[med-svn] [jellyfish] 02/05: Imported Upstream version 2.1.4
Andreas Tille
tille at debian.org
Sat Oct 4 17:38:56 UTC 2014
This is an automated email from the git hooks/post-receive script.
tille pushed a commit to branch master
in repository jellyfish.
commit 91d6a380c7ce711ffd2f54741c0964d96b7da009
Author: Andreas Tille <tille at debian.org>
Date: Sat Oct 4 19:07:45 2014 +0200
Imported Upstream version 2.1.4
---
.gitignore | 15 +
CHANGES | 13 +
Makefile.am | 327 +-
Makefile.in | 1826 --
Makefile.simple | 40 +
README | 22 +-
README.md | 32 +
aclocal.m4 | 1033 -
config.guess | 1530 --
config.h.in | 90 -
config.sub | 1773 --
configure | 18209 -----------------
configure.ac | 64 +-
depcomp | 708 -
development.mk | 22 +
doc/Makefile | 37 +
doc/UserGuide.lyx | 1515 ++
doc/generate_options_tex.sh | 7 +
doc/help_parse.rb | 451 +
doc/help_parse.treetop | 52 +
doc/jellyfish.html | 802 +
doc/jellyfish.tex | 205 +
doc/option_to_tex | 35 +
doc/options.tex | 210 +
doc/transfile | 19 +
examples/README | 15 +
examples/count_in_file/Makefile | 7 +
examples/count_in_file/README | 40 +
examples/count_in_file/count_in_file.cc | 158 +
examples/query_per_sequence/Makefile | 10 +
examples/query_per_sequence/README | 18 +
examples/query_per_sequence/query_per_sequence.cc | 86 +
examples/query_per_sequence/sequence_mers.hpp | 99 +
gtest.mk | 49 +-
.../reversible_hash_function.hpp => header-license | 7 -
include/jellyfish/allocators_mmap.hpp | 78 +
include/jellyfish/atomic_bits_array.hpp | 202 +
include/jellyfish/atomic_field.hpp | 157 +
{jellyfish => include/jellyfish}/atomic_gcc.hpp | 2 +-
{jellyfish => include/jellyfish}/backtrace.hpp | 0
include/jellyfish/binary_dumper.hpp | 224 +
include/jellyfish/bloom_common.hpp | 129 +
include/jellyfish/bloom_counter2.hpp | 221 +
include/jellyfish/bloom_filter.hpp | 164 +
include/jellyfish/circular_buffer.hpp | 200 +
include/jellyfish/compare_and_swap.hpp | 80 +
include/jellyfish/cooperative_pool.hpp | 258 +
include/jellyfish/cooperative_pool2.hpp | 283 +
include/jellyfish/cpp_array.hpp | 156 +
include/jellyfish/divisor.hpp | 150 +
include/jellyfish/dumper.hpp | 103 +
include/jellyfish/err.hpp | 99 +
include/jellyfish/file_header.hpp | 112 +
include/jellyfish/generator_manager.hpp | 163 +
include/jellyfish/generic_file_header.hpp | 255 +
include/jellyfish/hash_counter.hpp | 244 +
include/jellyfish/int128.hpp | 203 +
include/jellyfish/jellyfish.hpp | 37 +
include/jellyfish/json.h | 1855 ++
include/jellyfish/large_hash_array.hpp | 994 +
include/jellyfish/large_hash_iterator.hpp | 260 +
include/jellyfish/locks_pthread.hpp | 211 +
include/jellyfish/mapped_file.hpp | 220 +
include/jellyfish/mer_dna.hpp | 729 +
include/jellyfish/mer_dna_bloom_counter.hpp | 50 +
include/jellyfish/mer_heap.hpp | 115 +
include/jellyfish/mer_iterator.hpp | 100 +
include/jellyfish/mer_overlap_sequence_parser.hpp | 241 +
include/jellyfish/mer_qual_iterator.hpp | 118 +
include/jellyfish/misc.hpp | 247 +
include/jellyfish/offsets_key_value.hpp | 277 +
include/jellyfish/rectangular_binary_matrix.hpp | 379 +
.../jellyfish}/simple_circular_buffer.hpp | 14 +-
include/jellyfish/sorted_dumper.hpp | 115 +
include/jellyfish/stdio_filebuf.hpp | 170 +
{jellyfish => include/jellyfish}/storage.hpp | 4 +-
include/jellyfish/stream_iterator.hpp | 90 +
include/jellyfish/stream_manager.hpp | 157 +
include/jellyfish/text_dumper.hpp | 88 +
{jellyfish => include/jellyfish}/thread_exec.hpp | 2 +
{jellyfish => include/jellyfish}/time.hpp | 0
{jellyfish => include/jellyfish}/token_ring.hpp | 80 +-
include/jellyfish/whole_sequence_parser.hpp | 150 +
install-sh | 527 -
jellyfish-1.1.pc.in => jellyfish-2.0.pc.in | 2 +-
jellyfish/aligned_values_array.hpp | 141 -
jellyfish/allocators_malloc.hpp | 61 -
jellyfish/allocators_mmap.hpp | 64 -
jellyfish/allocators_shm.hpp | 94 -
jellyfish/capped_integer.hpp | 64 -
jellyfish/circular_buffer.hpp | 68 -
jellyfish/cite_cmdline.hpp | 111 -
jellyfish/compacted_dumper.hpp | 171 -
jellyfish/compacted_hash.hpp | 530 -
jellyfish/concurrent_queues.hpp | 160 -
jellyfish/count_main_cmdline.hpp | 684 -
jellyfish/counter.hpp | 52 -
jellyfish/dbg.cc | 7 -
jellyfish/direct_indexing_array.hpp | 151 -
jellyfish/direct_sorted_dumper.hpp | 131 -
jellyfish/divisor.hpp | 135 -
jellyfish/dna_codes.cc | 28 -
jellyfish/dna_codes.hpp | 20 -
jellyfish/double_fifo_input.hpp | 192 -
jellyfish/dump_fastq_main.cc | 71 -
jellyfish/dump_fastq_main_cmdline.hpp | 160 -
jellyfish/dump_main.cc | 100 -
jellyfish/dump_main_cmdline.hpp | 151 -
jellyfish/dumper.hpp | 61 -
jellyfish/eLut.h | 71 -
jellyfish/err.hpp | 145 -
jellyfish/fastq_dumper.hpp | 131 -
jellyfish/file_parser.cc | 99 -
jellyfish/file_parser.hpp | 92 -
jellyfish/floats.cc | 23 -
jellyfish/floats.hpp | 71 -
jellyfish/generate_sequence.cc | 199 +-
jellyfish/generate_sequence_cmdline.hpp | 171 -
jellyfish/generate_sequence_cmdline.yaggo | 27 +
jellyfish/half.cpp | 311 -
jellyfish/half.h | 766 -
jellyfish/hash.hpp | 253 -
jellyfish/hash_fastq_merge.cc | 52 -
jellyfish/hash_fastq_merge_cmdline.hpp | 171 -
jellyfish/hash_merge.cc | 242 -
jellyfish/hash_merge_cmdline.hpp | 157 -
jellyfish/heap.hpp | 125 -
jellyfish/histo_fastq_main.cc | 70 -
jellyfish/histo_fastq_main_cmdline.hpp | 142 -
jellyfish/histo_main.cc | 132 -
jellyfish/histo_main_cmdline.hpp | 199 -
jellyfish/invertible_hash_array.hpp | 1015 -
jellyfish/locking_hash_counters.hpp | 372 -
jellyfish/locks_pthread.hpp | 172 -
jellyfish/mapped_file.cc | 25 -
jellyfish/mapped_file.hpp | 181 -
jellyfish/mer_counter.cc | 379 -
jellyfish/mer_counting.hpp | 68 -
jellyfish/merge_files.cc | 151 +
jellyfish/{err.cc => merge_files.hpp} | 23 +-
jellyfish/misc.hpp | 144 -
jellyfish/noop_dumper.hpp | 30 -
jellyfish/offsets_key_value.hpp | 239 -
jellyfish/parse_dna.cc | 59 -
jellyfish/parse_dna.hpp | 194 -
jellyfish/parse_quake.cc | 107 -
jellyfish/parse_quake.hpp | 152 -
jellyfish/parse_qual_dna.cc | 74 -
jellyfish/parse_qual_dna.hpp | 147 -
jellyfish/parse_read.hpp | 105 -
jellyfish/query_cmdline.hpp | 135 -
jellyfish/query_main.cc | 76 -
jellyfish/randomc.h | 4 +-
jellyfish/raw_dumper.hpp | 244 -
jellyfish/read_parser.cc | 108 -
jellyfish/read_parser.hpp | 78 -
jellyfish/seq_qual_parser.cc | 139 -
jellyfish/seq_qual_parser.hpp | 66 -
jellyfish/sequence_parser.cc | 104 -
jellyfish/sequence_parser.hpp | 71 -
jellyfish/simple_growing_array.hpp | 60 -
jellyfish/sorted_dumper.hpp | 166 -
jellyfish/square_binary_matrix.cc | 289 -
jellyfish/square_binary_matrix.hpp | 203 -
jellyfish/stats_main.cc | 121 -
jellyfish/stats_main_cmdline.hpp | 160 -
jellyfish/storage.cc | 51 -
jellyfish/test_double_fifo_input.cc | 79 -
jellyfish/test_read_parser.cc | 50 -
jellyfish/toFloat.h | 16391 ---------------
jellyfish/yaggo.cpp | 184 -
jellyfish/yaggo.hpp | 152 -
{jellyfish => lib}/allocators_mmap.cc | 76 +-
{jellyfish => lib}/err.cc | 6 +-
lib/generator_manager.cc | 281 +
lib/int128.cc | 94 +
lib/jsoncpp.cpp | 4230 ++++
jellyfish/hash_function.hpp => lib/mer_dna.cc | 10 +-
{jellyfish => lib}/misc.cc | 40 +
lib/rectangular_binary_matrix.cc | 216 +
lib/storage.cc | 51 +
{jellyfish => lib}/thread_exec.cc | 12 +-
{jellyfish => lib}/time.cc | 0
local.mk | 3 +
ltmain.sh | 9655 ---------
m4/.gitignore | 4 +
m4/libtool.m4 | 7986 --------
m4/ltoptions.m4 | 384 -
m4/ltsugar.m4 | 123 -
m4/ltversion.m4 | 23 -
m4/lt~obsolete.m4 | 98 -
missing | 331 -
sub_commands/bc_main.cc | 161 +
sub_commands/bc_main_cmdline.yaggo | 45 +
jellyfish/cite.cc => sub_commands/cite_main.cc | 11 +-
sub_commands/cite_main_cmdline.yaggo | 12 +
sub_commands/count_main.cc | 354 +
sub_commands/count_main_cmdline.yaggo | 102 +
sub_commands/dump_main.cc | 88 +
sub_commands/dump_main_cmdline.yaggo | 24 +
sub_commands/histo_main.cc | 90 +
sub_commands/histo_main_cmdline.yaggo | 38 +
sub_commands/info_main.cc | 54 +
sub_commands/info_main_cmdline.yaggo | 23 +
{jellyfish => sub_commands}/jellyfish.cc | 18 +-
sub_commands/mem_main.cc | 54 +
sub_commands/mem_main_cmdline.yaggo | 123 +
.../parse_read.cc => sub_commands/merge_main.cc | 45 +-
sub_commands/merge_main_cmdline.yaggo | 15 +
sub_commands/query_main.cc | 123 +
sub_commands/query_main_cmdline.yaggo | 24 +
sub_commands/stats_main.cc | 83 +
sub_commands/stats_main_cmdline.yaggo | 28 +
swig/Readme.md | 154 +
swig/Tuprules.tup | 120 +
swig/hash_counter.i | 56 +
swig/hash_set.i | 35 +
swig/jellyfish.i | 28 +
swig/mer_dna.i | 99 +
swig/mer_file.i | 191 +
swig/perl5/Makefile.PL | 20 +
swig/perl5/Tupfile | 14 +
swig/perl5/t/test_hash_counter.t | 44 +
swig/perl5/t/test_mer_file.t | 51 +
swig/python/Tupfile | 14 +
swig/python/setup.py | 45 +
swig/python/test_hash_counter.py | 39 +
swig/python/test_mer_file.py | 57 +
swig/ruby/Tupfile | 14 +
swig/ruby/extconf.rb | 12 +
swig/ruby/test_hash_counter.rb | 42 +
swig/ruby/test_mer_file.rb | 57 +
swig/tests/Tupfile | 6 +
tests/big.sh | 15 +-
tests/bloom_counter.sh | 47 +
tests/bloom_filter.sh | 23 +
tests/compat.sh.in | 7 +-
tests/from_stream.sh | 2 +-
tests/from_stream_fastq.sh | 2 +-
tests/generate_sequence.sh | 6 +
tests/large_key.sh | 18 +
tests/merge.sh | 36 +-
tests/min_qual.sh | 2 +-
tests/multi_file.sh | 48 +-
tests/multi_file_fastq.sh | 2 +-
tests/parallel_direct_indexing.sh | 2 +-
tests/parallel_fastq_direct_indexing.sh | 2 +-
tests/parallel_fastq_hashing.sh | 2 +-
tests/parallel_fastq_sequence_hashing.sh | 2 +-
tests/parallel_hashing.sh | 99 +-
tests/parsers.sh | 2 +-
tests/quality_filter.sh | 25 +
tests/raw_hash.sh | 2 +-
tests/serial_direct_indexing.sh | 2 +-
tests/serial_hashing.sh | 2 +-
tests/small.sh | 2 +-
tests/subset_hashing.sh | 19 +
unit_tests/Makefile | 82 +
unit_tests/gtest/gtest.h | 20061 +++++++++++++++++++
unit_tests/gtest/include/gtest/gtest-death-test.h | 283 -
unit_tests/gtest/include/gtest/gtest-message.h | 230 -
unit_tests/gtest/include/gtest/gtest-param-test.h | 1421 --
unit_tests/gtest/include/gtest/gtest-printers.h | 796 -
unit_tests/gtest/include/gtest/gtest-spi.h | 232 -
unit_tests/gtest/include/gtest/gtest-test-part.h | 176 -
unit_tests/gtest/include/gtest/gtest-typed-test.h | 259 -
unit_tests/gtest/include/gtest/gtest.h | 2155 --
unit_tests/gtest/include/gtest/gtest_pred_impl.h | 358 -
unit_tests/gtest/include/gtest/gtest_prod.h | 58 -
.../gtest/internal/gtest-death-test-internal.h | 308 -
.../gtest/include/gtest/internal/gtest-filepath.h | 210 -
.../gtest/include/gtest/internal/gtest-internal.h | 1236 --
.../include/gtest/internal/gtest-linked_ptr.h | 233 -
.../gtest/internal/gtest-param-util-generated.h | 4822 -----
.../include/gtest/internal/gtest-param-util.h | 619 -
.../gtest/include/gtest/internal/gtest-port.h | 1785 --
.../gtest/include/gtest/internal/gtest-string.h | 360 -
.../gtest/include/gtest/internal/gtest-tuple.h | 968 -
.../gtest/include/gtest/internal/gtest-type-util.h | 3330 ---
unit_tests/gtest/src/gtest-all.cc | 9558 ++++++++-
unit_tests/gtest/src/gtest-death-test.cc | 1234 --
unit_tests/gtest/src/gtest-filepath.cc | 380 -
unit_tests/gtest/src/gtest-internal-inl.h | 1038 -
unit_tests/gtest/src/gtest-port.cc | 752 -
unit_tests/gtest/src/gtest-printers.cc | 356 -
unit_tests/gtest/src/gtest-test-part.cc | 110 -
unit_tests/gtest/src/gtest-typed-test.cc | 110 -
unit_tests/gtest/src/gtest.cc | 4898 -----
unit_tests/gtest/src/gtest_main.cc | 5 +-
unit_tests/test_allocators_mmap.cc | 15 +
unit_tests/test_atomic_bits_array.cc | 32 +
unit_tests/test_cond.cc | 80 +
unit_tests/test_cooperative_pool2.cc | 89 +
unit_tests/test_dumpers.cc | 144 +
unit_tests/test_file_header.cc | 90 +
unit_tests/test_generator_manager.cc | 95 +
unit_tests/test_hash_counter.cc | 104 +
unit_tests/test_int128.cc | 34 +
unit_tests/test_large_block.cc | 33 +
unit_tests/test_large_hash_array.cc | 346 +
unit_tests/test_main.cc | 67 +
unit_tests/test_main.hpp | 26 +
unit_tests/test_main_cmdline.yaggo | 10 +
unit_tests/test_mapped_file.cc | 54 +
unit_tests/test_mer_dna.cc | 529 +
unit_tests/test_mer_dna_bloom_counter.cc | 150 +
unit_tests/test_mer_heap.cc | 76 +
unit_tests/test_mer_iterator.cc | 181 +
unit_tests/test_mer_overlap_sequence_parser.cc | 177 +
unit_tests/test_misc.cc | 110 +
unit_tests/test_mutex.cc | 53 +
unit_tests/test_offsets_key_value.cc | 299 +-
unit_tests/test_packed_key_value_array.cc | 213 +
unit_tests/test_rectangular_binary_matrix.cc | 332 +
unit_tests/test_simple_circular_buffer.cc | 105 +-
unit_tests/test_square_binary_matrix.cc | 10 +-
unit_tests/test_stdio_filebuf.cc | 55 +
unit_tests/test_stream_iterator.cc | 94 +
unit_tests/test_text_dumper.cc | 115 +
unit_tests/test_token_ring.cc | 44 +
unit_tests/test_whole_sequence_parser.cc | 161 +
unit_tests/unit_tests.sh | 6 +-
322 files changed, 55831 insertions(+), 102991 deletions(-)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d065b04
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,15 @@
+Makefile.in
+aclocal.m4
+autom4te.cache
+config.h.in
+configure
+depcomp
+install-sh
+missing
+compile
+config.guess
+config.h.in~
+config.sub
+ltmain.sh
+*_cmdline.hpp
+m4
diff --git a/CHANGES b/CHANGES
new file mode 100644
index 0000000..066aaf2
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,13 @@
+Version 1.1
+===========
+
+* Read input from pipes. For example, to count DNA from zipped files, run:
+
+% gunzip -c *.fa.gz | jellyfish [options] /dev/fd/0
+
+* Support fasta and fastq formats.
+
+* Support for counting 'q-mers', as defined by the Quake error
+ correcting software (http://www.cbcb.umd.edu/software/quake/).
+
+* New dump subcommands which replaces 'stats -f' and 'stats -c'.
diff --git a/Makefile.am b/Makefile.am
index e25a30b..78a94af 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -3,192 +3,203 @@ EXTRA_DIST = doc/jellyfish.pdf doc/jellyfish.man README LICENSE HalfLICENSE
man1_MANS = doc/jellyfish.man
pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = jellyfish-1.1.pc
+pkgconfig_DATA = jellyfish-2.0.pc
-AM_LDFLAGS = -lpthread
-AM_CPPFLAGS = -Wall -Wnon-virtual-dtor -I$(top_srcdir)
-AM_CXXFLAGS = -g -O3
-LDADD = libjellyfish-1.1.la
+AM_LDFLAGS = -lpthread # $(VALGRIND_LIBS)
+AM_CPPFLAGS = -Wall -Wnon-virtual-dtor -I$(top_srcdir) -I$(top_srcdir)/include -g -O3 $(VALGRIND_CFLAGS)
+AM_CXXFLAGS = $(ALL_CXXFLAGS) -g -O3
-# What to build
-lib_LTLIBRARIES = libjellyfish-1.1.la
-
-bin_PROGRAMS = bin/jellyfish
-check_PROGRAMS = bin/generate_sequence bin/test_double_fifo_input \
- bin/test_read_parser
-
-
-########################################
-# Build Jellyfish the exec
-########################################
-bin_jellyfish_SOURCES = jellyfish/jellyfish.cc \
- jellyfish/stats_main.cc \
- jellyfish/hash_merge.cc \
- jellyfish/mer_counter.cc \
- jellyfish/histo_main.cc \
- jellyfish/dump_main.cc \
- jellyfish/query_main.cc \
- jellyfish/dump_fastq_main.cc \
- jellyfish/histo_fastq_main.cc \
- jellyfish/cite.cc \
- jellyfish/hash_fastq_merge.cc \
- jellyfish/yaggo.cpp
-# bin_jellyfish_LDADD = libjellyfish-1.1.la
+noinst_HEADERS = $(YAGGO_SOURCES)
+bin_PROGRAMS =
+dist_bin_SCRIPTS =
+data_DATA =
+BUILT_SOURCES = $(YAGGO_SOURCES)
+CLEANFILES =
+DISTCLEANFILES = $(BUILT_SOURCES)
+
+# Yaggo automatic rules with silencing
+V_YAGGO = $(V_YAGGO_$(V))
+V_YAGGO_ = $(V_YAGGO_$(AM_DEFAULT_VERBOSITY))
+V_YAGGO_0 = @echo " YAGGO " $@;
+.yaggo.hpp:
+ $(V_YAGGO)$(YAGGO) --license $(srcdir)/header-license -o $@ $<
+
+YAGGO_SOURCES = # Append all file to be built by yaggo
+# What to build
+bin_PROGRAMS += bin/jellyfish
+lib_LTLIBRARIES = libjellyfish-2.0.la
+LDADD = libjellyfish-2.0.la # $(VALGRIND_LIBS)
+check_PROGRAMS = bin/generate_sequence
+
+############################
+# Build Jellyfish the exec #
+############################
+bin_jellyfish_SOURCES = sub_commands/jellyfish.cc \
+ sub_commands/count_main.cc \
+ sub_commands/info_main.cc \
+ sub_commands/dump_main.cc \
+ sub_commands/histo_main.cc \
+ sub_commands/stats_main.cc \
+ sub_commands/merge_main.cc \
+ sub_commands/bc_main.cc \
+ sub_commands/query_main.cc \
+ sub_commands/cite_main.cc \
+ sub_commands/mem_main.cc \
+ jellyfish/merge_files.cc
bin_jellyfish_LDFLAGS = $(AM_LDFLAGS) $(STATIC_FLAGS)
-EXTRA_DIST += jellyfish/cite_cmdline.hpp jellyfish/query_cmdline.hpp \
- jellyfish/hash_merge_cmdline.hpp \
- jellyfish/histo_main_cmdline.hpp \
- jellyfish/stats_main_cmdline.hpp \
- jellyfish/histo_fastq_main_cmdline.hpp \
- jellyfish/dump_fastq_main_cmdline.hpp \
- jellyfish/count_main_cmdline.hpp \
- jellyfish/hash_fastq_merge_cmdline.hpp \
- jellyfish/dump_main_cmdline.hpp \
- jellyfish/double_fifo_input.hpp \
- jellyfish/simple_growing_array.hpp \
- jellyfish/backtrace.hpp jellyfish/noop_dumper.hpp \
- jellyfish/yaggo.hpp jellyfish/fstream_default.hpp
-
-########################################
-# Build Jellyfish the shared library
-########################################
-libjellyfish_srcs = jellyfish/square_binary_matrix.cc \
- jellyfish/err.cc jellyfish/misc.cc \
- jellyfish/storage.cc jellyfish/thread_exec.cc \
- jellyfish/time.cc jellyfish/file_parser.cc \
- jellyfish/read_parser.cc \
- jellyfish/parse_read.cc jellyfish/half.cpp \
- jellyfish/mapped_file.cc \
- jellyfish/parse_dna.cc \
- jellyfish/parse_quake.cc \
- jellyfish/parse_qual_dna.cc \
- jellyfish/sequence_parser.cc \
- jellyfish/seq_qual_parser.cc \
- jellyfish/backtrace.cc jellyfish/floats.cc \
- jellyfish/dbg.cc jellyfish/allocators_mmap.cc \
- jellyfish/dna_codes.cc
-
-libjellyfish_1_1_la_SOURCES = $(libjellyfish_srcs)
-libjellyfish_1_1_la_LDFLAGS = -version-info 1:1:0
+
+YAGGO_SOURCES += sub_commands/count_main_cmdline.hpp \
+ sub_commands/info_main_cmdline.hpp \
+ sub_commands/dump_main_cmdline.hpp \
+ sub_commands/histo_main_cmdline.hpp \
+ sub_commands/stats_main_cmdline.hpp \
+ sub_commands/merge_main_cmdline.hpp \
+ sub_commands/bc_main_cmdline.hpp \
+ sub_commands/query_main_cmdline.hpp \
+ sub_commands/cite_main_cmdline.hpp \
+ sub_commands/mem_main_cmdline.hpp
+
+######################################
+# Build Jellyfish the shared library #
+######################################
+libjellyfish_2_0_la_LDFLAGS = -version-info 2:0:0
+libjellyfish_2_0_la_SOURCES = lib/rectangular_binary_matrix.cc \
+ lib/mer_dna.cc lib/storage.cc \
+ lib/allocators_mmap.cc lib/misc.cc \
+ lib/int128.cc lib/thread_exec.cc \
+ lib/jsoncpp.cpp lib/time.cc \
+ lib/generator_manager.cc
+
library_includedir=$(includedir)/jellyfish- at PACKAGE_VERSION@/jellyfish
-library_include_HEADERS = jellyfish/allocators_malloc.hpp \
- jellyfish/allocators_mmap.hpp \
- jellyfish/allocators_shm.hpp \
- jellyfish/atomic_gcc.hpp \
- jellyfish/compacted_dumper.hpp \
- jellyfish/compacted_hash.hpp \
- jellyfish/concurrent_queues.hpp \
- jellyfish/direct_indexing_array.hpp \
- jellyfish/direct_sorted_dumper.hpp \
- jellyfish/divisor.hpp jellyfish/dumper.hpp \
- jellyfish/hash_function.hpp \
- jellyfish/hash.hpp jellyfish/heap.hpp \
- jellyfish/invertible_hash_array.hpp \
- jellyfish/locking_hash_counters.hpp \
- jellyfish/locks_pthread.hpp \
- jellyfish/mapped_file.hpp \
- jellyfish/mer_counting.hpp \
- jellyfish/err.hpp jellyfish/misc.hpp \
- jellyfish/offsets_key_value.hpp \
- jellyfish/reversible_hash_function.hpp \
- jellyfish/sorted_dumper.hpp \
- jellyfish/square_binary_matrix.hpp \
- jellyfish/storage.hpp \
- jellyfish/thread_exec.hpp \
- jellyfish/time.hpp jellyfish/token_ring.hpp \
- jellyfish/raw_dumper.hpp \
- jellyfish/capped_integer.hpp \
- jellyfish/aligned_values_array.hpp \
- jellyfish/fastq_dumper.hpp \
- jellyfish/floats.hpp \
- jellyfish/circular_buffer.hpp \
- jellyfish/counter.hpp \
- jellyfish/parse_quake.hpp \
- jellyfish/parse_dna.hpp \
- jellyfish/parse_qual_dna.hpp \
- jellyfish/file_parser.hpp \
- jellyfish/sequence_parser.hpp \
- jellyfish/seq_qual_parser.hpp \
- jellyfish/double_fifo_input.hpp \
- jellyfish/read_parser.hpp \
- jellyfish/parse_read.hpp \
- jellyfish/simple_growing_array.hpp \
- jellyfish/toFloat.h jellyfish/eLut.h \
- jellyfish/dbg.hpp jellyfish/half.h \
- jellyfish/backtrace.hpp \
- jellyfish/dna_codes.hpp \
- jellyfish/simple_circular_buffer.hpp
-
-
-########################################
-# Build tests
-########################################
+JFI = include/jellyfish
+library_include_HEADERS = $(JFI)/allocators_mmap.hpp \
+ $(JFI)/backtrace.hpp $(JFI)/atomic_gcc.hpp \
+ $(JFI)/large_hash_array.hpp $(JFI)/err.hpp \
+ $(JFI)/misc.hpp \
+ $(JFI)/offsets_key_value.hpp \
+ $(JFI)/int128.hpp \
+ $(JFI)/rectangular_binary_matrix.hpp \
+ $(JFI)/mer_dna.hpp $(JFI)/storage.hpp \
+ $(JFI)/simple_circular_buffer.hpp \
+ $(JFI)/circular_buffer.hpp \
+ $(JFI)/atomic_field.hpp \
+ $(JFI)/compare_and_swap.hpp \
+ $(JFI)/divisor.hpp \
+ $(JFI)/large_hash_iterator.hpp \
+ $(JFI)/jellyfish.hpp $(JFI)/thread_exec.hpp \
+ $(JFI)/stream_iterator.hpp \
+ $(JFI)/mer_overlap_sequence_parser.hpp \
+ $(JFI)/whole_sequence_parser.hpp \
+ $(JFI)/binary_dumper.hpp \
+ $(JFI)/sorted_dumper.hpp \
+ $(JFI)/text_dumper.hpp $(JFI)/dumper.hpp \
+ $(JFI)/time.hpp $(JFI)/mer_heap.hpp \
+ $(JFI)/token_ring.hpp \
+ $(JFI)/locks_pthread.hpp \
+ $(JFI)/file_header.hpp \
+ $(JFI)/generic_file_header.hpp \
+ $(JFI)/json.h $(JFI)/hash_counter.hpp \
+ $(JFI)/mapped_file.hpp \
+ $(JFI)/mer_dna_bloom_counter.hpp \
+ $(JFI)/bloom_common.hpp \
+ $(JFI)/bloom_counter2.hpp \
+ $(JFI)/bloom_filter.hpp \
+ $(JFI)/cooperative_pool.hpp \
+ $(JFI)/cooperative_pool2.hpp \
+ $(JFI)/stream_manager.hpp \
+ $(JFI)/generator_manager.hpp \
+ $(JFI)/cpp_array.hpp \
+ $(JFI)/mer_iterator.hpp \
+ $(JFI)/atomic_bits_array.hpp \
+ $(JFI)/stdio_filebuf.hpp \
+ $(JFI)/mer_qual_iterator.hpp
+
+
+noinst_HEADERS += jellyfish/fstream_default.hpp jellyfish/dbg.hpp \
+ jellyfish/randomc.h jellyfish/merge_files.hpp
+
+###############
+# Build tests #
+###############
bin_generate_sequence_SOURCES = jellyfish/generate_sequence.cc \
- jellyfish/mersenne.cpp
-bin_test_double_fifo_input_SOURCES = jellyfish/test_double_fifo_input.cc
-bin_test_read_parser_SOURCES = jellyfish/test_read_parser.cc
-EXTRA_DIST += jellyfish/randomc.h jellyfish/generate_sequence_cmdline.hpp
-
-########################################
-# Tests
-########################################
+ jellyfish/mersenne.cpp \
+ jellyfish/backtrace.cc \
+ jellyfish/dbg.cc
+YAGGO_SOURCES += jellyfish/generate_sequence_cmdline.hpp
+
+#########
+# Tests #
+#########
TEST_EXTENSIONS = .sh
SH_LOG_COMPILER = /bin/sh
AM_SH_LOG_FLAGS =
-TESTS = tests/generate_sequence.sh tests/serial_hashing.sh \
- tests/parallel_hashing.sh tests/serial_direct_indexing.sh \
- tests/parallel_direct_indexing.sh tests/raw_hash.sh \
- tests/generate_fastq_sequence.sh \
- tests/parallel_fastq_hashing.sh tests/multi_file.sh \
- tests/multi_file_fastq.sh tests/from_stream.sh \
- tests/parallel_fastq_sequence_hashing.sh \
- tests/from_stream_fastq.sh tests/merge.sh tests/min_qual.sh \
- tests/big.sh tests/parsers.sh tests/small.sh \
- tests/parallel_fastq_direct_indexing.sh
+TESTS = tests/generate_sequence.sh tests/parallel_hashing.sh \
+ tests/merge.sh tests/bloom_filter.sh tests/big.sh \
+ tests/subset_hashing.sh tests/multi_file.sh \
+ tests/bloom_counter.sh tests/large_key.sh
EXTRA_DIST += $(TESTS)
clean-local: clean-local-check
.PHONY: clean-local-check
clean-local-check:
- -cd tests; rm -f seq10m* seq1m* *_0 *_1 *_2 *_S *.md5sum *.histo *.stats *.timing *.query *.dump *.fa
+ -cd tests; rm -f *
-tests/serial_hashing.log: tests/generate_sequence.log
tests/parallel_hashing.log: tests/generate_sequence.log
-tests/serial_direct_indexing.log: tests/generate_sequence.log
-tests/parallel_direct_indexing.log: tests/generate_sequence.log
-tests/parallel_fastq_direct_indexing.log: tests/generate_fastq_sequence.log
+tests/subset_hashing.log: tests/generate_sequence.log
+tests/bloom_filter.log: tests/generate_sequence.log
+tests/bloom_counter.log: tests/generate_sequence.log
tests/multi_file.log: tests/generate_sequence.log
-tests/raw_hash.log: tests/generate_sequence.log
-tests/from_stream.log: tests/generate_sequence.log
-tests/parallel_fastq_hashing.log: tests/generate_fastq_sequence.log
-tests/parallel_fastq_sequence_hashing.log: tests/generate_fastq_sequence.log
-tests/multi_file_fastq.log: tests/generate_fastq_sequence.log
-tests/from_stream_fastq.log: tests/generate_fastq_sequence.log
-tests/merge.log: tests/generate_fastq_sequence.log
+tests/merge.log: tests/generate_sequence.log
tests/min_qual.log: tests/generate_fastq_sequence.log
-tests/parsers.log: tests/generate_sequence.log
+tests/large_key.log: tests/generate_sequence.log
+tests/quality_filter.log: tests/generate_sequence.log
-########################################
-# Unit tests
-########################################
+##############
+# Unit tests #
+##############
TESTS += unit_tests/unit_tests.sh
check_PROGRAMS += bin/test_all
-bin_test_all_SOURCES = unit_tests/test_offsets_key_value.cc \
- unit_tests/test_simple_circular_buffer.cc \
- unit_tests/test_square_binary_matrix.cc
-bin_test_all_CXXFLAGS = -I$(top_srcdir)/unit_tests/gtest/include -I$(top_srcdir)/unit_tests/gtest
-bin_test_all_LDADD = libgtest_main.a libgtest.a $(LDADD)
+bin_test_all_SOURCES = unit_tests/test_main.cc \
+ unit_tests/test_misc.cc \
+ unit_tests/test_offsets_key_value.cc \
+ unit_tests/test_simple_circular_buffer.cc \
+ unit_tests/test_rectangular_binary_matrix.cc \
+ unit_tests/test_mer_dna.cc \
+ unit_tests/test_large_hash_array.cc \
+ unit_tests/test_mer_overlap_sequence_parser.cc \
+ unit_tests/test_file_header.cc \
+ unit_tests/test_mer_iterator.cc \
+ unit_tests/test_hash_counter.cc \
+ unit_tests/test_mer_heap.cc \
+ unit_tests/test_stream_iterator.cc \
+ unit_tests/test_token_ring.cc \
+ unit_tests/test_text_dumper.cc \
+ unit_tests/test_dumpers.cc \
+ unit_tests/test_mapped_file.cc \
+ unit_tests/test_int128.cc \
+ unit_tests/test_mer_dna_bloom_counter.cc \
+ unit_tests/test_whole_sequence_parser.cc \
+ unit_tests/test_allocators_mmap.cc \
+ unit_tests/test_cooperative_pool2.cc \
+ unit_tests/test_generator_manager.cc \
+ unit_tests/test_atomic_bits_array.cc \
+ unit_tests/test_stdio_filebuf.cc
+bin_test_all_SOURCES += jellyfish/backtrace.cc
+
+bin_test_all_CPPFLAGS = -Dprotected=public -Dprivate=public -DJSON_IS_AMALGAMATION=1
+bin_test_all_CXXFLAGS = $(AM_CXXFLAGS) -I$(top_srcdir)/unit_tests/gtest/include -I$(top_srcdir)/unit_tests -I$(top_srcdir)/include
+bin_test_all_LDADD = libgtest.la $(LDADD)
+YAGGO_SOURCES += unit_tests/test_main_cmdline.hpp
+noinst_HEADERS += unit_tests/test_main.hpp
include gtest.mk
-include $(top_srcdir)/development.mk
-########
-# info #
-########
+# Print the value of a variable
print-%:
@echo -n $($*)
diff --git a/Makefile.in b/Makefile.in
deleted file mode 100644
index 455ac70..0000000
--- a/Makefile.in
+++ /dev/null
@@ -1,1826 +0,0 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-
-
-
-
-VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
- case $$MAKEFLAGS in \
- *\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
- esac; \
- test $$am__dry = yes; \
- }
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-bin_PROGRAMS = bin/jellyfish$(EXEEXT)
-check_PROGRAMS = bin/generate_sequence$(EXEEXT) \
- bin/test_double_fifo_input$(EXEEXT) \
- bin/test_read_parser$(EXEEXT) bin/test_all$(EXEEXT)
-DIST_COMMON = README $(am__configure_deps) $(library_include_HEADERS) \
- $(noinst_HEADERS) $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
- $(srcdir)/config.h.in $(srcdir)/gtest.mk \
- $(srcdir)/jellyfish-1.1.pc.in $(top_srcdir)/configure \
- $(top_srcdir)/tests/compat.sh.in config.guess config.sub \
- depcomp install-sh ltmain.sh missing
-subdir = .
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
- $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
- $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
- $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES = tests/compat.sh jellyfish-1.1.pc
-CONFIG_CLEAN_VPATH_FILES =
-ARFLAGS = cru
-AM_V_AR = $(am__v_AR_ at AM_V@)
-am__v_AR_ = $(am__v_AR_ at AM_DEFAULT_V@)
-am__v_AR_0 = @echo " AR " $@;
-AM_V_at = $(am__v_at_ at AM_V@)
-am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
-am__v_at_0 = @
-libgtest_a_AR = $(AR) $(ARFLAGS)
-libgtest_a_LIBADD =
-am__dirstamp = $(am__leading_dot)dirstamp
-am_libgtest_a_OBJECTS = \
- unit_tests/gtest/src/libgtest_a-gtest-all.$(OBJEXT)
-libgtest_a_OBJECTS = $(am_libgtest_a_OBJECTS)
-libgtest_main_a_AR = $(AR) $(ARFLAGS)
-libgtest_main_a_DEPENDENCIES = libgtest.a
-am_libgtest_main_a_OBJECTS = \
- unit_tests/gtest/src/libgtest_main_a-gtest_main.$(OBJEXT)
-libgtest_main_a_OBJECTS = $(am_libgtest_main_a_OBJECTS)
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
- *) f=$$p;; \
- esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
- for p in $$list; do echo "$$p $$p"; done | \
- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
- if (++n[$$2] == $(am__install_max)) \
- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
- END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
- test -z "$$files" \
- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
- $(am__cd) "$$dir" && rm -f $$files; }; \
- }
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
- "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" \
- "$(DESTDIR)$(library_includedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-libjellyfish_1_1_la_LIBADD =
-am__objects_1 = jellyfish/square_binary_matrix.lo jellyfish/err.lo \
- jellyfish/misc.lo jellyfish/storage.lo \
- jellyfish/thread_exec.lo jellyfish/time.lo \
- jellyfish/file_parser.lo jellyfish/read_parser.lo \
- jellyfish/parse_read.lo jellyfish/half.lo \
- jellyfish/mapped_file.lo jellyfish/parse_dna.lo \
- jellyfish/parse_quake.lo jellyfish/parse_qual_dna.lo \
- jellyfish/sequence_parser.lo jellyfish/seq_qual_parser.lo \
- jellyfish/backtrace.lo jellyfish/floats.lo jellyfish/dbg.lo \
- jellyfish/allocators_mmap.lo jellyfish/dna_codes.lo
-am_libjellyfish_1_1_la_OBJECTS = $(am__objects_1)
-libjellyfish_1_1_la_OBJECTS = $(am_libjellyfish_1_1_la_OBJECTS)
-AM_V_lt = $(am__v_lt_ at AM_V@)
-am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
-am__v_lt_0 = --silent
-libjellyfish_1_1_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
- $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
- $(AM_CXXFLAGS) $(CXXFLAGS) $(libjellyfish_1_1_la_LDFLAGS) \
- $(LDFLAGS) -o $@
-PROGRAMS = $(bin_PROGRAMS)
-am_bin_generate_sequence_OBJECTS = \
- jellyfish/generate_sequence.$(OBJEXT) \
- jellyfish/mersenne.$(OBJEXT)
-bin_generate_sequence_OBJECTS = $(am_bin_generate_sequence_OBJECTS)
-bin_generate_sequence_LDADD = $(LDADD)
-bin_generate_sequence_DEPENDENCIES = libjellyfish-1.1.la
-am_bin_jellyfish_OBJECTS = jellyfish/jellyfish.$(OBJEXT) \
- jellyfish/stats_main.$(OBJEXT) jellyfish/hash_merge.$(OBJEXT) \
- jellyfish/mer_counter.$(OBJEXT) jellyfish/histo_main.$(OBJEXT) \
- jellyfish/dump_main.$(OBJEXT) jellyfish/query_main.$(OBJEXT) \
- jellyfish/dump_fastq_main.$(OBJEXT) \
- jellyfish/histo_fastq_main.$(OBJEXT) jellyfish/cite.$(OBJEXT) \
- jellyfish/hash_fastq_merge.$(OBJEXT) jellyfish/yaggo.$(OBJEXT)
-bin_jellyfish_OBJECTS = $(am_bin_jellyfish_OBJECTS)
-bin_jellyfish_LDADD = $(LDADD)
-bin_jellyfish_DEPENDENCIES = libjellyfish-1.1.la
-bin_jellyfish_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
- $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
- $(AM_CXXFLAGS) $(CXXFLAGS) $(bin_jellyfish_LDFLAGS) $(LDFLAGS) \
- -o $@
-am_bin_test_all_OBJECTS = \
- unit_tests/bin_test_all-test_offsets_key_value.$(OBJEXT) \
- unit_tests/bin_test_all-test_simple_circular_buffer.$(OBJEXT) \
- unit_tests/bin_test_all-test_square_binary_matrix.$(OBJEXT)
-bin_test_all_OBJECTS = $(am_bin_test_all_OBJECTS)
-bin_test_all_DEPENDENCIES = libgtest_main.a libgtest.a $(LDADD)
-bin_test_all_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(bin_test_all_CXXFLAGS) \
- $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-am_bin_test_double_fifo_input_OBJECTS = \
- jellyfish/test_double_fifo_input.$(OBJEXT)
-bin_test_double_fifo_input_OBJECTS = \
- $(am_bin_test_double_fifo_input_OBJECTS)
-bin_test_double_fifo_input_LDADD = $(LDADD)
-bin_test_double_fifo_input_DEPENDENCIES = libjellyfish-1.1.la
-am_bin_test_read_parser_OBJECTS = \
- jellyfish/test_read_parser.$(OBJEXT)
-bin_test_read_parser_OBJECTS = $(am_bin_test_read_parser_OBJECTS)
-bin_test_read_parser_LDADD = $(LDADD)
-bin_test_read_parser_DEPENDENCIES = libjellyfish-1.1.la
-DEFAULT_INCLUDES = -I. at am__isrc@
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
- $(AM_CXXFLAGS) $(CXXFLAGS)
-AM_V_CXX = $(am__v_CXX_ at AM_V@)
-am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
-am__v_CXX_0 = @echo " CXX " $@;
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
- $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
-am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
-am__v_CXXLD_0 = @echo " CXXLD " $@;
-AM_V_GEN = $(am__v_GEN_ at AM_V@)
-am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
-SOURCES = $(libgtest_a_SOURCES) $(libgtest_main_a_SOURCES) \
- $(libjellyfish_1_1_la_SOURCES) \
- $(bin_generate_sequence_SOURCES) $(bin_jellyfish_SOURCES) \
- $(bin_test_all_SOURCES) $(bin_test_double_fifo_input_SOURCES) \
- $(bin_test_read_parser_SOURCES)
-DIST_SOURCES = $(libgtest_a_SOURCES) $(libgtest_main_a_SOURCES) \
- $(libjellyfish_1_1_la_SOURCES) \
- $(bin_generate_sequence_SOURCES) $(bin_jellyfish_SOURCES) \
- $(bin_test_all_SOURCES) $(bin_test_double_fifo_input_SOURCES) \
- $(bin_test_read_parser_SOURCES)
-am__can_run_installinfo = \
- case $$AM_UPDATE_INFO_DIR in \
- n|no|NO) false;; \
- *) (install-info --version) >/dev/null 2>&1;; \
- esac
-man1dir = $(mandir)/man1
-NROFF = nroff
-MANS = $(man1_MANS)
-DATA = $(pkgconfig_DATA)
-HEADERS = $(library_include_HEADERS) $(noinst_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-# If stdout is a non-dumb tty, use colors. If test -t is not supported,
-# then this fails; a conservative approach. Of course do not redirect
-# stdout here, just stderr.
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=; \
-test "X$(AM_COLOR_TESTS)" != Xno \
-&& test "X$$TERM" != Xdumb \
-&& { test "X$(AM_COLOR_TESTS)" = Xalways || test -t 1 2>/dev/null; } \
-&& { \
- red='[0;31m'; \
- grn='[0;32m'; \
- lgn='[1;32m'; \
- blu='[1;34m'; \
- std='[m'; \
-}
-# Restructured Text title and section.
-am__rst_title = sed 's/.*/ & /;h;s/./=/g;p;x;p;g;p;s/.*//'
-am__rst_section = sed 'p;s/./=/g;p;g'
-# Put stdin (possibly several lines separated by ". ") in a box.
-# Prefix each line by 'col' and terminate each with 'std', for coloring.
-# Multi line coloring is problematic with "less -R", so we really need
-# to color each line individually.
-am__text_box = $(AWK) '{ \
- n = split($$0, lines, "\\. "); max = 0; \
- for (i = 1; i <= n; ++i) \
- if (max < length(lines[i])) \
- max = length(lines[i]); \
- for (i = 0; i < max; ++i) \
- line = line "="; \
- print col line std; \
- for (i = 1; i <= n; ++i) \
- if (lines[i]) \
- print col lines[i] std; \
- print col line std; \
-}'
-# Solaris 10 'make', and several other traditional 'make' implementations,
-# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
-# by disabling -e (using the XSI extension "set +e") if it's set.
-am__sh_e_setup = case $$- in *e*) set +e;; esac
-# To be inserted before the command running the test. Creates the
-# directory for the log if needed. Stores in $dir the directory
-# containing $f, in $tst the test, in $log the log, and passes
-# TESTS_ENVIRONMENT. Save and restore TERM around use of
-# TESTS_ENVIRONMENT, in case that unsets it.
-am__check_pre = \
-$(am__sh_e_setup); \
-$(am__vpath_adj_setup) $(am__vpath_adj) \
-srcdir=$(srcdir); export srcdir; \
-rm -f $@-t; \
-am__trap='rm -f '\''$(abs_builddir)/$@-t'\''; (exit $$st); exit $$st'; \
-trap "st=129; $$am__trap" 1; trap "st=130; $$am__trap" 2; \
-trap "st=141; $$am__trap" 13; trap "st=143; $$am__trap" 15; \
-am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`; \
-test "x$$am__odir" = x. || $(MKDIR_P) "$$am__odir" || exit $$?; \
-if test -f "./$$f"; then dir=./; \
-elif test -f "$$f"; then dir=; \
-else dir="$(srcdir)/"; fi; \
-tst=$$dir$$f; log='$@'; __SAVED_TERM=$$TERM; \
-$(TESTS_ENVIRONMENT)
-# To be appended to the command running the test. Handle the stdout
-# and stderr redirection, and catch the exit status.
-am__check_post = \
->$@-t 2>&1; \
-estatus=$$?; \
-if test -n '$(DISABLE_HARD_ERRORS)' \
- && test $$estatus -eq 99; then \
- estatus=1; \
-fi; \
-TERM=$$__SAVED_TERM; export TERM; \
-$(am__tty_colors); \
-xfailed=PASS; \
-case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
- xfailed=XFAIL;; \
-esac; \
-case $$estatus.$$xfailed in \
- 0.XFAIL) col=$$red; res=XPASS;; \
- 0.*) col=$$grn; res=PASS ;; \
- 77.*) col=$$blu; res=SKIP ;; \
- 99.*) col=$$red; res=FAIL ;; \
- *.XFAIL) col=$$lgn; res=XFAIL;; \
- *.*) col=$$red; res=FAIL ;; \
-esac; \
-echo "$${col}$$res$${std}: $$f"; \
-echo "$$res: $$f (exit: $$estatus)" | \
- $(am__rst_section) >$@; \
-cat $@-t >>$@; \
-rm -f $@-t
-RECHECK_LOGS = $(TEST_LOGS)
-AM_RECURSIVE_TARGETS = check recheck check-html recheck-html
-TEST_SUITE_HTML = $(TEST_SUITE_LOG:.log=.html)
-TEST_SUITE_LOG = test-suite.log
-am__test_logs1 = $(TESTS:=.log)
-am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
-TEST_LOGS = $(am__test_logs2:.sh.log=.log)
-SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
-TEST_LOGS_TMP = $(TEST_LOGS:.log=.log-t)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
- if test -d "$(distdir)"; then \
- find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
- && rm -rf "$(distdir)" \
- || { sleep 5 && rm -rf "$(distdir)"; }; \
- else :; fi
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
- | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MANIFEST_TOOL = @MANIFEST_TOOL@
-MD5 = @MD5@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STATIC_FLAGS = @STATIC_FLAGS@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-ACLOCAL_AMFLAGS = -I m4
-EXTRA_DIST = doc/jellyfish.pdf doc/jellyfish.man README LICENSE \
- HalfLICENSE jellyfish/cite_cmdline.hpp \
- jellyfish/query_cmdline.hpp jellyfish/hash_merge_cmdline.hpp \
- jellyfish/histo_main_cmdline.hpp \
- jellyfish/stats_main_cmdline.hpp \
- jellyfish/histo_fastq_main_cmdline.hpp \
- jellyfish/dump_fastq_main_cmdline.hpp \
- jellyfish/count_main_cmdline.hpp \
- jellyfish/hash_fastq_merge_cmdline.hpp \
- jellyfish/dump_main_cmdline.hpp \
- jellyfish/double_fifo_input.hpp \
- jellyfish/simple_growing_array.hpp jellyfish/backtrace.hpp \
- jellyfish/noop_dumper.hpp jellyfish/yaggo.hpp \
- jellyfish/fstream_default.hpp jellyfish/randomc.h \
- jellyfish/generate_sequence_cmdline.hpp $(TESTS) $(GTEST_SRC)
-man1_MANS = doc/jellyfish.man
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = jellyfish-1.1.pc
-AM_LDFLAGS = -lpthread
-AM_CPPFLAGS = -Wall -Wnon-virtual-dtor -I$(top_srcdir)
-AM_CXXFLAGS = -g -O3
-LDADD = libjellyfish-1.1.la
-
-# What to build
-lib_LTLIBRARIES = libjellyfish-1.1.la
-
-########################################
-# Build Jellyfish the exec
-########################################
-bin_jellyfish_SOURCES = jellyfish/jellyfish.cc \
- jellyfish/stats_main.cc \
- jellyfish/hash_merge.cc \
- jellyfish/mer_counter.cc \
- jellyfish/histo_main.cc \
- jellyfish/dump_main.cc \
- jellyfish/query_main.cc \
- jellyfish/dump_fastq_main.cc \
- jellyfish/histo_fastq_main.cc \
- jellyfish/cite.cc \
- jellyfish/hash_fastq_merge.cc \
- jellyfish/yaggo.cpp
-
-# bin_jellyfish_LDADD = libjellyfish-1.1.la
-bin_jellyfish_LDFLAGS = $(AM_LDFLAGS) $(STATIC_FLAGS)
-
-########################################
-# Build Jellyfish the shared library
-########################################
-libjellyfish_srcs = jellyfish/square_binary_matrix.cc \
- jellyfish/err.cc jellyfish/misc.cc \
- jellyfish/storage.cc jellyfish/thread_exec.cc \
- jellyfish/time.cc jellyfish/file_parser.cc \
- jellyfish/read_parser.cc \
- jellyfish/parse_read.cc jellyfish/half.cpp \
- jellyfish/mapped_file.cc \
- jellyfish/parse_dna.cc \
- jellyfish/parse_quake.cc \
- jellyfish/parse_qual_dna.cc \
- jellyfish/sequence_parser.cc \
- jellyfish/seq_qual_parser.cc \
- jellyfish/backtrace.cc jellyfish/floats.cc \
- jellyfish/dbg.cc jellyfish/allocators_mmap.cc \
- jellyfish/dna_codes.cc
-
-libjellyfish_1_1_la_SOURCES = $(libjellyfish_srcs)
-libjellyfish_1_1_la_LDFLAGS = -version-info 1:1:0
-library_includedir = $(includedir)/jellyfish- at PACKAGE_VERSION@/jellyfish
-library_include_HEADERS = jellyfish/allocators_malloc.hpp \
- jellyfish/allocators_mmap.hpp \
- jellyfish/allocators_shm.hpp \
- jellyfish/atomic_gcc.hpp \
- jellyfish/compacted_dumper.hpp \
- jellyfish/compacted_hash.hpp \
- jellyfish/concurrent_queues.hpp \
- jellyfish/direct_indexing_array.hpp \
- jellyfish/direct_sorted_dumper.hpp \
- jellyfish/divisor.hpp jellyfish/dumper.hpp \
- jellyfish/hash_function.hpp \
- jellyfish/hash.hpp jellyfish/heap.hpp \
- jellyfish/invertible_hash_array.hpp \
- jellyfish/locking_hash_counters.hpp \
- jellyfish/locks_pthread.hpp \
- jellyfish/mapped_file.hpp \
- jellyfish/mer_counting.hpp \
- jellyfish/err.hpp jellyfish/misc.hpp \
- jellyfish/offsets_key_value.hpp \
- jellyfish/reversible_hash_function.hpp \
- jellyfish/sorted_dumper.hpp \
- jellyfish/square_binary_matrix.hpp \
- jellyfish/storage.hpp \
- jellyfish/thread_exec.hpp \
- jellyfish/time.hpp jellyfish/token_ring.hpp \
- jellyfish/raw_dumper.hpp \
- jellyfish/capped_integer.hpp \
- jellyfish/aligned_values_array.hpp \
- jellyfish/fastq_dumper.hpp \
- jellyfish/floats.hpp \
- jellyfish/circular_buffer.hpp \
- jellyfish/counter.hpp \
- jellyfish/parse_quake.hpp \
- jellyfish/parse_dna.hpp \
- jellyfish/parse_qual_dna.hpp \
- jellyfish/file_parser.hpp \
- jellyfish/sequence_parser.hpp \
- jellyfish/seq_qual_parser.hpp \
- jellyfish/double_fifo_input.hpp \
- jellyfish/read_parser.hpp \
- jellyfish/parse_read.hpp \
- jellyfish/simple_growing_array.hpp \
- jellyfish/toFloat.h jellyfish/eLut.h \
- jellyfish/dbg.hpp jellyfish/half.h \
- jellyfish/backtrace.hpp \
- jellyfish/dna_codes.hpp \
- jellyfish/simple_circular_buffer.hpp
-
-
-########################################
-# Build tests
-########################################
-bin_generate_sequence_SOURCES = jellyfish/generate_sequence.cc \
- jellyfish/mersenne.cpp
-
-bin_test_double_fifo_input_SOURCES = jellyfish/test_double_fifo_input.cc
-bin_test_read_parser_SOURCES = jellyfish/test_read_parser.cc
-
-########################################
-# Tests
-########################################
-TEST_EXTENSIONS = .sh
-SH_LOG_COMPILER = /bin/sh
-AM_SH_LOG_FLAGS =
-
-########################################
-# Unit tests
-########################################
-TESTS = tests/generate_sequence.sh tests/serial_hashing.sh \
- tests/parallel_hashing.sh tests/serial_direct_indexing.sh \
- tests/parallel_direct_indexing.sh tests/raw_hash.sh \
- tests/generate_fastq_sequence.sh \
- tests/parallel_fastq_hashing.sh tests/multi_file.sh \
- tests/multi_file_fastq.sh tests/from_stream.sh \
- tests/parallel_fastq_sequence_hashing.sh \
- tests/from_stream_fastq.sh tests/merge.sh tests/min_qual.sh \
- tests/big.sh tests/parsers.sh tests/small.sh \
- tests/parallel_fastq_direct_indexing.sh \
- unit_tests/unit_tests.sh
-bin_test_all_SOURCES = unit_tests/test_offsets_key_value.cc \
- unit_tests/test_simple_circular_buffer.cc \
- unit_tests/test_square_binary_matrix.cc
-
-bin_test_all_CXXFLAGS = -I$(top_srcdir)/unit_tests/gtest/include -I$(top_srcdir)/unit_tests/gtest
-bin_test_all_LDADD = libgtest_main.a libgtest.a $(LDADD)
-
-##############################
-# Gtest build.
-##############################
-# Build rules for libraries.
-# check_LTLIBRARIES = libgtest.la libgtest_main.la
-check_LIBRARIES = libgtest.a libgtest_main.a
-libgtest_a_SOURCES = unit_tests/gtest/src/gtest-all.cc
-libgtest_main_a_SOURCES = unit_tests/gtest/src/gtest_main.cc
-libgtest_main_a_LIBADD = libgtest.a
-libgtest_a_CXXFLAGS = -I$(top_srcdir)/unit_tests/gtest \
--I$(top_srcdir)/unit_tests/gtest/include
-
-libgtest_main_a_CXXFLAGS = -I$(top_srcdir)/unit_tests/gtest \
--I$(top_srcdir)/unit_tests/gtest/include
-
-
-# gtest source files that we don't compile directly. They are
-# #included by gtest-all.cc.
-GTEST_SRC = unit_tests/gtest/src/gtest-death-test.cc \
- unit_tests/gtest/src/gtest-filepath.cc \
- unit_tests/gtest/src/gtest-internal-inl.h \
- unit_tests/gtest/src/gtest-port.cc \
- unit_tests/gtest/src/gtest-printers.cc \
- unit_tests/gtest/src/gtest-test-part.cc \
- unit_tests/gtest/src/gtest-typed-test.cc \
- unit_tests/gtest/src/gtest.cc
-
-
-# Headers, not installed
-GTEST_I = unit_tests/gtest/include/gtest
-noinst_HEADERS = $(GTEST_I)/gtest-death-test.h \
- $(GTEST_I)/gtest-message.h \
- $(GTEST_I)/gtest-param-test.h \
- $(GTEST_I)/gtest-printers.h $(GTEST_I)/gtest-spi.h \
- $(GTEST_I)/gtest-test-part.h \
- $(GTEST_I)/gtest-typed-test.h $(GTEST_I)/gtest.h \
- $(GTEST_I)/gtest_pred_impl.h $(GTEST_I)/gtest_prod.h \
- $(GTEST_I)/internal/gtest-death-test-internal.h \
- $(GTEST_I)/internal/gtest-filepath.h \
- $(GTEST_I)/internal/gtest-internal.h \
- $(GTEST_I)/internal/gtest-linked_ptr.h \
- $(GTEST_I)/internal/gtest-param-util-generated.h \
- $(GTEST_I)/internal/gtest-param-util.h \
- $(GTEST_I)/internal/gtest-port.h \
- $(GTEST_I)/internal/gtest-string.h \
- $(GTEST_I)/internal/gtest-tuple.h \
- $(GTEST_I)/internal/gtest-type-util.h
-
-all: config.h
- $(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .cc .cpp .html .lo .log .o .obj .sh .sh$(EXEEXT)
-am--refresh: Makefile
- @:
-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/gtest.mk $(am__configure_deps)
- @for dep in $?; do \
- case '$(am__configure_deps)' in \
- *$$dep*) \
- echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
- $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
- && exit 0; \
- exit 1;; \
- esac; \
- done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
- $(am__cd) $(top_srcdir) && \
- $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- @case '$?' in \
- *config.status*) \
- echo ' $(SHELL) ./config.status'; \
- $(SHELL) ./config.status;; \
- *) \
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
- cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
- esac;
-$(srcdir)/gtest.mk:
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- $(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure: $(am__configure_deps)
- $(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4): $(am__aclocal_m4_deps)
- $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-
-config.h: stamp-h1
- @if test ! -f $@; then rm -f stamp-h1; else :; fi
- @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
- @rm -f stamp-h1
- cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in: $(am__configure_deps)
- ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
- rm -f stamp-h1
- touch $@
-
-distclean-hdr:
- -rm -f config.h stamp-h1
-tests/compat.sh: $(top_builddir)/config.status $(top_srcdir)/tests/compat.sh.in
- cd $(top_builddir) && $(SHELL) ./config.status $@
-jellyfish-1.1.pc: $(top_builddir)/config.status $(srcdir)/jellyfish-1.1.pc.in
- cd $(top_builddir) && $(SHELL) ./config.status $@
-
-clean-checkLIBRARIES:
- -test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES)
-unit_tests/gtest/src/$(am__dirstamp):
- @$(MKDIR_P) unit_tests/gtest/src
- @: > unit_tests/gtest/src/$(am__dirstamp)
-unit_tests/gtest/src/$(DEPDIR)/$(am__dirstamp):
- @$(MKDIR_P) unit_tests/gtest/src/$(DEPDIR)
- @: > unit_tests/gtest/src/$(DEPDIR)/$(am__dirstamp)
-unit_tests/gtest/src/libgtest_a-gtest-all.$(OBJEXT): \
- unit_tests/gtest/src/$(am__dirstamp) \
- unit_tests/gtest/src/$(DEPDIR)/$(am__dirstamp)
-libgtest.a: $(libgtest_a_OBJECTS) $(libgtest_a_DEPENDENCIES) $(EXTRA_libgtest_a_DEPENDENCIES)
- $(AM_V_at)-rm -f libgtest.a
- $(AM_V_AR)$(libgtest_a_AR) libgtest.a $(libgtest_a_OBJECTS) $(libgtest_a_LIBADD)
- $(AM_V_at)$(RANLIB) libgtest.a
-unit_tests/gtest/src/libgtest_main_a-gtest_main.$(OBJEXT): \
- unit_tests/gtest/src/$(am__dirstamp) \
- unit_tests/gtest/src/$(DEPDIR)/$(am__dirstamp)
-libgtest_main.a: $(libgtest_main_a_OBJECTS) $(libgtest_main_a_DEPENDENCIES) $(EXTRA_libgtest_main_a_DEPENDENCIES)
- $(AM_V_at)-rm -f libgtest_main.a
- $(AM_V_AR)$(libgtest_main_a_AR) libgtest_main.a $(libgtest_main_a_OBJECTS) $(libgtest_main_a_LIBADD)
- $(AM_V_at)$(RANLIB) libgtest_main.a
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
- @$(NORMAL_INSTALL)
- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
- list2=; for p in $$list; do \
- if test -f $$p; then \
- list2="$$list2 $$p"; \
- else :; fi; \
- done; \
- test -z "$$list2" || { \
- echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
- }
-
-uninstall-libLTLIBRARIES:
- @$(NORMAL_UNINSTALL)
- @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
- for p in $$list; do \
- $(am__strip_dir) \
- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
- done
-
-clean-libLTLIBRARIES:
- -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
- test "$$dir" != "$$p" || dir=.; \
- echo "rm -f \"$${dir}/so_locations\""; \
- rm -f "$${dir}/so_locations"; \
- done
-jellyfish/$(am__dirstamp):
- @$(MKDIR_P) jellyfish
- @: > jellyfish/$(am__dirstamp)
-jellyfish/$(DEPDIR)/$(am__dirstamp):
- @$(MKDIR_P) jellyfish/$(DEPDIR)
- @: > jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/square_binary_matrix.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/err.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/misc.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/storage.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/thread_exec.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/time.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/file_parser.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/read_parser.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/parse_read.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/half.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/mapped_file.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/parse_dna.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/parse_quake.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/parse_qual_dna.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/sequence_parser.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/seq_qual_parser.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/backtrace.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/floats.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/dbg.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/allocators_mmap.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/dna_codes.lo: jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-libjellyfish-1.1.la: $(libjellyfish_1_1_la_OBJECTS) $(libjellyfish_1_1_la_DEPENDENCIES) $(EXTRA_libjellyfish_1_1_la_DEPENDENCIES)
- $(AM_V_CXXLD)$(libjellyfish_1_1_la_LINK) -rpath $(libdir) $(libjellyfish_1_1_la_OBJECTS) $(libjellyfish_1_1_la_LIBADD) $(LIBS)
-install-binPROGRAMS: $(bin_PROGRAMS)
- @$(NORMAL_INSTALL)
- @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
- fi; \
- for p in $$list; do echo "$$p $$p"; done | \
- sed 's/$(EXEEXT)$$//' | \
- while read p p1; do if test -f $$p || test -f $$p1; \
- then echo "$$p"; echo "$$p"; else :; fi; \
- done | \
- sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
- -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
- sed 'N;N;N;s,\n, ,g' | \
- $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
- { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
- if ($$2 == $$4) files[d] = files[d] " " $$1; \
- else { print "f", $$3 "/" $$4, $$1; } } \
- END { for (d in files) print "f", d, files[d] }' | \
- while read type dir files; do \
- if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
- test -z "$$files" || { \
- echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
- $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
- } \
- ; done
-
-uninstall-binPROGRAMS:
- @$(NORMAL_UNINSTALL)
- @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
- files=`for p in $$list; do echo "$$p"; done | \
- sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
- -e 's/$$/$(EXEEXT)/' `; \
- test -n "$$list" || exit 0; \
- echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(bindir)" && rm -f $$files
-
-clean-binPROGRAMS:
- @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
- echo " rm -f" $$list; \
- rm -f $$list || exit $$?; \
- test -n "$(EXEEXT)" || exit 0; \
- list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f" $$list; \
- rm -f $$list
-
-clean-checkPROGRAMS:
- @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
- echo " rm -f" $$list; \
- rm -f $$list || exit $$?; \
- test -n "$(EXEEXT)" || exit 0; \
- list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f" $$list; \
- rm -f $$list
-jellyfish/generate_sequence.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/mersenne.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-bin/$(am__dirstamp):
- @$(MKDIR_P) bin
- @: > bin/$(am__dirstamp)
-bin/generate_sequence$(EXEEXT): $(bin_generate_sequence_OBJECTS) $(bin_generate_sequence_DEPENDENCIES) $(EXTRA_bin_generate_sequence_DEPENDENCIES) bin/$(am__dirstamp)
- @rm -f bin/generate_sequence$(EXEEXT)
- $(AM_V_CXXLD)$(CXXLINK) $(bin_generate_sequence_OBJECTS) $(bin_generate_sequence_LDADD) $(LIBS)
-jellyfish/jellyfish.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/stats_main.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/hash_merge.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/mer_counter.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/histo_main.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/dump_main.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/query_main.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/dump_fastq_main.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/histo_fastq_main.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/cite.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/hash_fastq_merge.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-jellyfish/yaggo.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-bin/jellyfish$(EXEEXT): $(bin_jellyfish_OBJECTS) $(bin_jellyfish_DEPENDENCIES) $(EXTRA_bin_jellyfish_DEPENDENCIES) bin/$(am__dirstamp)
- @rm -f bin/jellyfish$(EXEEXT)
- $(AM_V_CXXLD)$(bin_jellyfish_LINK) $(bin_jellyfish_OBJECTS) $(bin_jellyfish_LDADD) $(LIBS)
-unit_tests/$(am__dirstamp):
- @$(MKDIR_P) unit_tests
- @: > unit_tests/$(am__dirstamp)
-unit_tests/$(DEPDIR)/$(am__dirstamp):
- @$(MKDIR_P) unit_tests/$(DEPDIR)
- @: > unit_tests/$(DEPDIR)/$(am__dirstamp)
-unit_tests/bin_test_all-test_offsets_key_value.$(OBJEXT): \
- unit_tests/$(am__dirstamp) \
- unit_tests/$(DEPDIR)/$(am__dirstamp)
-unit_tests/bin_test_all-test_simple_circular_buffer.$(OBJEXT): \
- unit_tests/$(am__dirstamp) \
- unit_tests/$(DEPDIR)/$(am__dirstamp)
-unit_tests/bin_test_all-test_square_binary_matrix.$(OBJEXT): \
- unit_tests/$(am__dirstamp) \
- unit_tests/$(DEPDIR)/$(am__dirstamp)
-bin/test_all$(EXEEXT): $(bin_test_all_OBJECTS) $(bin_test_all_DEPENDENCIES) $(EXTRA_bin_test_all_DEPENDENCIES) bin/$(am__dirstamp)
- @rm -f bin/test_all$(EXEEXT)
- $(AM_V_CXXLD)$(bin_test_all_LINK) $(bin_test_all_OBJECTS) $(bin_test_all_LDADD) $(LIBS)
-jellyfish/test_double_fifo_input.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-bin/test_double_fifo_input$(EXEEXT): $(bin_test_double_fifo_input_OBJECTS) $(bin_test_double_fifo_input_DEPENDENCIES) $(EXTRA_bin_test_double_fifo_input_DEPENDENCIES) bin/$(am__dirstamp)
- @rm -f bin/test_double_fifo_input$(EXEEXT)
- $(AM_V_CXXLD)$(CXXLINK) $(bin_test_double_fifo_input_OBJECTS) $(bin_test_double_fifo_input_LDADD) $(LIBS)
-jellyfish/test_read_parser.$(OBJEXT): jellyfish/$(am__dirstamp) \
- jellyfish/$(DEPDIR)/$(am__dirstamp)
-bin/test_read_parser$(EXEEXT): $(bin_test_read_parser_OBJECTS) $(bin_test_read_parser_DEPENDENCIES) $(EXTRA_bin_test_read_parser_DEPENDENCIES) bin/$(am__dirstamp)
- @rm -f bin/test_read_parser$(EXEEXT)
- $(AM_V_CXXLD)$(CXXLINK) $(bin_test_read_parser_OBJECTS) $(bin_test_read_parser_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
- -rm -f jellyfish/allocators_mmap.$(OBJEXT)
- -rm -f jellyfish/allocators_mmap.lo
- -rm -f jellyfish/backtrace.$(OBJEXT)
- -rm -f jellyfish/backtrace.lo
- -rm -f jellyfish/cite.$(OBJEXT)
- -rm -f jellyfish/dbg.$(OBJEXT)
- -rm -f jellyfish/dbg.lo
- -rm -f jellyfish/dna_codes.$(OBJEXT)
- -rm -f jellyfish/dna_codes.lo
- -rm -f jellyfish/dump_fastq_main.$(OBJEXT)
- -rm -f jellyfish/dump_main.$(OBJEXT)
- -rm -f jellyfish/err.$(OBJEXT)
- -rm -f jellyfish/err.lo
- -rm -f jellyfish/file_parser.$(OBJEXT)
- -rm -f jellyfish/file_parser.lo
- -rm -f jellyfish/floats.$(OBJEXT)
- -rm -f jellyfish/floats.lo
- -rm -f jellyfish/generate_sequence.$(OBJEXT)
- -rm -f jellyfish/half.$(OBJEXT)
- -rm -f jellyfish/half.lo
- -rm -f jellyfish/hash_fastq_merge.$(OBJEXT)
- -rm -f jellyfish/hash_merge.$(OBJEXT)
- -rm -f jellyfish/histo_fastq_main.$(OBJEXT)
- -rm -f jellyfish/histo_main.$(OBJEXT)
- -rm -f jellyfish/jellyfish.$(OBJEXT)
- -rm -f jellyfish/mapped_file.$(OBJEXT)
- -rm -f jellyfish/mapped_file.lo
- -rm -f jellyfish/mer_counter.$(OBJEXT)
- -rm -f jellyfish/mersenne.$(OBJEXT)
- -rm -f jellyfish/misc.$(OBJEXT)
- -rm -f jellyfish/misc.lo
- -rm -f jellyfish/parse_dna.$(OBJEXT)
- -rm -f jellyfish/parse_dna.lo
- -rm -f jellyfish/parse_quake.$(OBJEXT)
- -rm -f jellyfish/parse_quake.lo
- -rm -f jellyfish/parse_qual_dna.$(OBJEXT)
- -rm -f jellyfish/parse_qual_dna.lo
- -rm -f jellyfish/parse_read.$(OBJEXT)
- -rm -f jellyfish/parse_read.lo
- -rm -f jellyfish/query_main.$(OBJEXT)
- -rm -f jellyfish/read_parser.$(OBJEXT)
- -rm -f jellyfish/read_parser.lo
- -rm -f jellyfish/seq_qual_parser.$(OBJEXT)
- -rm -f jellyfish/seq_qual_parser.lo
- -rm -f jellyfish/sequence_parser.$(OBJEXT)
- -rm -f jellyfish/sequence_parser.lo
- -rm -f jellyfish/square_binary_matrix.$(OBJEXT)
- -rm -f jellyfish/square_binary_matrix.lo
- -rm -f jellyfish/stats_main.$(OBJEXT)
- -rm -f jellyfish/storage.$(OBJEXT)
- -rm -f jellyfish/storage.lo
- -rm -f jellyfish/test_double_fifo_input.$(OBJEXT)
- -rm -f jellyfish/test_read_parser.$(OBJEXT)
- -rm -f jellyfish/thread_exec.$(OBJEXT)
- -rm -f jellyfish/thread_exec.lo
- -rm -f jellyfish/time.$(OBJEXT)
- -rm -f jellyfish/time.lo
- -rm -f jellyfish/yaggo.$(OBJEXT)
- -rm -f unit_tests/bin_test_all-test_offsets_key_value.$(OBJEXT)
- -rm -f unit_tests/bin_test_all-test_simple_circular_buffer.$(OBJEXT)
- -rm -f unit_tests/bin_test_all-test_square_binary_matrix.$(OBJEXT)
- -rm -f unit_tests/gtest/src/libgtest_a-gtest-all.$(OBJEXT)
- -rm -f unit_tests/gtest/src/libgtest_main_a-gtest_main.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/allocators_mmap.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/backtrace.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/cite.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/dbg.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/dna_codes.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/dump_fastq_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/dump_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/err.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/file_parser.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/floats.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/generate_sequence.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/half.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/hash_fastq_merge.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/hash_merge.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/histo_fastq_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/histo_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/jellyfish.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/mapped_file.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/mer_counter.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/mersenne.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/misc.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/parse_dna.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/parse_quake.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/parse_qual_dna.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/parse_read.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/query_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/read_parser.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/seq_qual_parser.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/sequence_parser.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/square_binary_matrix.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/stats_main.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/storage.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/test_double_fifo_input.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/test_read_parser.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/thread_exec.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/time.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at jellyfish/$(DEPDIR)/yaggo.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Po at am__quote@
-
-.cc.o:
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
- at am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
- at am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
-
-.cc.obj:
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
- at am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
- at am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cc.lo:
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
- at am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
- at am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
-
-unit_tests/gtest/src/libgtest_a-gtest-all.o: unit_tests/gtest/src/gtest-all.cc
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_a_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/gtest/src/libgtest_a-gtest-all.o -MD -MP -MF unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Tpo -c -o unit_tests/gtest/src/libgtest_a-gtest-all.o `test -f 'unit_tests/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`unit_tests/gtest/src/gtest-all.cc
- at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Tpo unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='unit_tests/gtest/src/gtest-all.cc' object='unit_tests/gtest/src/libgtest_a-gtest-all.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_a_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/gtest/src/libgtest_a-gtest-all.o `test -f 'unit_tests/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`unit_tests/gtest/src/gtest-all.cc
-
-unit_tests/gtest/src/libgtest_a-gtest-all.obj: unit_tests/gtest/src/gtest-all.cc
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_a_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/gtest/src/libgtest_a-gtest-all.obj -MD -MP -MF unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Tpo -c -o unit_tests/gtest/src/libgtest_a-gtest-all.obj `if test -f 'unit_tests/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'unit_tests/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/gtest/src/gtest-all.cc'; fi`
- at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Tpo unit_tests/gtest/src/$(DEPDIR)/libgtest_a-gtest-all.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='unit_tests/gtest/src/gtest-all.cc' object='unit_tests/gtest/src/libgtest_a-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_a_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/gtest/src/libgtest_a-gtest-all.obj `if test -f 'unit_tests/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'unit_tests/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/gtest/src/gtest-all.cc'; fi`
-
-unit_tests/gtest/src/libgtest_main_a-gtest_main.o: unit_tests/gtest/src/gtest_main.cc
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_main_a_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/gtest/src/libgtest_main_a-gtest_main.o -MD -MP -MF unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Tpo -c -o unit_tests/gtest/src/libgtest_main_a-gtest_main.o `test -f 'unit_tests/gtest/src/gtest_main.cc' || echo '$(srcdir)/'`unit_tests/gtest/src/gtest_main.cc
- at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Tpo unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='unit_tests/gtest/src/gtest_main.cc' object='unit_tests/gtest/src/libgtest_main_a-gtest_main.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_main_a_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/gtest/src/libgtest_main_a-gtest_main.o `test -f 'unit_tests/gtest/src/gtest_main.cc' || echo '$(srcdir)/'`unit_tests/gtest/src/gtest_main.cc
-
-unit_tests/gtest/src/libgtest_main_a-gtest_main.obj: unit_tests/gtest/src/gtest_main.cc
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_main_a_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/gtest/src/libgtest_main_a-gtest_main.obj -MD -MP -MF unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Tpo -c -o unit_tests/gtest/src/libgtest_main_a-gtest_main.obj `if test -f 'unit_tests/gtest/src/gtest_main.cc'; then $(CYGPATH_W) 'unit_tests/gtest/src/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/gtest/src/g [...]
- at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Tpo unit_tests/gtest/src/$(DEPDIR)/libgtest_main_a-gtest_main.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='unit_tests/gtest/src/gtest_main.cc' object='unit_tests/gtest/src/libgtest_main_a-gtest_main.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgtest_main_a_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/gtest/src/libgtest_main_a-gtest_main.obj `if test -f 'unit_tests/gtest/src/gtest_main.cc'; then $(CYGPATH_W) 'unit_tests/gtest/src/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/gtest/src/gtest_main.cc'; fi`
-
-unit_tests/bin_test_all-test_offsets_key_value.o: unit_tests/test_offsets_key_value.cc
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/bin_test_all-test_offsets_key_value.o -MD -MP -MF unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Tpo -c -o unit_tests/bin_test_all-test_offsets_key_value.o `test -f 'unit_tests/test_offsets_key_value.cc' || echo '$(srcdir)/'`unit_tests/test_offsets_key_value.cc
- at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Tpo unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='unit_tests/test_offsets_key_value.cc' object='unit_tests/bin_test_all-test_offsets_key_value.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/bin_test_all-test_offsets_key_value.o `test -f 'unit_tests/test_offsets_key_value.cc' || echo '$(srcdir)/'`unit_tests/test_offsets_key_value.cc
-
-unit_tests/bin_test_all-test_offsets_key_value.obj: unit_tests/test_offsets_key_value.cc
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/bin_test_all-test_offsets_key_value.obj -MD -MP -MF unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Tpo -c -o unit_tests/bin_test_all-test_offsets_key_value.obj `if test -f 'unit_tests/test_offsets_key_value.cc'; then $(CYGPATH_W) 'unit_tests/test_offsets_key_value.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/test_offsets_ [...]
- at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Tpo unit_tests/$(DEPDIR)/bin_test_all-test_offsets_key_value.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='unit_tests/test_offsets_key_value.cc' object='unit_tests/bin_test_all-test_offsets_key_value.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/bin_test_all-test_offsets_key_value.obj `if test -f 'unit_tests/test_offsets_key_value.cc'; then $(CYGPATH_W) 'unit_tests/test_offsets_key_value.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/test_offsets_key_value.cc'; fi`
-
-unit_tests/bin_test_all-test_simple_circular_buffer.o: unit_tests/test_simple_circular_buffer.cc
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/bin_test_all-test_simple_circular_buffer.o -MD -MP -MF unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Tpo -c -o unit_tests/bin_test_all-test_simple_circular_buffer.o `test -f 'unit_tests/test_simple_circular_buffer.cc' || echo '$(srcdir)/'`unit_tests/test_simple_circular_buffer.cc
- at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Tpo unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='unit_tests/test_simple_circular_buffer.cc' object='unit_tests/bin_test_all-test_simple_circular_buffer.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/bin_test_all-test_simple_circular_buffer.o `test -f 'unit_tests/test_simple_circular_buffer.cc' || echo '$(srcdir)/'`unit_tests/test_simple_circular_buffer.cc
-
-unit_tests/bin_test_all-test_simple_circular_buffer.obj: unit_tests/test_simple_circular_buffer.cc
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/bin_test_all-test_simple_circular_buffer.obj -MD -MP -MF unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Tpo -c -o unit_tests/bin_test_all-test_simple_circular_buffer.obj `if test -f 'unit_tests/test_simple_circular_buffer.cc'; then $(CYGPATH_W) 'unit_tests/test_simple_circular_buffer.cc'; else $(CYGPATH_W) '$(srcdir) [...]
- at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Tpo unit_tests/$(DEPDIR)/bin_test_all-test_simple_circular_buffer.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='unit_tests/test_simple_circular_buffer.cc' object='unit_tests/bin_test_all-test_simple_circular_buffer.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/bin_test_all-test_simple_circular_buffer.obj `if test -f 'unit_tests/test_simple_circular_buffer.cc'; then $(CYGPATH_W) 'unit_tests/test_simple_circular_buffer.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/test_simple_circular_buffer.cc'; fi`
-
-unit_tests/bin_test_all-test_square_binary_matrix.o: unit_tests/test_square_binary_matrix.cc
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/bin_test_all-test_square_binary_matrix.o -MD -MP -MF unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Tpo -c -o unit_tests/bin_test_all-test_square_binary_matrix.o `test -f 'unit_tests/test_square_binary_matrix.cc' || echo '$(srcdir)/'`unit_tests/test_square_binary_matrix.cc
- at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Tpo unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='unit_tests/test_square_binary_matrix.cc' object='unit_tests/bin_test_all-test_square_binary_matrix.o' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/bin_test_all-test_square_binary_matrix.o `test -f 'unit_tests/test_square_binary_matrix.cc' || echo '$(srcdir)/'`unit_tests/test_square_binary_matrix.cc
-
-unit_tests/bin_test_all-test_square_binary_matrix.obj: unit_tests/test_square_binary_matrix.cc
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -MT unit_tests/bin_test_all-test_square_binary_matrix.obj -MD -MP -MF unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Tpo -c -o unit_tests/bin_test_all-test_square_binary_matrix.obj `if test -f 'unit_tests/test_square_binary_matrix.cc'; then $(CYGPATH_W) 'unit_tests/test_square_binary_matrix.cc'; else $(CYGPATH_W) '$(srcdir)/unit_test [...]
- at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Tpo unit_tests/$(DEPDIR)/bin_test_all-test_square_binary_matrix.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='unit_tests/test_square_binary_matrix.cc' object='unit_tests/bin_test_all-test_square_binary_matrix.obj' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bin_test_all_CXXFLAGS) $(CXXFLAGS) -c -o unit_tests/bin_test_all-test_square_binary_matrix.obj `if test -f 'unit_tests/test_square_binary_matrix.cc'; then $(CYGPATH_W) 'unit_tests/test_square_binary_matrix.cc'; else $(CYGPATH_W) '$(srcdir)/unit_tests/test_square_binary_matrix.cc'; fi`
-
-.cpp.o:
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
- at am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
- at am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
-
-.cpp.obj:
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
- at am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
- at am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cpp.lo:
- at am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
- at am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
- at am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCXX_FALSE@ $(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
- -rm -rf bin/.libs bin/_libs
- -rm -rf jellyfish/.libs jellyfish/_libs
-
-distclean-libtool:
- -rm -f libtool config.lt
-install-man1: $(man1_MANS)
- @$(NORMAL_INSTALL)
- @list1='$(man1_MANS)'; \
- list2=''; \
- test -n "$(man1dir)" \
- && test -n "`echo $$list1$$list2`" \
- || exit 0; \
- echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
- { for i in $$list1; do echo "$$i"; done; \
- if test -n "$$list2"; then \
- for i in $$list2; do echo "$$i"; done \
- | sed -n '/\.1[a-z]*$$/p'; \
- fi; \
- } | while read p; do \
- if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; echo "$$p"; \
- done | \
- sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
- -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
- sed 'N;N;s,\n, ,g' | { \
- list=; while read file base inst; do \
- if test "$$base" = "$$inst"; then list="$$list $$file"; else \
- echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
- $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
- fi; \
- done; \
- for i in $$list; do echo "$$i"; done | $(am__base_list) | \
- while read files; do \
- test -z "$$files" || { \
- echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
- $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
- done; }
-
-uninstall-man1:
- @$(NORMAL_UNINSTALL)
- @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \
- files=`{ for i in $$list; do echo "$$i"; done; \
- } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
- -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
- dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
-install-pkgconfigDATA: $(pkgconfig_DATA)
- @$(NORMAL_INSTALL)
- @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
- $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
- done
-
-uninstall-pkgconfigDATA:
- @$(NORMAL_UNINSTALL)
- @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
-install-library_includeHEADERS: $(library_include_HEADERS)
- @$(NORMAL_INSTALL)
- @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(library_includedir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(library_includedir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(library_includedir)'"; \
- $(INSTALL_HEADER) $$files "$(DESTDIR)$(library_includedir)" || exit $$?; \
- done
-
-uninstall-library_includeHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(library_include_HEADERS)'; test -n "$(library_includedir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(library_includedir)'; $(am__uninstall_files_from_dir)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- set x; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- shift; \
- if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- if test $$# -gt 0; then \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- "$$@" $$unique; \
- else \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$unique; \
- fi; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- test -z "$(CTAGS_ARGS)$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && $(am__cd) $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-$(TEST_SUITE_LOG): $(TEST_LOGS)
- @$(am__sh_e_setup); \
- list='$(TEST_LOGS)'; \
- results=`for f in $$list; do \
- test -r $$f && read line < $$f && echo "$$line" \
- || echo FAIL; \
- done`; \
- all=`echo "$$results" | sed '/^$$/d' | wc -l | sed -e 's/^[ ]*//'`; \
- fail=`echo "$$results" | grep -c '^FAIL'`; \
- pass=`echo "$$results" | grep -c '^PASS'`; \
- skip=`echo "$$results" | grep -c '^SKIP'`; \
- xfail=`echo "$$results" | grep -c '^XFAIL'`; \
- xpass=`echo "$$results" | grep -c '^XPASS'`; \
- failures=`expr $$fail + $$xpass`; \
- all=`expr $$all - $$skip`; \
- if test "$$all" -eq 1; then tests=test; All=; \
- else tests=tests; All="All "; fi; \
- case fail=$$fail:xpass=$$xpass:xfail=$$xfail in \
- fail=0:xpass=0:xfail=0) \
- msg="$$All$$all $$tests passed. "; \
- exit=true;; \
- fail=0:xpass=0:xfail=*) \
- msg="$$All$$all $$tests behaved as expected"; \
- if test "$$xfail" -eq 1; then xfailures=failure; \
- else xfailures=failures; fi; \
- msg="$$msg ($$xfail expected $$xfailures). "; \
- exit=true;; \
- fail=*:xpass=0:xfail=*) \
- msg="$$fail of $$all $$tests failed. "; \
- exit=false;; \
- fail=*:xpass=*:xfail=*) \
- msg="$$failures of $$all $$tests did not behave as expected"; \
- if test "$$xpass" -eq 1; then xpasses=pass; \
- else xpasses=passes; fi; \
- msg="$$msg ($$xpass unexpected $$xpasses). "; \
- exit=false;; \
- *) \
- echo >&2 "incorrect case"; exit 4;; \
- esac; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- msg="$$msg($$skip test was not run). "; \
- else \
- msg="$$msg($$skip tests were not run). "; \
- fi; \
- fi; \
- { \
- echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
- $(am__rst_title); \
- echo "$$msg"; \
- echo; \
- echo ".. contents:: :depth: 2"; \
- echo; \
- for f in $$list; do \
- test -r $$f && read line < $$f || line=; \
- case $$line in \
- PASS:*|XFAIL:*);; \
- *) echo; cat $$f;; \
- esac; \
- done; \
- } >$(TEST_SUITE_LOG).tmp; \
- mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
- if test "$$failures" -ne 0; then \
- msg="$${msg}See $(subdir)/$(TEST_SUITE_LOG). "; \
- if test -n "$(PACKAGE_BUGREPORT)"; then \
- msg="$${msg}Please report to $(PACKAGE_BUGREPORT). "; \
- fi; \
- fi; \
- test x"$$VERBOSE" = x || $$exit || cat $(TEST_SUITE_LOG); \
- $(am__tty_colors); \
- if $$exit; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$$msg" | $(am__text_box) "col=$$col" "std=$$std"; \
- $$exit || exit 1
-
-check-TESTS recheck:
- @if test $@ != recheck; then \
- list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list; \
- fi
- @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
- @list='' list2='$(TEST_LOGS)'; for f in $$list2; do \
- test .log = $$f && continue; \
- if test $@ = recheck; then \
- test -f $$f || continue; \
- if test -r $$f && read line < $$f; then \
- case $$line in FAIL*|XPASS*) : ;; *) continue;; esac; \
- fi; \
- fi; \
- if test -z "$$list"; then list=$$f; else list="$$list $$f"; fi; \
- done; \
- if test $@ = recheck && test -n "$$list"; then \
- $(am__make_dryrun) || rm -f $$list || exit 1; \
- fi; \
- $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$list"
-recheck: $(check_LIBRARIES) $(check_PROGRAMS)
-
-am--mostlyclean-test-html:
- list='$(TEST_LOGS:.log=.html)'; test -z "$$list" || rm -f $$list
- rm -f $(TEST_SUITE_HTML)
-
-.log.html:
- @list='$(RST2HTML) $$RST2HTML rst2html rst2html.py'; \
- for r2h in $$list; do \
- if ($$r2h --version) >/dev/null 2>&1; then \
- R2H=$$r2h; \
- fi; \
- done; \
- if test -z "$$R2H"; then \
- echo >&2 "cannot find rst2html, cannot create $@"; \
- exit 2; \
- fi; \
- $$R2H $< >$@.tmp
- @mv $@.tmp $@
-
-# Be sure to run check first, and then to convert the result.
-# Beware of concurrent executions. Run "check" not "check-TESTS", as
-# check-SCRIPTS and other dependencies are rebuilt by the former only.
-# And expect check to fail.
-check-html recheck-html:
- @target=`echo $@ | sed 's/-html$$//'`; \
- rv=0; $(MAKE) $(AM_MAKEFLAGS) $$target || rv=$$?; \
- $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_HTML) TEST_LOGS= || exit 4; \
- exit $$rv
-.sh.log:
- @p='$<'; $(am__check_pre) $(SH_LOG_COMPILE) "$$tst" $(am__check_post)
- at am__EXEEXT_TRUE@.sh$(EXEEXT).log:
- at am__EXEEXT_TRUE@ @p='$<'; $(am__check_pre) $(SH_LOG_COMPILE) "$$tst" $(am__check_post)
-
-distdir: $(DISTFILES)
- @list='$(MANS)'; if test -n "$$list"; then \
- list=`for p in $$list; do \
- if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
- if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \
- if test -n "$$list" && \
- grep 'ab help2man is required to generate this page' $$list >/dev/null; then \
- echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \
- grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \
- echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \
- echo " typically \`make maintainer-clean' will remove them" >&2; \
- exit 1; \
- else :; fi; \
- else :; fi
- $(am__remove_distdir)
- test -d "$(distdir)" || mkdir "$(distdir)"
- @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
- list='$(DISTFILES)'; \
- dist_files=`for file in $$list; do echo $$file; done | \
- sed -e "s|^$$srcdirstrip/||;t" \
- -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
- case $$dist_files in \
- */*) $(MKDIR_P) `echo "$$dist_files" | \
- sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
- sort -u` ;; \
- esac; \
- for file in $$dist_files; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- if test -d $$d/$$file; then \
- dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test -d "$(distdir)/$$file"; then \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
- find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
- fi; \
- cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
- else \
- test -f "$(distdir)/$$file" \
- || cp -p $$d/$$file "$(distdir)/$$file" \
- || exit 1; \
- fi; \
- done
- -test -n "$(am__skip_mode_fix)" \
- || find "$(distdir)" -type d ! -perm -755 \
- -exec chmod u+rwx,go+rx {} \; -o \
- ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
- ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
- ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
- || chmod -R a+r "$(distdir)"
-dist-gzip: distdir
- tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
- $(am__remove_distdir)
-
-dist-bzip2: distdir
- tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
- $(am__remove_distdir)
-
-dist-lzip: distdir
- tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
- $(am__remove_distdir)
-
-dist-lzma: distdir
- tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
- $(am__remove_distdir)
-
-dist-xz: distdir
- tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
- $(am__remove_distdir)
-
-dist-tarZ: distdir
- tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
- $(am__remove_distdir)
-
-dist-shar: distdir
- shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
- $(am__remove_distdir)
-
-dist-zip: distdir
- -rm -f $(distdir).zip
- zip -rq $(distdir).zip $(distdir)
- $(am__remove_distdir)
-
-dist dist-all: distdir
- tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
- $(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration. Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
- case '$(DIST_ARCHIVES)' in \
- *.tar.gz*) \
- GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
- *.tar.bz2*) \
- bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
- *.tar.lzma*) \
- lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
- *.tar.lz*) \
- lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
- *.tar.xz*) \
- xz -dc $(distdir).tar.xz | $(am__untar) ;;\
- *.tar.Z*) \
- uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
- *.shar.gz*) \
- GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
- *.zip*) \
- unzip $(distdir).zip ;;\
- esac
- chmod -R a-w $(distdir); chmod u+w $(distdir)
- mkdir $(distdir)/_build
- mkdir $(distdir)/_inst
- chmod a-w $(distdir)
- test -d $(distdir)/_build || exit 0; \
- dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
- && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
- && am__cwd=`pwd` \
- && $(am__cd) $(distdir)/_build \
- && ../configure --srcdir=.. --prefix="$$dc_install_base" \
- $(AM_DISTCHECK_CONFIGURE_FLAGS) \
- $(DISTCHECK_CONFIGURE_FLAGS) \
- && $(MAKE) $(AM_MAKEFLAGS) \
- && $(MAKE) $(AM_MAKEFLAGS) dvi \
- && $(MAKE) $(AM_MAKEFLAGS) check \
- && $(MAKE) $(AM_MAKEFLAGS) install \
- && $(MAKE) $(AM_MAKEFLAGS) installcheck \
- && $(MAKE) $(AM_MAKEFLAGS) uninstall \
- && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
- distuninstallcheck \
- && chmod -R a-w "$$dc_install_base" \
- && ({ \
- (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
- && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
- && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
- && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
- distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
- } || { rm -rf "$$dc_destdir"; exit 1; }) \
- && rm -rf "$$dc_destdir" \
- && $(MAKE) $(AM_MAKEFLAGS) dist \
- && rm -rf $(DIST_ARCHIVES) \
- && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
- && cd "$$am__cwd" \
- || exit 1
- $(am__remove_distdir)
- @(echo "$(distdir) archives ready for distribution: "; \
- list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
- sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
- @test -n '$(distuninstallcheck_dir)' || { \
- echo 'ERROR: trying to run $@ with an empty' \
- '$$(distuninstallcheck_dir)' >&2; \
- exit 1; \
- }; \
- $(am__cd) '$(distuninstallcheck_dir)' || { \
- echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
- exit 1; \
- }; \
- test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
- || { echo "ERROR: files left after uninstall:" ; \
- if test -n "$(DESTDIR)"; then \
- echo " (check DESTDIR support)"; \
- fi ; \
- $(distuninstallcheck_listfiles) ; \
- exit 1; } >&2
-distcleancheck: distclean
- @if test '$(srcdir)' = . ; then \
- echo "ERROR: distcleancheck can only run from a VPATH build" ; \
- exit 1 ; \
- fi
- @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
- || { echo "ERROR: files left in build directory after distclean:" ; \
- $(distcleancheck_listfiles) ; \
- exit 1; } >&2
-check-am: all-am
- $(MAKE) $(AM_MAKEFLAGS) $(check_LIBRARIES) $(check_PROGRAMS)
- $(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-am
-all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) \
- config.h
-install-binPROGRAMS: install-libLTLIBRARIES
-
-installdirs:
- for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(library_includedir)"; do \
- test -z "$$dir" || $(MKDIR_P) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
-mostlyclean-generic:
- -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
- -test -z "$(TEST_LOGS_TMP)" || rm -f $(TEST_LOGS_TMP)
- -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
- -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
- -rm -f bin/$(am__dirstamp)
- -rm -f jellyfish/$(DEPDIR)/$(am__dirstamp)
- -rm -f jellyfish/$(am__dirstamp)
- -rm -f unit_tests/$(DEPDIR)/$(am__dirstamp)
- -rm -f unit_tests/$(am__dirstamp)
- -rm -f unit_tests/gtest/src/$(DEPDIR)/$(am__dirstamp)
- -rm -f unit_tests/gtest/src/$(am__dirstamp)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-checkLIBRARIES clean-checkPROGRAMS \
- clean-generic clean-libLTLIBRARIES clean-libtool clean-local \
- mostlyclean-am
-
-distclean: distclean-am
- -rm -f $(am__CONFIG_DISTCLEAN_FILES)
- -rm -rf jellyfish/$(DEPDIR) unit_tests/$(DEPDIR) unit_tests/gtest/src/$(DEPDIR)
- -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-hdr distclean-libtool distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-library_includeHEADERS install-man \
- install-pkgconfigDATA
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man: install-man1
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -f $(am__CONFIG_DISTCLEAN_FILES)
- -rm -rf $(top_srcdir)/autom4te.cache
- -rm -rf jellyfish/$(DEPDIR) unit_tests/$(DEPDIR) unit_tests/gtest/src/$(DEPDIR)
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: am--mostlyclean-test-html mostlyclean-compile \
- mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \
- uninstall-library_includeHEADERS uninstall-man \
- uninstall-pkgconfigDATA
-
-uninstall-man: uninstall-man1
-
-.MAKE: all check-am check-html install-am install-strip recheck-html
-
-.PHONY: CTAGS GTAGS all all-am am--mostlyclean-test-html am--refresh \
- check check-TESTS check-am check-html clean clean-binPROGRAMS \
- clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \
- clean-libLTLIBRARIES clean-libtool clean-local ctags dist \
- dist-all dist-bzip2 dist-gzip dist-lzip dist-lzma dist-shar \
- dist-tarZ dist-xz dist-zip distcheck distclean \
- distclean-compile distclean-generic distclean-hdr \
- distclean-libtool distclean-tags distcleancheck distdir \
- distuninstallcheck dvi dvi-am html html-am info info-am \
- install install-am install-binPROGRAMS install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-libLTLIBRARIES \
- install-library_includeHEADERS install-man install-man1 \
- install-pdf install-pdf-am install-pkgconfigDATA install-ps \
- install-ps-am install-strip installcheck installcheck-am \
- installdirs maintainer-clean maintainer-clean-generic \
- mostlyclean mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am recheck recheck-html \
- tags uninstall uninstall-am uninstall-binPROGRAMS \
- uninstall-libLTLIBRARIES uninstall-library_includeHEADERS \
- uninstall-man uninstall-man1 uninstall-pkgconfigDATA
-
-clean-local: clean-local-check
-.PHONY: clean-local-check
-clean-local-check:
- -cd tests; rm -f seq10m* seq1m* *_0 *_1 *_2 *_S *.md5sum *.histo *.stats *.timing *.query *.dump *.fa
-
-tests/serial_hashing.log: tests/generate_sequence.log
-tests/parallel_hashing.log: tests/generate_sequence.log
-tests/serial_direct_indexing.log: tests/generate_sequence.log
-tests/parallel_direct_indexing.log: tests/generate_sequence.log
-tests/parallel_fastq_direct_indexing.log: tests/generate_fastq_sequence.log
-tests/multi_file.log: tests/generate_sequence.log
-tests/raw_hash.log: tests/generate_sequence.log
-tests/from_stream.log: tests/generate_sequence.log
-tests/parallel_fastq_hashing.log: tests/generate_fastq_sequence.log
-tests/parallel_fastq_sequence_hashing.log: tests/generate_fastq_sequence.log
-tests/multi_file_fastq.log: tests/generate_fastq_sequence.log
-tests/from_stream_fastq.log: tests/generate_fastq_sequence.log
-tests/merge.log: tests/generate_fastq_sequence.log
-tests/min_qual.log: tests/generate_fastq_sequence.log
-tests/parsers.log: tests/generate_sequence.log
-
--include $(top_srcdir)/development.mk
-
-########
-# info #
-########
-print-%:
- @echo -n $($*)
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/Makefile.simple b/Makefile.simple
new file mode 100644
index 0000000..0e1730b
--- /dev/null
+++ b/Makefile.simple
@@ -0,0 +1,40 @@
+# This Makefile is meant to be run in the traget directories. There
+# name start with a '_' by convention and contain a config.h.
+
+CC = g++
+CPPFLAGS = -Wall -Werror -g -O2 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -I.
+# Uncomment following to use SSE
+# CPPFLAGS += -msse -msse2 -DSSE
+LDFLAGS = -lpthread
+TARGETS = jellyfish
+# old TARGETS = mer_counter dump_stats dump_stats_compacted hash_merge
+SOURCES = $(patsubst %,%.cc,$(TARGETS)) mer_count_thread.cc
+
+.SECONDARY:
+
+#VPATH=..:../lib
+
+%.d: %.cc
+ $(CC) -M -MM -MG -MP $(CPPFLAGS) $< > $@.tmp
+ sed -e 's/$*.o/& $@/g' $@.tmp > $@ && rm $@.tmp
+
+all: $(TARGETS)
+
+jellyfish: dump_stats_compacted.o square_binary_matrix.o hash_merge.o storage.o misc.o mer_count_thread.o mer_counter.o
+
+# compare_dump3: compare_dump3.o
+# dump_stats_compacted: dump_stats_compacted.o square_binary_matrix.o
+total_mers_single_fasta: total_mers_single_fasta.o
+mer_counter_C: mer_counter_C.o
+
+# hash_merge: hash_merge.o storage.o misc.o
+# mer_counter: mer_counter.o mer_count_thread.o storage.o misc.o
+# dump_mers: dump_mers.o storage.o misc.o
+dump_stats: dump_stats.o storage.o misc.o
+
+clean:
+ rm -f $(TARGETS) *.o *.d
+
+# Is the following OK? Shouldn't we include more than that?
+include $(SOURCES:.cc=.d)
+-include local.mk
diff --git a/README b/README
index 8cf449a..d73a91b 100644
--- a/README
+++ b/README
@@ -25,6 +25,26 @@ jellyfish. MANPATH is used by the man command. PKG_CONFIG_PATH and
LD_LIBRARY_PATH are used to compile software against the jellyfish
shared library.
+GCC requirement
+===============
+
+GCC version 4.4 or higher is required to compile Jellyfish. Most
+current Linux distribution provides a version of gcc current
+enough. On RedHat 5.x, install the packages gcc44 and gcc44-c++.
+
+To install on Mac OS X: Jellyfish 2.0 does not compile with Apple's
+Xcode GCC 4.2. Instead, the easiest thing to do is to install GCC 4.8
+using MacPorts (http://www.macports.org) using the following commands:
+
+ sudo port install gcc48
+ sudo port install gcc_select
+ sudo port select -set gcc mp-gcc48
+
+The first command installs GCC version 4.8. The third command makes
+that version of GCC the default, and the second installs a package that
+makes the third command work. After the above, you should be able to
+run './configure ; make' as normal.
+
Tests
=====
@@ -47,7 +67,7 @@ to create the data, 10 to run jellyfish).
Notes
=====
-* Jellyfish has been devellopped and tested on x86-64 GNU/Linux. It
+* Jellyfish has been developed and tested on x86-64 GNU/Linux. It
compiles and runs correctly the tests on MacOS X (Intel) and
FreeBSD. It should be fairly easy to port on other *NIX platform
with the gcc compiler, but no guarantee is made. Support for 32-bits
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..bc5bb1c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,32 @@
+Jellyfish
+=========
+
+Overview
+--------
+
+Jellyfish is a tool for fast, memory-efficient counting of k-mers in DNA. A k-mer is a substring of length k, and counting the occurrences of all such substrings is a central step in many analyses of DNA sequence. Jellyfish can count k-mers using an order of magnitude less memory and an order of magnitude faster than other k-mer counting packages by using an efficient encoding of a hash table and by exploiting the "compare-and-swap" CPU instruction to increase parallelism.
+
+JELLYFISH is a command-line program that reads FASTA and multi-FASTA files containing DNA sequences. It outputs its k-mer counts in an binary format, which can be translated into a human-readable text format using the "jellyfish dump" command. See the documentation below for more details.
+
+If you use Jellyfish in your research, please cite:
+
+ Guillaume Marcais and Carl Kingsford, A fast, lock-free approach for efficient parallel counting of occurrences of k-mers. Bioinformatics (2011) 27(6): 764-770 ([first published online January 7, 2011](http://bioinformatics.oxfordjournals.org/cgi/content/abstract/27/6/764 "Paper on Oxford Bioinformatics website")) doi:10.1093/bioinformatics/btr011
+
+Installation
+------------
+
+To get packaged tar ball of the source code, see the [home page of Jellyfish at the University of Maryland](http://www.genome.umd.edu/jellyfish.html "University of Maryland website").
+
+To compile from the git tree, you will need autoconf/automake, make, g++ 4.4 or newer and [yaggo](https://github.com/gmarcais/yaggo "Yaggo on github"). Then compile with:
+
+```Shell
+autoreconf -i
+./configure
+make
+sudo make install
+```
+
+Extra / Examples
+----------------
+
+In the examples directory are potentially useful extra programs to query/manipulates output files from Jellyfish. The examples are not compiled by default. Each subdirectory of examples is independent and is compiled with a simple invocation of 'make'.
diff --git a/aclocal.m4 b/aclocal.m4
deleted file mode 100644
index 20ca7c9..0000000
--- a/aclocal.m4
+++ /dev/null
@@ -1,1033 +0,0 @@
-# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
-# Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
- [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
-[m4_warning([this file was generated for autoconf 2.68.
-You have another version of autoconf. It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
-# Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.11.6], [],
- [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too. Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.6])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
- [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-
-# AM_AUX_DIR_EXPAND -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory. The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run. This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-# fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-# fails if $ac_aux_dir is absolute,
-# fails when called from a subdirectory in a VPATH build with
-# a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir. In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
-# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-# MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH. The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
- [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-m4_define([_AM_COND_VALUE_$1], [$2])dnl
-if $2; then
- $1_TRUE=
- $1_FALSE='#'
-else
- $1_TRUE='#'
- $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
- AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
-# 2010, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 12
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery. Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
- [$1], CXX, [depcc="$CXX" am_compiler_list=],
- [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
- [$1], UPC, [depcc="$UPC" am_compiler_list=],
- [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
- [depcc="$$1" am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
- [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
- # We make a subdir and do the tests there. Otherwise we can end up
- # making bogus files that we don't know about and never remove. For
- # instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named `D' -- because `-MD' means `put the output
- # in D'.
- rm -rf conftest.dir
- mkdir conftest.dir
- # Copy depcomp to subdir because otherwise we won't find it if we're
- # using a relative directory.
- cp "$am_depcomp" conftest.dir
- cd conftest.dir
- # We will build objects and dependencies in a subdirectory because
- # it helps to detect inapplicable dependency modes. For instance
- # both Tru64's cc and ICC support -MD to output dependencies as a
- # side effect of compilation, but ICC will put the dependencies in
- # the current directory while Tru64 will put them in the object
- # directory.
- mkdir sub
-
- am_cv_$1_dependencies_compiler_type=none
- if test "$am_compiler_list" = ""; then
- am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
- fi
- am__universal=false
- m4_case([$1], [CC],
- [case " $depcc " in #(
- *\ -arch\ *\ -arch\ *) am__universal=true ;;
- esac],
- [CXX],
- [case " $depcc " in #(
- *\ -arch\ *\ -arch\ *) am__universal=true ;;
- esac])
-
- for depmode in $am_compiler_list; do
- # Setup a source with many dependencies, because some compilers
- # like to wrap large dependency lists on column 80 (with \), and
- # we should not choose a depcomp mode which is confused by this.
- #
- # We need to recreate these files for each test, as the compiler may
- # overwrite some of them when testing with obscure command lines.
- # This happens at least with the AIX C compiler.
- : > sub/conftest.c
- for i in 1 2 3 4 5 6; do
- echo '#include "conftst'$i'.h"' >> sub/conftest.c
- # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
- # Solaris 8's {/usr,}/bin/sh.
- touch sub/conftst$i.h
- done
- echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
- # We check with `-c' and `-o' for the sake of the "dashmstdout"
- # mode. It turns out that the SunPro C++ compiler does not properly
- # handle `-M -o', and we need to detect this. Also, some Intel
- # versions had trouble with output in subdirs
- am__obj=sub/conftest.${OBJEXT-o}
- am__minus_obj="-o $am__obj"
- case $depmode in
- gcc)
- # This depmode causes a compiler race in universal mode.
- test "$am__universal" = false || continue
- ;;
- nosideeffect)
- # after this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested
- if test "x$enable_dependency_tracking" = xyes; then
- continue
- else
- break
- fi
- ;;
- msvc7 | msvc7msys | msvisualcpp | msvcmsys)
- # This compiler won't grok `-c -o', but also, the minuso test has
- # not run yet. These depmodes are late enough in the game, and
- # so weak that their functioning should not be impacted.
- am__obj=conftest.${OBJEXT-o}
- am__minus_obj=
- ;;
- none) break ;;
- esac
- if depmode=$depmode \
- source=sub/conftest.c object=$am__obj \
- depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
- $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
- >/dev/null 2>conftest.err &&
- grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
- grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
- grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
- ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
- # icc doesn't choke on unknown options, it will just issue warnings
- # or remarks (even with -Werror). So we grep stderr for any message
- # that says an option was ignored or not supported.
- # When given -MP, icc 7.0 and 7.1 complain thusly:
- # icc: Command line warning: ignoring option '-M'; no argument required
- # The diagnosis changed in icc 8.0:
- # icc: Command line remark: option '-MP' not supported
- if (grep 'ignoring option' conftest.err ||
- grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
- am_cv_$1_dependencies_compiler_type=$depmode
- break
- fi
- fi
- done
-
- cd ..
- rm -rf conftest.dir
-else
- am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
- test "x$enable_dependency_tracking" != xno \
- && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[ --disable-dependency-tracking speeds up one-time build
- --enable-dependency-tracking do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
- am_depcomp="$ac_aux_dir/depcomp"
- AMDEPBACKSLASH='\'
- am__nodep='_no'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-AC_SUBST([am__nodep])dnl
-_AM_SUBST_NOTMAKE([am__nodep])dnl
-])
-
-# Generate code to set up dependency tracking. -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 5
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[{
- # Autoconf 2.62 quotes --file arguments for eval, but not when files
- # are listed without --file. Let's play safe and only enable the eval
- # if we detect the quoting.
- case $CONFIG_FILES in
- *\'*) eval set x "$CONFIG_FILES" ;;
- *) set x $CONFIG_FILES ;;
- esac
- shift
- for mf
- do
- # Strip MF so we end up with the name of the file.
- mf=`echo "$mf" | sed -e 's/:.*$//'`
- # Check whether this is an Automake generated Makefile or not.
- # We used to match only the files named `Makefile.in', but
- # some people rename them; so instead we look at the file content.
- # Grep'ing the first line is not enough: some people post-process
- # each Makefile.in and add a new line on top of each file to say so.
- # Grep'ing the whole file is not good either: AIX grep has a line
- # limit of 2048, but all sed's we know have understand at least 4000.
- if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
- dirpart=`AS_DIRNAME("$mf")`
- else
- continue
- fi
- # Extract the definition of DEPDIR, am__include, and am__quote
- # from the Makefile without running `make'.
- DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
- test -z "$DEPDIR" && continue
- am__include=`sed -n 's/^am__include = //p' < "$mf"`
- test -z "am__include" && continue
- am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
- # When using ansi2knr, U may be empty or an underscore; expand it
- U=`sed -n 's/^U = //p' < "$mf"`
- # Find all dependency output files, they are included files with
- # $(DEPDIR) in their names. We invoke sed twice because it is the
- # simplest approach to changing $(DEPDIR) to its actual value in the
- # expansion.
- for file in `sed -n "
- s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
- # Make sure the directory exists.
- test -f "$dirpart/$file" && continue
- fdir=`AS_DIRNAME(["$file"])`
- AS_MKDIR_P([$dirpart/$fdir])
- # echo "creating $dirpart/$file"
- echo '# dummy' > "$dirpart/$file"
- done
- done
-}
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled. FIXME. This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
- [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
- [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Do all the work for Automake. -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 16
-
-# This macro actually does too much. Some checks are only needed if
-# your package does certain things. But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out. PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition. After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
-dnl Autoconf wants to disallow AM_ names. We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
- # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
- # is not polluted with repeated "-I."
- AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
- # test to see if srcdir already configured
- if test -f $srcdir/config.status; then
- AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
- fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
- if (cygpath --version) >/dev/null 2>/dev/null; then
- CYGPATH_W='cygpath -w'
- else
- CYGPATH_W=echo
- fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
- [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target. The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
- [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
- [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
- [_AM_DEPENDENCIES(CC)],
- [define([AC_PROG_CC],
- defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
- [_AM_DEPENDENCIES(CXX)],
- [define([AC_PROG_CXX],
- defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
- [_AM_DEPENDENCIES(OBJC)],
- [define([AC_PROG_OBJC],
- defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
-AC_CONFIG_COMMANDS_PRE(dnl
-[m4_provide_if([_AM_COMPILER_EXEEXT],
- [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
-
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
-dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
-dnl mangled by Autoconf and run in a shell conditional statement.
-m4_define([_AC_COMPILER_EXEEXT],
-m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated. The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
- case $_am_header in
- $_am_arg | $_am_arg:* )
- break ;;
- * )
- _am_stamp_count=`expr $_am_stamp_count + 1` ;;
- esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
-# Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
- case $am_aux_dir in
- *\ * | *\ *)
- install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
- *)
- install_sh="\${SHELL} $am_aux_dir/install-sh"
- esac
-fi
-AC_SUBST(install_sh)])
-
-# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot. For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
- am__leading_dot=.
-else
- am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
-# Check to see how 'make' treats includes. -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
- @echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
- am__include=include
- am__quote=
- _am_result=GNU
- ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
- echo '.include "confinc"' > confmf
- case `$am_make -s -f confmf 2> /dev/null` in #(
- *the\ am__doit\ target*)
- am__include=.include
- am__quote="\""
- _am_result=BSD
- ;;
- esac
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
-
-# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-if test x"${MISSING+set}" != xset; then
- case $am_aux_dir in
- *\ * | *\ *)
- MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
- *)
- MISSING="\${SHELL} $am_aux_dir/missing" ;;
- esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
- am_missing_run="$MISSING --run "
-else
- am_missing_run=
- AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
-# Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
- [[\\/$]]* | ?:[[\\/]]*) ;;
- */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling. -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
-# Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# --------------------
-# Set option NAME. Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane. -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name. Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
- *[[\\\"\#\$\&\'\`$am_lf]]*)
- AC_MSG_ERROR([unsafe absolute working directory name]);;
-esac
-case $srcdir in
- *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
- AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments. Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
- if test "$[*]" = "X"; then
- # -L didn't work.
- set X `ls -t "$srcdir/configure" conftest.file`
- fi
- rm -f conftest.file
- if test "$[*]" != "X $srcdir/configure conftest.file" \
- && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
- # If neither matched, then we have a broken ls. This can happen
- # if, for instance, CONFIG_SHELL is bash and it inherits a
- # broken ls alias from the environment. This has actually
- # happened. Such a system could not be considered "sane".
- AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
-alias in your environment])
- fi
-
- test "$[2]" = conftest.file
- )
-then
- # Ok.
- :
-else
- AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2009, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# AM_SILENT_RULES([DEFAULT])
-# --------------------------
-# Enable less verbose build rules; with the default set to DEFAULT
-# (`yes' being less verbose, `no' or empty being verbose).
-AC_DEFUN([AM_SILENT_RULES],
-[AC_ARG_ENABLE([silent-rules],
-[ --enable-silent-rules less verbose build output (undo: `make V=1')
- --disable-silent-rules verbose build output (undo: `make V=0')])
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no) AM_DEFAULT_VERBOSITY=1;;
-*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
-esac
-dnl
-dnl A few `make' implementations (e.g., NonStop OS and NextStep)
-dnl do not support nested variable expansions.
-dnl See automake bug#9928 and bug#10237.
-am_make=${MAKE-make}
-AC_CACHE_CHECK([whether $am_make supports nested variables],
- [am_cv_make_support_nested_variables],
- [if AS_ECHO([['TRUE=$(BAR$(V))
-BAR0=false
-BAR1=true
-V=1
-am__doit:
- @$(TRUE)
-.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
- am_cv_make_support_nested_variables=yes
-else
- am_cv_make_support_nested_variables=no
-fi])
-if test $am_cv_make_support_nested_variables = yes; then
- dnl Using `$V' instead of `$(V)' breaks IRIX make.
- AM_V='$(V)'
- AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
-else
- AM_V=$AM_DEFAULT_VERBOSITY
- AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
-fi
-AC_SUBST([AM_V])dnl
-AM_SUBST_NOTMAKE([AM_V])dnl
-AC_SUBST([AM_DEFAULT_V])dnl
-AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
-AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
-AM_BACKSLASH='\'
-AC_SUBST([AM_BACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
-])
-
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries. This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'. However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
- AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 3
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# AM_SUBST_NOTMAKE(VARIABLE)
-# --------------------------
-# Public sister of _AM_SUBST_NOTMAKE.
-AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
-
-# Check how to create a tarball. -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-# tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-# $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility. Yes, it's still used
-# in the wild :-( We should find a proper way to deprecate it ...
-AC_SUBST([AMTAR], ['$${TAR-tar}'])
-m4_if([$1], [v7],
- [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
- [m4_case([$1], [ustar],, [pax],,
- [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
- case $_am_tool in
- gnutar)
- for _am_tar in tar gnutar gtar;
- do
- AM_RUN_LOG([$_am_tar --version]) && break
- done
- am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
- am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
- am__untar="$_am_tar -xf -"
- ;;
- plaintar)
- # Must skip GNU tar: if it does not support --format= it doesn't create
- # ustar tarball either.
- (tar --version) >/dev/null 2>&1 && continue
- am__tar='tar chf - "$$tardir"'
- am__tar_='tar chf - "$tardir"'
- am__untar='tar xf -'
- ;;
- pax)
- am__tar='pax -L -x $1 -w "$$tardir"'
- am__tar_='pax -L -x $1 -w "$tardir"'
- am__untar='pax -r'
- ;;
- cpio)
- am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
- am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
- am__untar='cpio -i -H $1 -d'
- ;;
- none)
- am__tar=false
- am__tar_=false
- am__untar=false
- ;;
- esac
-
- # If the value was cached, stop now. We just wanted to have am__tar
- # and am__untar set.
- test -n "${am_cv_prog_tar_$1}" && break
-
- # tar/untar a dummy directory, and stop if the command works
- rm -rf conftest.dir
- mkdir conftest.dir
- echo GrepMe > conftest.dir/file
- AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
- rm -rf conftest.dir
- if test -s conftest.tar; then
- AM_RUN_LOG([$am__untar <conftest.tar])
- grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
- fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([m4/libtool.m4])
-m4_include([m4/ltoptions.m4])
-m4_include([m4/ltsugar.m4])
-m4_include([m4/ltversion.m4])
-m4_include([m4/lt~obsolete.m4])
diff --git a/config.guess b/config.guess
deleted file mode 100755
index d622a44..0000000
--- a/config.guess
+++ /dev/null
@@ -1,1530 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-# 2011, 2012 Free Software Foundation, Inc.
-
-timestamp='2012-02-10'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner. Please send patches (context
-# diff format) to <config-patches at gnu.org> and include a ChangeLog
-# entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub. If it succeeds, it prints the system name on stdout, and
-# exits with 0. Otherwise, it exits with 1.
-#
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches at gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help" >&2
- exit 1 ;;
- * )
- break ;;
- esac
-done
-
-if test $# != 0; then
- echo "$me: too many arguments$help" >&2
- exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,) echo "int x;" > $dummy.c ;
- for c in cc gcc c89 c99 ; do
- if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
- CC_FOR_BUILD="$c"; break ;
- fi ;
- done ;
- if test x"$CC_FOR_BUILD" = x ; then
- CC_FOR_BUILD=no_compiler_found ;
- fi
- ;;
- ,,*) CC_FOR_BUILD=$CC ;;
- ,*,*) CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi at noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
- PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
- *:NetBSD:*:*)
- # NetBSD (nbsd) targets should (where applicable) match one or
- # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
- # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
- # switched to ELF, *-*-netbsd* would select the old
- # object file format. This provides both forward
- # compatibility and a consistent mechanism for selecting the
- # object file format.
- #
- # Note: NetBSD doesn't particularly care about the vendor
- # portion of the name. We always set it to "unknown".
- sysctl="sysctl -n hw.machine_arch"
- UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
- /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
- case "${UNAME_MACHINE_ARCH}" in
- armeb) machine=armeb-unknown ;;
- arm*) machine=arm-unknown ;;
- sh3el) machine=shl-unknown ;;
- sh3eb) machine=sh-unknown ;;
- sh5el) machine=sh5le-unknown ;;
- *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
- esac
- # The Operating System including object format, if it has switched
- # to ELF recently, or will in the future.
- case "${UNAME_MACHINE_ARCH}" in
- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
- eval $set_cc_for_build
- if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ELF__
- then
- # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
- # Return netbsd for either. FIX?
- os=netbsd
- else
- os=netbsdelf
- fi
- ;;
- *)
- os=netbsd
- ;;
- esac
- # The OS release
- # Debian GNU/NetBSD machines have a different userland, and
- # thus, need a distinct triplet. However, they do not need
- # kernel version information, so it can be replaced with a
- # suitable tag, in the style of linux-gnu.
- case "${UNAME_VERSION}" in
- Debian*)
- release='-gnu'
- ;;
- *)
- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
- ;;
- esac
- # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
- # contains redundant information, the shorter form:
- # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "${machine}-${os}${release}"
- exit ;;
- *:OpenBSD:*:*)
- UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
- echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
- exit ;;
- *:ekkoBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
- exit ;;
- *:SolidBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
- exit ;;
- macppc:MirBSD:*:*)
- echo powerpc-unknown-mirbsd${UNAME_RELEASE}
- exit ;;
- *:MirBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
- exit ;;
- alpha:OSF1:*:*)
- case $UNAME_RELEASE in
- *4.0)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
- ;;
- *5.*)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
- ;;
- esac
- # According to Compaq, /usr/sbin/psrinfo has been available on
- # OSF/1 and Tru64 systems produced since 1995. I hope that
- # covers most systems running today. This code pipes the CPU
- # types through head -n 1, so we only detect the type of CPU 0.
- ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
- case "$ALPHA_CPU_TYPE" in
- "EV4 (21064)")
- UNAME_MACHINE="alpha" ;;
- "EV4.5 (21064)")
- UNAME_MACHINE="alpha" ;;
- "LCA4 (21066/21068)")
- UNAME_MACHINE="alpha" ;;
- "EV5 (21164)")
- UNAME_MACHINE="alphaev5" ;;
- "EV5.6 (21164A)")
- UNAME_MACHINE="alphaev56" ;;
- "EV5.6 (21164PC)")
- UNAME_MACHINE="alphapca56" ;;
- "EV5.7 (21164PC)")
- UNAME_MACHINE="alphapca57" ;;
- "EV6 (21264)")
- UNAME_MACHINE="alphaev6" ;;
- "EV6.7 (21264A)")
- UNAME_MACHINE="alphaev67" ;;
- "EV6.8CB (21264C)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.8AL (21264B)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.8CX (21264D)")
- UNAME_MACHINE="alphaev68" ;;
- "EV6.9A (21264/EV69A)")
- UNAME_MACHINE="alphaev69" ;;
- "EV7 (21364)")
- UNAME_MACHINE="alphaev7" ;;
- "EV7.9 (21364A)")
- UNAME_MACHINE="alphaev79" ;;
- esac
- # A Pn.n version is a patched version.
- # A Vn.n version is a released version.
- # A Tn.n version is a released field test version.
- # A Xn.n version is an unreleased experimental baselevel.
- # 1.2 uses "1.2" for uname -r.
- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
- exitcode=$?
- trap '' 0
- exit $exitcode ;;
- Alpha\ *:Windows_NT*:*)
- # How do we know it's Interix rather than the generic POSIX subsystem?
- # Should we change UNAME_MACHINE based on the output of uname instead
- # of the specific Alpha model?
- echo alpha-pc-interix
- exit ;;
- 21064:Windows_NT:50:3)
- echo alpha-dec-winnt3.5
- exit ;;
- Amiga*:UNIX_System_V:4.0:*)
- echo m68k-unknown-sysv4
- exit ;;
- *:[Aa]miga[Oo][Ss]:*:*)
- echo ${UNAME_MACHINE}-unknown-amigaos
- exit ;;
- *:[Mm]orph[Oo][Ss]:*:*)
- echo ${UNAME_MACHINE}-unknown-morphos
- exit ;;
- *:OS/390:*:*)
- echo i370-ibm-openedition
- exit ;;
- *:z/VM:*:*)
- echo s390-ibm-zvmoe
- exit ;;
- *:OS400:*:*)
- echo powerpc-ibm-os400
- exit ;;
- arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
- echo arm-acorn-riscix${UNAME_RELEASE}
- exit ;;
- arm:riscos:*:*|arm:RISCOS:*:*)
- echo arm-unknown-riscos
- exit ;;
- SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
- echo hppa1.1-hitachi-hiuxmpp
- exit ;;
- Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
- # akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
- if test "`(/bin/universe) 2>/dev/null`" = att ; then
- echo pyramid-pyramid-sysv3
- else
- echo pyramid-pyramid-bsd
- fi
- exit ;;
- NILE*:*:*:dcosx)
- echo pyramid-pyramid-svr4
- exit ;;
- DRS?6000:unix:4.0:6*)
- echo sparc-icl-nx6
- exit ;;
- DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
- case `/usr/bin/uname -p` in
- sparc) echo sparc-icl-nx7; exit ;;
- esac ;;
- s390x:SunOS:*:*)
- echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4H:SunOS:5.*:*)
- echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
- echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
- echo i386-pc-auroraux${UNAME_RELEASE}
- exit ;;
- i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
- eval $set_cc_for_build
- SUN_ARCH="i386"
- # If there is a compiler, see if it is configured for 64-bit objects.
- # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
- # This test works for both compilers.
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
- if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- SUN_ARCH="x86_64"
- fi
- fi
- echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:6*:*)
- # According to config.sub, this is the proper way to canonicalize
- # SunOS6. Hard to guess exactly what SunOS6 will be like, but
- # it's likely to be more like Solaris than SunOS4.
- echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- sun4*:SunOS:*:*)
- case "`/usr/bin/arch -k`" in
- Series*|S4*)
- UNAME_RELEASE=`uname -v`
- ;;
- esac
- # Japanese Language versions have a version number like `4.1.3-JL'.
- echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
- exit ;;
- sun3*:SunOS:*:*)
- echo m68k-sun-sunos${UNAME_RELEASE}
- exit ;;
- sun*:*:4.2BSD:*)
- UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
- test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
- case "`/bin/arch`" in
- sun3)
- echo m68k-sun-sunos${UNAME_RELEASE}
- ;;
- sun4)
- echo sparc-sun-sunos${UNAME_RELEASE}
- ;;
- esac
- exit ;;
- aushp:SunOS:*:*)
- echo sparc-auspex-sunos${UNAME_RELEASE}
- exit ;;
- # The situation for MiNT is a little confusing. The machine name
- # can be virtually everything (everything which is not
- # "atarist" or "atariste" at least should have a processor
- # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
- # to the lowercase version "mint" (or "freemint"). Finally
- # the system name "TOS" denotes a system which is actually not
- # MiNT. But MiNT is downward compatible to TOS, so this should
- # be no problem.
- atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
- milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
- echo m68k-milan-mint${UNAME_RELEASE}
- exit ;;
- hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
- echo m68k-hades-mint${UNAME_RELEASE}
- exit ;;
- *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
- echo m68k-unknown-mint${UNAME_RELEASE}
- exit ;;
- m68k:machten:*:*)
- echo m68k-apple-machten${UNAME_RELEASE}
- exit ;;
- powerpc:machten:*:*)
- echo powerpc-apple-machten${UNAME_RELEASE}
- exit ;;
- RISC*:Mach:*:*)
- echo mips-dec-mach_bsd4.3
- exit ;;
- RISC*:ULTRIX:*:*)
- echo mips-dec-ultrix${UNAME_RELEASE}
- exit ;;
- VAX*:ULTRIX*:*:*)
- echo vax-dec-ultrix${UNAME_RELEASE}
- exit ;;
- 2020:CLIX:*:* | 2430:CLIX:*:*)
- echo clipper-intergraph-clix${UNAME_RELEASE}
- exit ;;
- mips:*:*:UMIPS | mips:*:*:RISCos)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h> /* for printf() prototype */
- int main (int argc, char *argv[]) {
-#else
- int main (argc, argv) int argc; char *argv[]; {
-#endif
- #if defined (host_mips) && defined (MIPSEB)
- #if defined (SYSTYPE_SYSV)
- printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_SVR4)
- printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
- printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
- #endif
- #endif
- exit (-1);
- }
-EOF
- $CC_FOR_BUILD -o $dummy $dummy.c &&
- dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
- SYSTEM_NAME=`$dummy $dummyarg` &&
- { echo "$SYSTEM_NAME"; exit; }
- echo mips-mips-riscos${UNAME_RELEASE}
- exit ;;
- Motorola:PowerMAX_OS:*:*)
- echo powerpc-motorola-powermax
- exit ;;
- Motorola:*:4.3:PL8-*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:Power_UNIX:*:*)
- echo powerpc-harris-powerunix
- exit ;;
- m88k:CX/UX:7*:*)
- echo m88k-harris-cxux7
- exit ;;
- m88k:*:4*:R4*)
- echo m88k-motorola-sysv4
- exit ;;
- m88k:*:3*:R3*)
- echo m88k-motorola-sysv3
- exit ;;
- AViiON:dgux:*:*)
- # DG/UX returns AViiON for all architectures
- UNAME_PROCESSOR=`/usr/bin/uname -p`
- if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
- then
- if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
- [ ${TARGET_BINARY_INTERFACE}x = x ]
- then
- echo m88k-dg-dgux${UNAME_RELEASE}
- else
- echo m88k-dg-dguxbcs${UNAME_RELEASE}
- fi
- else
- echo i586-dg-dgux${UNAME_RELEASE}
- fi
- exit ;;
- M88*:DolphinOS:*:*) # DolphinOS (SVR3)
- echo m88k-dolphin-sysv3
- exit ;;
- M88*:*:R3*:*)
- # Delta 88k system running SVR3
- echo m88k-motorola-sysv3
- exit ;;
- XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
- echo m88k-tektronix-sysv3
- exit ;;
- Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
- echo m68k-tektronix-bsd
- exit ;;
- *:IRIX*:*:*)
- echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
- exit ;;
- ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
- exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
- i*86:AIX:*:*)
- echo i386-ibm-aix
- exit ;;
- ia64:AIX:*:*)
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
- exit ;;
- *:AIX:2:3)
- if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <sys/systemcfg.h>
-
- main()
- {
- if (!__power_pc())
- exit(1);
- puts("powerpc-ibm-aix3.2.5");
- exit(0);
- }
-EOF
- if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
- then
- echo "$SYSTEM_NAME"
- else
- echo rs6000-ibm-aix3.2.5
- fi
- elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
- echo rs6000-ibm-aix3.2.4
- else
- echo rs6000-ibm-aix3.2
- fi
- exit ;;
- *:AIX:*:[4567])
- IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
- if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
- IBM_ARCH=rs6000
- else
- IBM_ARCH=powerpc
- fi
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${IBM_ARCH}-ibm-aix${IBM_REV}
- exit ;;
- *:AIX:*:*)
- echo rs6000-ibm-aix
- exit ;;
- ibmrt:4.4BSD:*|romp-ibm:BSD:*)
- echo romp-ibm-bsd4.4
- exit ;;
- ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
- echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
- exit ;; # report: romp-ibm BSD 4.3
- *:BOSX:*:*)
- echo rs6000-bull-bosx
- exit ;;
- DPX/2?00:B.O.S.:*:*)
- echo m68k-bull-sysv3
- exit ;;
- 9000/[34]??:4.3bsd:1.*:*)
- echo m68k-hp-bsd
- exit ;;
- hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
- echo m68k-hp-bsd4.4
- exit ;;
- 9000/[34678]??:HP-UX:*:*)
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- case "${UNAME_MACHINE}" in
- 9000/31? ) HP_ARCH=m68000 ;;
- 9000/[34]?? ) HP_ARCH=m68k ;;
- 9000/[678][0-9][0-9])
- if [ -x /usr/bin/getconf ]; then
- sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
- case "${sc_cpu_version}" in
- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
- 532) # CPU_PA_RISC2_0
- case "${sc_kernel_bits}" in
- 32) HP_ARCH="hppa2.0n" ;;
- 64) HP_ARCH="hppa2.0w" ;;
- '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
- esac ;;
- esac
- fi
- if [ "${HP_ARCH}" = "" ]; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
-
- #define _HPUX_SOURCE
- #include <stdlib.h>
- #include <unistd.h>
-
- int main ()
- {
- #if defined(_SC_KERNEL_BITS)
- long bits = sysconf(_SC_KERNEL_BITS);
- #endif
- long cpu = sysconf (_SC_CPU_VERSION);
-
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
- case CPU_PA_RISC2_0:
- #if defined(_SC_KERNEL_BITS)
- switch (bits)
- {
- case 64: puts ("hppa2.0w"); break;
- case 32: puts ("hppa2.0n"); break;
- default: puts ("hppa2.0"); break;
- } break;
- #else /* !defined(_SC_KERNEL_BITS) */
- puts ("hppa2.0"); break;
- #endif
- default: puts ("hppa1.0"); break;
- }
- exit (0);
- }
-EOF
- (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
- test -z "$HP_ARCH" && HP_ARCH=hppa
- fi ;;
- esac
- if [ ${HP_ARCH} = "hppa2.0w" ]
- then
- eval $set_cc_for_build
-
- # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
- # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
- # generating 64-bit code. GNU and HP use different nomenclature:
- #
- # $ CC_FOR_BUILD=cc ./config.guess
- # => hppa2.0w-hp-hpux11.23
- # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
- # => hppa64-hp-hpux11.23
-
- if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
- grep -q __LP64__
- then
- HP_ARCH="hppa2.0w"
- else
- HP_ARCH="hppa64"
- fi
- fi
- echo ${HP_ARCH}-hp-hpux${HPUX_REV}
- exit ;;
- ia64:HP-UX:*:*)
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- echo ia64-hp-hpux${HPUX_REV}
- exit ;;
- 3050*:HI-UX:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <unistd.h>
- int
- main ()
- {
- long cpu = sysconf (_SC_CPU_VERSION);
- /* The order matters, because CPU_IS_HP_MC68K erroneously returns
- true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
- results, however. */
- if (CPU_IS_PA_RISC (cpu))
- {
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
- default: puts ("hppa-hitachi-hiuxwe2"); break;
- }
- }
- else if (CPU_IS_HP_MC68K (cpu))
- puts ("m68k-hitachi-hiuxwe2");
- else puts ("unknown-hitachi-hiuxwe2");
- exit (0);
- }
-EOF
- $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
- echo unknown-hitachi-hiuxwe2
- exit ;;
- 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
- echo hppa1.1-hp-bsd
- exit ;;
- 9000/8??:4.3bsd:*:*)
- echo hppa1.0-hp-bsd
- exit ;;
- *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
- echo hppa1.0-hp-mpeix
- exit ;;
- hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
- echo hppa1.1-hp-osf
- exit ;;
- hp8??:OSF1:*:*)
- echo hppa1.0-hp-osf
- exit ;;
- i*86:OSF1:*:*)
- if [ -x /usr/sbin/sysversion ] ; then
- echo ${UNAME_MACHINE}-unknown-osf1mk
- else
- echo ${UNAME_MACHINE}-unknown-osf1
- fi
- exit ;;
- parisc*:Lites*:*:*)
- echo hppa1.1-hp-lites
- exit ;;
- C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
- echo c1-convex-bsd
- exit ;;
- C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
- echo c34-convex-bsd
- exit ;;
- C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
- echo c38-convex-bsd
- exit ;;
- C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
- echo c4-convex-bsd
- exit ;;
- CRAY*Y-MP:*:*:*)
- echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*[A-Z]90:*:*:*)
- echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
- | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
- -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
- -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*TS:*:*:*)
- echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*T3E:*:*:*)
- echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*SV1:*:*:*)
- echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- *:UNICOS/mp:*:*)
- echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
- FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- 5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
- echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
- exit ;;
- sparc*:BSD/OS:*:*)
- echo sparc-unknown-bsdi${UNAME_RELEASE}
- exit ;;
- *:BSD/OS:*:*)
- echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
- exit ;;
- *:FreeBSD:*:*)
- UNAME_PROCESSOR=`/usr/bin/uname -p`
- case ${UNAME_PROCESSOR} in
- amd64)
- echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
- *)
- echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
- esac
- exit ;;
- i*:CYGWIN*:*)
- echo ${UNAME_MACHINE}-pc-cygwin
- exit ;;
- *:MINGW*:*)
- echo ${UNAME_MACHINE}-pc-mingw32
- exit ;;
- i*:MSYS*:*)
- echo ${UNAME_MACHINE}-pc-msys
- exit ;;
- i*:windows32*:*)
- # uname -m includes "-pc" on this system.
- echo ${UNAME_MACHINE}-mingw32
- exit ;;
- i*:PW*:*)
- echo ${UNAME_MACHINE}-pc-pw32
- exit ;;
- *:Interix*:*)
- case ${UNAME_MACHINE} in
- x86)
- echo i586-pc-interix${UNAME_RELEASE}
- exit ;;
- authenticamd | genuineintel | EM64T)
- echo x86_64-unknown-interix${UNAME_RELEASE}
- exit ;;
- IA64)
- echo ia64-unknown-interix${UNAME_RELEASE}
- exit ;;
- esac ;;
- [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
- echo i${UNAME_MACHINE}-pc-mks
- exit ;;
- 8664:Windows_NT:*)
- echo x86_64-pc-mks
- exit ;;
- i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
- # How do we know it's Interix rather than the generic POSIX subsystem?
- # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
- # UNAME_MACHINE based on the output of uname instead of i386?
- echo i586-pc-interix
- exit ;;
- i*:UWIN*:*)
- echo ${UNAME_MACHINE}-pc-uwin
- exit ;;
- amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
- echo x86_64-unknown-cygwin
- exit ;;
- p*:CYGWIN*:*)
- echo powerpcle-unknown-cygwin
- exit ;;
- prep*:SunOS:5.*:*)
- echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit ;;
- *:GNU:*:*)
- # the GNU system
- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
- exit ;;
- *:GNU/*:*:*)
- # other systems with GNU libc and userland
- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
- exit ;;
- i*86:Minix:*:*)
- echo ${UNAME_MACHINE}-pc-minix
- exit ;;
- aarch64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- aarch64_be:Linux:*:*)
- UNAME_MACHINE=aarch64_be
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- alpha:Linux:*:*)
- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
- EV5) UNAME_MACHINE=alphaev5 ;;
- EV56) UNAME_MACHINE=alphaev56 ;;
- PCA56) UNAME_MACHINE=alphapca56 ;;
- PCA57) UNAME_MACHINE=alphapca56 ;;
- EV6) UNAME_MACHINE=alphaev6 ;;
- EV67) UNAME_MACHINE=alphaev67 ;;
- EV68*) UNAME_MACHINE=alphaev68 ;;
- esac
- objdump --private-headers /bin/sh | grep -q ld.so.1
- if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
- exit ;;
- arm*:Linux:*:*)
- eval $set_cc_for_build
- if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_EABI__
- then
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- else
- if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_PCS_VFP
- then
- echo ${UNAME_MACHINE}-unknown-linux-gnueabi
- else
- echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
- fi
- fi
- exit ;;
- avr32*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- cris:Linux:*:*)
- echo ${UNAME_MACHINE}-axis-linux-gnu
- exit ;;
- crisv32:Linux:*:*)
- echo ${UNAME_MACHINE}-axis-linux-gnu
- exit ;;
- frv:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- hexagon:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- i*86:Linux:*:*)
- LIBC=gnu
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #ifdef __dietlibc__
- LIBC=dietlibc
- #endif
-EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
- echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
- exit ;;
- ia64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- m32r*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- m68*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- mips:Linux:*:* | mips64:Linux:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #undef CPU
- #undef ${UNAME_MACHINE}
- #undef ${UNAME_MACHINE}el
- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
- CPU=${UNAME_MACHINE}el
- #else
- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
- CPU=${UNAME_MACHINE}
- #else
- CPU=
- #endif
- #endif
-EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
- ;;
- or32:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- padre:Linux:*:*)
- echo sparc-unknown-linux-gnu
- exit ;;
- parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-gnu
- exit ;;
- parisc:Linux:*:* | hppa:Linux:*:*)
- # Look for CPU level
- case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
- PA7*) echo hppa1.1-unknown-linux-gnu ;;
- PA8*) echo hppa2.0-unknown-linux-gnu ;;
- *) echo hppa-unknown-linux-gnu ;;
- esac
- exit ;;
- ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-gnu
- exit ;;
- ppc:Linux:*:*)
- echo powerpc-unknown-linux-gnu
- exit ;;
- s390:Linux:*:* | s390x:Linux:*:*)
- echo ${UNAME_MACHINE}-ibm-linux
- exit ;;
- sh64*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- sh*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- sparc:Linux:*:* | sparc64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- tile*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- vax:Linux:*:*)
- echo ${UNAME_MACHINE}-dec-linux-gnu
- exit ;;
- x86_64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- xtensa*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit ;;
- i*86:DYNIX/ptx:4*:*)
- # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
- # earlier versions are messed up and put the nodename in both
- # sysname and nodename.
- echo i386-sequent-sysv4
- exit ;;
- i*86:UNIX_SV:4.2MP:2.*)
- # Unixware is an offshoot of SVR4, but it has its own version
- # number series starting with 2...
- # I am not positive that other SVR4 systems won't match this,
- # I just have to hope. -- rms.
- # Use sysv4.2uw... so that sysv4* matches it.
- echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
- exit ;;
- i*86:OS/2:*:*)
- # If we were able to find `uname', then EMX Unix compatibility
- # is probably installed.
- echo ${UNAME_MACHINE}-pc-os2-emx
- exit ;;
- i*86:XTS-300:*:STOP)
- echo ${UNAME_MACHINE}-unknown-stop
- exit ;;
- i*86:atheos:*:*)
- echo ${UNAME_MACHINE}-unknown-atheos
- exit ;;
- i*86:syllable:*:*)
- echo ${UNAME_MACHINE}-pc-syllable
- exit ;;
- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
- echo i386-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- i*86:*DOS:*:*)
- echo ${UNAME_MACHINE}-pc-msdosdjgpp
- exit ;;
- i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
- UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
- if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
- echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
- else
- echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
- fi
- exit ;;
- i*86:*:5:[678]*)
- # UnixWare 7.x, OpenUNIX and OpenServer 6.
- case `/bin/uname -X | grep "^Machine"` in
- *486*) UNAME_MACHINE=i486 ;;
- *Pentium) UNAME_MACHINE=i586 ;;
- *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
- esac
- echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
- exit ;;
- i*86:*:3.2:*)
- if test -f /usr/options/cb.name; then
- UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
- echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
- elif /bin/uname -X 2>/dev/null >/dev/null ; then
- UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
- (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
- (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
- && UNAME_MACHINE=i586
- (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
- && UNAME_MACHINE=i686
- (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
- && UNAME_MACHINE=i686
- echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
- else
- echo ${UNAME_MACHINE}-pc-sysv32
- fi
- exit ;;
- pc:*:*:*)
- # Left here for compatibility:
- # uname -m prints for DJGPP always 'pc', but it prints nothing about
- # the processor, so we play safe by assuming i586.
- # Note: whatever this is, it MUST be the same as what config.sub
- # prints for the "djgpp" host, or else GDB configury will decide that
- # this is a cross-build.
- echo i586-pc-msdosdjgpp
- exit ;;
- Intel:Mach:3*:*)
- echo i386-pc-mach3
- exit ;;
- paragon:*:*:*)
- echo i860-intel-osf1
- exit ;;
- i860:*:4.*:*) # i860-SVR4
- if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
- echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
- else # Add other i860-SVR4 vendors below as they are discovered.
- echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
- fi
- exit ;;
- mini*:CTIX:SYS*5:*)
- # "miniframe"
- echo m68010-convergent-sysv
- exit ;;
- mc68k:UNIX:SYSTEM5:3.51m)
- echo m68k-convergent-sysv
- exit ;;
- M680?0:D-NIX:5.3:*)
- echo m68k-diab-dnix
- exit ;;
- M68*:*:R3V[5678]*:*)
- test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
- 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
- OS_REL=''
- test -r /etc/.relid \
- && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
- 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4; exit; } ;;
- NCR*:*:4.2:* | MPRAS*:*:4.2:*)
- OS_REL='.3'
- test -r /etc/.relid \
- && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
- && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
- m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
- echo m68k-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- mc68030:UNIX_System_V:4.*:*)
- echo m68k-atari-sysv4
- exit ;;
- TSUNAMI:LynxOS:2.*:*)
- echo sparc-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- rs6000:LynxOS:2.*:*)
- echo rs6000-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
- echo powerpc-unknown-lynxos${UNAME_RELEASE}
- exit ;;
- SM[BE]S:UNIX_SV:*:*)
- echo mips-dde-sysv${UNAME_RELEASE}
- exit ;;
- RM*:ReliantUNIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- RM*:SINIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- *:SINIX-*:*:*)
- if uname -p 2>/dev/null >/dev/null ; then
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
- echo ${UNAME_MACHINE}-sni-sysv4
- else
- echo ns32k-sni-sysv
- fi
- exit ;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
- # says <Richard.M.Bartel at ccMail.Census.GOV>
- echo i586-unisys-sysv4
- exit ;;
- *:UNIX_System_V:4*:FTX*)
- # From Gerald Hewes <hewes at openmarket.com>.
- # How about differentiating between stratus architectures? -djm
- echo hppa1.1-stratus-sysv4
- exit ;;
- *:*:*:FTX*)
- # From seanf at swdc.stratus.com.
- echo i860-stratus-sysv4
- exit ;;
- i*86:VOS:*:*)
- # From Paul.Green at stratus.com.
- echo ${UNAME_MACHINE}-stratus-vos
- exit ;;
- *:VOS:*:*)
- # From Paul.Green at stratus.com.
- echo hppa1.1-stratus-vos
- exit ;;
- mc68*:A/UX:*:*)
- echo m68k-apple-aux${UNAME_RELEASE}
- exit ;;
- news*:NEWS-OS:6*:*)
- echo mips-sony-newsos6
- exit ;;
- R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
- if [ -d /usr/nec ]; then
- echo mips-nec-sysv${UNAME_RELEASE}
- else
- echo mips-unknown-sysv${UNAME_RELEASE}
- fi
- exit ;;
- BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
- echo powerpc-be-beos
- exit ;;
- BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
- echo powerpc-apple-beos
- exit ;;
- BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
- echo i586-pc-beos
- exit ;;
- BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
- echo i586-pc-haiku
- exit ;;
- SX-4:SUPER-UX:*:*)
- echo sx4-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-5:SUPER-UX:*:*)
- echo sx5-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-6:SUPER-UX:*:*)
- echo sx6-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-7:SUPER-UX:*:*)
- echo sx7-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-8:SUPER-UX:*:*)
- echo sx8-nec-superux${UNAME_RELEASE}
- exit ;;
- SX-8R:SUPER-UX:*:*)
- echo sx8r-nec-superux${UNAME_RELEASE}
- exit ;;
- Power*:Rhapsody:*:*)
- echo powerpc-apple-rhapsody${UNAME_RELEASE}
- exit ;;
- *:Rhapsody:*:*)
- echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
- exit ;;
- *:Darwin:*:*)
- UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
- case $UNAME_PROCESSOR in
- i386)
- eval $set_cc_for_build
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- UNAME_PROCESSOR="x86_64"
- fi
- fi ;;
- unknown) UNAME_PROCESSOR=powerpc ;;
- esac
- echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
- exit ;;
- *:procnto*:*:* | *:QNX:[0123456789]*:*)
- UNAME_PROCESSOR=`uname -p`
- if test "$UNAME_PROCESSOR" = "x86"; then
- UNAME_PROCESSOR=i386
- UNAME_MACHINE=pc
- fi
- echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
- exit ;;
- *:QNX:*:4*)
- echo i386-pc-qnx
- exit ;;
- NEO-?:NONSTOP_KERNEL:*:*)
- echo neo-tandem-nsk${UNAME_RELEASE}
- exit ;;
- NSE-?:NONSTOP_KERNEL:*:*)
- echo nse-tandem-nsk${UNAME_RELEASE}
- exit ;;
- NSR-?:NONSTOP_KERNEL:*:*)
- echo nsr-tandem-nsk${UNAME_RELEASE}
- exit ;;
- *:NonStop-UX:*:*)
- echo mips-compaq-nonstopux
- exit ;;
- BS2000:POSIX*:*:*)
- echo bs2000-siemens-sysv
- exit ;;
- DS/*:UNIX_System_V:*:*)
- echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
- exit ;;
- *:Plan9:*:*)
- # "uname -m" is not consistent, so use $cputype instead. 386
- # is converted to i386 for consistency with other x86
- # operating systems.
- if test "$cputype" = "386"; then
- UNAME_MACHINE=i386
- else
- UNAME_MACHINE="$cputype"
- fi
- echo ${UNAME_MACHINE}-unknown-plan9
- exit ;;
- *:TOPS-10:*:*)
- echo pdp10-unknown-tops10
- exit ;;
- *:TENEX:*:*)
- echo pdp10-unknown-tenex
- exit ;;
- KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
- echo pdp10-dec-tops20
- exit ;;
- XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
- echo pdp10-xkl-tops20
- exit ;;
- *:TOPS-20:*:*)
- echo pdp10-unknown-tops20
- exit ;;
- *:ITS:*:*)
- echo pdp10-unknown-its
- exit ;;
- SEI:*:*:SEIUX)
- echo mips-sei-seiux${UNAME_RELEASE}
- exit ;;
- *:DragonFly:*:*)
- echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
- exit ;;
- *:*VMS:*:*)
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
- case "${UNAME_MACHINE}" in
- A*) echo alpha-dec-vms ; exit ;;
- I*) echo ia64-dec-vms ; exit ;;
- V*) echo vax-dec-vms ; exit ;;
- esac ;;
- *:XENIX:*:SysV)
- echo i386-pc-xenix
- exit ;;
- i*86:skyos:*:*)
- echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
- exit ;;
- i*86:rdos:*:*)
- echo ${UNAME_MACHINE}-pc-rdos
- exit ;;
- i*86:AROS:*:*)
- echo ${UNAME_MACHINE}-pc-aros
- exit ;;
- x86_64:VMkernel:*:*)
- echo ${UNAME_MACHINE}-unknown-esx
- exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
- I don't know.... */
- printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
- printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
- "4"
-#else
- ""
-#endif
- ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
- printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
- printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
- int version;
- version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
- if (version < 4)
- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
- else
- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
- exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
- printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
- printf ("ns32k-encore-mach\n"); exit (0);
-#else
- printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
- printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
- printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
- printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
- struct utsname un;
-
- uname(&un);
-
- if (strncmp(un.version, "V2", 2) == 0) {
- printf ("i386-sequent-ptx2\n"); exit (0);
- }
- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
- printf ("i386-sequent-ptx1\n"); exit (0);
- }
- printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-# include <sys/param.h>
-# if defined (BSD)
-# if BSD == 43
- printf ("vax-dec-bsd4.3\n"); exit (0);
-# else
-# if BSD == 199006
- printf ("vax-dec-bsd4.3reno\n"); exit (0);
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# endif
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# else
- printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
- printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
- exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
- case `getsysinfo -f cpu_type` in
- c1*)
- echo c1-convex-bsd
- exit ;;
- c2*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- c34*)
- echo c34-convex-bsd
- exit ;;
- c38*)
- echo c38-convex-bsd
- exit ;;
- c4*)
- echo c4-convex-bsd
- exit ;;
- esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
- http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
- http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches at gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo = `(hostinfo) 2>/dev/null`
-/bin/universe = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/config.h.in b/config.h.in
deleted file mode 100644
index 7801220..0000000
--- a/config.h.in
+++ /dev/null
@@ -1,90 +0,0 @@
-/* config.h.in. Generated from configure.ac by autoheader. */
-
-/* Define if you use half floats for qmer counting */
-#undef HALF_FLOATS
-
-/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
- don't. */
-#undef HAVE_DECL_STRERROR_R
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the <execinfo.h> header file. */
-#undef HAVE_EXECINFO_H
-
-/* Define if type __int128 is supported */
-#undef HAVE_INT128
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define if siginfo_t.si_int exists */
-#undef HAVE_SI_INT
-
-/* Define if you have SSE */
-#undef HAVE_SSE
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the `strerror_r' function. */
-#undef HAVE_STRERROR_R
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/syscall.h> header file. */
-#undef HAVE_SYS_SYSCALL_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-#undef LT_OBJDIR
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define to 1 if strerror_r returns char *. */
-#undef STRERROR_R_CHAR_P
-
-/* Version number of package */
-#undef VERSION
diff --git a/config.sub b/config.sub
deleted file mode 100755
index c894da4..0000000
--- a/config.sub
+++ /dev/null
@@ -1,1773 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-# 2011, 2012 Free Software Foundation, Inc.
-
-timestamp='2012-02-10'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine. It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches at gnu.org>. Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support. The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
- $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches at gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help"
- exit 1 ;;
-
- *local*)
- # First pass through any local machine types.
- echo $1
- exit ;;
-
- * )
- break ;;
- esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
- exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
- exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
- nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
- linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
- knetbsd*-gnu* | netbsd*-gnu* | \
- kopensolaris*-gnu* | \
- storm-chaos* | os2-emx* | rtmk-nova*)
- os=-$maybe_os
- basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
- ;;
- android-linux)
- os=-linux-android
- basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
- ;;
- *)
- basic_machine=`echo $1 | sed 's/-[^-]*$//'`
- if [ $basic_machine != $1 ]
- then os=`echo $1 | sed 's/.*-/-/'`
- else os=; fi
- ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work. We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
- -sun*os*)
- # Prevent following clause from handling this invalid input.
- ;;
- -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
- -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
- -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
- -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
- -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
- -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
- -apple | -axis | -knuth | -cray | -microblaze)
- os=
- basic_machine=$1
- ;;
- -bluegene*)
- os=-cnk
- ;;
- -sim | -cisco | -oki | -wec | -winbond)
- os=
- basic_machine=$1
- ;;
- -scout)
- ;;
- -wrs)
- os=-vxworks
- basic_machine=$1
- ;;
- -chorusos*)
- os=-chorusos
- basic_machine=$1
- ;;
- -chorusrdb)
- os=-chorusrdb
- basic_machine=$1
- ;;
- -hiux*)
- os=-hiuxwe2
- ;;
- -sco6)
- os=-sco5v6
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco5)
- os=-sco3.2v5
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco4)
- os=-sco3.2v4
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2.[4-9]*)
- os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2v[4-9]*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco*)
- os=-sco3.2v2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -udk*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -isc)
- os=-isc2.2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -clix*)
- basic_machine=clipper-intergraph
- ;;
- -isc*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -lynx*)
- os=-lynxos
- ;;
- -ptx*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
- ;;
- -windowsnt*)
- os=`echo $os | sed -e 's/windowsnt/winnt/'`
- ;;
- -psos*)
- os=-psos
- ;;
- -mint | -mint[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
- # Recognize the basic CPU types without company name.
- # Some are omitted here because they have special meanings below.
- 1750a | 580 \
- | a29k \
- | aarch64 | aarch64_be \
- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
- | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
- | am33_2.0 \
- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
- | be32 | be64 \
- | bfin \
- | c4x | clipper \
- | d10v | d30v | dlx | dsp16xx \
- | epiphany \
- | fido | fr30 | frv \
- | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
- | hexagon \
- | i370 | i860 | i960 | ia64 \
- | ip2k | iq2000 \
- | le32 | le64 \
- | lm32 \
- | m32c | m32r | m32rle | m68000 | m68k | m88k \
- | maxq | mb | microblaze | mcore | mep | metag \
- | mips | mipsbe | mipseb | mipsel | mipsle \
- | mips16 \
- | mips64 | mips64el \
- | mips64octeon | mips64octeonel \
- | mips64orion | mips64orionel \
- | mips64r5900 | mips64r5900el \
- | mips64vr | mips64vrel \
- | mips64vr4100 | mips64vr4100el \
- | mips64vr4300 | mips64vr4300el \
- | mips64vr5000 | mips64vr5000el \
- | mips64vr5900 | mips64vr5900el \
- | mipsisa32 | mipsisa32el \
- | mipsisa32r2 | mipsisa32r2el \
- | mipsisa64 | mipsisa64el \
- | mipsisa64r2 | mipsisa64r2el \
- | mipsisa64sb1 | mipsisa64sb1el \
- | mipsisa64sr71k | mipsisa64sr71kel \
- | mipstx39 | mipstx39el \
- | mn10200 | mn10300 \
- | moxie \
- | mt \
- | msp430 \
- | nds32 | nds32le | nds32be \
- | nios | nios2 \
- | ns16k | ns32k \
- | open8 \
- | or32 \
- | pdp10 | pdp11 | pj | pjl \
- | powerpc | powerpc64 | powerpc64le | powerpcle \
- | pyramid \
- | rl78 | rx \
- | score \
- | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
- | sh64 | sh64le \
- | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
- | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
- | spu \
- | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
- | ubicom32 \
- | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
- | we32k \
- | x86 | xc16x | xstormy16 | xtensa \
- | z8k | z80)
- basic_machine=$basic_machine-unknown
- ;;
- c54x)
- basic_machine=tic54x-unknown
- ;;
- c55x)
- basic_machine=tic55x-unknown
- ;;
- c6x)
- basic_machine=tic6x-unknown
- ;;
- m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
- basic_machine=$basic_machine-unknown
- os=-none
- ;;
- m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
- ;;
- ms1)
- basic_machine=mt-unknown
- ;;
-
- strongarm | thumb | xscale)
- basic_machine=arm-unknown
- ;;
- xgate)
- basic_machine=$basic_machine-unknown
- os=-none
- ;;
- xscaleeb)
- basic_machine=armeb-unknown
- ;;
-
- xscaleel)
- basic_machine=armel-unknown
- ;;
-
- # We use `pc' rather than `unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i*86 | x86_64)
- basic_machine=$basic_machine-pc
- ;;
- # Object if more than one company name word.
- *-*-*)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
- # Recognize the basic CPU types with company name.
- 580-* \
- | a29k-* \
- | aarch64-* | aarch64_be-* \
- | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
- | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
- | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
- | avr-* | avr32-* \
- | be32-* | be64-* \
- | bfin-* | bs2000-* \
- | c[123]* | c30-* | [cjt]90-* | c4x-* \
- | clipper-* | craynv-* | cydra-* \
- | d10v-* | d30v-* | dlx-* \
- | elxsi-* \
- | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
- | h8300-* | h8500-* \
- | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
- | hexagon-* \
- | i*86-* | i860-* | i960-* | ia64-* \
- | ip2k-* | iq2000-* \
- | le32-* | le64-* \
- | lm32-* \
- | m32c-* | m32r-* | m32rle-* \
- | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
- | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
- | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
- | mips16-* \
- | mips64-* | mips64el-* \
- | mips64octeon-* | mips64octeonel-* \
- | mips64orion-* | mips64orionel-* \
- | mips64r5900-* | mips64r5900el-* \
- | mips64vr-* | mips64vrel-* \
- | mips64vr4100-* | mips64vr4100el-* \
- | mips64vr4300-* | mips64vr4300el-* \
- | mips64vr5000-* | mips64vr5000el-* \
- | mips64vr5900-* | mips64vr5900el-* \
- | mipsisa32-* | mipsisa32el-* \
- | mipsisa32r2-* | mipsisa32r2el-* \
- | mipsisa64-* | mipsisa64el-* \
- | mipsisa64r2-* | mipsisa64r2el-* \
- | mipsisa64sb1-* | mipsisa64sb1el-* \
- | mipsisa64sr71k-* | mipsisa64sr71kel-* \
- | mipstx39-* | mipstx39el-* \
- | mmix-* \
- | mt-* \
- | msp430-* \
- | nds32-* | nds32le-* | nds32be-* \
- | nios-* | nios2-* \
- | none-* | np1-* | ns16k-* | ns32k-* \
- | open8-* \
- | orion-* \
- | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
- | pyramid-* \
- | rl78-* | romp-* | rs6000-* | rx-* \
- | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
- | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
- | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
- | sparclite-* \
- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
- | tahoe-* \
- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
- | tile*-* \
- | tron-* \
- | ubicom32-* \
- | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
- | vax-* \
- | we32k-* \
- | x86-* | x86_64-* | xc16x-* | xps100-* \
- | xstormy16-* | xtensa*-* \
- | ymp-* \
- | z8k-* | z80-*)
- ;;
- # Recognize the basic CPU types without company name, with glob match.
- xtensa*)
- basic_machine=$basic_machine-unknown
- ;;
- # Recognize the various machine names and aliases which stand
- # for a CPU type and a company and sometimes even an OS.
- 386bsd)
- basic_machine=i386-unknown
- os=-bsd
- ;;
- 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
- basic_machine=m68000-att
- ;;
- 3b*)
- basic_machine=we32k-att
- ;;
- a29khif)
- basic_machine=a29k-amd
- os=-udi
- ;;
- abacus)
- basic_machine=abacus-unknown
- ;;
- adobe68k)
- basic_machine=m68010-adobe
- os=-scout
- ;;
- alliant | fx80)
- basic_machine=fx80-alliant
- ;;
- altos | altos3068)
- basic_machine=m68k-altos
- ;;
- am29k)
- basic_machine=a29k-none
- os=-bsd
- ;;
- amd64)
- basic_machine=x86_64-pc
- ;;
- amd64-*)
- basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- amdahl)
- basic_machine=580-amdahl
- os=-sysv
- ;;
- amiga | amiga-*)
- basic_machine=m68k-unknown
- ;;
- amigaos | amigados)
- basic_machine=m68k-unknown
- os=-amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-unknown
- os=-sysv4
- ;;
- apollo68)
- basic_machine=m68k-apollo
- os=-sysv
- ;;
- apollo68bsd)
- basic_machine=m68k-apollo
- os=-bsd
- ;;
- aros)
- basic_machine=i386-pc
- os=-aros
- ;;
- aux)
- basic_machine=m68k-apple
- os=-aux
- ;;
- balance)
- basic_machine=ns32k-sequent
- os=-dynix
- ;;
- blackfin)
- basic_machine=bfin-unknown
- os=-linux
- ;;
- blackfin-*)
- basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- bluegene*)
- basic_machine=powerpc-ibm
- os=-cnk
- ;;
- c54x-*)
- basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- c55x-*)
- basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- c6x-*)
- basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- c90)
- basic_machine=c90-cray
- os=-unicos
- ;;
- cegcc)
- basic_machine=arm-unknown
- os=-cegcc
- ;;
- convex-c1)
- basic_machine=c1-convex
- os=-bsd
- ;;
- convex-c2)
- basic_machine=c2-convex
- os=-bsd
- ;;
- convex-c32)
- basic_machine=c32-convex
- os=-bsd
- ;;
- convex-c34)
- basic_machine=c34-convex
- os=-bsd
- ;;
- convex-c38)
- basic_machine=c38-convex
- os=-bsd
- ;;
- cray | j90)
- basic_machine=j90-cray
- os=-unicos
- ;;
- craynv)
- basic_machine=craynv-cray
- os=-unicosmp
- ;;
- cr16 | cr16-*)
- basic_machine=cr16-unknown
- os=-elf
- ;;
- crds | unos)
- basic_machine=m68k-crds
- ;;
- crisv32 | crisv32-* | etraxfs*)
- basic_machine=crisv32-axis
- ;;
- cris | cris-* | etrax*)
- basic_machine=cris-axis
- ;;
- crx)
- basic_machine=crx-unknown
- os=-elf
- ;;
- da30 | da30-*)
- basic_machine=m68k-da30
- ;;
- decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
- basic_machine=mips-dec
- ;;
- decsystem10* | dec10*)
- basic_machine=pdp10-dec
- os=-tops10
- ;;
- decsystem20* | dec20*)
- basic_machine=pdp10-dec
- os=-tops20
- ;;
- delta | 3300 | motorola-3300 | motorola-delta \
- | 3300-motorola | delta-motorola)
- basic_machine=m68k-motorola
- ;;
- delta88)
- basic_machine=m88k-motorola
- os=-sysv3
- ;;
- dicos)
- basic_machine=i686-pc
- os=-dicos
- ;;
- djgpp)
- basic_machine=i586-pc
- os=-msdosdjgpp
- ;;
- dpx20 | dpx20-*)
- basic_machine=rs6000-bull
- os=-bosx
- ;;
- dpx2* | dpx2*-bull)
- basic_machine=m68k-bull
- os=-sysv3
- ;;
- ebmon29k)
- basic_machine=a29k-amd
- os=-ebmon
- ;;
- elxsi)
- basic_machine=elxsi-elxsi
- os=-bsd
- ;;
- encore | umax | mmax)
- basic_machine=ns32k-encore
- ;;
- es1800 | OSE68k | ose68k | ose | OSE)
- basic_machine=m68k-ericsson
- os=-ose
- ;;
- fx2800)
- basic_machine=i860-alliant
- ;;
- genix)
- basic_machine=ns32k-ns
- ;;
- gmicro)
- basic_machine=tron-gmicro
- os=-sysv
- ;;
- go32)
- basic_machine=i386-pc
- os=-go32
- ;;
- h3050r* | hiux*)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- h8300hms)
- basic_machine=h8300-hitachi
- os=-hms
- ;;
- h8300xray)
- basic_machine=h8300-hitachi
- os=-xray
- ;;
- h8500hms)
- basic_machine=h8500-hitachi
- os=-hms
- ;;
- harris)
- basic_machine=m88k-harris
- os=-sysv3
- ;;
- hp300-*)
- basic_machine=m68k-hp
- ;;
- hp300bsd)
- basic_machine=m68k-hp
- os=-bsd
- ;;
- hp300hpux)
- basic_machine=m68k-hp
- os=-hpux
- ;;
- hp3k9[0-9][0-9] | hp9[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k2[0-9][0-9] | hp9k31[0-9])
- basic_machine=m68000-hp
- ;;
- hp9k3[2-9][0-9])
- basic_machine=m68k-hp
- ;;
- hp9k6[0-9][0-9] | hp6[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k7[0-79][0-9] | hp7[0-79][0-9])
- basic_machine=hppa1.1-hp
- ;;
- hp9k78[0-9] | hp78[0-9])
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][13679] | hp8[0-9][13679])
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][0-9] | hp8[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hppa-next)
- os=-nextstep3
- ;;
- hppaosf)
- basic_machine=hppa1.1-hp
- os=-osf
- ;;
- hppro)
- basic_machine=hppa1.1-hp
- os=-proelf
- ;;
- i370-ibm* | ibm*)
- basic_machine=i370-ibm
- ;;
- i*86v32)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv32
- ;;
- i*86v4*)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv4
- ;;
- i*86v)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv
- ;;
- i*86sol2)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-solaris2
- ;;
- i386mach)
- basic_machine=i386-mach
- os=-mach
- ;;
- i386-vsta | vsta)
- basic_machine=i386-unknown
- os=-vsta
- ;;
- iris | iris4d)
- basic_machine=mips-sgi
- case $os in
- -irix*)
- ;;
- *)
- os=-irix4
- ;;
- esac
- ;;
- isi68 | isi)
- basic_machine=m68k-isi
- os=-sysv
- ;;
- m68knommu)
- basic_machine=m68k-unknown
- os=-linux
- ;;
- m68knommu-*)
- basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- m88k-omron*)
- basic_machine=m88k-omron
- ;;
- magnum | m3230)
- basic_machine=mips-mips
- os=-sysv
- ;;
- merlin)
- basic_machine=ns32k-utek
- os=-sysv
- ;;
- microblaze)
- basic_machine=microblaze-xilinx
- ;;
- mingw32)
- basic_machine=i386-pc
- os=-mingw32
- ;;
- mingw32ce)
- basic_machine=arm-unknown
- os=-mingw32ce
- ;;
- miniframe)
- basic_machine=m68000-convergent
- ;;
- *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
- mips3*-*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
- ;;
- mips3*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
- ;;
- monitor)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- morphos)
- basic_machine=powerpc-unknown
- os=-morphos
- ;;
- msdos)
- basic_machine=i386-pc
- os=-msdos
- ;;
- ms1-*)
- basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
- ;;
- msys)
- basic_machine=i386-pc
- os=-msys
- ;;
- mvs)
- basic_machine=i370-ibm
- os=-mvs
- ;;
- nacl)
- basic_machine=le32-unknown
- os=-nacl
- ;;
- ncr3000)
- basic_machine=i486-ncr
- os=-sysv4
- ;;
- netbsd386)
- basic_machine=i386-unknown
- os=-netbsd
- ;;
- netwinder)
- basic_machine=armv4l-rebel
- os=-linux
- ;;
- news | news700 | news800 | news900)
- basic_machine=m68k-sony
- os=-newsos
- ;;
- news1000)
- basic_machine=m68030-sony
- os=-newsos
- ;;
- news-3600 | risc-news)
- basic_machine=mips-sony
- os=-newsos
- ;;
- necv70)
- basic_machine=v70-nec
- os=-sysv
- ;;
- next | m*-next )
- basic_machine=m68k-next
- case $os in
- -nextstep* )
- ;;
- -ns2*)
- os=-nextstep2
- ;;
- *)
- os=-nextstep3
- ;;
- esac
- ;;
- nh3000)
- basic_machine=m68k-harris
- os=-cxux
- ;;
- nh[45]000)
- basic_machine=m88k-harris
- os=-cxux
- ;;
- nindy960)
- basic_machine=i960-intel
- os=-nindy
- ;;
- mon960)
- basic_machine=i960-intel
- os=-mon960
- ;;
- nonstopux)
- basic_machine=mips-compaq
- os=-nonstopux
- ;;
- np1)
- basic_machine=np1-gould
- ;;
- neo-tandem)
- basic_machine=neo-tandem
- ;;
- nse-tandem)
- basic_machine=nse-tandem
- ;;
- nsr-tandem)
- basic_machine=nsr-tandem
- ;;
- op50n-* | op60c-*)
- basic_machine=hppa1.1-oki
- os=-proelf
- ;;
- openrisc | openrisc-*)
- basic_machine=or32-unknown
- ;;
- os400)
- basic_machine=powerpc-ibm
- os=-os400
- ;;
- OSE68000 | ose68000)
- basic_machine=m68000-ericsson
- os=-ose
- ;;
- os68k)
- basic_machine=m68k-none
- os=-os68k
- ;;
- pa-hitachi)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- paragon)
- basic_machine=i860-intel
- os=-osf
- ;;
- parisc)
- basic_machine=hppa-unknown
- os=-linux
- ;;
- parisc-*)
- basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
- os=-linux
- ;;
- pbd)
- basic_machine=sparc-tti
- ;;
- pbb)
- basic_machine=m68k-tti
- ;;
- pc532 | pc532-*)
- basic_machine=ns32k-pc532
- ;;
- pc98)
- basic_machine=i386-pc
- ;;
- pc98-*)
- basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentium | p5 | k5 | k6 | nexgen | viac3)
- basic_machine=i586-pc
- ;;
- pentiumpro | p6 | 6x86 | athlon | athlon_*)
- basic_machine=i686-pc
- ;;
- pentiumii | pentium2 | pentiumiii | pentium3)
- basic_machine=i686-pc
- ;;
- pentium4)
- basic_machine=i786-pc
- ;;
- pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
- basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumpro-* | p6-* | 6x86-* | athlon-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentium4-*)
- basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pn)
- basic_machine=pn-gould
- ;;
- power) basic_machine=power-ibm
- ;;
- ppc | ppcbe) basic_machine=powerpc-unknown
- ;;
- ppc-* | ppcbe-*)
- basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppcle | powerpclittle | ppc-le | powerpc-little)
- basic_machine=powerpcle-unknown
- ;;
- ppcle-* | powerpclittle-*)
- basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppc64) basic_machine=powerpc64-unknown
- ;;
- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppc64le | powerpc64little | ppc64-le | powerpc64-little)
- basic_machine=powerpc64le-unknown
- ;;
- ppc64le-* | powerpc64little-*)
- basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ps2)
- basic_machine=i386-ibm
- ;;
- pw32)
- basic_machine=i586-unknown
- os=-pw32
- ;;
- rdos)
- basic_machine=i386-pc
- os=-rdos
- ;;
- rom68k)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- rm[46]00)
- basic_machine=mips-siemens
- ;;
- rtpc | rtpc-*)
- basic_machine=romp-ibm
- ;;
- s390 | s390-*)
- basic_machine=s390-ibm
- ;;
- s390x | s390x-*)
- basic_machine=s390x-ibm
- ;;
- sa29200)
- basic_machine=a29k-amd
- os=-udi
- ;;
- sb1)
- basic_machine=mipsisa64sb1-unknown
- ;;
- sb1el)
- basic_machine=mipsisa64sb1el-unknown
- ;;
- sde)
- basic_machine=mipsisa32-sde
- os=-elf
- ;;
- sei)
- basic_machine=mips-sei
- os=-seiux
- ;;
- sequent)
- basic_machine=i386-sequent
- ;;
- sh)
- basic_machine=sh-hitachi
- os=-hms
- ;;
- sh5el)
- basic_machine=sh5le-unknown
- ;;
- sh64)
- basic_machine=sh64-unknown
- ;;
- sparclite-wrs | simso-wrs)
- basic_machine=sparclite-wrs
- os=-vxworks
- ;;
- sps7)
- basic_machine=m68k-bull
- os=-sysv2
- ;;
- spur)
- basic_machine=spur-unknown
- ;;
- st2000)
- basic_machine=m68k-tandem
- ;;
- stratus)
- basic_machine=i860-stratus
- os=-sysv4
- ;;
- strongarm-* | thumb-*)
- basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- sun2)
- basic_machine=m68000-sun
- ;;
- sun2os3)
- basic_machine=m68000-sun
- os=-sunos3
- ;;
- sun2os4)
- basic_machine=m68000-sun
- os=-sunos4
- ;;
- sun3os3)
- basic_machine=m68k-sun
- os=-sunos3
- ;;
- sun3os4)
- basic_machine=m68k-sun
- os=-sunos4
- ;;
- sun4os3)
- basic_machine=sparc-sun
- os=-sunos3
- ;;
- sun4os4)
- basic_machine=sparc-sun
- os=-sunos4
- ;;
- sun4sol2)
- basic_machine=sparc-sun
- os=-solaris2
- ;;
- sun3 | sun3-*)
- basic_machine=m68k-sun
- ;;
- sun4)
- basic_machine=sparc-sun
- ;;
- sun386 | sun386i | roadrunner)
- basic_machine=i386-sun
- ;;
- sv1)
- basic_machine=sv1-cray
- os=-unicos
- ;;
- symmetry)
- basic_machine=i386-sequent
- os=-dynix
- ;;
- t3e)
- basic_machine=alphaev5-cray
- os=-unicos
- ;;
- t90)
- basic_machine=t90-cray
- os=-unicos
- ;;
- tile*)
- basic_machine=$basic_machine-unknown
- os=-linux-gnu
- ;;
- tx39)
- basic_machine=mipstx39-unknown
- ;;
- tx39el)
- basic_machine=mipstx39el-unknown
- ;;
- toad1)
- basic_machine=pdp10-xkl
- os=-tops20
- ;;
- tower | tower-32)
- basic_machine=m68k-ncr
- ;;
- tpf)
- basic_machine=s390x-ibm
- os=-tpf
- ;;
- udi29k)
- basic_machine=a29k-amd
- os=-udi
- ;;
- ultra3)
- basic_machine=a29k-nyu
- os=-sym1
- ;;
- v810 | necv810)
- basic_machine=v810-nec
- os=-none
- ;;
- vaxv)
- basic_machine=vax-dec
- os=-sysv
- ;;
- vms)
- basic_machine=vax-dec
- os=-vms
- ;;
- vpp*|vx|vx-*)
- basic_machine=f301-fujitsu
- ;;
- vxworks960)
- basic_machine=i960-wrs
- os=-vxworks
- ;;
- vxworks68)
- basic_machine=m68k-wrs
- os=-vxworks
- ;;
- vxworks29k)
- basic_machine=a29k-wrs
- os=-vxworks
- ;;
- w65*)
- basic_machine=w65-wdc
- os=-none
- ;;
- w89k-*)
- basic_machine=hppa1.1-winbond
- os=-proelf
- ;;
- xbox)
- basic_machine=i686-pc
- os=-mingw32
- ;;
- xps | xps100)
- basic_machine=xps100-honeywell
- ;;
- xscale-* | xscalee[bl]-*)
- basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
- ;;
- ymp)
- basic_machine=ymp-cray
- os=-unicos
- ;;
- z8k-*-coff)
- basic_machine=z8k-unknown
- os=-sim
- ;;
- z80-*-coff)
- basic_machine=z80-unknown
- os=-sim
- ;;
- none)
- basic_machine=none-none
- os=-none
- ;;
-
-# Here we handle the default manufacturer of certain CPU types. It is in
-# some cases the only manufacturer, in others, it is the most popular.
- w89k)
- basic_machine=hppa1.1-winbond
- ;;
- op50n)
- basic_machine=hppa1.1-oki
- ;;
- op60c)
- basic_machine=hppa1.1-oki
- ;;
- romp)
- basic_machine=romp-ibm
- ;;
- mmix)
- basic_machine=mmix-knuth
- ;;
- rs6000)
- basic_machine=rs6000-ibm
- ;;
- vax)
- basic_machine=vax-dec
- ;;
- pdp10)
- # there are many clones, so DEC is not a safe bet
- basic_machine=pdp10-unknown
- ;;
- pdp11)
- basic_machine=pdp11-dec
- ;;
- we32k)
- basic_machine=we32k-att
- ;;
- sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
- basic_machine=sh-unknown
- ;;
- sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
- basic_machine=sparc-sun
- ;;
- cydra)
- basic_machine=cydra-cydrome
- ;;
- orion)
- basic_machine=orion-highlevel
- ;;
- orion105)
- basic_machine=clipper-highlevel
- ;;
- mac | mpw | mac-mpw)
- basic_machine=m68k-apple
- ;;
- pmac | pmac-mpw)
- basic_machine=powerpc-apple
- ;;
- *-unknown)
- # Make sure to match an already-canonicalized machine name.
- ;;
- *)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
- *-digital*)
- basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
- ;;
- *-commodore*)
- basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
- ;;
- *)
- ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
- # First match some system type aliases
- # that might get confused with valid system types.
- # -solaris* is a basic system type, with this one exception.
- -auroraux)
- os=-auroraux
- ;;
- -solaris1 | -solaris1.*)
- os=`echo $os | sed -e 's|solaris1|sunos4|'`
- ;;
- -solaris)
- os=-solaris2
- ;;
- -svr4*)
- os=-sysv4
- ;;
- -unixware*)
- os=-sysv4.2uw
- ;;
- -gnu/linux*)
- os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
- ;;
- # First accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST END IN A *, to match a version number.
- # -sysv* is not here because it comes later, after sysvr4.
- -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
- | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
- | -sym* | -kopensolaris* \
- | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
- | -aos* | -aros* \
- | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
- | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
- | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
- | -openbsd* | -solidbsd* \
- | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
- | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
- | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
- | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
- | -chorusos* | -chorusrdb* | -cegcc* \
- | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -mingw32* | -linux-gnu* | -linux-android* \
- | -linux-newlib* | -linux-uclibc* \
- | -uxpv* | -beos* | -mpeix* | -udk* \
- | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
- | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
- | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
- | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
- | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
- | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
- | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
- # Remember, each alternative MUST END IN *, to match a version number.
- ;;
- -qnx*)
- case $basic_machine in
- x86-* | i*86-*)
- ;;
- *)
- os=-nto$os
- ;;
- esac
- ;;
- -nto-qnx*)
- ;;
- -nto*)
- os=`echo $os | sed -e 's|nto|nto-qnx|'`
- ;;
- -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
- | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
- | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
- ;;
- -mac*)
- os=`echo $os | sed -e 's|mac|macos|'`
- ;;
- -linux-dietlibc)
- os=-linux-dietlibc
- ;;
- -linux*)
- os=`echo $os | sed -e 's|linux|linux-gnu|'`
- ;;
- -sunos5*)
- os=`echo $os | sed -e 's|sunos5|solaris2|'`
- ;;
- -sunos6*)
- os=`echo $os | sed -e 's|sunos6|solaris3|'`
- ;;
- -opened*)
- os=-openedition
- ;;
- -os400*)
- os=-os400
- ;;
- -wince*)
- os=-wince
- ;;
- -osfrose*)
- os=-osfrose
- ;;
- -osf*)
- os=-osf
- ;;
- -utek*)
- os=-bsd
- ;;
- -dynix*)
- os=-bsd
- ;;
- -acis*)
- os=-aos
- ;;
- -atheos*)
- os=-atheos
- ;;
- -syllable*)
- os=-syllable
- ;;
- -386bsd)
- os=-bsd
- ;;
- -ctix* | -uts*)
- os=-sysv
- ;;
- -nova*)
- os=-rtmk-nova
- ;;
- -ns2 )
- os=-nextstep2
- ;;
- -nsk*)
- os=-nsk
- ;;
- # Preserve the version number of sinix5.
- -sinix5.*)
- os=`echo $os | sed -e 's|sinix|sysv|'`
- ;;
- -sinix*)
- os=-sysv4
- ;;
- -tpf*)
- os=-tpf
- ;;
- -triton*)
- os=-sysv3
- ;;
- -oss*)
- os=-sysv3
- ;;
- -svr4)
- os=-sysv4
- ;;
- -svr3)
- os=-sysv3
- ;;
- -sysvr4)
- os=-sysv4
- ;;
- # This must come after -sysvr4.
- -sysv*)
- ;;
- -ose*)
- os=-ose
- ;;
- -es1800*)
- os=-ose
- ;;
- -xenix)
- os=-xenix
- ;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- os=-mint
- ;;
- -aros*)
- os=-aros
- ;;
- -kaos*)
- os=-kaos
- ;;
- -zvmoe)
- os=-zvmoe
- ;;
- -dicos*)
- os=-dicos
- ;;
- -nacl*)
- ;;
- -none)
- ;;
- *)
- # Get rid of the `-' at the beginning of $os.
- os=`echo $os | sed 's/[^-]*-//'`
- echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
- exit 1
- ;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system. Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
- score-*)
- os=-elf
- ;;
- spu-*)
- os=-elf
- ;;
- *-acorn)
- os=-riscix1.2
- ;;
- arm*-rebel)
- os=-linux
- ;;
- arm*-semi)
- os=-aout
- ;;
- c4x-* | tic4x-*)
- os=-coff
- ;;
- tic54x-*)
- os=-coff
- ;;
- tic55x-*)
- os=-coff
- ;;
- tic6x-*)
- os=-coff
- ;;
- # This must come before the *-dec entry.
- pdp10-*)
- os=-tops20
- ;;
- pdp11-*)
- os=-none
- ;;
- *-dec | vax-*)
- os=-ultrix4.2
- ;;
- m68*-apollo)
- os=-domain
- ;;
- i386-sun)
- os=-sunos4.0.2
- ;;
- m68000-sun)
- os=-sunos3
- ;;
- m68*-cisco)
- os=-aout
- ;;
- mep-*)
- os=-elf
- ;;
- mips*-cisco)
- os=-elf
- ;;
- mips*-*)
- os=-elf
- ;;
- or32-*)
- os=-coff
- ;;
- *-tti) # must be before sparc entry or we get the wrong os.
- os=-sysv3
- ;;
- sparc-* | *-sun)
- os=-sunos4.1.1
- ;;
- *-be)
- os=-beos
- ;;
- *-haiku)
- os=-haiku
- ;;
- *-ibm)
- os=-aix
- ;;
- *-knuth)
- os=-mmixware
- ;;
- *-wec)
- os=-proelf
- ;;
- *-winbond)
- os=-proelf
- ;;
- *-oki)
- os=-proelf
- ;;
- *-hp)
- os=-hpux
- ;;
- *-hitachi)
- os=-hiux
- ;;
- i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
- os=-sysv
- ;;
- *-cbm)
- os=-amigaos
- ;;
- *-dg)
- os=-dgux
- ;;
- *-dolphin)
- os=-sysv3
- ;;
- m68k-ccur)
- os=-rtu
- ;;
- m88k-omron*)
- os=-luna
- ;;
- *-next )
- os=-nextstep
- ;;
- *-sequent)
- os=-ptx
- ;;
- *-crds)
- os=-unos
- ;;
- *-ns)
- os=-genix
- ;;
- i370-*)
- os=-mvs
- ;;
- *-next)
- os=-nextstep3
- ;;
- *-gould)
- os=-sysv
- ;;
- *-highlevel)
- os=-bsd
- ;;
- *-encore)
- os=-bsd
- ;;
- *-sgi)
- os=-irix
- ;;
- *-siemens)
- os=-sysv4
- ;;
- *-masscomp)
- os=-rtu
- ;;
- f30[01]-fujitsu | f700-fujitsu)
- os=-uxpv
- ;;
- *-rom68k)
- os=-coff
- ;;
- *-*bug)
- os=-coff
- ;;
- *-apple)
- os=-macos
- ;;
- *-atari*)
- os=-mint
- ;;
- *)
- os=-none
- ;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer. We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
- *-unknown)
- case $os in
- -riscix*)
- vendor=acorn
- ;;
- -sunos*)
- vendor=sun
- ;;
- -cnk*|-aix*)
- vendor=ibm
- ;;
- -beos*)
- vendor=be
- ;;
- -hpux*)
- vendor=hp
- ;;
- -mpeix*)
- vendor=hp
- ;;
- -hiux*)
- vendor=hitachi
- ;;
- -unos*)
- vendor=crds
- ;;
- -dgux*)
- vendor=dg
- ;;
- -luna*)
- vendor=omron
- ;;
- -genix*)
- vendor=ns
- ;;
- -mvs* | -opened*)
- vendor=ibm
- ;;
- -os400*)
- vendor=ibm
- ;;
- -ptx*)
- vendor=sequent
- ;;
- -tpf*)
- vendor=ibm
- ;;
- -vxsim* | -vxworks* | -windiss*)
- vendor=wrs
- ;;
- -aux*)
- vendor=apple
- ;;
- -hms*)
- vendor=hitachi
- ;;
- -mpw* | -macos*)
- vendor=apple
- ;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- vendor=atari
- ;;
- -vos*)
- vendor=stratus
- ;;
- esac
- basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
- ;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/configure b/configure
deleted file mode 100755
index dc385a3..0000000
--- a/configure
+++ /dev/null
@@ -1,18209 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for jellyfish 1.1.11.
-#
-# Report bugs to <gmarcais at umd.edu>.
-#
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
-#
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
- emulate sh
- NULLCMD=:
- # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
- setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in #(
- *posix*) :
- set -o posix ;; #(
- *) :
- ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- PATH_SEPARATOR=:
- (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
- (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
- PATH_SEPARATOR=';'
- }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
-# Find who we are. Look in the path if we contain no directory separator.
-as_myself=
-case $0 in #((
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
- as_myself=$0
-fi
-if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
- exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
- emulate sh
- NULLCMD=:
- # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '\${1+\"\$@\"}'='\"\$@\"'
- setopt NO_GLOB_SUBST
-else
- case \`(set -o) 2>/dev/null\` in #(
- *posix*) :
- set -o posix ;; #(
- *) :
- ;;
-esac
-fi
-"
- as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
- exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1"
- as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
- as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
- eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
- test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-
- test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
- ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
- ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
- ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
- PATH=/empty FPATH=/empty; export PATH FPATH
- test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
- || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
- as_have_required=yes
-else
- as_have_required=no
-fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- as_found=:
- case $as_dir in #(
- /*)
- for as_base in sh bash ksh sh5; do
- # Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
- if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
- CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
- break 2
-fi
-fi
- done;;
- esac
- as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
- if test "x$CONFIG_SHELL" != x; then :
- # We cannot yet assume a decent shell, so we have to provide a
- # neutralization value for shells without unset; and this also
- # works around shells that cannot unset nonexistent variables.
- # Preserve -v and -x to the replacement shell.
- BASH_ENV=/dev/null
- ENV=/dev/null
- (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
- export CONFIG_SHELL
- case $- in # ((((
- *v*x* | *x*v* ) as_opts=-vx ;;
- *v* ) as_opts=-v ;;
- *x* ) as_opts=-x ;;
- * ) as_opts= ;;
- esac
- exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
-fi
-
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
- else
- $as_echo "$0: Please tell bug-autoconf at gnu.org and gmarcais at umd.edu
-$0: about your system, including any error possibly output
-$0: before this message. Then install a modern shell, or
-$0: manually run the script under such a shell if you do
-$0: have one."
- fi
- exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
- { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
- return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
- set +e
- as_fn_set_status $1
- exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
- case $as_dir in #(
- -*) as_dir=./$as_dir;;
- esac
- test -d "$as_dir" || eval $as_mkdir_p || {
- as_dirs=
- while :; do
- case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
- *) as_qdir=$as_dir;;
- esac
- as_dirs="'$as_qdir' $as_dirs"
- as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_dir" : 'X\(//\)[^/]' \| \
- X"$as_dir" : 'X\(//\)$' \| \
- X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- test -d "$as_dir" && break
- done
- test -z "$as_dirs" || eval "mkdir $as_dirs"
- } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
- eval 'as_fn_append ()
- {
- eval $1+=\$2
- }'
-else
- as_fn_append ()
- {
- eval $1=\$$1\$2
- }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
- eval 'as_fn_arith ()
- {
- as_val=$(( $* ))
- }'
-else
- as_fn_arith ()
- {
- as_val=`expr "$@" || test $? -eq 1`
- }
-fi # as_fn_arith
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
- as_status=$1; test $as_status -eq 0 && as_status=1
- if test "$4"; then
- as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
- fi
- $as_echo "$as_me: error: $2" >&2
- as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
- test "X`expr 00001 : '.*\(...\)'`" = X001; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
- as_basename=basename
-else
- as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
- as_dirname=dirname
-else
- as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{
- s//\1/
- q
- }
- /^X\/\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\/\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
- as_lineno_1=$LINENO as_lineno_1a=$LINENO
- as_lineno_2=$LINENO as_lineno_2a=$LINENO
- eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
- test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
- # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
- sed -n '
- p
- /[$]LINENO/=
- ' <$as_myself |
- sed '
- s/[$]LINENO.*/&-/
- t lineno
- b
- :lineno
- N
- :loop
- s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
- t loop
- s/-\n.*//
- ' >$as_me.lineno &&
- chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
- # Don't try to exec as it changes $[0], causing all sort of problems
- # (the dirname of $[0] is not the place where we might find the
- # original and so on. Autoconf is especially sensitive to this).
- . "./$as_me.lineno"
- # Exit status is that of the last command.
- exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
- case `echo 'xy\c'` in
- *c*) ECHO_T=' ';; # ECHO_T is single tab character.
- xy) ECHO_C='\c';;
- *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
- ECHO_T=' ';;
- esac;;
-*)
- ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
- rm -f conf$$.dir/conf$$.file
-else
- rm -f conf$$.dir
- mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
- if ln -s conf$$.file conf$$ 2>/dev/null; then
- as_ln_s='ln -s'
- # ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -p'.
- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -p'
- elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
- else
- as_ln_s='cp -p'
- fi
-else
- as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
- as_mkdir_p='mkdir -p "$as_dir"'
-else
- test -d ./-p && rmdir ./-p
- as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
- as_test_x='test -x'
-else
- if ls -dL / >/dev/null 2>&1; then
- as_ls_L_option=L
- else
- as_ls_L_option=
- fi
- as_test_x='
- eval sh -c '\''
- if test -d "$1"; then
- test -d "$1/.";
- else
- case $1 in #(
- -*)set "./$1";;
- esac;
- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
- ???[sx]*):;;*)false;;esac;fi
- '\'' sh
- '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-
-test -n "$DJDIR" || exec 7<&0 </dev/null
-exec 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='jellyfish'
-PACKAGE_TARNAME='jellyfish'
-PACKAGE_VERSION='1.1.11'
-PACKAGE_STRING='jellyfish 1.1.11'
-PACKAGE_BUGREPORT='gmarcais at umd.edu'
-PACKAGE_URL=''
-
-ac_unique_file="jellyfish"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-# include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='am__EXEEXT_FALSE
-am__EXEEXT_TRUE
-LTLIBOBJS
-LIBOBJS
-STATIC_FLAGS
-MD5
-CXXCPP
-am__fastdepCXX_FALSE
-am__fastdepCXX_TRUE
-CXXDEPMODE
-ac_ct_CXX
-CXXFLAGS
-CXX
-CPP
-OTOOL64
-OTOOL
-LIPO
-NMEDIT
-DSYMUTIL
-MANIFEST_TOOL
-RANLIB
-ac_ct_AR
-AR
-DLLTOOL
-OBJDUMP
-LN_S
-NM
-ac_ct_DUMPBIN
-DUMPBIN
-LD
-FGREP
-EGREP
-GREP
-SED
-am__fastdepCC_FALSE
-am__fastdepCC_TRUE
-CCDEPMODE
-am__nodep
-AMDEPBACKSLASH
-AMDEP_FALSE
-AMDEP_TRUE
-am__quote
-am__include
-DEPDIR
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-LIBTOOL
-AM_BACKSLASH
-AM_DEFAULT_VERBOSITY
-AM_DEFAULT_V
-AM_V
-am__untar
-am__tar
-AMTAR
-am__leading_dot
-SET_MAKE
-AWK
-mkdir_p
-MKDIR_P
-INSTALL_STRIP_PROGRAM
-STRIP
-install_sh
-MAKEINFO
-AUTOHEADER
-AUTOMAKE
-AUTOCONF
-ACLOCAL
-VERSION
-PACKAGE
-CYGPATH_W
-am__isrc
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_silent_rules
-enable_shared
-enable_static
-with_pic
-enable_fast_install
-enable_dependency_tracking
-with_gnu_ld
-with_sysroot
-enable_libtool_lock
-with_sse
-with_half
-enable_all_static
-'
- ac_precious_vars='build_alias
-host_alias
-target_alias
-CC
-CFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CPP
-CXX
-CXXFLAGS
-CCC
-CXXCPP
-MD5'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
- # If the previous option needs an argument, assign it.
- if test -n "$ac_prev"; then
- eval $ac_prev=\$ac_option
- ac_prev=
- continue
- fi
-
- case $ac_option in
- *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
- *=) ac_optarg= ;;
- *) ac_optarg=yes ;;
- esac
-
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
- case $ac_dashdash$ac_option in
- --)
- ac_dashdash=yes ;;
-
- -bindir | --bindir | --bindi | --bind | --bin | --bi)
- ac_prev=bindir ;;
- -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
- bindir=$ac_optarg ;;
-
- -build | --build | --buil | --bui | --bu)
- ac_prev=build_alias ;;
- -build=* | --build=* | --buil=* | --bui=* | --bu=*)
- build_alias=$ac_optarg ;;
-
- -cache-file | --cache-file | --cache-fil | --cache-fi \
- | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
- ac_prev=cache_file ;;
- -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
- | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
- cache_file=$ac_optarg ;;
-
- --config-cache | -C)
- cache_file=config.cache ;;
-
- -datadir | --datadir | --datadi | --datad)
- ac_prev=datadir ;;
- -datadir=* | --datadir=* | --datadi=* | --datad=*)
- datadir=$ac_optarg ;;
-
- -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
- | --dataroo | --dataro | --datar)
- ac_prev=datarootdir ;;
- -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
- | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
- datarootdir=$ac_optarg ;;
-
- -disable-* | --disable-*)
- ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"enable_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval enable_$ac_useropt=no ;;
-
- -docdir | --docdir | --docdi | --doc | --do)
- ac_prev=docdir ;;
- -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
- docdir=$ac_optarg ;;
-
- -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
- ac_prev=dvidir ;;
- -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
- dvidir=$ac_optarg ;;
-
- -enable-* | --enable-*)
- ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"enable_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval enable_$ac_useropt=\$ac_optarg ;;
-
- -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
- | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
- | --exec | --exe | --ex)
- ac_prev=exec_prefix ;;
- -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
- | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
- | --exec=* | --exe=* | --ex=*)
- exec_prefix=$ac_optarg ;;
-
- -gas | --gas | --ga | --g)
- # Obsolete; use --with-gas.
- with_gas=yes ;;
-
- -help | --help | --hel | --he | -h)
- ac_init_help=long ;;
- -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
- ac_init_help=recursive ;;
- -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
- ac_init_help=short ;;
-
- -host | --host | --hos | --ho)
- ac_prev=host_alias ;;
- -host=* | --host=* | --hos=* | --ho=*)
- host_alias=$ac_optarg ;;
-
- -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
- ac_prev=htmldir ;;
- -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
- | --ht=*)
- htmldir=$ac_optarg ;;
-
- -includedir | --includedir | --includedi | --included | --include \
- | --includ | --inclu | --incl | --inc)
- ac_prev=includedir ;;
- -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
- | --includ=* | --inclu=* | --incl=* | --inc=*)
- includedir=$ac_optarg ;;
-
- -infodir | --infodir | --infodi | --infod | --info | --inf)
- ac_prev=infodir ;;
- -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
- infodir=$ac_optarg ;;
-
- -libdir | --libdir | --libdi | --libd)
- ac_prev=libdir ;;
- -libdir=* | --libdir=* | --libdi=* | --libd=*)
- libdir=$ac_optarg ;;
-
- -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
- | --libexe | --libex | --libe)
- ac_prev=libexecdir ;;
- -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
- | --libexe=* | --libex=* | --libe=*)
- libexecdir=$ac_optarg ;;
-
- -localedir | --localedir | --localedi | --localed | --locale)
- ac_prev=localedir ;;
- -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
- localedir=$ac_optarg ;;
-
- -localstatedir | --localstatedir | --localstatedi | --localstated \
- | --localstate | --localstat | --localsta | --localst | --locals)
- ac_prev=localstatedir ;;
- -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
- | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
- localstatedir=$ac_optarg ;;
-
- -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
- ac_prev=mandir ;;
- -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
- mandir=$ac_optarg ;;
-
- -nfp | --nfp | --nf)
- # Obsolete; use --without-fp.
- with_fp=no ;;
-
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c | -n)
- no_create=yes ;;
-
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
- no_recursion=yes ;;
-
- -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
- | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
- | --oldin | --oldi | --old | --ol | --o)
- ac_prev=oldincludedir ;;
- -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
- | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
- | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
- oldincludedir=$ac_optarg ;;
-
- -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
- ac_prev=prefix ;;
- -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
- prefix=$ac_optarg ;;
-
- -program-prefix | --program-prefix | --program-prefi | --program-pref \
- | --program-pre | --program-pr | --program-p)
- ac_prev=program_prefix ;;
- -program-prefix=* | --program-prefix=* | --program-prefi=* \
- | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
- program_prefix=$ac_optarg ;;
-
- -program-suffix | --program-suffix | --program-suffi | --program-suff \
- | --program-suf | --program-su | --program-s)
- ac_prev=program_suffix ;;
- -program-suffix=* | --program-suffix=* | --program-suffi=* \
- | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
- program_suffix=$ac_optarg ;;
-
- -program-transform-name | --program-transform-name \
- | --program-transform-nam | --program-transform-na \
- | --program-transform-n | --program-transform- \
- | --program-transform | --program-transfor \
- | --program-transfo | --program-transf \
- | --program-trans | --program-tran \
- | --progr-tra | --program-tr | --program-t)
- ac_prev=program_transform_name ;;
- -program-transform-name=* | --program-transform-name=* \
- | --program-transform-nam=* | --program-transform-na=* \
- | --program-transform-n=* | --program-transform-=* \
- | --program-transform=* | --program-transfor=* \
- | --program-transfo=* | --program-transf=* \
- | --program-trans=* | --program-tran=* \
- | --progr-tra=* | --program-tr=* | --program-t=*)
- program_transform_name=$ac_optarg ;;
-
- -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
- ac_prev=pdfdir ;;
- -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
- pdfdir=$ac_optarg ;;
-
- -psdir | --psdir | --psdi | --psd | --ps)
- ac_prev=psdir ;;
- -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
- psdir=$ac_optarg ;;
-
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- silent=yes ;;
-
- -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
- ac_prev=sbindir ;;
- -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
- | --sbi=* | --sb=*)
- sbindir=$ac_optarg ;;
-
- -sharedstatedir | --sharedstatedir | --sharedstatedi \
- | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
- | --sharedst | --shareds | --shared | --share | --shar \
- | --sha | --sh)
- ac_prev=sharedstatedir ;;
- -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
- | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
- | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
- | --sha=* | --sh=*)
- sharedstatedir=$ac_optarg ;;
-
- -site | --site | --sit)
- ac_prev=site ;;
- -site=* | --site=* | --sit=*)
- site=$ac_optarg ;;
-
- -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
- ac_prev=srcdir ;;
- -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
- srcdir=$ac_optarg ;;
-
- -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
- | --syscon | --sysco | --sysc | --sys | --sy)
- ac_prev=sysconfdir ;;
- -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
- | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
- sysconfdir=$ac_optarg ;;
-
- -target | --target | --targe | --targ | --tar | --ta | --t)
- ac_prev=target_alias ;;
- -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
- target_alias=$ac_optarg ;;
-
- -v | -verbose | --verbose | --verbos | --verbo | --verb)
- verbose=yes ;;
-
- -version | --version | --versio | --versi | --vers | -V)
- ac_init_version=: ;;
-
- -with-* | --with-*)
- ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"with_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval with_$ac_useropt=\$ac_optarg ;;
-
- -without-* | --without-*)
- ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"with_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval with_$ac_useropt=no ;;
-
- --x)
- # Obsolete; use --with-x.
- with_x=yes ;;
-
- -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
- | --x-incl | --x-inc | --x-in | --x-i)
- ac_prev=x_includes ;;
- -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
- | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
- x_includes=$ac_optarg ;;
-
- -x-libraries | --x-libraries | --x-librarie | --x-librari \
- | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
- ac_prev=x_libraries ;;
- -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
- | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
- x_libraries=$ac_optarg ;;
-
- -*) as_fn_error $? "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information"
- ;;
-
- *=*)
- ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
- # Reject names that are not valid shell variable names.
- case $ac_envvar in #(
- '' | [0-9]* | *[!_$as_cr_alnum]* )
- as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
- esac
- eval $ac_envvar=\$ac_optarg
- export $ac_envvar ;;
-
- *)
- # FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
- expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
- : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
- ;;
-
- esac
-done
-
-if test -n "$ac_prev"; then
- ac_option=--`echo $ac_prev | sed 's/_/-/g'`
- as_fn_error $? "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
- case $enable_option_checking in
- no) ;;
- fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
- esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
- datadir sysconfdir sharedstatedir localstatedir includedir \
- oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
- libdir localedir mandir
-do
- eval ac_val=\$$ac_var
- # Remove trailing slashes.
- case $ac_val in
- */ )
- ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
- eval $ac_var=\$ac_val;;
- esac
- # Be sure to have absolute directory names.
- case $ac_val in
- [\\/$]* | ?:[\\/]* ) continue;;
- NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
- esac
- as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
- if test "x$build_alias" = x; then
- cross_compiling=maybe
- $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
- If a cross compiler is detected then cross compile mode will be used" >&2
- elif test "x$build_alias" != "x$host_alias"; then
- cross_compiling=yes
- fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
- as_fn_error $? "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
- as_fn_error $? "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
- ac_srcdir_defaulted=yes
- # Try the directory containing this script, then the parent directory.
- ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_myself" : 'X\(//\)[^/]' \| \
- X"$as_myself" : 'X\(//\)$' \| \
- X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- srcdir=$ac_confdir
- if test ! -r "$srcdir/$ac_unique_file"; then
- srcdir=..
- fi
-else
- ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
- test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
- as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
- pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
- srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
- eval ac_env_${ac_var}_set=\${${ac_var}+set}
- eval ac_env_${ac_var}_value=\$${ac_var}
- eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
- eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
- # Omit some internal or obsolete options to make the list less imposing.
- # This message is too long to be a string in the A/UX 3.1 sh.
- cat <<_ACEOF
-\`configure' configures jellyfish 1.1.11 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE. See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
- -h, --help display this help and exit
- --help=short display options specific to this package
- --help=recursive display the short help of all the included packages
- -V, --version display version information and exit
- -q, --quiet, --silent do not print \`checking ...' messages
- --cache-file=FILE cache test results in FILE [disabled]
- -C, --config-cache alias for \`--cache-file=config.cache'
- -n, --no-create do not create output files
- --srcdir=DIR find the sources in DIR [configure dir or \`..']
-
-Installation directories:
- --prefix=PREFIX install architecture-independent files in PREFIX
- [$ac_default_prefix]
- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
- --bindir=DIR user executables [EPREFIX/bin]
- --sbindir=DIR system admin executables [EPREFIX/sbin]
- --libexecdir=DIR program executables [EPREFIX/libexec]
- --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data [PREFIX/var]
- --libdir=DIR object code libraries [EPREFIX/lib]
- --includedir=DIR C header files [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc [/usr/include]
- --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
- --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
- --infodir=DIR info documentation [DATAROOTDIR/info]
- --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
- --mandir=DIR man documentation [DATAROOTDIR/man]
- --docdir=DIR documentation root [DATAROOTDIR/doc/jellyfish]
- --htmldir=DIR html documentation [DOCDIR]
- --dvidir=DIR dvi documentation [DOCDIR]
- --pdfdir=DIR pdf documentation [DOCDIR]
- --psdir=DIR ps documentation [DOCDIR]
-_ACEOF
-
- cat <<\_ACEOF
-
-Program names:
- --program-prefix=PREFIX prepend PREFIX to installed program names
- --program-suffix=SUFFIX append SUFFIX to installed program names
- --program-transform-name=PROGRAM run sed PROGRAM on installed program names
-
-System types:
- --build=BUILD configure for building on BUILD [guessed]
- --host=HOST cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
- case $ac_init_help in
- short | recursive ) echo "Configuration of jellyfish 1.1.11:";;
- esac
- cat <<\_ACEOF
-
-Optional Features:
- --disable-option-checking ignore unrecognized --enable/--with options
- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
- --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --enable-silent-rules less verbose build output (undo: `make V=1')
- --disable-silent-rules verbose build output (undo: `make V=0')
- --enable-shared[=PKGS] build shared libraries [default=yes]
- --enable-static[=PKGS] build static libraries [default=yes]
- --enable-fast-install[=PKGS]
- optimize for fast installation [default=yes]
- --disable-dependency-tracking speeds up one-time build
- --enable-dependency-tracking do not reject slow dependency extractors
- --disable-libtool-lock avoid locking (might break parallel builds)
- --enable-all-static create statically linked executable
-
-Optional Packages:
- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
- both]
- --with-gnu-ld assume the C compiler uses GNU ld [default=no]
- --with-sysroot=DIR Search for dependent libraries within DIR
- (or the compiler's sysroot if not specified).
- --with-sse enable SSE
- --with-half enable half float (16 bits)
-
-Some influential environment variables:
- CC C compiler command
- CFLAGS C compiler flags
- LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
- nonstandard directory <lib dir>
- LIBS libraries to pass to the linker, e.g. -l<library>
- CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
- you have headers in a nonstandard directory <include dir>
- CPP C preprocessor
- CXX C++ compiler command
- CXXFLAGS C++ compiler flags
- CXXCPP C++ preprocessor
- MD5 Path to md5 hashing program
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <gmarcais at umd.edu>.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
- # If there are subdirs, report their specific --help.
- for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
- test -d "$ac_dir" ||
- { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
- continue
- ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
- # A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
- case $ac_top_builddir_sub in
- "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
- *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
- esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
- .) # We are building in place.
- ac_srcdir=.
- ac_top_srcdir=$ac_top_builddir_sub
- ac_abs_top_srcdir=$ac_pwd ;;
- [\\/]* | ?:[\\/]* ) # Absolute name.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir
- ac_abs_top_srcdir=$srcdir ;;
- *) # Relative name.
- ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_build_prefix$srcdir
- ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
- cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
- if test -f "$ac_srcdir/configure.gnu"; then
- echo &&
- $SHELL "$ac_srcdir/configure.gnu" --help=recursive
- elif test -f "$ac_srcdir/configure"; then
- echo &&
- $SHELL "$ac_srcdir/configure" --help=recursive
- else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
- fi || ac_status=$?
- cd "$ac_pwd" || { ac_status=$?; break; }
- done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
- cat <<\_ACEOF
-jellyfish configure 1.1.11
-generated by GNU Autoconf 2.68
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
- exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
- if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- $as_test_x conftest$ac_exeext
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } > conftest.i && {
- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
- test ! -s conftest.err
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
- ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=$ac_status
-fi
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
- For example, HP-UX 11i <limits.h> declares gettimeofday. */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_func
-
-# ac_fn_cxx_try_compile LINENO
-# ----------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
- if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_cxx_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_compile
-
-# ac_fn_cxx_try_cpp LINENO
-# ------------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_cpp ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } > conftest.i && {
- test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
- test ! -s conftest.err
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_cpp
-
-# ac_fn_cxx_try_link LINENO
-# -------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_link ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_cxx_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- $as_test_x conftest$ac_exeext
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_link
-
-# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES
-# ---------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_cxx_check_type ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=no"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-int
-main ()
-{
-if (sizeof ($2))
- return 0;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
- return 0;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
- eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_type
-
-# ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES
-# -----------------------------------------------
-# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
-# accordingly.
-ac_fn_cxx_check_decl ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- as_decl_name=`echo $2|sed 's/ *(.*//'`
- as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
-$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-int
-main ()
-{
-#ifndef $as_decl_name
-#ifdef __cplusplus
- (void) $as_decl_use;
-#else
- (void) $as_decl_name;
-#endif
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_decl
-
-# ac_fn_cxx_check_func LINENO FUNC VAR
-# ------------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_cxx_check_func ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
- For example, HP-UX 11i <limits.h> declares gettimeofday. */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_func
-
-# ac_fn_cxx_try_run LINENO
-# ------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_cxx_try_run ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
- ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=$ac_status
-fi
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_run
-
-# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
-# ---------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_cxx_check_header_mongrel ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <$2>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ------------------------------- ##
-## Report this to gmarcais at umd.edu ##
-## ------------------------------- ##"
- ) | sed "s/^/$as_me: WARNING: /" >&2
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_header_mongrel
-
-# ac_fn_cxx_check_member LINENO AGGR MEMBER VAR INCLUDES
-# ------------------------------------------------------
-# Tries to find if the field MEMBER exists in type AGGR, after including
-# INCLUDES, setting cache variable VAR accordingly.
-ac_fn_cxx_check_member ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
-$as_echo_n "checking for $2.$3... " >&6; }
-if eval \${$4+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$5
-int
-main ()
-{
-static $2 ac_aggr;
-if (ac_aggr.$3)
-return 0;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- eval "$4=yes"
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$5
-int
-main ()
-{
-static $2 ac_aggr;
-if (sizeof ac_aggr.$3)
-return 0;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- eval "$4=yes"
-else
- eval "$4=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$4
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_member
-cat >config.log <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by jellyfish $as_me 1.1.11, which was
-generated by GNU Autoconf 2.68. Invocation command line was
-
- $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
-
-/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
-/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
-/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
- done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
- for ac_arg
- do
- case $ac_arg in
- -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- continue ;;
- *\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
- esac
- case $ac_pass in
- 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
- 2)
- as_fn_append ac_configure_args1 " '$ac_arg'"
- if test $ac_must_keep_next = true; then
- ac_must_keep_next=false # Got value, back to normal.
- else
- case $ac_arg in
- *=* | --config-cache | -C | -disable-* | --disable-* \
- | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
- | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
- | -with-* | --with-* | -without-* | --without-* | --x)
- case "$ac_configure_args0 " in
- "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
- esac
- ;;
- -* ) ac_must_keep_next=true ;;
- esac
- fi
- as_fn_append ac_configure_args " '$ac_arg'"
- ;;
- esac
- done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log. We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
- # Save into config.log some information that might help in debugging.
- {
- echo
-
- $as_echo "## ---------------- ##
-## Cache variables. ##
-## ---------------- ##"
- echo
- # The following way of writing the cache mishandles newlines in values,
-(
- for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
- eval ac_val=\$$ac_var
- case $ac_val in #(
- *${as_nl}*)
- case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
- esac
- case $ac_var in #(
- _ | IFS | as_nl) ;; #(
- BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
- *) { eval $ac_var=; unset $ac_var;} ;;
- esac ;;
- esac
- done
- (set) 2>&1 |
- case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
- *${as_nl}ac_space=\ *)
- sed -n \
- "s/'\''/'\''\\\\'\'''\''/g;
- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
- ;; #(
- *)
- sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
- ;;
- esac |
- sort
-)
- echo
-
- $as_echo "## ----------------- ##
-## Output variables. ##
-## ----------------- ##"
- echo
- for ac_var in $ac_subst_vars
- do
- eval ac_val=\$$ac_var
- case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
- esac
- $as_echo "$ac_var='\''$ac_val'\''"
- done | sort
- echo
-
- if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
-## File substitutions. ##
-## ------------------- ##"
- echo
- for ac_var in $ac_subst_files
- do
- eval ac_val=\$$ac_var
- case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
- esac
- $as_echo "$ac_var='\''$ac_val'\''"
- done | sort
- echo
- fi
-
- if test -s confdefs.h; then
- $as_echo "## ----------- ##
-## confdefs.h. ##
-## ----------- ##"
- echo
- cat confdefs.h
- echo
- fi
- test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
- } >&5
- rm -f core *.core core.conftest.* &&
- rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
- exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
- trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
-elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
-else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
- sed 's/^/| /' "$ac_site_file" >&5
- . "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5; }
- fi
-done
-
-if test -r "$cache_file"; then
- # Some versions of bash will fail to source /dev/null (special files
- # actually), so we avoid doing that. DJGPP emulates it as a regular file.
- if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
- case $cache_file in
- [\\/]* | ?:[\\/]* ) . "$cache_file";;
- *) . "./$cache_file";;
- esac
- fi
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
- >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
- eval ac_old_set=\$ac_cv_env_${ac_var}_set
- eval ac_new_set=\$ac_env_${ac_var}_set
- eval ac_old_val=\$ac_cv_env_${ac_var}_value
- eval ac_new_val=\$ac_env_${ac_var}_value
- case $ac_old_set,$ac_new_set in
- set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
- ac_cache_corrupted=: ;;
- ,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
- ac_cache_corrupted=: ;;
- ,);;
- *)
- if test "x$ac_old_val" != "x$ac_new_val"; then
- # differences in whitespace do not lead to failure.
- ac_old_val_w=`echo x $ac_old_val`
- ac_new_val_w=`echo x $ac_new_val`
- if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
- ac_cache_corrupted=:
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
- eval $ac_var=\$ac_old_val
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
- fi;;
- esac
- # Pass precious variables to config.status.
- if test "$ac_new_set" = set; then
- case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
- *) ac_arg=$ac_var=$ac_new_val ;;
- esac
- case " $ac_configure_args " in
- *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
- *) as_fn_append ac_configure_args " '$ac_arg'" ;;
- esac
- fi
-done
-if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
- as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "x$host_alias" = x; then
- ac_cv_host=$ac_cv_build
-else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-
-am__api_version='1.11'
-
-# Find a good install program. We prefer a C program (faster),
-# so one script is as good as another. But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if ${ac_cv_path_install+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
- ./ | .// | /[cC]/* | \
- /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
- ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
- /usr/ucb/* ) ;;
- *)
- # OSF1 and SCO ODT 3.0 have their own names for install.
- # Don't use installbsd from OSF since it installs stuff as root
- # by default.
- for ac_prog in ginstall scoinst install; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
- if test $ac_prog = install &&
- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
- # AIX install. It has an incompatible calling convention.
- :
- elif test $ac_prog = install &&
- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
- # program-specific install script used by HP pwplus--don't use.
- :
- else
- rm -rf conftest.one conftest.two conftest.dir
- echo one > conftest.one
- echo two > conftest.two
- mkdir conftest.dir
- if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
- test -s conftest.one && test -s conftest.two &&
- test -s conftest.dir/conftest.one &&
- test -s conftest.dir/conftest.two
- then
- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
- break 3
- fi
- fi
- fi
- done
- done
- ;;
-esac
-
- done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
- if test "${ac_cv_path_install+set}" = set; then
- INSTALL=$ac_cv_path_install
- else
- # As a last resort, use the slow shell script. Don't cache a
- # value for INSTALL within a source directory, because that will
- # break other packages using the cache if that directory is
- # removed, or if the value is a relative name.
- INSTALL=$ac_install_sh
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name. Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
- *[\\\"\#\$\&\'\`$am_lf]*)
- as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
-esac
-case $srcdir in
- *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
- as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments. Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
- if test "$*" = "X"; then
- # -L didn't work.
- set X `ls -t "$srcdir/configure" conftest.file`
- fi
- rm -f conftest.file
- if test "$*" != "X $srcdir/configure conftest.file" \
- && test "$*" != "X conftest.file $srcdir/configure"; then
-
- # If neither matched, then we have a broken ls. This can happen
- # if, for instance, CONFIG_SHELL is bash and it inherits a
- # broken ls alias from the environment. This has actually
- # happened. Such a system could not be considered "sane".
- as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
-alias in your environment" "$LINENO" 5
- fi
-
- test "$2" = conftest.file
- )
-then
- # Ok.
- :
-else
- as_fn_error $? "newly created file is older than distributed files!
-Check your system clock" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-test "$program_prefix" != NONE &&
- program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
- program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.
-# By default was `s,x,x', remove it if useless.
-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-if test x"${MISSING+set}" != xset; then
- case $am_aux_dir in
- *\ * | *\ *)
- MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
- *)
- MISSING="\${SHELL} $am_aux_dir/missing" ;;
- esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
- am_missing_run="$MISSING --run "
-else
- am_missing_run=
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if test x"${install_sh}" != xset; then
- case $am_aux_dir in
- *\ * | *\ *)
- install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
- *)
- install_sh="\${SHELL} $am_aux_dir/install-sh"
- esac
-fi
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'. However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$STRIP"; then
- ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_STRIP="${ac_tool_prefix}strip"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
- ac_ct_STRIP=$STRIP
- # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_STRIP"; then
- ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_STRIP="strip"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_STRIP" = x; then
- STRIP=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- STRIP=$ac_ct_STRIP
- fi
-else
- STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
-if test -z "$MKDIR_P"; then
- if ${ac_cv_path_mkdir+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in mkdir gmkdir; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
- case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
- 'mkdir (GNU coreutils) '* | \
- 'mkdir (coreutils) '* | \
- 'mkdir (fileutils) '4.1*)
- ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
- break 3;;
- esac
- done
- done
- done
-IFS=$as_save_IFS
-
-fi
-
- test -d ./--version && rmdir ./--version
- if test "${ac_cv_path_mkdir+set}" = set; then
- MKDIR_P="$ac_cv_path_mkdir -p"
- else
- # As a last resort, use the slow shell script. Don't cache a
- # value for MKDIR_P within a source directory, because that will
- # break other packages using the cache if that directory is
- # removed, or if the value is a relative name.
- MKDIR_P="$ac_install_sh -d"
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
- [\\/$]* | ?:[\\/]*) ;;
- */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AWK+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$AWK"; then
- ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_AWK="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$AWK" && break
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
- @echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
- *@@@%%%=?*=@@@%%%*)
- eval ac_cv_prog_make_${ac_make}_set=yes;;
- *)
- eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- SET_MAKE=
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
- am__leading_dot=.
-else
- am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
- # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
- # is not polluted with repeated "-I."
- am__isrc=' -I$(srcdir)'
- # test to see if srcdir already configured
- if test -f $srcdir/config.status; then
- as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
- fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
- if (cygpath --version) >/dev/null 2>/dev/null; then
- CYGPATH_W='cygpath -w'
- else
- CYGPATH_W=echo
- fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='jellyfish'
- VERSION='1.1.11'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-# We need awk for the "check" target. The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility. Yes, it's still used
-# in the wild :-( We should find a proper way to deprecate it ...
-AMTAR='$${TAR-tar}'
-
-am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
-
-
-
-
-
-# Check whether --enable-silent-rules was given.
-if test "${enable_silent_rules+set}" = set; then :
- enableval=$enable_silent_rules;
-fi
-
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no) AM_DEFAULT_VERBOSITY=1;;
-*) AM_DEFAULT_VERBOSITY=0;;
-esac
-am_make=${MAKE-make}
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
-$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
-if ${am_cv_make_support_nested_variables+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if $as_echo 'TRUE=$(BAR$(V))
-BAR0=false
-BAR1=true
-V=1
-am__doit:
- @$(TRUE)
-.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
- am_cv_make_support_nested_variables=yes
-else
- am_cv_make_support_nested_variables=no
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
-$as_echo "$am_cv_make_support_nested_variables" >&6; }
-if test $am_cv_make_support_nested_variables = yes; then
- AM_V='$(V)'
- AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
-else
- AM_V=$AM_DEFAULT_VERBOSITY
- AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
-fi
-AM_BACKSLASH='\'
-
-
-ac_config_headers="$ac_config_headers config.h"
-
-
-case `pwd` in
- *\ * | *\ *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
-
-
-
-macro_version='2.4.2'
-macro_revision='1.3337'
-
-
-
-
-
-
-
-
-
-
-
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
-$as_echo_n "checking how to print strings... " >&6; }
-# Test print first, because it will be a builtin if present.
-if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
- test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
- ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
- ECHO='printf %s\n'
-else
- # Use this function as a fallback that always works.
- func_fallback_echo ()
- {
- eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
- }
- ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
- $ECHO ""
-}
-
-case "$ECHO" in
- printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
-$as_echo "printf" >&6; } ;;
- print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
-$as_echo "print -r" >&6; } ;;
- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
-$as_echo "cat" >&6; } ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
- @echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
- am__include=include
- am__quote=
- _am_result=GNU
- ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
- echo '.include "confinc"' > confmf
- case `$am_make -s -f confmf 2> /dev/null` in #(
- *the\ am__doit\ target*)
- am__include=.include
- am__quote="\""
- _am_result=BSD
- ;;
- esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
- enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
- am_depcomp="$ac_aux_dir/depcomp"
- AMDEPBACKSLASH='\'
- am__nodep='_no'
-fi
- if test "x$enable_dependency_tracking" != xno; then
- AMDEP_TRUE=
- AMDEP_FALSE='#'
-else
- AMDEP_TRUE='#'
- AMDEP_FALSE=
-fi
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
- ac_ct_CC=$CC
- # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-else
- CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- fi
-fi
-if test -z "$CC"; then
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $ac_cv_prog_CC
- shift
- if test $# != 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same basename, so the bogon will be chosen
- # first if we set CC to just the basename; use the full file name.
- shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
- fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- for ac_prog in cl.exe
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$CC" && break
- done
-fi
-if test -z "$CC"; then
- ac_ct_CC=$CC
- for ac_prog in cl.exe
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_CC" && break
-done
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
- { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compiler $ac_option >&5") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- sed '10a\
-... rest of stderr output deleted ...
- 10q' conftest.err >conftest.er1
- cat conftest.er1 >&5
- fi
- rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
- * ) ac_rmfiles="$ac_rmfiles $ac_file";;
- esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link_default") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile. We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
- test -f "$ac_file" || continue
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
- ;;
- [ab].out )
- # We found the default executable, but exeext='' is most
- # certainly right.
- break;;
- *.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
- then :; else
- ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- fi
- # We set ac_cv_exeext here because the later test for it is not
- # safe: cross compilers may not add the suffix if given an `-o'
- # argument, so we may need to know it at that point already.
- # Even if this section looks crufty: it has the advantage of
- # actually working.
- break;;
- * )
- break;;
- esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
- ac_file=''
-fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
- test -f "$ac_file" || continue
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
- *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- break;;
- * ) break;;
- esac
-done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdio.h>
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run. If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
- { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- if { ac_try='./conftest$ac_cv_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then
- cross_compiling=no
- else
- if test "$cross_compiling" = maybe; then
- cross_compiling=yes
- else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5; }
- fi
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- for ac_file in conftest.o conftest.obj conftest.*; do
- test -f "$ac_file" || continue;
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
- *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
- break;;
- esac
-done
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_compiler_gnu=yes
-else
- ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
- GCC=yes
-else
- GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_c_werror_flag=$ac_c_werror_flag
- ac_c_werror_flag=yes
- ac_cv_prog_cc_g=no
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-else
- CFLAGS=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
- ac_c_werror_flag=$ac_save_c_werror_flag
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
- CFLAGS="-g -O2"
- else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
- CFLAGS="-O2"
- else
- CFLAGS=
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
- CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
- test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-depcc="$CC" am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CC_dependencies_compiler_type+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
- # We make a subdir and do the tests there. Otherwise we can end up
- # making bogus files that we don't know about and never remove. For
- # instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named `D' -- because `-MD' means `put the output
- # in D'.
- rm -rf conftest.dir
- mkdir conftest.dir
- # Copy depcomp to subdir because otherwise we won't find it if we're
- # using a relative directory.
- cp "$am_depcomp" conftest.dir
- cd conftest.dir
- # We will build objects and dependencies in a subdirectory because
- # it helps to detect inapplicable dependency modes. For instance
- # both Tru64's cc and ICC support -MD to output dependencies as a
- # side effect of compilation, but ICC will put the dependencies in
- # the current directory while Tru64 will put them in the object
- # directory.
- mkdir sub
-
- am_cv_CC_dependencies_compiler_type=none
- if test "$am_compiler_list" = ""; then
- am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
- fi
- am__universal=false
- case " $depcc " in #(
- *\ -arch\ *\ -arch\ *) am__universal=true ;;
- esac
-
- for depmode in $am_compiler_list; do
- # Setup a source with many dependencies, because some compilers
- # like to wrap large dependency lists on column 80 (with \), and
- # we should not choose a depcomp mode which is confused by this.
- #
- # We need to recreate these files for each test, as the compiler may
- # overwrite some of them when testing with obscure command lines.
- # This happens at least with the AIX C compiler.
- : > sub/conftest.c
- for i in 1 2 3 4 5 6; do
- echo '#include "conftst'$i'.h"' >> sub/conftest.c
- # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
- # Solaris 8's {/usr,}/bin/sh.
- touch sub/conftst$i.h
- done
- echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
- # We check with `-c' and `-o' for the sake of the "dashmstdout"
- # mode. It turns out that the SunPro C++ compiler does not properly
- # handle `-M -o', and we need to detect this. Also, some Intel
- # versions had trouble with output in subdirs
- am__obj=sub/conftest.${OBJEXT-o}
- am__minus_obj="-o $am__obj"
- case $depmode in
- gcc)
- # This depmode causes a compiler race in universal mode.
- test "$am__universal" = false || continue
- ;;
- nosideeffect)
- # after this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested
- if test "x$enable_dependency_tracking" = xyes; then
- continue
- else
- break
- fi
- ;;
- msvc7 | msvc7msys | msvisualcpp | msvcmsys)
- # This compiler won't grok `-c -o', but also, the minuso test has
- # not run yet. These depmodes are late enough in the game, and
- # so weak that their functioning should not be impacted.
- am__obj=conftest.${OBJEXT-o}
- am__minus_obj=
- ;;
- none) break ;;
- esac
- if depmode=$depmode \
- source=sub/conftest.c object=$am__obj \
- depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
- $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
- >/dev/null 2>conftest.err &&
- grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
- grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
- grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
- ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
- # icc doesn't choke on unknown options, it will just issue warnings
- # or remarks (even with -Werror). So we grep stderr for any message
- # that says an option was ignored or not supported.
- # When given -MP, icc 7.0 and 7.1 complain thusly:
- # icc: Command line warning: ignoring option '-M'; no argument required
- # The diagnosis changed in icc 8.0:
- # icc: Command line remark: option '-MP' not supported
- if (grep 'ignoring option' conftest.err ||
- grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
- am_cv_CC_dependencies_compiler_type=$depmode
- break
- fi
- fi
- done
-
- cd ..
- rm -rf conftest.dir
-else
- am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
- test "x$enable_dependency_tracking" != xno \
- && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
- am__fastdepCC_TRUE=
- am__fastdepCC_FALSE='#'
-else
- am__fastdepCC_TRUE='#'
- am__fastdepCC_FALSE=
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if ${ac_cv_path_SED+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
- for ac_i in 1 2 3 4 5 6 7; do
- ac_script="$ac_script$as_nl$ac_script"
- done
- echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
- { ac_script=; unset ac_script;}
- if test -z "$SED"; then
- ac_path_SED_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in sed gsed; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
- { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
-# Check for GNU ac_path_SED and select it if it is found.
- # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
- ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo '' >> "conftest.nl"
- "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_SED_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_SED="$ac_path_SED"
- ac_path_SED_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_SED_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_SED"; then
- as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
- fi
-else
- ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
- rm -f conftest.sed
-
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
- then ac_cv_path_EGREP="$GREP -E"
- else
- if test -z "$EGREP"; then
- ac_path_EGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_EGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_EGREP="$ac_path_EGREP"
- ac_path_EGREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_EGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_EGREP=$EGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if ${ac_cv_path_FGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
- then ac_cv_path_FGREP="$GREP -F"
- else
- if test -z "$FGREP"; then
- ac_path_FGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in fgrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
- { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
- # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'FGREP' >> "conftest.nl"
- "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_FGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_FGREP="$ac_path_FGREP"
- ac_path_FGREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_FGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_FGREP"; then
- as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_FGREP=$FGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
-
-
-test -z "$GREP" && GREP=grep
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
- withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
- with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
- # Check if gcc -print-prog-name=ld gives a path.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
- case $host in
- *-*-mingw*)
- # gcc leaves a trailing carriage return which upsets mingw
- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
- *)
- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
- esac
- case $ac_prog in
- # Accept absolute paths.
- [\\/]* | ?:[\\/]*)
- re_direlt='/[^/][^/]*/\.\./'
- # Canonicalize the pathname of ld
- ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
- while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
- done
- test -z "$LD" && LD="$ac_prog"
- ;;
- "")
- # If it fails, then pretend we aren't using GCC.
- ac_prog=ld
- ;;
- *)
- # If it is relative, then search for the first ld in PATH.
- with_gnu_ld=unknown
- ;;
- esac
-elif test "$with_gnu_ld" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${lt_cv_path_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$LD"; then
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
- lt_cv_path_LD="$ac_dir/$ac_prog"
- # Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some variants of GNU ld only accept -v.
- # Break only if it was the GNU/non-GNU ld that we prefer.
- case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
- *GNU* | *'with BFD'*)
- test "$with_gnu_ld" != no && break
- ;;
- *)
- test "$with_gnu_ld" != yes && break
- ;;
- esac
- fi
- done
- IFS="$lt_save_ifs"
-else
- lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
- lt_cv_prog_gnu_ld=yes
- ;;
-*)
- lt_cv_prog_gnu_ld=no
- ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if ${lt_cv_path_NM+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$NM"; then
- # Let the user override the test.
- lt_cv_path_NM="$NM"
-else
- lt_nm_to_check="${ac_tool_prefix}nm"
- if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
- lt_nm_to_check="$lt_nm_to_check nm"
- fi
- for lt_tmp_nm in $lt_nm_to_check; do
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- tmp_nm="$ac_dir/$lt_tmp_nm"
- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
- # Check to see if the nm accepts a BSD-compat flag.
- # Adding the `sed 1q' prevents false positives on HP-UX, which says:
- # nm: unknown option "B" ignored
- # Tru64's nm complains that /dev/null is an invalid object file
- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
- */dev/null* | *'Invalid file or object type'*)
- lt_cv_path_NM="$tmp_nm -B"
- break
- ;;
- *)
- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
- */dev/null*)
- lt_cv_path_NM="$tmp_nm -p"
- break
- ;;
- *)
- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
- continue # so that we can try to find one that supports BSD flags
- ;;
- esac
- ;;
- esac
- fi
- done
- IFS="$lt_save_ifs"
- done
- : ${lt_cv_path_NM=no}
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
- NM="$lt_cv_path_NM"
-else
- # Didn't find any BSD compatible name lister, look for dumpbin.
- if test -n "$DUMPBIN"; then :
- # Let the user override the test.
- else
- if test -n "$ac_tool_prefix"; then
- for ac_prog in dumpbin "link -dump"
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DUMPBIN+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$DUMPBIN"; then
- ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$DUMPBIN" && break
- done
-fi
-if test -z "$DUMPBIN"; then
- ac_ct_DUMPBIN=$DUMPBIN
- for ac_prog in dumpbin "link -dump"
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_DUMPBIN"; then
- ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_DUMPBIN" && break
-done
-
- if test "x$ac_ct_DUMPBIN" = x; then
- DUMPBIN=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- DUMPBIN=$ac_ct_DUMPBIN
- fi
-fi
-
- case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
- *COFF*)
- DUMPBIN="$DUMPBIN -symbols"
- ;;
- *)
- DUMPBIN=:
- ;;
- esac
- fi
-
- if test "$DUMPBIN" != ":"; then
- NM="$DUMPBIN"
- fi
-fi
-test -z "$NM" && NM=nm
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if ${lt_cv_nm_interface+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_nm_interface="BSD nm"
- echo "int some_variable = 0;" > conftest.$ac_ext
- (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
- (eval "$ac_compile" 2>conftest.err)
- cat conftest.err >&5
- (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
- (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
- cat conftest.err >&5
- (eval echo "\"\$as_me:$LINENO: output\"" >&5)
- cat conftest.out >&5
- if $GREP 'External.*some_variable' conftest.out > /dev/null; then
- lt_cv_nm_interface="MS dumpbin"
- fi
- rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if ${lt_cv_sys_max_cmd_len+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- i=0
- teststring="ABCD"
-
- case $build_os in
- msdosdjgpp*)
- # On DJGPP, this test can blow up pretty badly due to problems in libc
- # (any single argument exceeding 2000 bytes causes a buffer overrun
- # during glob expansion). Even if it were fixed, the result of this
- # check would be larger than it should be.
- lt_cv_sys_max_cmd_len=12288; # 12K is about right
- ;;
-
- gnu*)
- # Under GNU Hurd, this test is not required because there is
- # no limit to the length of command line arguments.
- # Libtool will interpret -1 as no limit whatsoever
- lt_cv_sys_max_cmd_len=-1;
- ;;
-
- cygwin* | mingw* | cegcc*)
- # On Win9x/ME, this test blows up -- it succeeds, but takes
- # about 5 minutes as the teststring grows exponentially.
- # Worse, since 9x/ME are not pre-emptively multitasking,
- # you end up with a "frozen" computer, even though with patience
- # the test eventually succeeds (with a max line length of 256k).
- # Instead, let's just punt: use the minimum linelength reported by
- # all of the supported platforms: 8192 (on NT/2K/XP).
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
- mint*)
- # On MiNT this can take a long time and run out of memory.
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
- amigaos*)
- # On AmigaOS with pdksh, this test takes hours, literally.
- # So we just punt and use a minimum line length of 8192.
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
- netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
- # This has been around since 386BSD, at least. Likely further.
- if test -x /sbin/sysctl; then
- lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
- elif test -x /usr/sbin/sysctl; then
- lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
- else
- lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
- fi
- # And add a safety zone
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
- ;;
-
- interix*)
- # We know the value 262144 and hardcode it with a safety zone (like BSD)
- lt_cv_sys_max_cmd_len=196608
- ;;
-
- os2*)
- # The test takes a long time on OS/2.
- lt_cv_sys_max_cmd_len=8192
- ;;
-
- osf*)
- # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
- # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
- # nice to cause kernel panics so lets avoid the loop below.
- # First set a reasonable default.
- lt_cv_sys_max_cmd_len=16384
- #
- if test -x /sbin/sysconfig; then
- case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
- *1*) lt_cv_sys_max_cmd_len=-1 ;;
- esac
- fi
- ;;
- sco3.2v5*)
- lt_cv_sys_max_cmd_len=102400
- ;;
- sysv5* | sco5v6* | sysv4.2uw2*)
- kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
- if test -n "$kargmax"; then
- lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
- else
- lt_cv_sys_max_cmd_len=32768
- fi
- ;;
- *)
- lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
- if test -n "$lt_cv_sys_max_cmd_len"; then
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
- else
- # Make teststring a little bigger before we do anything with it.
- # a 1K string should be a reasonable start.
- for i in 1 2 3 4 5 6 7 8 ; do
- teststring=$teststring$teststring
- done
- SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
- # If test is not a shell built-in, we'll probably end up computing a
- # maximum length that is only half of the actual maximum length, but
- # we can't tell.
- while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
- = "X$teststring$teststring"; } >/dev/null 2>&1 &&
- test $i != 17 # 1/2 MB should be enough
- do
- i=`expr $i + 1`
- teststring=$teststring$teststring
- done
- # Only check the string length outside the loop.
- lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
- teststring=
- # Add a significant safety factor because C++ compilers can tack on
- # massive amounts of additional arguments before passing them to the
- # linker. It appears as though 1/2 is a usable value.
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
- fi
- ;;
- esac
-
-fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-
-
-
-
-
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
- test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
- = c,a/b,b/c, \
- && eval 'test $(( 1 + 1 )) -eq 2 \
- && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
- && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
- >/dev/null 2>&1 \
- && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
- lt_unset=unset
-else
- lt_unset=false
-fi
-
-
-
-
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
- # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
- lt_SP2NL='tr \040 \012'
- lt_NL2SP='tr \015\012 \040\040'
- ;;
- *) # EBCDIC based system
- lt_SP2NL='tr \100 \n'
- lt_NL2SP='tr \r\n \100\100'
- ;;
-esac
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
-$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
-if ${lt_cv_to_host_file_cmd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $host in
- *-*-mingw* )
- case $build in
- *-*-mingw* ) # actually msys
- lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
- ;;
- *-*-cygwin* )
- lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
- ;;
- * ) # otherwise, assume *nix
- lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
- ;;
- esac
- ;;
- *-*-cygwin* )
- case $build in
- *-*-mingw* ) # actually msys
- lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
- ;;
- *-*-cygwin* )
- lt_cv_to_host_file_cmd=func_convert_file_noop
- ;;
- * ) # otherwise, assume *nix
- lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
- ;;
- esac
- ;;
- * ) # unhandled hosts (and "normal" native builds)
- lt_cv_to_host_file_cmd=func_convert_file_noop
- ;;
-esac
-
-fi
-
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
-$as_echo "$lt_cv_to_host_file_cmd" >&6; }
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
-$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
-if ${lt_cv_to_tool_file_cmd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- #assume ordinary cross tools, or native build.
-lt_cv_to_tool_file_cmd=func_convert_file_noop
-case $host in
- *-*-mingw* )
- case $build in
- *-*-mingw* ) # actually msys
- lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
- ;;
- esac
- ;;
-esac
-
-fi
-
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
-$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if ${lt_cv_ld_reload_flag+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
- if test "$GCC" != yes; then
- reload_cmds=false
- fi
- ;;
- darwin*)
- if test "$GCC" = yes; then
- reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
- else
- reload_cmds='$LD$reload_flag -o $output$reload_objs'
- fi
- ;;
-esac
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OBJDUMP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$OBJDUMP"; then
- ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
- ac_ct_OBJDUMP=$OBJDUMP
- # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_OBJDUMP"; then
- ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_OBJDUMP="objdump"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_OBJDUMP" = x; then
- OBJDUMP="false"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- OBJDUMP=$ac_ct_OBJDUMP
- fi
-else
- OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if ${lt_cv_deplibs_check_method+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[4-9]*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-beos*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-bsdi[45]*)
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
- lt_cv_file_magic_cmd='/usr/bin/file -L'
- lt_cv_file_magic_test_file=/shlib/libc.so
- ;;
-
-cygwin*)
- # func_win32_libid is a shell function defined in ltmain.sh
- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
- lt_cv_file_magic_cmd='func_win32_libid'
- ;;
-
-mingw* | pw32*)
- # Base MSYS/MinGW do not provide the 'file' command needed by
- # func_win32_libid shell function, so use a weaker test based on 'objdump',
- # unless we find 'file', for example because we are cross-compiling.
- # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
- if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
- lt_cv_file_magic_cmd='func_win32_libid'
- else
- # Keep this pattern in sync with the one in func_win32_libid.
- lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
- lt_cv_file_magic_cmd='$OBJDUMP -f'
- fi
- ;;
-
-cegcc*)
- # use the weaker test based on 'objdump'. See mingw*.
- lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
- lt_cv_file_magic_cmd='$OBJDUMP -f'
- ;;
-
-darwin* | rhapsody*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-freebsd* | dragonfly*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
- case $host_cpu in
- i*86 )
- # Not sure whether the presence of OpenBSD here was a mistake.
- # Let's accept both of them until this is cleared up.
- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
- ;;
- esac
- else
- lt_cv_deplibs_check_method=pass_all
- fi
- ;;
-
-gnu*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-haiku*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-hpux10.20* | hpux11*)
- lt_cv_file_magic_cmd=/usr/bin/file
- case $host_cpu in
- ia64*)
- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
- lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
- ;;
- hppa*64*)
- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
- lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
- ;;
- *)
- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
- lt_cv_file_magic_test_file=/usr/lib/libc.sl
- ;;
- esac
- ;;
-
-interix[3-9]*)
- # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
- ;;
-
-irix5* | irix6* | nonstopux*)
- case $LD in
- *-32|*"-32 ") libmagic=32-bit;;
- *-n32|*"-n32 ") libmagic=N32;;
- *-64|*"-64 ") libmagic=64-bit;;
- *) libmagic=never-match;;
- esac
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
- else
- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
- fi
- ;;
-
-newos6*)
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=/usr/lib/libnls.so
- ;;
-
-*nto* | *qnx*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-openbsd*)
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
- else
- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
- fi
- ;;
-
-osf3* | osf4* | osf5*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-rdos*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-solaris*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sysv4 | sysv4.3*)
- case $host_vendor in
- motorola)
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
- ;;
- ncr)
- lt_cv_deplibs_check_method=pass_all
- ;;
- sequent)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
- ;;
- sni)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
- lt_cv_file_magic_test_file=/lib/libc.so
- ;;
- siemens)
- lt_cv_deplibs_check_method=pass_all
- ;;
- pc)
- lt_cv_deplibs_check_method=pass_all
- ;;
- esac
- ;;
-
-tpf*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-
-file_magic_glob=
-want_nocaseglob=no
-if test "$build" = "$host"; then
- case $host_os in
- mingw* | pw32*)
- if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
- want_nocaseglob=yes
- else
- file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
- fi
- ;;
- esac
-fi
-
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DLLTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$DLLTOOL"; then
- ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-DLLTOOL=$ac_cv_prog_DLLTOOL
-if test -n "$DLLTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
-$as_echo "$DLLTOOL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DLLTOOL"; then
- ac_ct_DLLTOOL=$DLLTOOL
- # Extract the first word of "dlltool", so it can be a program name with args.
-set dummy dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_DLLTOOL"; then
- ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_DLLTOOL="dlltool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
-if test -n "$ac_ct_DLLTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
-$as_echo "$ac_ct_DLLTOOL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_DLLTOOL" = x; then
- DLLTOOL="false"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- DLLTOOL=$ac_ct_DLLTOOL
- fi
-else
- DLLTOOL="$ac_cv_prog_DLLTOOL"
-fi
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
-$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
-if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_sharedlib_from_linklib_cmd='unknown'
-
-case $host_os in
-cygwin* | mingw* | pw32* | cegcc*)
- # two different shell functions defined in ltmain.sh
- # decide which to use based on capabilities of $DLLTOOL
- case `$DLLTOOL --help 2>&1` in
- *--identify-strict*)
- lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
- ;;
- *)
- lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
- ;;
- esac
- ;;
-*)
- # fallback: assume linklib IS sharedlib
- lt_cv_sharedlib_from_linklib_cmd="$ECHO"
- ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
-$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
-sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
-test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
- for ac_prog in ar
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$AR"; then
- ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$AR" && break
- done
-fi
-if test -z "$AR"; then
- ac_ct_AR=$AR
- for ac_prog in ar
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_AR"; then
- ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_AR="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_AR" && break
-done
-
- if test "x$ac_ct_AR" = x; then
- AR="false"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- AR=$ac_ct_AR
- fi
-fi
-
-: ${AR=ar}
-: ${AR_FLAGS=cru}
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
-$as_echo_n "checking for archiver @FILE support... " >&6; }
-if ${lt_cv_ar_at_file+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_ar_at_file=no
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- echo conftest.$ac_objext > conftest.lst
- lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
- (eval $lt_ar_try) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- if test "$ac_status" -eq 0; then
- # Ensure the archiver fails upon bogus file names.
- rm -f conftest.$ac_objext libconftest.a
- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
- (eval $lt_ar_try) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- if test "$ac_status" -ne 0; then
- lt_cv_ar_at_file=@
- fi
- fi
- rm -f conftest.* libconftest.a
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
-$as_echo "$lt_cv_ar_at_file" >&6; }
-
-if test "x$lt_cv_ar_at_file" = xno; then
- archiver_list_spec=
-else
- archiver_list_spec=$lt_cv_ar_at_file
-fi
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$STRIP"; then
- ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_STRIP="${ac_tool_prefix}strip"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
- ac_ct_STRIP=$STRIP
- # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_STRIP"; then
- ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_STRIP="strip"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_STRIP" = x; then
- STRIP=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- STRIP=$ac_ct_STRIP
- fi
-else
- STRIP="$ac_cv_prog_STRIP"
-fi
-
-test -z "$STRIP" && STRIP=:
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$RANLIB"; then
- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
- ac_ct_RANLIB=$RANLIB
- # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_RANLIB"; then
- ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_RANLIB="ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_RANLIB" = x; then
- RANLIB=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- RANLIB=$ac_ct_RANLIB
- fi
-else
- RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-test -z "$RANLIB" && RANLIB=:
-
-
-
-
-
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
- case $host_os in
- openbsd*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
- ;;
- *)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
- ;;
- esac
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
-fi
-
-case $host_os in
- darwin*)
- lock_old_archive_extraction=yes ;;
- *)
- lock_old_archive_extraction=no ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if ${lt_cv_sys_global_symbol_pipe+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix. What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
- symcode='[BCDT]'
- ;;
-cygwin* | mingw* | pw32* | cegcc*)
- symcode='[ABCDGISTW]'
- ;;
-hpux*)
- if test "$host_cpu" = ia64; then
- symcode='[ABCDEGRST]'
- fi
- ;;
-irix* | nonstopux*)
- symcode='[BCDEGRST]'
- ;;
-osf*)
- symcode='[BCDEGQRST]'
- ;;
-solaris*)
- symcode='[BDRT]'
- ;;
-sco3.2v5*)
- symcode='[DT]'
- ;;
-sysv4.2uw2*)
- symcode='[DT]'
- ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
- symcode='[ABDT]'
- ;;
-sysv4)
- symcode='[DFNSTU]'
- ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
- symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
- opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
- ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
- # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
- symxfrm="\\1 $ac_symprfx\\2 \\2"
-
- # Write the raw and C identifiers.
- if test "$lt_cv_nm_interface" = "MS dumpbin"; then
- # Fake it for dumpbin and say T for any non-static function
- # and D for any global variable.
- # Also find C++ and __fastcall symbols from MSVC++,
- # which start with @ or ?.
- lt_cv_sys_global_symbol_pipe="$AWK '"\
-" {last_section=section; section=\$ 3};"\
-" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
-" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-" \$ 0!~/External *\|/{next};"\
-" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-" {if(hide[section]) next};"\
-" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-" s[1]~/^[@?]/{print s[1], s[1]; next};"\
-" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-" ' prfx=^$ac_symprfx"
- else
- lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
- fi
- lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
-
- # Check to see that the pipe works correctly.
- pipe_works=no
-
- rm -f conftest*
- cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- # Now try to grab the symbols.
- nlist=conftest.nm
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
- (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s "$nlist"; then
- # Try sorting and uniquifying the output.
- if sort "$nlist" | uniq > "$nlist"T; then
- mv -f "$nlist"T "$nlist"
- else
- rm -f "$nlist"T
- fi
-
- # Make sure that we snagged all the symbols we need.
- if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
- if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
- cat <<_LT_EOF > conftest.$ac_ext
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
- relocations are performed -- see ld's documentation on pseudo-relocs. */
-# define LT_DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data. */
-# define LT_DLSYM_CONST
-#else
-# define LT_DLSYM_CONST const
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
- # Now generate the symbol file.
- eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
- cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols. */
-LT_DLSYM_CONST struct {
- const char *name;
- void *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
- { "@PROGRAM@", (void *) 0 },
-_LT_EOF
- $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
- cat <<\_LT_EOF >> conftest.$ac_ext
- {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
- return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
- # Now try linking the two files.
- mv conftest.$ac_objext conftstm.$ac_objext
- lt_globsym_save_LIBS=$LIBS
- lt_globsym_save_CFLAGS=$CFLAGS
- LIBS="conftstm.$ac_objext"
- CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s conftest${ac_exeext}; then
- pipe_works=yes
- fi
- LIBS=$lt_globsym_save_LIBS
- CFLAGS=$lt_globsym_save_CFLAGS
- else
- echo "cannot find nm_test_func in $nlist" >&5
- fi
- else
- echo "cannot find nm_test_var in $nlist" >&5
- fi
- else
- echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
- fi
- else
- echo "$progname: failed program was:" >&5
- cat conftest.$ac_ext >&5
- fi
- rm -rf conftest* conftst*
-
- # Do not use the global_symbol_pipe unless it works.
- if test "$pipe_works" = yes; then
- break
- else
- lt_cv_sys_global_symbol_pipe=
- fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
- lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-# Response file support.
-if test "$lt_cv_nm_interface" = "MS dumpbin"; then
- nm_file_list_spec='@'
-elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
- nm_file_list_spec='@'
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
-$as_echo_n "checking for sysroot... " >&6; }
-
-# Check whether --with-sysroot was given.
-if test "${with_sysroot+set}" = set; then :
- withval=$with_sysroot;
-else
- with_sysroot=no
-fi
-
-
-lt_sysroot=
-case ${with_sysroot} in #(
- yes)
- if test "$GCC" = yes; then
- lt_sysroot=`$CC --print-sysroot 2>/dev/null`
- fi
- ;; #(
- /*)
- lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
- ;; #(
- no|'')
- ;; #(
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
-$as_echo "${with_sysroot}" >&6; }
- as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
- ;;
-esac
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
-$as_echo "${lt_sysroot:-no}" >&6; }
-
-
-
-
-
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
- enableval=$enable_libtool_lock;
-fi
-
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
- # Find out which ABI we are using.
- echo 'int i;' > conftest.$ac_ext
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- case `/usr/bin/file conftest.$ac_objext` in
- *ELF-32*)
- HPUX_IA64_MODE="32"
- ;;
- *ELF-64*)
- HPUX_IA64_MODE="64"
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-*-*-irix6*)
- # Find out which ABI we are using.
- echo '#line '$LINENO' "configure"' > conftest.$ac_ext
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- if test "$lt_cv_prog_gnu_ld" = yes; then
- case `/usr/bin/file conftest.$ac_objext` in
- *32-bit*)
- LD="${LD-ld} -melf32bsmip"
- ;;
- *N32*)
- LD="${LD-ld} -melf32bmipn32"
- ;;
- *64-bit*)
- LD="${LD-ld} -melf64bmip"
- ;;
- esac
- else
- case `/usr/bin/file conftest.$ac_objext` in
- *32-bit*)
- LD="${LD-ld} -32"
- ;;
- *N32*)
- LD="${LD-ld} -n32"
- ;;
- *64-bit*)
- LD="${LD-ld} -64"
- ;;
- esac
- fi
- fi
- rm -rf conftest*
- ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
- # Find out which ABI we are using.
- echo 'int i;' > conftest.$ac_ext
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- case `/usr/bin/file conftest.o` in
- *32-bit*)
- case $host in
- x86_64-*kfreebsd*-gnu)
- LD="${LD-ld} -m elf_i386_fbsd"
- ;;
- x86_64-*linux*)
- LD="${LD-ld} -m elf_i386"
- ;;
- ppc64-*linux*|powerpc64-*linux*)
- LD="${LD-ld} -m elf32ppclinux"
- ;;
- s390x-*linux*)
- LD="${LD-ld} -m elf_s390"
- ;;
- sparc64-*linux*)
- LD="${LD-ld} -m elf32_sparc"
- ;;
- esac
- ;;
- *64-bit*)
- case $host in
- x86_64-*kfreebsd*-gnu)
- LD="${LD-ld} -m elf_x86_64_fbsd"
- ;;
- x86_64-*linux*)
- LD="${LD-ld} -m elf_x86_64"
- ;;
- ppc*-*linux*|powerpc*-*linux*)
- LD="${LD-ld} -m elf64ppc"
- ;;
- s390*-*linux*|s390*-*tpf*)
- LD="${LD-ld} -m elf64_s390"
- ;;
- sparc*-*linux*)
- LD="${LD-ld} -m elf64_sparc"
- ;;
- esac
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-
-*-*-sco3.2v5*)
- # On SCO OpenServer 5, we need -belf to get full-featured binaries.
- SAVE_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -belf"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if ${lt_cv_cc_needs_belf+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- lt_cv_cc_needs_belf=yes
-else
- lt_cv_cc_needs_belf=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
- if test x"$lt_cv_cc_needs_belf" != x"yes"; then
- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
- CFLAGS="$SAVE_CFLAGS"
- fi
- ;;
-*-*solaris*)
- # Find out which ABI we are using.
- echo 'int i;' > conftest.$ac_ext
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- case `/usr/bin/file conftest.o` in
- *64-bit*)
- case $lt_cv_prog_gnu_ld in
- yes*)
- case $host in
- i?86-*-solaris*)
- LD="${LD-ld} -m elf_x86_64"
- ;;
- sparc*-*-solaris*)
- LD="${LD-ld} -m elf64_sparc"
- ;;
- esac
- # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
- if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
- LD="${LD-ld}_sol2"
- fi
- ;;
- *)
- if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
- LD="${LD-ld} -64"
- fi
- ;;
- esac
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-esac
-
-need_locks="$enable_libtool_lock"
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
-set dummy ${ac_tool_prefix}mt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$MANIFEST_TOOL"; then
- ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
-if test -n "$MANIFEST_TOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
-$as_echo "$MANIFEST_TOOL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
- ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
- # Extract the first word of "mt", so it can be a program name with args.
-set dummy mt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_MANIFEST_TOOL"; then
- ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
-if test -n "$ac_ct_MANIFEST_TOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
-$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_MANIFEST_TOOL" = x; then
- MANIFEST_TOOL=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
- fi
-else
- MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
-fi
-
-test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
-$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
-if ${lt_cv_path_mainfest_tool+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_path_mainfest_tool=no
- echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
- $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
- cat conftest.err >&5
- if $GREP 'Manifest Tool' conftest.out > /dev/null; then
- lt_cv_path_mainfest_tool=yes
- fi
- rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
-$as_echo "$lt_cv_path_mainfest_tool" >&6; }
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
- MANIFEST_TOOL=:
-fi
-
-
-
-
-
-
- case $host_os in
- rhapsody* | darwin*)
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DSYMUTIL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$DSYMUTIL"; then
- ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
- ac_ct_DSYMUTIL=$DSYMUTIL
- # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_DSYMUTIL"; then
- ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_DSYMUTIL" = x; then
- DSYMUTIL=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- DSYMUTIL=$ac_ct_DSYMUTIL
- fi
-else
- DSYMUTIL="$ac_cv_prog_DSYMUTIL"
-fi
-
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_NMEDIT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$NMEDIT"; then
- ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_NMEDIT"; then
- ac_ct_NMEDIT=$NMEDIT
- # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_NMEDIT"; then
- ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_NMEDIT="nmedit"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_NMEDIT" = x; then
- NMEDIT=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- NMEDIT=$ac_ct_NMEDIT
- fi
-else
- NMEDIT="$ac_cv_prog_NMEDIT"
-fi
-
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LIPO+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$LIPO"; then
- ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_LIPO"; then
- ac_ct_LIPO=$LIPO
- # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_LIPO"; then
- ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_LIPO="lipo"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_LIPO" = x; then
- LIPO=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- LIPO=$ac_ct_LIPO
- fi
-else
- LIPO="$ac_cv_prog_LIPO"
-fi
-
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$OTOOL"; then
- ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
- ac_ct_OTOOL=$OTOOL
- # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_OTOOL"; then
- ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_OTOOL="otool"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_OTOOL" = x; then
- OTOOL=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- OTOOL=$ac_ct_OTOOL
- fi
-else
- OTOOL="$ac_cv_prog_OTOOL"
-fi
-
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$OTOOL64"; then
- ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
- ac_ct_OTOOL64=$OTOOL64
- # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_OTOOL64"; then
- ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_OTOOL64="otool64"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_OTOOL64" = x; then
- OTOOL64=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- OTOOL64=$ac_ct_OTOOL64
- fi
-else
- OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if ${lt_cv_apple_cc_single_mod+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_apple_cc_single_mod=no
- if test -z "${LT_MULTI_MODULE}"; then
- # By default we will add the -single_module flag. You can override
- # by either setting the environment variable LT_MULTI_MODULE
- # non-empty at configure time, or by adding -multi_module to the
- # link flags.
- rm -rf libconftest.dylib*
- echo "int foo(void){return 1;}" > conftest.c
- echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
- $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
- -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
- _lt_result=$?
- # If there is a non-empty error log, and "single_module"
- # appears in it, assume the flag caused a linker warning
- if test -s conftest.err && $GREP single_module conftest.err; then
- cat conftest.err >&5
- # Otherwise, if the output was created with a 0 exit code from
- # the compiler, it worked.
- elif test -f libconftest.dylib && test $_lt_result -eq 0; then
- lt_cv_apple_cc_single_mod=yes
- else
- cat conftest.err >&5
- fi
- rm -rf libconftest.dylib*
- rm -f conftest.*
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if ${lt_cv_ld_exported_symbols_list+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_ld_exported_symbols_list=no
- save_LDFLAGS=$LDFLAGS
- echo "_main" > conftest.sym
- LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- lt_cv_ld_exported_symbols_list=yes
-else
- lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
-$as_echo_n "checking for -force_load linker flag... " >&6; }
-if ${lt_cv_ld_force_load+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_ld_force_load=no
- cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
- echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
- $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
- echo "$AR cru libconftest.a conftest.o" >&5
- $AR cru libconftest.a conftest.o 2>&5
- echo "$RANLIB libconftest.a" >&5
- $RANLIB libconftest.a 2>&5
- cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
- echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
- $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
- _lt_result=$?
- if test -s conftest.err && $GREP force_load conftest.err; then
- cat conftest.err >&5
- elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
- lt_cv_ld_force_load=yes
- else
- cat conftest.err >&5
- fi
- rm -f conftest.err libconftest.a conftest conftest.c
- rm -rf conftest.dSYM
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
-$as_echo "$lt_cv_ld_force_load" >&6; }
- case $host_os in
- rhapsody* | darwin1.[012])
- _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
- darwin1.*)
- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
- darwin*) # darwin 5.x on
- # if running on 10.5 or later, the deployment target defaults
- # to the OS version, if on x86, and 10.4, the deployment
- # target defaults to 10.4. Don't you love it?
- case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
- 10.0,*86*-darwin8*|10.0,*-darwin[91]*)
- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
- 10.[012]*)
- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
- 10.*)
- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
- esac
- ;;
- esac
- if test "$lt_cv_apple_cc_single_mod" = "yes"; then
- _lt_dar_single_mod='$single_module'
- fi
- if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
- _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
- else
- _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
- fi
- if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
- _lt_dsymutil='~$DSYMUTIL $lib || :'
- else
- _lt_dsymutil=
- fi
- ;;
- esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
-
- done
- ac_cv_prog_CPP=$CPP
-
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in dlfcn.h
-do :
- ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-
-
-# Set options
-
-
-
- enable_dlopen=no
-
-
- enable_win32_dll=no
-
-
- # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
- enableval=$enable_shared; p=${PACKAGE-default}
- case $enableval in
- yes) enable_shared=yes ;;
- no) enable_shared=no ;;
- *)
- enable_shared=no
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for pkg in $enableval; do
- IFS="$lt_save_ifs"
- if test "X$pkg" = "X$p"; then
- enable_shared=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac
-else
- enable_shared=yes
-fi
-
-
-
-
-
-
-
-
-
- # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
- enableval=$enable_static; p=${PACKAGE-default}
- case $enableval in
- yes) enable_static=yes ;;
- no) enable_static=no ;;
- *)
- enable_static=no
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for pkg in $enableval; do
- IFS="$lt_save_ifs"
- if test "X$pkg" = "X$p"; then
- enable_static=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac
-else
- enable_static=yes
-fi
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
- withval=$with_pic; lt_p=${PACKAGE-default}
- case $withval in
- yes|no) pic_mode=$withval ;;
- *)
- pic_mode=default
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for lt_pkg in $withval; do
- IFS="$lt_save_ifs"
- if test "X$lt_pkg" = "X$lt_p"; then
- pic_mode=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac
-else
- pic_mode=default
-fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
- # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
- enableval=$enable_fast_install; p=${PACKAGE-default}
- case $enableval in
- yes) enable_fast_install=yes ;;
- no) enable_fast_install=no ;;
- *)
- enable_fast_install=no
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for pkg in $enableval; do
- IFS="$lt_save_ifs"
- if test "X$pkg" = "X$p"; then
- enable_fast_install=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac
-else
- enable_fast_install=yes
-fi
-
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-test -z "$LN_S" && LN_S="ln -s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "${ZSH_VERSION+set}" ; then
- setopt NO_GLOB_SUBST
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if ${lt_cv_objdir+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
- lt_cv_objdir=.libs
-else
- # MS-DOS does not allow filenames that begin with a dot.
- lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-case $host_os in
-aix3*)
- # AIX sometimes has problems with the GCC collect2 program. For some
- # reason, if we set the COLLECT_NAMES environment variable, the problems
- # vanish in a puff of smoke.
- if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
- fi
- ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-for cc_temp in $compiler""; do
- case $cc_temp in
- compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
- distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
- \-*) ;;
- *) break;;
- esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
- if test "$file_magic_cmd" = '$MAGIC_CMD'; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if ${lt_cv_path_MAGIC_CMD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $MAGIC_CMD in
-[\\/*] | ?:[\\/]*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
- ;;
-*)
- lt_save_MAGIC_CMD="$MAGIC_CMD"
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
- for ac_dir in $ac_dummy; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/${ac_tool_prefix}file; then
- lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
- if test -n "$file_magic_test_file"; then
- case $deplibs_check_method in
- "file_magic "*)
- file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
- $EGREP "$file_magic_regex" > /dev/null; then
- :
- else
- cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such. This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem. Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
- fi ;;
- esac
- fi
- break
- fi
- done
- IFS="$lt_save_ifs"
- MAGIC_CMD="$lt_save_MAGIC_CMD"
- ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
- if test -n "$ac_tool_prefix"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if ${lt_cv_path_MAGIC_CMD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $MAGIC_CMD in
-[\\/*] | ?:[\\/]*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
- ;;
-*)
- lt_save_MAGIC_CMD="$MAGIC_CMD"
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
- for ac_dir in $ac_dummy; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/file; then
- lt_cv_path_MAGIC_CMD="$ac_dir/file"
- if test -n "$file_magic_test_file"; then
- case $deplibs_check_method in
- "file_magic "*)
- file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
- $EGREP "$file_magic_regex" > /dev/null; then
- :
- else
- cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such. This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem. Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
- fi ;;
- esac
- fi
- break
- fi
- done
- IFS="$lt_save_ifs"
- MAGIC_CMD="$lt_save_MAGIC_CMD"
- ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- else
- MAGIC_CMD=:
- fi
-fi
-
- fi
- ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag=
-
-if test "$GCC" = yes; then
- case $cc_basename in
- nvcc*)
- lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
- *)
- lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
- esac
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_rtti_exceptions=no
- ac_outfile=conftest.$ac_objext
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
- lt_compiler_flag="-fno-rtti -fno-exceptions"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- # The option is referenced via a variable to avoid confusing sed.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_rtti_exceptions=yes
- fi
- fi
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
- lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
- :
-fi
-
-fi
-
-
-
-
-
-
- lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
-
- if test "$GCC" = yes; then
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_static='-static'
-
- case $host_os in
- aix*)
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- lt_prog_compiler_static='-Bstatic'
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- lt_prog_compiler_pic='-fPIC'
- ;;
- m68k)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
- ;;
- esac
- ;;
-
- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
- # PIC is the default for these OSes.
- ;;
-
- mingw* | cygwin* | pw32* | os2* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- # Although the cygwin gcc ignores -fPIC, still need this for old-style
- # (--disable-auto-import) libraries
- lt_prog_compiler_pic='-DDLL_EXPORT'
- ;;
-
- darwin* | rhapsody*)
- # PIC is the default on this platform
- # Common symbols not allowed in MH_DYLIB files
- lt_prog_compiler_pic='-fno-common'
- ;;
-
- haiku*)
- # PIC is the default for Haiku.
- # The "-static" flag exists, but is broken.
- lt_prog_compiler_static=
- ;;
-
- hpux*)
- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
- # sets the default TLS model and affects inlining.
- case $host_cpu in
- hppa*64*)
- # +Z the default
- ;;
- *)
- lt_prog_compiler_pic='-fPIC'
- ;;
- esac
- ;;
-
- interix[3-9]*)
- # Interix 3.x gcc -fpic/-fPIC options generate broken code.
- # Instead, we relocate shared libraries at runtime.
- ;;
-
- msdosdjgpp*)
- # Just because we use GCC doesn't mean we suddenly get shared libraries
- # on systems that don't support them.
- lt_prog_compiler_can_build_shared=no
- enable_shared=no
- ;;
-
- *nto* | *qnx*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- lt_prog_compiler_pic='-fPIC -shared'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec; then
- lt_prog_compiler_pic=-Kconform_pic
- fi
- ;;
-
- *)
- lt_prog_compiler_pic='-fPIC'
- ;;
- esac
-
- case $cc_basename in
- nvcc*) # Cuda Compiler Driver 2.2
- lt_prog_compiler_wl='-Xlinker '
- if test -n "$lt_prog_compiler_pic"; then
- lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
- fi
- ;;
- esac
- else
- # PORTME Check for flag to pass linker flags through the system compiler.
- case $host_os in
- aix*)
- lt_prog_compiler_wl='-Wl,'
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- lt_prog_compiler_static='-Bstatic'
- else
- lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
- fi
- ;;
-
- mingw* | cygwin* | pw32* | os2* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- lt_prog_compiler_pic='-DDLL_EXPORT'
- ;;
-
- hpux9* | hpux10* | hpux11*)
- lt_prog_compiler_wl='-Wl,'
- # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
- # not for PA HP-UX.
- case $host_cpu in
- hppa*64*|ia64*)
- # +Z the default
- ;;
- *)
- lt_prog_compiler_pic='+Z'
- ;;
- esac
- # Is there a better lt_prog_compiler_static that works with the bundled CC?
- lt_prog_compiler_static='${wl}-a ${wl}archive'
- ;;
-
- irix5* | irix6* | nonstopux*)
- lt_prog_compiler_wl='-Wl,'
- # PIC (with -KPIC) is the default.
- lt_prog_compiler_static='-non_shared'
- ;;
-
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
- case $cc_basename in
- # old Intel for x86_64 which still supported -KPIC.
- ecc*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-static'
- ;;
- # icc used to be incompatible with GCC.
- # ICC 10 doesn't accept -KPIC any more.
- icc* | ifort*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-fPIC'
- lt_prog_compiler_static='-static'
- ;;
- # Lahey Fortran 8.1.
- lf95*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='--shared'
- lt_prog_compiler_static='--static'
- ;;
- nagfor*)
- # NAG Fortran compiler
- lt_prog_compiler_wl='-Wl,-Wl,,'
- lt_prog_compiler_pic='-PIC'
- lt_prog_compiler_static='-Bstatic'
- ;;
- pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
- # Portland Group compilers (*not* the Pentium gcc compiler,
- # which looks to be a dead project)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-fpic'
- lt_prog_compiler_static='-Bstatic'
- ;;
- ccc*)
- lt_prog_compiler_wl='-Wl,'
- # All Alpha code is PIC.
- lt_prog_compiler_static='-non_shared'
- ;;
- xl* | bgxl* | bgf* | mpixl*)
- # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-qpic'
- lt_prog_compiler_static='-qstaticlink'
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
- # Sun Fortran 8.3 passes all unrecognized flags to the linker
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- lt_prog_compiler_wl=''
- ;;
- *Sun\ F* | *Sun*Fortran*)
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- lt_prog_compiler_wl='-Qoption ld '
- ;;
- *Sun\ C*)
- # Sun C 5.9
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- lt_prog_compiler_wl='-Wl,'
- ;;
- *Intel*\ [CF]*Compiler*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-fPIC'
- lt_prog_compiler_static='-static'
- ;;
- *Portland\ Group*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-fpic'
- lt_prog_compiler_static='-Bstatic'
- ;;
- esac
- ;;
- esac
- ;;
-
- newsos6)
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- ;;
-
- *nto* | *qnx*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- lt_prog_compiler_pic='-fPIC -shared'
- ;;
-
- osf3* | osf4* | osf5*)
- lt_prog_compiler_wl='-Wl,'
- # All OSF/1 code is PIC.
- lt_prog_compiler_static='-non_shared'
- ;;
-
- rdos*)
- lt_prog_compiler_static='-non_shared'
- ;;
-
- solaris*)
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- case $cc_basename in
- f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
- lt_prog_compiler_wl='-Qoption ld ';;
- *)
- lt_prog_compiler_wl='-Wl,';;
- esac
- ;;
-
- sunos4*)
- lt_prog_compiler_wl='-Qoption ld '
- lt_prog_compiler_pic='-PIC'
- lt_prog_compiler_static='-Bstatic'
- ;;
-
- sysv4 | sysv4.2uw2* | sysv4.3*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec ;then
- lt_prog_compiler_pic='-Kconform_pic'
- lt_prog_compiler_static='-Bstatic'
- fi
- ;;
-
- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_pic='-KPIC'
- lt_prog_compiler_static='-Bstatic'
- ;;
-
- unicos*)
- lt_prog_compiler_wl='-Wl,'
- lt_prog_compiler_can_build_shared=no
- ;;
-
- uts4*)
- lt_prog_compiler_pic='-pic'
- lt_prog_compiler_static='-Bstatic'
- ;;
-
- *)
- lt_prog_compiler_can_build_shared=no
- ;;
- esac
- fi
-
-case $host_os in
- # For platforms which do not support PIC, -DPIC is meaningless:
- *djgpp*)
- lt_prog_compiler_pic=
- ;;
- *)
- lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
- ;;
-esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-if ${lt_cv_prog_compiler_pic+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
-$as_echo "$lt_cv_prog_compiler_pic" >&6; }
-lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if ${lt_cv_prog_compiler_pic_works+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_pic_works=no
- ac_outfile=conftest.$ac_objext
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
- lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- # The option is referenced via a variable to avoid confusing sed.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_pic_works=yes
- fi
- fi
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
- case $lt_prog_compiler_pic in
- "" | " "*) ;;
- *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
- esac
-else
- lt_prog_compiler_pic=
- lt_prog_compiler_can_build_shared=no
-fi
-
-fi
-
-
-
-
-
-
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if ${lt_cv_prog_compiler_static_works+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_static_works=no
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
- echo "$lt_simple_link_test_code" > conftest.$ac_ext
- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
- # The linker can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if diff conftest.exp conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_static_works=yes
- fi
- else
- lt_cv_prog_compiler_static_works=yes
- fi
- fi
- $RM -r conftest*
- LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
- :
-else
- lt_prog_compiler_static=
-fi
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_c_o=no
- $RM -r conftest 2>/dev/null
- mkdir conftest
- cd conftest
- mkdir out
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- lt_compiler_flag="-o out/conftest2.$ac_objext"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_c_o=yes
- fi
- fi
- chmod u+w . 2>&5
- $RM conftest*
- # SGI C++ compiler will create directory out/ii_files/ for
- # template instantiation
- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
- $RM out/* && rmdir out
- cd ..
- $RM -r conftest
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_c_o=no
- $RM -r conftest 2>/dev/null
- mkdir conftest
- cd conftest
- mkdir out
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- lt_compiler_flag="-o out/conftest2.$ac_objext"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_c_o=yes
- fi
- fi
- chmod u+w . 2>&5
- $RM conftest*
- # SGI C++ compiler will create directory out/ii_files/ for
- # template instantiation
- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
- $RM out/* && rmdir out
- cd ..
- $RM -r conftest
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
- # do not overwrite the value of need_locks provided by the user
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
- hard_links=yes
- $RM conftest*
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- touch conftest.a
- ln conftest.a conftest.b 2>&5 || hard_links=no
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
- if test "$hard_links" = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
- need_locks=warn
- fi
-else
- need_locks=no
-fi
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
- runpath_var=
- allow_undefined_flag=
- always_export_symbols=no
- archive_cmds=
- archive_expsym_cmds=
- compiler_needs_object=no
- enable_shared_with_static_runtimes=no
- export_dynamic_flag_spec=
- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- hardcode_automatic=no
- hardcode_direct=no
- hardcode_direct_absolute=no
- hardcode_libdir_flag_spec=
- hardcode_libdir_separator=
- hardcode_minus_L=no
- hardcode_shlibpath_var=unsupported
- inherit_rpath=no
- link_all_deplibs=unknown
- module_cmds=
- module_expsym_cmds=
- old_archive_from_new_cmds=
- old_archive_from_expsyms_cmds=
- thread_safe_flag_spec=
- whole_archive_flag_spec=
- # include_expsyms should be a list of space-separated symbols to be *always*
- # included in the symbol list
- include_expsyms=
- # exclude_expsyms can be an extended regexp of symbols to exclude
- # it will be wrapped by ` (' and `)$', so one must not match beginning or
- # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
- # as well as any symbol that contains `d'.
- exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
- # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
- # platforms (ab)use it in PIC code, but their linkers get confused if
- # the symbol is explicitly referenced. Since portable code cannot
- # rely on this symbol name, it's probably fine to never include it in
- # preloaded symbol tables.
- # Exclude shared library initialization/finalization symbols.
- extract_expsyms_cmds=
-
- case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
- # FIXME: the MSVC++ port hasn't been tested in a loooong time
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- if test "$GCC" != yes; then
- with_gnu_ld=no
- fi
- ;;
- interix*)
- # we just hope/assume this is gcc and not c89 (= MSVC++)
- with_gnu_ld=yes
- ;;
- openbsd*)
- with_gnu_ld=no
- ;;
- esac
-
- ld_shlibs=yes
-
- # On some targets, GNU ld is compatible enough with the native linker
- # that we're better off using the native interface for both.
- lt_use_gnu_ld_interface=no
- if test "$with_gnu_ld" = yes; then
- case $host_os in
- aix*)
- # The AIX port of GNU ld has always aspired to compatibility
- # with the native linker. However, as the warning in the GNU ld
- # block says, versions before 2.19.5* couldn't really create working
- # shared libraries, regardless of the interface used.
- case `$LD -v 2>&1` in
- *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
- *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
- *\ \(GNU\ Binutils\)\ [3-9]*) ;;
- *)
- lt_use_gnu_ld_interface=yes
- ;;
- esac
- ;;
- *)
- lt_use_gnu_ld_interface=yes
- ;;
- esac
- fi
-
- if test "$lt_use_gnu_ld_interface" = yes; then
- # If archive_cmds runs LD, not CC, wlarc should be empty
- wlarc='${wl}'
-
- # Set some defaults for GNU ld with shared library support. These
- # are reset later if shared libraries are not supported. Putting them
- # here allows them to be overridden if necessary.
- runpath_var=LD_RUN_PATH
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- export_dynamic_flag_spec='${wl}--export-dynamic'
- # ancient GNU ld didn't support --whole-archive et. al.
- if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- else
- whole_archive_flag_spec=
- fi
- supports_anon_versioning=no
- case `$LD -v 2>&1` in
- *GNU\ gold*) supports_anon_versioning=yes ;;
- *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
- *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
- *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
- *\ 2.11.*) ;; # other 2.11 versions
- *) supports_anon_versioning=yes ;;
- esac
-
- # See if GNU ld supports shared libraries.
- case $host_os in
- aix[3-9]*)
- # On AIX/PPC, the GNU linker is very broken
- if test "$host_cpu" != ia64; then
- ld_shlibs=no
- cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support. If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds=''
- ;;
- m68k)
- archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- ;;
- esac
- ;;
-
- beos*)
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- allow_undefined_flag=unsupported
- # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
- # support --undefined. This deserves some investigation. FIXME
- archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- cygwin* | mingw* | pw32* | cegcc*)
- # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
- # as there is no search path for DLLs.
- hardcode_libdir_flag_spec='-L$libdir'
- export_dynamic_flag_spec='${wl}--export-all-symbols'
- allow_undefined_flag=unsupported
- always_export_symbols=no
- enable_shared_with_static_runtimes=yes
- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
- exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
-
- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is; otherwise, prepend...
- archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname.def;
- else
- echo EXPORTS > $output_objdir/$soname.def;
- cat $export_symbols >> $output_objdir/$soname.def;
- fi~
- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- haiku*)
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- link_all_deplibs=yes
- ;;
-
- interix[3-9]*)
- hardcode_direct=no
- hardcode_shlibpath_var=no
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- export_dynamic_flag_spec='${wl}-E'
- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
- # Instead, shared libraries are loaded at an image base (0x10000000 by
- # default) and relocated if they conflict, which is a slow very memory
- # consuming and fragmenting process. To avoid this, we pick a random,
- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
- # time. Moving up from 0x10000000 also allows more sbrk(2) space.
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- ;;
-
- gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
- tmp_diet=no
- if test "$host_os" = linux-dietlibc; then
- case $cc_basename in
- diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
- esac
- fi
- if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
- && test "$tmp_diet" = no
- then
- tmp_addflag=' $pic_flag'
- tmp_sharedflag='-shared'
- case $cc_basename,$host_cpu in
- pgcc*) # Portland Group C compiler
- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- tmp_addflag=' $pic_flag'
- ;;
- pgf77* | pgf90* | pgf95* | pgfortran*)
- # Portland Group f77 and f90 compilers
- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- tmp_addflag=' $pic_flag -Mnomain' ;;
- ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
- tmp_addflag=' -i_dynamic' ;;
- efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
- tmp_addflag=' -i_dynamic -nofor_main' ;;
- ifc* | ifort*) # Intel Fortran compiler
- tmp_addflag=' -nofor_main' ;;
- lf95*) # Lahey Fortran 8.1
- whole_archive_flag_spec=
- tmp_sharedflag='--shared' ;;
- xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
- tmp_sharedflag='-qmkshrobj'
- tmp_addflag= ;;
- nvcc*) # Cuda Compiler Driver 2.2
- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- compiler_needs_object=yes
- ;;
- esac
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*) # Sun C 5.9
- whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- compiler_needs_object=yes
- tmp_sharedflag='-G' ;;
- *Sun\ F*) # Sun Fortran 8.3
- tmp_sharedflag='-G' ;;
- esac
- archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
- if test "x$supports_anon_versioning" = xyes; then
- archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
- fi
-
- case $cc_basename in
- xlf* | bgf* | bgxlf* | mpixlf*)
- # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
- whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
- archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
- fi
- ;;
- esac
- else
- ld_shlibs=no
- fi
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
- wlarc=
- else
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- fi
- ;;
-
- solaris*)
- if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
- ld_shlibs=no
- cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems. Therefore, libtool
-*** is disabling shared libraries support. We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer. Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
- elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
- case `$LD -v 2>&1` in
- *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
- ld_shlibs=no
- cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems. Therefore, libtool
-*** is disabling shared libraries support. We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
- ;;
- *)
- # For security reasons, it is highly recommended that you always
- # use absolute paths for naming shared libraries, and exclude the
- # DT_RUNPATH tag from executables and libraries. But doing so
- # requires that you compile everything twice, which is a pain.
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
- esac
- ;;
-
- sunos4*)
- archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- wlarc=
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- *)
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
- esac
-
- if test "$ld_shlibs" = no; then
- runpath_var=
- hardcode_libdir_flag_spec=
- export_dynamic_flag_spec=
- whole_archive_flag_spec=
- fi
- else
- # PORTME fill in a description of your system's linker (not GNU ld)
- case $host_os in
- aix3*)
- allow_undefined_flag=unsupported
- always_export_symbols=yes
- archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
- # Note: this linker hardcodes the directories in LIBPATH if there
- # are no directories specified by -L.
- hardcode_minus_L=yes
- if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
- # Neither direct hardcoding nor static linking is supported with a
- # broken collect2.
- hardcode_direct=unsupported
- fi
- ;;
-
- aix[4-9]*)
- if test "$host_cpu" = ia64; then
- # On IA64, the linker does run time linking by default, so we don't
- # have to do anything special.
- aix_use_runtimelinking=no
- exp_sym_flag='-Bexport'
- no_entry_flag=""
- else
- # If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to AIX nm, but means don't demangle with GNU nm
- # Also, AIX nm treats weak defined symbols like other global
- # defined symbols, whereas GNU nm marks them as "W".
- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- else
- export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- fi
- aix_use_runtimelinking=no
-
- # Test if we are trying to use run time linking or normal
- # AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
- case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
- for ld_flag in $LDFLAGS; do
- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
- aix_use_runtimelinking=yes
- break
- fi
- done
- ;;
- esac
-
- exp_sym_flag='-bexport'
- no_entry_flag='-bnoentry'
- fi
-
- # When large executables or shared objects are built, AIX ld can
- # have problems creating the table of contents. If linking a library
- # or program results in "error TOC overflow" add -mminimal-toc to
- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
- archive_cmds=''
- hardcode_direct=yes
- hardcode_direct_absolute=yes
- hardcode_libdir_separator=':'
- link_all_deplibs=yes
- file_list_spec='${wl}-f,'
-
- if test "$GCC" = yes; then
- case $host_os in aix4.[012]|aix4.[012].*)
- # We only want to do this on AIX 4.2 and lower, the check
- # below for broken collect2 doesn't work under 4.3+
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" &&
- strings "$collect2name" | $GREP resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- :
- else
- # We have old collect2
- hardcode_direct=unsupported
- # It fails to find uninstalled libraries when the uninstalled
- # path is not listed in the libpath. Setting hardcode_minus_L
- # to unsupported forces relinking
- hardcode_minus_L=yes
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_libdir_separator=
- fi
- ;;
- esac
- shared_flag='-shared'
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag="$shared_flag "'${wl}-G'
- fi
- else
- # not using gcc
- if test "$host_cpu" = ia64; then
- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
- # chokes on -Wl,-G. The following line is correct:
- shared_flag='-G'
- else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
- else
- shared_flag='${wl}-bM:SRE'
- fi
- fi
- fi
-
- export_dynamic_flag_spec='${wl}-bexpall'
- # It seems that -bexpall does not export symbols beginning with
- # underscore (_), so it is better to generate a list of symbols to export.
- always_export_symbols=yes
- if test "$aix_use_runtimelinking" = yes; then
- # Warning - without using the other runtime loading flags (-brtl),
- # -berok will link without error, but may produce a broken library.
- allow_undefined_flag='-berok'
- # Determine the default libpath from the value encoded in an
- # empty executable.
- if test "${lt_cv_aix_libpath+set}" = set; then
- aix_libpath=$lt_cv_aix_libpath
-else
- if ${lt_cv_aix_libpath_+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
- lt_aix_libpath_sed='
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\([^ ]*\) *$/\1/
- p
- }
- }'
- lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- # Check for a 64-bit object if we didn't find anything.
- if test -z "$lt_cv_aix_libpath_"; then
- lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- if test -z "$lt_cv_aix_libpath_"; then
- lt_cv_aix_libpath_="/usr/lib:/lib"
- fi
-
-fi
-
- aix_libpath=$lt_cv_aix_libpath_
-fi
-
- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
- archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
- else
- if test "$host_cpu" = ia64; then
- hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
- allow_undefined_flag="-z nodefs"
- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
- else
- # Determine the default libpath from the value encoded in an
- # empty executable.
- if test "${lt_cv_aix_libpath+set}" = set; then
- aix_libpath=$lt_cv_aix_libpath
-else
- if ${lt_cv_aix_libpath_+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
- lt_aix_libpath_sed='
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\([^ ]*\) *$/\1/
- p
- }
- }'
- lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- # Check for a 64-bit object if we didn't find anything.
- if test -z "$lt_cv_aix_libpath_"; then
- lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- if test -z "$lt_cv_aix_libpath_"; then
- lt_cv_aix_libpath_="/usr/lib:/lib"
- fi
-
-fi
-
- aix_libpath=$lt_cv_aix_libpath_
-fi
-
- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
- # Warning - without using the other run time loading flags,
- # -berok will link without error, but may produce a broken library.
- no_undefined_flag=' ${wl}-bernotok'
- allow_undefined_flag=' ${wl}-berok'
- if test "$with_gnu_ld" = yes; then
- # We only use this code for GNU lds that support --whole-archive.
- whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- else
- # Exported symbols can be pulled into shared objects from archives
- whole_archive_flag_spec='$convenience'
- fi
- archive_cmds_need_lc=yes
- # This is similar to how AIX traditionally builds its shared libraries.
- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
- fi
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds=''
- ;;
- m68k)
- archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- ;;
- esac
- ;;
-
- bsdi[45]*)
- export_dynamic_flag_spec=-rdynamic
- ;;
-
- cygwin* | mingw* | pw32* | cegcc*)
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- case $cc_basename in
- cl*)
- # Native MSVC
- hardcode_libdir_flag_spec=' '
- allow_undefined_flag=unsupported
- always_export_symbols=yes
- file_list_spec='@'
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
- archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
- else
- sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
- fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
- linknames='
- # The linker will not automatically build a static lib if we build a DLL.
- # _LT_TAGVAR(old_archive_from_new_cmds, )='true'
- enable_shared_with_static_runtimes=yes
- exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
- # Don't use ranlib
- old_postinstall_cmds='chmod 644 $oldlib'
- postlink_cmds='lt_outputfile="@OUTPUT@"~
- lt_tool_outputfile="@TOOL_OUTPUT@"~
- case $lt_outputfile in
- *.exe|*.EXE) ;;
- *)
- lt_outputfile="$lt_outputfile.exe"
- lt_tool_outputfile="$lt_tool_outputfile.exe"
- ;;
- esac~
- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
- $RM "$lt_outputfile.manifest";
- fi'
- ;;
- *)
- # Assume MSVC wrapper
- hardcode_libdir_flag_spec=' '
- allow_undefined_flag=unsupported
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
- # The linker will automatically build a .lib file if we build a DLL.
- old_archive_from_new_cmds='true'
- # FIXME: Should let the user specify the lib program.
- old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
- enable_shared_with_static_runtimes=yes
- ;;
- esac
- ;;
-
- darwin* | rhapsody*)
-
-
- archive_cmds_need_lc=no
- hardcode_direct=no
- hardcode_automatic=yes
- hardcode_shlibpath_var=unsupported
- if test "$lt_cv_ld_force_load" = "yes"; then
- whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-
- else
- whole_archive_flag_spec=''
- fi
- link_all_deplibs=yes
- allow_undefined_flag="$_lt_dar_allow_undefined"
- case $cc_basename in
- ifort*) _lt_dar_can_shared=yes ;;
- *) _lt_dar_can_shared=$GCC ;;
- esac
- if test "$_lt_dar_can_shared" = "yes"; then
- output_verbose_link_cmd=func_echo_all
- archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
- module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
- archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
- module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
- else
- ld_shlibs=no
- fi
-
- ;;
-
- dgux*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_shlibpath_var=no
- ;;
-
- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
- # support. Future versions do this automatically, but an explicit c++rt0.o
- # does not break anything, and helps significantly (at the cost of a little
- # extra space).
- freebsd2.2*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- # Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2.*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
- freebsd* | dragonfly*)
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- hpux9*)
- if test "$GCC" = yes; then
- archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- else
- archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- fi
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_direct=yes
-
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- hardcode_minus_L=yes
- export_dynamic_flag_spec='${wl}-E'
- ;;
-
- hpux10*)
- if test "$GCC" = yes && test "$with_gnu_ld" = no; then
- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
- fi
- if test "$with_gnu_ld" = no; then
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_direct=yes
- hardcode_direct_absolute=yes
- export_dynamic_flag_spec='${wl}-E'
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- hardcode_minus_L=yes
- fi
- ;;
-
- hpux11*)
- if test "$GCC" = yes && test "$with_gnu_ld" = no; then
- case $host_cpu in
- hppa*64*)
- archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- ia64*)
- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- *)
- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- esac
- else
- case $host_cpu in
- hppa*64*)
- archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- ia64*)
- archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- *)
-
- # Older versions of the 11.00 compiler do not understand -b yet
- # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
-$as_echo_n "checking if $CC understands -b... " >&6; }
-if ${lt_cv_prog_compiler__b+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler__b=no
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -b"
- echo "$lt_simple_link_test_code" > conftest.$ac_ext
- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
- # The linker can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if diff conftest.exp conftest.er2 >/dev/null; then
- lt_cv_prog_compiler__b=yes
- fi
- else
- lt_cv_prog_compiler__b=yes
- fi
- fi
- $RM -r conftest*
- LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
-$as_echo "$lt_cv_prog_compiler__b" >&6; }
-
-if test x"$lt_cv_prog_compiler__b" = xyes; then
- archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-else
- archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-fi
-
- ;;
- esac
- fi
- if test "$with_gnu_ld" = no; then
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
-
- case $host_cpu in
- hppa*64*|ia64*)
- hardcode_direct=no
- hardcode_shlibpath_var=no
- ;;
- *)
- hardcode_direct=yes
- hardcode_direct_absolute=yes
- export_dynamic_flag_spec='${wl}-E'
-
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- hardcode_minus_L=yes
- ;;
- esac
- fi
- ;;
-
- irix5* | irix6* | nonstopux*)
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- # Try to use the -exported_symbol ld option, if it does not
- # work, assume that -exports_file does not work either and
- # implicitly export all symbols.
- # This should be the same for all languages, so no per-tag cache variable.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
-$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
-if ${lt_cv_irix_exported_symbol+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-int foo (void) { return 0; }
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- lt_cv_irix_exported_symbol=yes
-else
- lt_cv_irix_exported_symbol=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS="$save_LDFLAGS"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
-$as_echo "$lt_cv_irix_exported_symbol" >&6; }
- if test "$lt_cv_irix_exported_symbol" = yes; then
- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
- fi
- else
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
- fi
- archive_cmds_need_lc='no'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- inherit_rpath=yes
- link_all_deplibs=yes
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
- else
- archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
- fi
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- newsos6)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_shlibpath_var=no
- ;;
-
- *nto* | *qnx*)
- ;;
-
- openbsd*)
- if test -f /usr/libexec/ld.so; then
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- hardcode_direct_absolute=yes
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- export_dynamic_flag_spec='${wl}-E'
- else
- case $host_os in
- openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-R$libdir'
- ;;
- *)
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- ;;
- esac
- fi
- else
- ld_shlibs=no
- fi
- ;;
-
- os2*)
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- allow_undefined_flag=unsupported
- archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
- old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
- ;;
-
- osf3*)
- if test "$GCC" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- fi
- archive_cmds_need_lc='no'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- ;;
-
- osf4* | osf5*) # as osf3* with the addition of -msym flag
- if test "$GCC" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
- # Both c and cxx compiler support -rpath directly
- hardcode_libdir_flag_spec='-rpath $libdir'
- fi
- archive_cmds_need_lc='no'
- hardcode_libdir_separator=:
- ;;
-
- solaris*)
- no_undefined_flag=' -z defs'
- if test "$GCC" = yes; then
- wlarc='${wl}'
- archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
- else
- case `$CC -V 2>&1` in
- *"Compilers 5.0"*)
- wlarc=''
- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
- archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
- ;;
- *)
- wlarc='${wl}'
- archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
- ;;
- esac
- fi
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_shlibpath_var=no
- case $host_os in
- solaris2.[0-5] | solaris2.[0-5].*) ;;
- *)
- # The compiler driver will combine and reorder linker options,
- # but understands `-z linker_flag'. GCC discards it without `$wl',
- # but is careful enough not to reorder.
- # Supported since Solaris 2.6 (maybe 2.5.1?)
- if test "$GCC" = yes; then
- whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
- else
- whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
- fi
- ;;
- esac
- link_all_deplibs=yes
- ;;
-
- sunos4*)
- if test "x$host_vendor" = xsequent; then
- # Use $CC to link under sequent, because it throws in some extra .o
- # files that make .init and .fini sections work.
- archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
- fi
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- sysv4)
- case $host_vendor in
- sni)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes # is this really true???
- ;;
- siemens)
- ## LD is ld it makes a PLAMLIB
- ## CC just makes a GrossModule.
- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
- reload_cmds='$CC -r -o $output$reload_objs'
- hardcode_direct=no
- ;;
- motorola)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=no #Motorola manual says yes, but my tests say they lie
- ;;
- esac
- runpath_var='LD_RUN_PATH'
- hardcode_shlibpath_var=no
- ;;
-
- sysv4.3*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- export_dynamic_flag_spec='-Bexport'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec; then
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- runpath_var=LD_RUN_PATH
- hardcode_runpath_var=yes
- ld_shlibs=yes
- fi
- ;;
-
- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
- no_undefined_flag='${wl}-z,text'
- archive_cmds_need_lc=no
- hardcode_shlibpath_var=no
- runpath_var='LD_RUN_PATH'
-
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- fi
- ;;
-
- sysv5* | sco3.2v5* | sco5v6*)
- # Note: We can NOT use -z defs as we might desire, because we do not
- # link with -lc, and that would cause any symbols used from libc to
- # always be unresolved, which means just about no library would
- # ever link correctly. If we're not using GNU ld we use -z text
- # though, which does catch some bad symbols but isn't as heavy-handed
- # as -z defs.
- no_undefined_flag='${wl}-z,text'
- allow_undefined_flag='${wl}-z,nodefs'
- archive_cmds_need_lc=no
- hardcode_shlibpath_var=no
- hardcode_libdir_flag_spec='${wl}-R,$libdir'
- hardcode_libdir_separator=':'
- link_all_deplibs=yes
- export_dynamic_flag_spec='${wl}-Bexport'
- runpath_var='LD_RUN_PATH'
-
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- fi
- ;;
-
- uts4*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_shlibpath_var=no
- ;;
-
- *)
- ld_shlibs=no
- ;;
- esac
-
- if test x$host_vendor = xsni; then
- case $host in
- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- export_dynamic_flag_spec='${wl}-Blargedynsym'
- ;;
- esac
- fi
- fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
-
-with_gnu_ld=$with_gnu_ld
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
- # Assume -lc should be added
- archive_cmds_need_lc=yes
-
- if test "$enable_shared" = yes && test "$GCC" = yes; then
- case $archive_cmds in
- *'~'*)
- # FIXME: we may have to deal with multi-command sequences.
- ;;
- '$CC '*)
- # Test whether the compiler implicitly links with -lc since on some
- # systems, -lgcc has to come before -lc. If gcc already passes -lc
- # to ld, don't add -lc before -lgcc.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- $RM conftest*
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } 2>conftest.err; then
- soname=conftest
- lib=conftest
- libobjs=conftest.$ac_objext
- deplibs=
- wl=$lt_prog_compiler_wl
- pic_flag=$lt_prog_compiler_pic
- compiler_flags=-v
- linker_flags=-v
- verstring=
- output_objdir=.
- libname=conftest
- lt_save_allow_undefined_flag=$allow_undefined_flag
- allow_undefined_flag=
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
- (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- then
- lt_cv_archive_cmds_need_lc=no
- else
- lt_cv_archive_cmds_need_lc=yes
- fi
- allow_undefined_flag=$lt_save_allow_undefined_flag
- else
- cat conftest.err 1>&5
- fi
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
- archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
- ;;
- esac
- fi
- ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-if test "$GCC" = yes; then
- case $host_os in
- darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
- *) lt_awk_arg="/^libraries:/" ;;
- esac
- case $host_os in
- mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
- *) lt_sed_strip_eq="s,=/,/,g" ;;
- esac
- lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
- case $lt_search_path_spec in
- *\;*)
- # if the path contains ";" then we assume it to be the separator
- # otherwise default to the standard path separator (i.e. ":") - it is
- # assumed that no part of a normal pathname contains ";" but that should
- # okay in the real world where ";" in dirpaths is itself problematic.
- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
- ;;
- *)
- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
- ;;
- esac
- # Ok, now we have the path, separated by spaces, we can step through it
- # and add multilib dir if necessary.
- lt_tmp_lt_search_path_spec=
- lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
- for lt_sys_path in $lt_search_path_spec; do
- if test -d "$lt_sys_path/$lt_multi_os_dir"; then
- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
- else
- test -d "$lt_sys_path" && \
- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
- fi
- done
- lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
- lt_foo="";
- lt_count=0;
- for (lt_i = NF; lt_i > 0; lt_i--) {
- if ($lt_i != "" && $lt_i != ".") {
- if ($lt_i == "..") {
- lt_count++;
- } else {
- if (lt_count == 0) {
- lt_foo="/" $lt_i lt_foo;
- } else {
- lt_count--;
- }
- }
- }
- }
- if (lt_foo != "") { lt_freq[lt_foo]++; }
- if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
- # AWK program above erroneously prepends '/' to C:/dos/paths
- # for these hosts.
- case $host_os in
- mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
- $SED 's,/\([A-Za-z]:\),\1,g'` ;;
- esac
- sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
- sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
- shlibpath_var=LIBPATH
-
- # AIX 3 has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}${shared_ext}$major'
- ;;
-
-aix[4-9]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- hardcode_into_libs=yes
- if test "$host_cpu" = ia64; then
- # AIX 5 supports IA64
- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- else
- # With GCC up to 2.95.x, collect2 would create an import file
- # for dependence libraries. The import file would start with
- # the line `#! .'. This would cause the generated library to
- # depend on `.', always an invalid library. This was fixed in
- # development snapshots of GCC prior to 3.0.
- case $host_os in
- aix4 | aix4.[01] | aix4.[01].*)
- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
- echo ' yes '
- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
- :
- else
- can_build_shared=no
- fi
- ;;
- esac
- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
- # soname into executable. Probably we can add versioning support to
- # collect2, so additional links can be useful in future.
- if test "$aix_use_runtimelinking" = yes; then
- # If using run time linking (on AIX 4.2 or later) use lib<name>.so
- # instead of lib<name>.a to let people know that these are not
- # typical AIX shared libraries.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- else
- # We preserve .a as extension for shared libraries through AIX4.2
- # and later when we are not doing run time linking.
- library_names_spec='${libname}${release}.a $libname.a'
- soname_spec='${libname}${release}${shared_ext}$major'
- fi
- shlibpath_var=LIBPATH
- fi
- ;;
-
-amigaos*)
- case $host_cpu in
- powerpc)
- # Since July 2007 AmigaOS4 officially supports .so libraries.
- # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- ;;
- m68k)
- library_names_spec='$libname.ixlibrary $libname.a'
- # Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
- ;;
- esac
- ;;
-
-beos*)
- library_names_spec='${libname}${shared_ext}'
- dynamic_linker="$host_os ld.so"
- shlibpath_var=LIBRARY_PATH
- ;;
-
-bsdi[45]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
- # the default ld.so.conf also contains /usr/contrib/lib and
- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
- # libtool to hard-code these into programs
- ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
- version_type=windows
- shrext_cmds=".dll"
- need_version=no
- need_lib_prefix=no
-
- case $GCC,$cc_basename in
- yes,*)
- # gcc
- library_names_spec='$libname.dll.a'
- # DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname~
- chmod a+x \$dldir/$dlname~
- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
- fi'
- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $RM \$dlpath'
- shlibpath_overrides_runpath=yes
-
- case $host_os in
- cygwin*)
- # Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
- ;;
- mingw* | cegcc*)
- # MinGW DLLs use traditional 'lib' prefix
- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- ;;
- pw32*)
- # pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- ;;
- esac
- dynamic_linker='Win32 ld.exe'
- ;;
-
- *,cl*)
- # Native MSVC
- libname_spec='$name'
- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- library_names_spec='${libname}.dll.lib'
-
- case $build_os in
- mingw*)
- sys_lib_search_path_spec=
- lt_save_ifs=$IFS
- IFS=';'
- for lt_path in $LIB
- do
- IFS=$lt_save_ifs
- # Let DOS variable expansion print the short 8.3 style file name.
- lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
- sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
- done
- IFS=$lt_save_ifs
- # Convert to MSYS style.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
- ;;
- cygwin*)
- # Convert to unix form, then to dos form, then back to unix form
- # but this time dos style (no spaces!) so that the unix form looks
- # like /cygdrive/c/PROGRA~1:/cygdr...
- sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
- sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
- sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- ;;
- *)
- sys_lib_search_path_spec="$LIB"
- if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
- # It is most probably a Windows format PATH.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
- else
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- fi
- # FIXME: find the short name or the path components, as spaces are
- # common. (e.g. "Program Files" -> "PROGRA~1")
- ;;
- esac
-
- # DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname'
- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $RM \$dlpath'
- shlibpath_overrides_runpath=yes
- dynamic_linker='Win32 link.exe'
- ;;
-
- *)
- # Assume MSVC wrapper
- library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
- dynamic_linker='Win32 ld.exe'
- ;;
- esac
- # FIXME: first we should search . and the directory the executable is in
- shlibpath_var=PATH
- ;;
-
-darwin* | rhapsody*)
- dynamic_linker="$host_os dyld"
- version_type=darwin
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
- soname_spec='${libname}${release}${major}$shared_ext'
- shlibpath_overrides_runpath=yes
- shlibpath_var=DYLD_LIBRARY_PATH
- shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
- sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
- ;;
-
-dgux*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-freebsd* | dragonfly*)
- # DragonFly does not have aout. When/if they implement a new
- # versioning mechanism, adjust this.
- if test -x /usr/bin/objformat; then
- objformat=`/usr/bin/objformat`
- else
- case $host_os in
- freebsd[23].*) objformat=aout ;;
- *) objformat=elf ;;
- esac
- fi
- version_type=freebsd-$objformat
- case $version_type in
- freebsd-elf*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- need_version=no
- need_lib_prefix=no
- ;;
- freebsd-*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
- need_version=yes
- ;;
- esac
- shlibpath_var=LD_LIBRARY_PATH
- case $host_os in
- freebsd2.*)
- shlibpath_overrides_runpath=yes
- ;;
- freebsd3.[01]* | freebsdelf3.[01]*)
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
- freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
- freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
- *) # from 4.6 on, and DragonFly
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
- esac
- ;;
-
-gnu*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-haiku*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- dynamic_linker="$host_os runtime_loader"
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
- hardcode_into_libs=yes
- ;;
-
-hpux9* | hpux10* | hpux11*)
- # Give a soname corresponding to the major version so that dld.sl refuses to
- # link against other versions.
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- case $host_cpu in
- ia64*)
- shrext_cmds='.so'
- hardcode_into_libs=yes
- dynamic_linker="$host_os dld.so"
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- if test "X$HPUX_IA64_MODE" = X32; then
- sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
- else
- sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
- fi
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
- ;;
- hppa*64*)
- shrext_cmds='.sl'
- hardcode_into_libs=yes
- dynamic_linker="$host_os dld.sl"
- shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
- ;;
- *)
- shrext_cmds='.sl'
- dynamic_linker="$host_os dld.sl"
- shlibpath_var=SHLIB_PATH
- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- ;;
- esac
- # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
- postinstall_cmds='chmod 555 $lib'
- # or fails outright, so override atomically:
- install_override_mode=555
- ;;
-
-interix[3-9]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-irix5* | irix6* | nonstopux*)
- case $host_os in
- nonstopux*) version_type=nonstopux ;;
- *)
- if test "$lt_cv_prog_gnu_ld" = yes; then
- version_type=linux # correct to gnu/linux during the next big refactor
- else
- version_type=irix
- fi ;;
- esac
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
- case $host_os in
- irix5* | nonstopux*)
- libsuff= shlibsuff=
- ;;
- *)
- case $LD in # libtool.m4 will add one of these switches to LD
- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
- libsuff= shlibsuff= libmagic=32-bit;;
- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
- libsuff=32 shlibsuff=N32 libmagic=N32;;
- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
- libsuff=64 shlibsuff=64 libmagic=64-bit;;
- *) libsuff= shlibsuff= libmagic=never-match;;
- esac
- ;;
- esac
- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
- hardcode_into_libs=yes
- ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
- dynamic_linker=no
- ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
-
- # Some binutils ld are patched to set DT_RUNPATH
- if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_shlibpath_overrides_runpath=no
- save_LDFLAGS=$LDFLAGS
- save_libdir=$libdir
- eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
- LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
- lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS=$save_LDFLAGS
- libdir=$save_libdir
-
-fi
-
- shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
- # This implies no fast_install, which is unacceptable.
- # Some rework will be needed to allow for fast_install
- # before this can be enabled.
- hardcode_into_libs=yes
-
- # Add ABI-specific directories to the system library path.
- sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
-
- # Append ld.so.conf contents to the search path
- if test -f /etc/ld.so.conf; then
- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
- sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
-
- fi
-
- # We used to test for /lib/ld.so.1 and disable shared libraries on
- # powerpc, because MkLinux only supported shared libraries with the
- # GNU dynamic linker. Since this was broken with cross compilers,
- # most powerpc-linux boxes support dynamic linking these days and
- # people can always --disable-shared, the test was removed, and we
- # assume the GNU/Linux dynamic linker is in use.
- dynamic_linker='GNU/Linux ld.so'
- ;;
-
-netbsd*)
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- dynamic_linker='NetBSD (a.out) ld.so'
- else
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- dynamic_linker='NetBSD ld.elf_so'
- fi
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
-
-newsos6)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- ;;
-
-*nto* | *qnx*)
- version_type=qnx
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- dynamic_linker='ldqnx.so'
- ;;
-
-openbsd*)
- version_type=sunos
- sys_lib_dlsearch_path_spec="/usr/lib"
- need_lib_prefix=no
- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
- case $host_os in
- openbsd3.3 | openbsd3.3.*) need_version=yes ;;
- *) need_version=no ;;
- esac
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- case $host_os in
- openbsd2.[89] | openbsd2.[89].*)
- shlibpath_overrides_runpath=no
- ;;
- *)
- shlibpath_overrides_runpath=yes
- ;;
- esac
- else
- shlibpath_overrides_runpath=yes
- fi
- ;;
-
-os2*)
- libname_spec='$name'
- shrext_cmds=".dll"
- need_lib_prefix=no
- library_names_spec='$libname${shared_ext} $libname.a'
- dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
- ;;
-
-osf3* | osf4* | osf5*)
- version_type=osf
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
- ;;
-
-rdos*)
- dynamic_linker=no
- ;;
-
-solaris*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- # ldd complains unless libraries are executable
- postinstall_cmds='chmod +x $lib'
- ;;
-
-sunos4*)
- version_type=sunos
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- if test "$with_gnu_ld" = yes; then
- need_lib_prefix=no
- fi
- need_version=yes
- ;;
-
-sysv4 | sysv4.3*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- case $host_vendor in
- sni)
- shlibpath_overrides_runpath=no
- need_lib_prefix=no
- runpath_var=LD_RUN_PATH
- ;;
- siemens)
- need_lib_prefix=no
- ;;
- motorola)
- need_lib_prefix=no
- need_version=no
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
- ;;
- esac
- ;;
-
-sysv4*MP*)
- if test -d /usr/nec ;then
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
- soname_spec='$libname${shared_ext}.$major'
- shlibpath_var=LD_LIBRARY_PATH
- fi
- ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- version_type=freebsd-elf
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- if test "$with_gnu_ld" = yes; then
- sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
- else
- sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
- case $host_os in
- sco3.2v5*)
- sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
- ;;
- esac
- fi
- sys_lib_dlsearch_path_spec='/usr/lib'
- ;;
-
-tpf*)
- # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-uts4*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-*)
- dynamic_linker=no
- ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
- test -n "$runpath_var" ||
- test "X$hardcode_automatic" = "Xyes" ; then
-
- # We can hardcode non-existent directories.
- if test "$hardcode_direct" != no &&
- # If the only mechanism to avoid hardcoding is shlibpath_var, we
- # have to relink, otherwise we might link with an installed library
- # when we should be linking with a yet-to-be-installed one
- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
- test "$hardcode_minus_L" != no; then
- # Linking always hardcodes the temporary library directory.
- hardcode_action=relink
- else
- # We can link without hardcoding, and we can hardcode nonexisting dirs.
- hardcode_action=immediate
- fi
-else
- # We cannot hardcode anything, or else we can only hardcode existing
- # directories.
- hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
-
-if test "$hardcode_action" = relink ||
- test "$inherit_rpath" = yes; then
- # Fast installation is not supported
- enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
- test "$enable_shared" = no; then
- # Fast installation is not necessary
- enable_fast_install=needless
-fi
-
-
-
-
-
-
- if test "x$enable_dlopen" != xyes; then
- enable_dlopen=unknown
- enable_dlopen_self=unknown
- enable_dlopen_self_static=unknown
-else
- lt_cv_dlopen=no
- lt_cv_dlopen_libs=
-
- case $host_os in
- beos*)
- lt_cv_dlopen="load_add_on"
- lt_cv_dlopen_libs=
- lt_cv_dlopen_self=yes
- ;;
-
- mingw* | pw32* | cegcc*)
- lt_cv_dlopen="LoadLibrary"
- lt_cv_dlopen_libs=
- ;;
-
- cygwin*)
- lt_cv_dlopen="dlopen"
- lt_cv_dlopen_libs=
- ;;
-
- darwin*)
- # if libdl is installed we need to link against it
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_dl_dlopen=yes
-else
- ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
- lt_cv_dlopen="dyld"
- lt_cv_dlopen_libs=
- lt_cv_dlopen_self=yes
-
-fi
-
- ;;
-
- *)
- ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = xyes; then :
- lt_cv_dlopen="shl_load"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if ${ac_cv_lib_dld_shl_load+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_dld_shl_load=yes
-else
- ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
- lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
- ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = xyes; then :
- lt_cv_dlopen="dlopen"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_dl_dlopen=yes
-else
- ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if ${ac_cv_lib_svld_dlopen+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_svld_dlopen=yes
-else
- ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if ${ac_cv_lib_dld_dld_link+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-int
-main ()
-{
-return dld_link ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_dld_dld_link=yes
-else
- ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
- lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
- ;;
- esac
-
- if test "x$lt_cv_dlopen" != xno; then
- enable_dlopen=yes
- else
- enable_dlopen=no
- fi
-
- case $lt_cv_dlopen in
- dlopen)
- save_CPPFLAGS="$CPPFLAGS"
- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
- save_LDFLAGS="$LDFLAGS"
- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
- save_LIBS="$LIBS"
- LIBS="$lt_cv_dlopen_libs $LIBS"
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if ${lt_cv_dlopen_self+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "$cross_compiling" = yes; then :
- lt_cv_dlopen_self=cross
-else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LT_DLGLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LT_DLGLOBAL DL_GLOBAL
-# else
-# define LT_DLGLOBAL 0
-# endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LT_DLLAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LT_DLLAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LT_DLLAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LT_DLLAZY_OR_NOW DL_NOW
-# else
-# define LT_DLLAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
- correspondingly for the symbols needed. */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
- int status = $lt_dlunknown;
-
- if (self)
- {
- if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else
- {
- if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
- else puts (dlerror ());
- }
- /* dlclose (self); */
- }
- else
- puts (dlerror ());
-
- return status;
-}
-_LT_EOF
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
- (./conftest; exit; ) >&5 2>/dev/null
- lt_status=$?
- case x$lt_status in
- x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
- x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
- x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
- esac
- else :
- # compilation failed
- lt_cv_dlopen_self=no
- fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
-
- if test "x$lt_cv_dlopen_self" = xyes; then
- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if ${lt_cv_dlopen_self_static+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "$cross_compiling" = yes; then :
- lt_cv_dlopen_self_static=cross
-else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LT_DLGLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LT_DLGLOBAL DL_GLOBAL
-# else
-# define LT_DLGLOBAL 0
-# endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LT_DLLAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LT_DLLAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LT_DLLAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LT_DLLAZY_OR_NOW DL_NOW
-# else
-# define LT_DLLAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
- correspondingly for the symbols needed. */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
- int status = $lt_dlunknown;
-
- if (self)
- {
- if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else
- {
- if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
- else puts (dlerror ());
- }
- /* dlclose (self); */
- }
- else
- puts (dlerror ());
-
- return status;
-}
-_LT_EOF
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
- (./conftest; exit; ) >&5 2>/dev/null
- lt_status=$?
- case x$lt_status in
- x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
- x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
- x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
- esac
- else :
- # compilation failed
- lt_cv_dlopen_self_static=no
- fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
- fi
-
- CPPFLAGS="$save_CPPFLAGS"
- LDFLAGS="$save_LDFLAGS"
- LIBS="$save_LIBS"
- ;;
- esac
-
- case $lt_cv_dlopen_self in
- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
- *) enable_dlopen_self=unknown ;;
- esac
-
- case $lt_cv_dlopen_self_static in
- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
- *) enable_dlopen_self_static=unknown ;;
- esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
- test -z "$striplib" && striplib="$STRIP --strip-unneeded"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
- case $host_os in
- darwin*)
- if test -n "$STRIP" ; then
- striplib="$STRIP -x"
- old_striplib="$STRIP -S"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
- ;;
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- ;;
- esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
- # Report which library types will actually be built
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
- test "$can_build_shared" = "no" && enable_shared=no
-
- # On AIX, shared libraries and static libraries use the same namespace, and
- # are all built from PIC.
- case $host_os in
- aix3*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
-
- aix[4-9]*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
- fi
- ;;
- esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
- # Make sure either enable_shared or enable_static is yes.
- test "$enable_shared" = yes || enable_static=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
-
-
-
-
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-CC="$lt_save_CC"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-
-# Change default compilation flags
-#AC_SUBST([ALL_CXXFLAGS], [-std=c++0x])
-#CXXFLAGS="-std=c++0x $CXXFLAGS"
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -z "$CXX"; then
- if test -n "$CCC"; then
- CXX=$CCC
- else
- if test -n "$ac_tool_prefix"; then
- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CXX"; then
- ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$CXX" && break
- done
-fi
-if test -z "$CXX"; then
- ac_ct_CXX=$CXX
- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CXX"; then
- ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_CXX="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_CXX" && break
-done
-
- if test "x$ac_ct_CXX" = x; then
- CXX="g++"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CXX=$ac_ct_CXX
- fi
-fi
-
- fi
-fi
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
- { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compiler $ac_option >&5") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- sed '10a\
-... rest of stderr output deleted ...
- 10q' conftest.err >conftest.er1
- cat conftest.er1 >&5
- fi
- rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if ${ac_cv_cxx_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_compiler_gnu=yes
-else
- ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
- GXX=yes
-else
- GXX=
-fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if ${ac_cv_prog_cxx_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_cxx_werror_flag=$ac_cxx_werror_flag
- ac_cxx_werror_flag=yes
- ac_cv_prog_cxx_g=no
- CXXFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_cv_prog_cxx_g=yes
-else
- CXXFLAGS=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
- ac_cxx_werror_flag=$ac_save_cxx_werror_flag
- CXXFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_cv_prog_cxx_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
- CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
- if test "$GXX" = yes; then
- CXXFLAGS="-g -O2"
- else
- CXXFLAGS="-g"
- fi
-else
- if test "$GXX" = yes; then
- CXXFLAGS="-O2"
- else
- CXXFLAGS=
- fi
-fi
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-depcc="$CXX" am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
- # We make a subdir and do the tests there. Otherwise we can end up
- # making bogus files that we don't know about and never remove. For
- # instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named `D' -- because `-MD' means `put the output
- # in D'.
- rm -rf conftest.dir
- mkdir conftest.dir
- # Copy depcomp to subdir because otherwise we won't find it if we're
- # using a relative directory.
- cp "$am_depcomp" conftest.dir
- cd conftest.dir
- # We will build objects and dependencies in a subdirectory because
- # it helps to detect inapplicable dependency modes. For instance
- # both Tru64's cc and ICC support -MD to output dependencies as a
- # side effect of compilation, but ICC will put the dependencies in
- # the current directory while Tru64 will put them in the object
- # directory.
- mkdir sub
-
- am_cv_CXX_dependencies_compiler_type=none
- if test "$am_compiler_list" = ""; then
- am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
- fi
- am__universal=false
- case " $depcc " in #(
- *\ -arch\ *\ -arch\ *) am__universal=true ;;
- esac
-
- for depmode in $am_compiler_list; do
- # Setup a source with many dependencies, because some compilers
- # like to wrap large dependency lists on column 80 (with \), and
- # we should not choose a depcomp mode which is confused by this.
- #
- # We need to recreate these files for each test, as the compiler may
- # overwrite some of them when testing with obscure command lines.
- # This happens at least with the AIX C compiler.
- : > sub/conftest.c
- for i in 1 2 3 4 5 6; do
- echo '#include "conftst'$i'.h"' >> sub/conftest.c
- # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
- # Solaris 8's {/usr,}/bin/sh.
- touch sub/conftst$i.h
- done
- echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
- # We check with `-c' and `-o' for the sake of the "dashmstdout"
- # mode. It turns out that the SunPro C++ compiler does not properly
- # handle `-M -o', and we need to detect this. Also, some Intel
- # versions had trouble with output in subdirs
- am__obj=sub/conftest.${OBJEXT-o}
- am__minus_obj="-o $am__obj"
- case $depmode in
- gcc)
- # This depmode causes a compiler race in universal mode.
- test "$am__universal" = false || continue
- ;;
- nosideeffect)
- # after this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested
- if test "x$enable_dependency_tracking" = xyes; then
- continue
- else
- break
- fi
- ;;
- msvc7 | msvc7msys | msvisualcpp | msvcmsys)
- # This compiler won't grok `-c -o', but also, the minuso test has
- # not run yet. These depmodes are late enough in the game, and
- # so weak that their functioning should not be impacted.
- am__obj=conftest.${OBJEXT-o}
- am__minus_obj=
- ;;
- none) break ;;
- esac
- if depmode=$depmode \
- source=sub/conftest.c object=$am__obj \
- depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
- $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
- >/dev/null 2>conftest.err &&
- grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
- grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
- grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
- ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
- # icc doesn't choke on unknown options, it will just issue warnings
- # or remarks (even with -Werror). So we grep stderr for any message
- # that says an option was ignored or not supported.
- # When given -MP, icc 7.0 and 7.1 complain thusly:
- # icc: Command line warning: ignoring option '-M'; no argument required
- # The diagnosis changed in icc 8.0:
- # icc: Command line remark: option '-MP' not supported
- if (grep 'ignoring option' conftest.err ||
- grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
- am_cv_CXX_dependencies_compiler_type=$depmode
- break
- fi
- fi
- done
-
- cd ..
- rm -rf conftest.dir
-else
- am_cv_CXX_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
-
- if
- test "x$enable_dependency_tracking" != xno \
- && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
- am__fastdepCXX_TRUE=
- am__fastdepCXX_FALSE='#'
-else
- am__fastdepCXX_TRUE='#'
- am__fastdepCXX_FALSE=
-fi
-
-
-
-
-func_stripname_cnf ()
-{
- case ${2} in
- .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
- *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
- esac
-} # func_stripname_cnf
-
- if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
- ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
- (test "X$CXX" != "Xg++"))) ; then
- ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
-$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
-if test -z "$CXXCPP"; then
- if ${ac_cv_prog_CXXCPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CXXCPP needs to be expanded
- for CXXCPP in "$CXX -E" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
-
- done
- ac_cv_prog_CXXCPP=$CXXCPP
-
-fi
- CXXCPP=$ac_cv_prog_CXXCPP
-else
- ac_cv_prog_CXXCPP=$CXXCPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
-$as_echo "$CXXCPP" >&6; }
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-else
- _lt_caught_CXX_error=yes
-fi
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-archive_cmds_need_lc_CXX=no
-allow_undefined_flag_CXX=
-always_export_symbols_CXX=no
-archive_expsym_cmds_CXX=
-compiler_needs_object_CXX=no
-export_dynamic_flag_spec_CXX=
-hardcode_direct_CXX=no
-hardcode_direct_absolute_CXX=no
-hardcode_libdir_flag_spec_CXX=
-hardcode_libdir_separator_CXX=
-hardcode_minus_L_CXX=no
-hardcode_shlibpath_var_CXX=unsupported
-hardcode_automatic_CXX=no
-inherit_rpath_CXX=no
-module_cmds_CXX=
-module_expsym_cmds_CXX=
-link_all_deplibs_CXX=unknown
-old_archive_cmds_CXX=$old_archive_cmds
-reload_flag_CXX=$reload_flag
-reload_cmds_CXX=$reload_cmds
-no_undefined_flag_CXX=
-whole_archive_flag_spec_CXX=
-enable_shared_with_static_runtimes_CXX=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-objext_CXX=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working. Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
- # Code to be used in simple compile tests
- lt_simple_compile_test_code="int some_variable = 0;"
-
- # Code to be used in simple link tests
- lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
-
- # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
- # save warnings/boilerplate of simple test code
- ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
- ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
- # Allow CC to be a program name with arguments.
- lt_save_CC=$CC
- lt_save_CFLAGS=$CFLAGS
- lt_save_LD=$LD
- lt_save_GCC=$GCC
- GCC=$GXX
- lt_save_with_gnu_ld=$with_gnu_ld
- lt_save_path_LD=$lt_cv_path_LD
- if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
- lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
- else
- $as_unset lt_cv_prog_gnu_ld
- fi
- if test -n "${lt_cv_path_LDCXX+set}"; then
- lt_cv_path_LD=$lt_cv_path_LDCXX
- else
- $as_unset lt_cv_path_LD
- fi
- test -z "${LDCXX+set}" || LD=$LDCXX
- CC=${CXX-"c++"}
- CFLAGS=$CXXFLAGS
- compiler=$CC
- compiler_CXX=$CC
- for cc_temp in $compiler""; do
- case $cc_temp in
- compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
- distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
- \-*) ;;
- *) break;;
- esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
- if test -n "$compiler"; then
- # We don't want -fno-exception when compiling C++ code, so set the
- # no_builtin_flag separately
- if test "$GXX" = yes; then
- lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
- else
- lt_prog_compiler_no_builtin_flag_CXX=
- fi
-
- if test "$GXX" = yes; then
- # Set up default GNU C++ configuration
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
- withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
- with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
- # Check if gcc -print-prog-name=ld gives a path.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
- case $host in
- *-*-mingw*)
- # gcc leaves a trailing carriage return which upsets mingw
- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
- *)
- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
- esac
- case $ac_prog in
- # Accept absolute paths.
- [\\/]* | ?:[\\/]*)
- re_direlt='/[^/][^/]*/\.\./'
- # Canonicalize the pathname of ld
- ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
- while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
- done
- test -z "$LD" && LD="$ac_prog"
- ;;
- "")
- # If it fails, then pretend we aren't using GCC.
- ac_prog=ld
- ;;
- *)
- # If it is relative, then search for the first ld in PATH.
- with_gnu_ld=unknown
- ;;
- esac
-elif test "$with_gnu_ld" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${lt_cv_path_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$LD"; then
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
- lt_cv_path_LD="$ac_dir/$ac_prog"
- # Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some variants of GNU ld only accept -v.
- # Break only if it was the GNU/non-GNU ld that we prefer.
- case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
- *GNU* | *'with BFD'*)
- test "$with_gnu_ld" != no && break
- ;;
- *)
- test "$with_gnu_ld" != yes && break
- ;;
- esac
- fi
- done
- IFS="$lt_save_ifs"
-else
- lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
- lt_cv_prog_gnu_ld=yes
- ;;
-*)
- lt_cv_prog_gnu_ld=no
- ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
- # Check if GNU C++ uses GNU ld as the underlying linker, since the
- # archiving commands below assume that GNU ld is being used.
- if test "$with_gnu_ld" = yes; then
- archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
- export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
- # If archive_cmds runs LD, not CC, wlarc should be empty
- # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
- # investigate it a little bit more. (MM)
- wlarc='${wl}'
-
- # ancient GNU ld didn't support --whole-archive et. al.
- if eval "`$CC -print-prog-name=ld` --help 2>&1" |
- $GREP 'no-whole-archive' > /dev/null; then
- whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- else
- whole_archive_flag_spec_CXX=
- fi
- else
- with_gnu_ld=no
- wlarc=
-
- # A generic and very simple default shared library creation
- # command for GNU C++ for the case where it uses the native
- # linker, instead of GNU ld. If possible, this setting should
- # overridden to take advantage of the native linker features on
- # the platform it is being used on.
- archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
- fi
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
- else
- GXX=no
- with_gnu_ld=no
- wlarc=
- fi
-
- # PORTME: fill in a description of your system's C++ link characteristics
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
- ld_shlibs_CXX=yes
- case $host_os in
- aix3*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- aix[4-9]*)
- if test "$host_cpu" = ia64; then
- # On IA64, the linker does run time linking by default, so we don't
- # have to do anything special.
- aix_use_runtimelinking=no
- exp_sym_flag='-Bexport'
- no_entry_flag=""
- else
- aix_use_runtimelinking=no
-
- # Test if we are trying to use run time linking or normal
- # AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
- case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
- for ld_flag in $LDFLAGS; do
- case $ld_flag in
- *-brtl*)
- aix_use_runtimelinking=yes
- break
- ;;
- esac
- done
- ;;
- esac
-
- exp_sym_flag='-bexport'
- no_entry_flag='-bnoentry'
- fi
-
- # When large executables or shared objects are built, AIX ld can
- # have problems creating the table of contents. If linking a library
- # or program results in "error TOC overflow" add -mminimal-toc to
- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
- archive_cmds_CXX=''
- hardcode_direct_CXX=yes
- hardcode_direct_absolute_CXX=yes
- hardcode_libdir_separator_CXX=':'
- link_all_deplibs_CXX=yes
- file_list_spec_CXX='${wl}-f,'
-
- if test "$GXX" = yes; then
- case $host_os in aix4.[012]|aix4.[012].*)
- # We only want to do this on AIX 4.2 and lower, the check
- # below for broken collect2 doesn't work under 4.3+
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" &&
- strings "$collect2name" | $GREP resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- :
- else
- # We have old collect2
- hardcode_direct_CXX=unsupported
- # It fails to find uninstalled libraries when the uninstalled
- # path is not listed in the libpath. Setting hardcode_minus_L
- # to unsupported forces relinking
- hardcode_minus_L_CXX=yes
- hardcode_libdir_flag_spec_CXX='-L$libdir'
- hardcode_libdir_separator_CXX=
- fi
- esac
- shared_flag='-shared'
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag="$shared_flag "'${wl}-G'
- fi
- else
- # not using gcc
- if test "$host_cpu" = ia64; then
- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
- # chokes on -Wl,-G. The following line is correct:
- shared_flag='-G'
- else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
- else
- shared_flag='${wl}-bM:SRE'
- fi
- fi
- fi
-
- export_dynamic_flag_spec_CXX='${wl}-bexpall'
- # It seems that -bexpall does not export symbols beginning with
- # underscore (_), so it is better to generate a list of symbols to
- # export.
- always_export_symbols_CXX=yes
- if test "$aix_use_runtimelinking" = yes; then
- # Warning - without using the other runtime loading flags (-brtl),
- # -berok will link without error, but may produce a broken library.
- allow_undefined_flag_CXX='-berok'
- # Determine the default libpath from the value encoded in an empty
- # executable.
- if test "${lt_cv_aix_libpath+set}" = set; then
- aix_libpath=$lt_cv_aix_libpath
-else
- if ${lt_cv_aix_libpath__CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- lt_aix_libpath_sed='
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\([^ ]*\) *$/\1/
- p
- }
- }'
- lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- # Check for a 64-bit object if we didn't find anything.
- if test -z "$lt_cv_aix_libpath__CXX"; then
- lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- if test -z "$lt_cv_aix_libpath__CXX"; then
- lt_cv_aix_libpath__CXX="/usr/lib:/lib"
- fi
-
-fi
-
- aix_libpath=$lt_cv_aix_libpath__CXX
-fi
-
- hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-
- archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
- else
- if test "$host_cpu" = ia64; then
- hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
- allow_undefined_flag_CXX="-z nodefs"
- archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
- else
- # Determine the default libpath from the value encoded in an
- # empty executable.
- if test "${lt_cv_aix_libpath+set}" = set; then
- aix_libpath=$lt_cv_aix_libpath
-else
- if ${lt_cv_aix_libpath__CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
- lt_aix_libpath_sed='
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\([^ ]*\) *$/\1/
- p
- }
- }'
- lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- # Check for a 64-bit object if we didn't find anything.
- if test -z "$lt_cv_aix_libpath__CXX"; then
- lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- if test -z "$lt_cv_aix_libpath__CXX"; then
- lt_cv_aix_libpath__CXX="/usr/lib:/lib"
- fi
-
-fi
-
- aix_libpath=$lt_cv_aix_libpath__CXX
-fi
-
- hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
- # Warning - without using the other run time loading flags,
- # -berok will link without error, but may produce a broken library.
- no_undefined_flag_CXX=' ${wl}-bernotok'
- allow_undefined_flag_CXX=' ${wl}-berok'
- if test "$with_gnu_ld" = yes; then
- # We only use this code for GNU lds that support --whole-archive.
- whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- else
- # Exported symbols can be pulled into shared objects from archives
- whole_archive_flag_spec_CXX='$convenience'
- fi
- archive_cmds_need_lc_CXX=yes
- # This is similar to how AIX traditionally builds its shared
- # libraries.
- archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
- fi
- fi
- ;;
-
- beos*)
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- allow_undefined_flag_CXX=unsupported
- # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
- # support --undefined. This deserves some investigation. FIXME
- archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- else
- ld_shlibs_CXX=no
- fi
- ;;
-
- chorus*)
- case $cc_basename in
- *)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- esac
- ;;
-
- cygwin* | mingw* | pw32* | cegcc*)
- case $GXX,$cc_basename in
- ,cl* | no,cl*)
- # Native MSVC
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec_CXX=' '
- allow_undefined_flag_CXX=unsupported
- always_export_symbols_CXX=yes
- file_list_spec_CXX='@'
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
- archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
- else
- $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
- fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
- linknames='
- # The linker will not automatically build a static lib if we build a DLL.
- # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
- enable_shared_with_static_runtimes_CXX=yes
- # Don't use ranlib
- old_postinstall_cmds_CXX='chmod 644 $oldlib'
- postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
- lt_tool_outputfile="@TOOL_OUTPUT@"~
- case $lt_outputfile in
- *.exe|*.EXE) ;;
- *)
- lt_outputfile="$lt_outputfile.exe"
- lt_tool_outputfile="$lt_tool_outputfile.exe"
- ;;
- esac~
- func_to_tool_file "$lt_outputfile"~
- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
- $RM "$lt_outputfile.manifest";
- fi'
- ;;
- *)
- # g++
- # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
- # as there is no search path for DLLs.
- hardcode_libdir_flag_spec_CXX='-L$libdir'
- export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
- allow_undefined_flag_CXX=unsupported
- always_export_symbols_CXX=no
- enable_shared_with_static_runtimes_CXX=yes
-
- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
- archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is; otherwise, prepend...
- archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname.def;
- else
- echo EXPORTS > $output_objdir/$soname.def;
- cat $export_symbols >> $output_objdir/$soname.def;
- fi~
- $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- else
- ld_shlibs_CXX=no
- fi
- ;;
- esac
- ;;
- darwin* | rhapsody*)
-
-
- archive_cmds_need_lc_CXX=no
- hardcode_direct_CXX=no
- hardcode_automatic_CXX=yes
- hardcode_shlibpath_var_CXX=unsupported
- if test "$lt_cv_ld_force_load" = "yes"; then
- whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-
- else
- whole_archive_flag_spec_CXX=''
- fi
- link_all_deplibs_CXX=yes
- allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
- case $cc_basename in
- ifort*) _lt_dar_can_shared=yes ;;
- *) _lt_dar_can_shared=$GCC ;;
- esac
- if test "$_lt_dar_can_shared" = "yes"; then
- output_verbose_link_cmd=func_echo_all
- archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
- module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
- archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
- module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
- if test "$lt_cv_apple_cc_single_mod" != "yes"; then
- archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
- archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
- fi
-
- else
- ld_shlibs_CXX=no
- fi
-
- ;;
-
- dgux*)
- case $cc_basename in
- ec++*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- ghcx*)
- # Green Hills C++ Compiler
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- esac
- ;;
-
- freebsd2.*)
- # C++ shared libraries reported to be fairly broken before
- # switch to ELF
- ld_shlibs_CXX=no
- ;;
-
- freebsd-elf*)
- archive_cmds_need_lc_CXX=no
- ;;
-
- freebsd* | dragonfly*)
- # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
- # conventions
- ld_shlibs_CXX=yes
- ;;
-
- gnu*)
- ;;
-
- haiku*)
- archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- link_all_deplibs_CXX=yes
- ;;
-
- hpux9*)
- hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator_CXX=:
- export_dynamic_flag_spec_CXX='${wl}-E'
- hardcode_direct_CXX=yes
- hardcode_minus_L_CXX=yes # Not in the search PATH,
- # but as the default
- # location of the library.
-
- case $cc_basename in
- CC*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- aCC*)
- archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- ;;
- *)
- if test "$GXX" = yes; then
- archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- else
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- fi
- ;;
- esac
- ;;
-
- hpux10*|hpux11*)
- if test $with_gnu_ld = no; then
- hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator_CXX=:
-
- case $host_cpu in
- hppa*64*|ia64*)
- ;;
- *)
- export_dynamic_flag_spec_CXX='${wl}-E'
- ;;
- esac
- fi
- case $host_cpu in
- hppa*64*|ia64*)
- hardcode_direct_CXX=no
- hardcode_shlibpath_var_CXX=no
- ;;
- *)
- hardcode_direct_CXX=yes
- hardcode_direct_absolute_CXX=yes
- hardcode_minus_L_CXX=yes # Not in the search PATH,
- # but as the default
- # location of the library.
- ;;
- esac
-
- case $cc_basename in
- CC*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- aCC*)
- case $host_cpu in
- hppa*64*)
- archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- ia64*)
- archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- *)
- archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- esac
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- ;;
- *)
- if test "$GXX" = yes; then
- if test $with_gnu_ld = no; then
- case $host_cpu in
- hppa*64*)
- archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- ia64*)
- archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- *)
- archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- esac
- fi
- else
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- fi
- ;;
- esac
- ;;
-
- interix[3-9]*)
- hardcode_direct_CXX=no
- hardcode_shlibpath_var_CXX=no
- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
- export_dynamic_flag_spec_CXX='${wl}-E'
- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
- # Instead, shared libraries are loaded at an image base (0x10000000 by
- # default) and relocated if they conflict, which is a slow very memory
- # consuming and fragmenting process. To avoid this, we pick a random,
- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
- # time. Moving up from 0x10000000 also allows more sbrk(2) space.
- archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- ;;
- irix5* | irix6*)
- case $cc_basename in
- CC*)
- # SGI C++
- archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
- # Archives containing C++ object files must be created using
- # "CC -ar", where "CC" is the IRIX C++ compiler. This is
- # necessary to make sure instantiated templates are included
- # in the archive.
- old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
- ;;
- *)
- if test "$GXX" = yes; then
- if test "$with_gnu_ld" = no; then
- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
- fi
- fi
- link_all_deplibs_CXX=yes
- ;;
- esac
- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator_CXX=:
- inherit_rpath_CXX=yes
- ;;
-
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
- case $cc_basename in
- KCC*)
- # Kuck and Associates, Inc. (KAI) C++ Compiler
-
- # KCC will only create a shared library if the output file
- # ends with ".so" (or ".sl" for HP-UX), so rename the library
- # to its proper name (with version) after linking.
- archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
- archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
- export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
- # Archives containing C++ object files must be created using
- # "CC -Bstatic", where "CC" is the KAI C++ compiler.
- old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
- ;;
- icpc* | ecpc* )
- # Intel C++
- with_gnu_ld=yes
- # version 8.0 and above of icpc choke on multiply defined symbols
- # if we add $predep_objects and $postdep_objects, however 7.1 and
- # earlier do not add the objects themselves.
- case `$CC -V 2>&1` in
- *"Version 7."*)
- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- ;;
- *) # Version 8.0 or newer
- tmp_idyn=
- case $host_cpu in
- ia64*) tmp_idyn=' -i_dynamic';;
- esac
- archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- ;;
- esac
- archive_cmds_need_lc_CXX=no
- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
- export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
- whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- ;;
- pgCC* | pgcpp*)
- # Portland Group C++ compiler
- case `$CC -V` in
- *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
- prelink_cmds_CXX='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
- compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
- old_archive_cmds_CXX='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
- $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
- $RANLIB $oldlib'
- archive_cmds_CXX='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
- archive_expsym_cmds_CXX='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
- ;;
- *) # Version 6 and above use weak symbols
- archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
- archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
- ;;
- esac
-
- hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
- export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
- whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- ;;
- cxx*)
- # Compaq C++
- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
- runpath_var=LD_RUN_PATH
- hardcode_libdir_flag_spec_CXX='-rpath $libdir'
- hardcode_libdir_separator_CXX=:
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
- ;;
- xl* | mpixl* | bgxl*)
- # IBM XL 8.0 on PPC, with GNU ld
- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
- export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
- archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
- archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
- fi
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
- no_undefined_flag_CXX=' -zdefs'
- archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
- hardcode_libdir_flag_spec_CXX='-R$libdir'
- whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- compiler_needs_object_CXX=yes
-
- # Not sure whether something based on
- # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
- # would be better.
- output_verbose_link_cmd='func_echo_all'
-
- # Archives containing C++ object files must be created using
- # "CC -xar", where "CC" is the Sun C++ compiler. This is
- # necessary to make sure instantiated templates are included
- # in the archive.
- old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
- ;;
- esac
- ;;
- esac
- ;;
-
- lynxos*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
-
- m88k*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
-
- mvs*)
- case $cc_basename in
- cxx*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- esac
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
- wlarc=
- hardcode_libdir_flag_spec_CXX='-R$libdir'
- hardcode_direct_CXX=yes
- hardcode_shlibpath_var_CXX=no
- fi
- # Workaround some broken pre-1.5 toolchains
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
- ;;
-
- *nto* | *qnx*)
- ld_shlibs_CXX=yes
- ;;
-
- openbsd2*)
- # C++ shared libraries are fairly broken
- ld_shlibs_CXX=no
- ;;
-
- openbsd*)
- if test -f /usr/libexec/ld.so; then
- hardcode_direct_CXX=yes
- hardcode_shlibpath_var_CXX=no
- hardcode_direct_absolute_CXX=yes
- archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
- export_dynamic_flag_spec_CXX='${wl}-E'
- whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- fi
- output_verbose_link_cmd=func_echo_all
- else
- ld_shlibs_CXX=no
- fi
- ;;
-
- osf3* | osf4* | osf5*)
- case $cc_basename in
- KCC*)
- # Kuck and Associates, Inc. (KAI) C++ Compiler
-
- # KCC will only create a shared library if the output file
- # ends with ".so" (or ".sl" for HP-UX), so rename the library
- # to its proper name (with version) after linking.
- archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
- hardcode_libdir_separator_CXX=:
-
- # Archives containing C++ object files must be created using
- # the KAI C++ compiler.
- case $host in
- osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
- *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
- esac
- ;;
- RCC*)
- # Rational C++ 2.4.1
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- cxx*)
- case $host in
- osf3*)
- allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
- ;;
- *)
- allow_undefined_flag_CXX=' -expect_unresolved \*'
- archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
- echo "-hidden">> $lib.exp~
- $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
- $RM $lib.exp'
- hardcode_libdir_flag_spec_CXX='-rpath $libdir'
- ;;
- esac
-
- hardcode_libdir_separator_CXX=:
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- ;;
- *)
- if test "$GXX" = yes && test "$with_gnu_ld" = no; then
- allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
- case $host in
- osf3*)
- archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- ;;
- *)
- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- ;;
- esac
-
- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator_CXX=:
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
- else
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- fi
- ;;
- esac
- ;;
-
- psos*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
-
- sunos4*)
- case $cc_basename in
- CC*)
- # Sun C++ 4.x
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- lcc*)
- # Lucid
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- esac
- ;;
-
- solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # Sun C++ 4.2, 5.x and Centerline C++
- archive_cmds_need_lc_CXX=yes
- no_undefined_flag_CXX=' -zdefs'
- archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
- hardcode_libdir_flag_spec_CXX='-R$libdir'
- hardcode_shlibpath_var_CXX=no
- case $host_os in
- solaris2.[0-5] | solaris2.[0-5].*) ;;
- *)
- # The compiler driver will combine and reorder linker options,
- # but understands `-z linker_flag'.
- # Supported since Solaris 2.6 (maybe 2.5.1?)
- whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
- ;;
- esac
- link_all_deplibs_CXX=yes
-
- output_verbose_link_cmd='func_echo_all'
-
- # Archives containing C++ object files must be created using
- # "CC -xar", where "CC" is the Sun C++ compiler. This is
- # necessary to make sure instantiated templates are included
- # in the archive.
- old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
- ;;
- gcx*)
- # Green Hills C++ Compiler
- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
- # The C++ compiler must be used to create the archive.
- old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
- ;;
- *)
- # GNU C++ compiler with Solaris linker
- if test "$GXX" = yes && test "$with_gnu_ld" = no; then
- no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
- if $CC --version | $GREP -v '^2\.7' > /dev/null; then
- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
- archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
- else
- # g++ 2.7 appears to require `-G' NOT `-shared' on this
- # platform.
- archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
- archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
- fi
-
- hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
- case $host_os in
- solaris2.[0-5] | solaris2.[0-5].*) ;;
- *)
- whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
- ;;
- esac
- fi
- ;;
- esac
- ;;
-
- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
- no_undefined_flag_CXX='${wl}-z,text'
- archive_cmds_need_lc_CXX=no
- hardcode_shlibpath_var_CXX=no
- runpath_var='LD_RUN_PATH'
-
- case $cc_basename in
- CC*)
- archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- *)
- archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- esac
- ;;
-
- sysv5* | sco3.2v5* | sco5v6*)
- # Note: We can NOT use -z defs as we might desire, because we do not
- # link with -lc, and that would cause any symbols used from libc to
- # always be unresolved, which means just about no library would
- # ever link correctly. If we're not using GNU ld we use -z text
- # though, which does catch some bad symbols but isn't as heavy-handed
- # as -z defs.
- no_undefined_flag_CXX='${wl}-z,text'
- allow_undefined_flag_CXX='${wl}-z,nodefs'
- archive_cmds_need_lc_CXX=no
- hardcode_shlibpath_var_CXX=no
- hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
- hardcode_libdir_separator_CXX=':'
- link_all_deplibs_CXX=yes
- export_dynamic_flag_spec_CXX='${wl}-Bexport'
- runpath_var='LD_RUN_PATH'
-
- case $cc_basename in
- CC*)
- archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
- '"$old_archive_cmds_CXX"
- reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
- '"$reload_cmds_CXX"
- ;;
- *)
- archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- esac
- ;;
-
- tandem*)
- case $cc_basename in
- NCC*)
- # NonStop-UX NCC 3.20
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- esac
- ;;
-
- vxworks*)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
-
- *)
- # FIXME: insert proper C++ library support
- ld_shlibs_CXX=no
- ;;
- esac
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
- test "$ld_shlibs_CXX" = no && can_build_shared=no
-
- GCC_CXX="$GXX"
- LD_CXX="$LD"
-
- ## CAVEAT EMPTOR:
- ## There is no encapsulation within the following macros, do not change
- ## the running order or otherwise move them around unless you know exactly
- ## what you are doing...
- # Dependencies to place before and after the object being linked:
-predep_objects_CXX=
-postdep_objects_CXX=
-predeps_CXX=
-postdeps_CXX=
-compiler_lib_search_path_CXX=
-
-cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
- Foo (void) { a = 0; }
-private:
- int a;
-};
-_LT_EOF
-
-
-_lt_libdeps_save_CFLAGS=$CFLAGS
-case "$CC $CFLAGS " in #(
-*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
-*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
-*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
-esac
-
-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- # Parse the compiler output and extract the necessary
- # objects, libraries and library flags.
-
- # Sentinel used to keep track of whether or not we are before
- # the conftest object file.
- pre_test_object_deps_done=no
-
- for p in `eval "$output_verbose_link_cmd"`; do
- case ${prev}${p} in
-
- -L* | -R* | -l*)
- # Some compilers place space between "-{L,R}" and the path.
- # Remove the space.
- if test $p = "-L" ||
- test $p = "-R"; then
- prev=$p
- continue
- fi
-
- # Expand the sysroot to ease extracting the directories later.
- if test -z "$prev"; then
- case $p in
- -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
- -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
- -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
- esac
- fi
- case $p in
- =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
- esac
- if test "$pre_test_object_deps_done" = no; then
- case ${prev} in
- -L | -R)
- # Internal compiler library paths should come after those
- # provided the user. The postdeps already come after the
- # user supplied libs so there is no need to process them.
- if test -z "$compiler_lib_search_path_CXX"; then
- compiler_lib_search_path_CXX="${prev}${p}"
- else
- compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
- fi
- ;;
- # The "-l" case would never come before the object being
- # linked, so don't bother handling this case.
- esac
- else
- if test -z "$postdeps_CXX"; then
- postdeps_CXX="${prev}${p}"
- else
- postdeps_CXX="${postdeps_CXX} ${prev}${p}"
- fi
- fi
- prev=
- ;;
-
- *.lto.$objext) ;; # Ignore GCC LTO objects
- *.$objext)
- # This assumes that the test object file only shows up
- # once in the compiler output.
- if test "$p" = "conftest.$objext"; then
- pre_test_object_deps_done=yes
- continue
- fi
-
- if test "$pre_test_object_deps_done" = no; then
- if test -z "$predep_objects_CXX"; then
- predep_objects_CXX="$p"
- else
- predep_objects_CXX="$predep_objects_CXX $p"
- fi
- else
- if test -z "$postdep_objects_CXX"; then
- postdep_objects_CXX="$p"
- else
- postdep_objects_CXX="$postdep_objects_CXX $p"
- fi
- fi
- ;;
-
- *) ;; # Ignore the rest.
-
- esac
- done
-
- # Clean up.
- rm -f a.out a.exe
-else
- echo "libtool.m4: error: problem compiling CXX test program"
-fi
-
-$RM -f confest.$objext
-CFLAGS=$_lt_libdeps_save_CFLAGS
-
-# PORTME: override above test on systems where it is broken
-case $host_os in
-interix[3-9]*)
- # Interix 3.5 installs completely hosed .la files for C++, so rather than
- # hack all around it, let's just trust "g++" to DTRT.
- predep_objects_CXX=
- postdep_objects_CXX=
- postdeps_CXX=
- ;;
-
-linux*)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
-
- # The more standards-conforming stlport4 library is
- # incompatible with the Cstd library. Avoid specifying
- # it if it's in CXXFLAGS. Ignore libCrun as
- # -library=stlport4 depends on it.
- case " $CXX $CXXFLAGS " in
- *" -library=stlport4 "*)
- solaris_use_stlport4=yes
- ;;
- esac
-
- if test "$solaris_use_stlport4" != yes; then
- postdeps_CXX='-library=Cstd -library=Crun'
- fi
- ;;
- esac
- ;;
-
-solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # The more standards-conforming stlport4 library is
- # incompatible with the Cstd library. Avoid specifying
- # it if it's in CXXFLAGS. Ignore libCrun as
- # -library=stlport4 depends on it.
- case " $CXX $CXXFLAGS " in
- *" -library=stlport4 "*)
- solaris_use_stlport4=yes
- ;;
- esac
-
- # Adding this requires a known-good setup of shared libraries for
- # Sun compiler versions before 5.6, else PIC objects from an old
- # archive will be linked into the output, leading to subtle bugs.
- if test "$solaris_use_stlport4" != yes; then
- postdeps_CXX='-library=Cstd -library=Crun'
- fi
- ;;
- esac
- ;;
-esac
-
-
-case " $postdeps_CXX " in
-*" -lc "*) archive_cmds_need_lc_CXX=no ;;
-esac
- compiler_lib_search_dirs_CXX=
-if test -n "${compiler_lib_search_path_CXX}"; then
- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- lt_prog_compiler_wl_CXX=
-lt_prog_compiler_pic_CXX=
-lt_prog_compiler_static_CXX=
-
-
- # C++ specific cases for pic, static, wl, etc.
- if test "$GXX" = yes; then
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_static_CXX='-static'
-
- case $host_os in
- aix*)
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- lt_prog_compiler_static_CXX='-Bstatic'
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- lt_prog_compiler_pic_CXX='-fPIC'
- ;;
- m68k)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
- ;;
- esac
- ;;
-
- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
- # PIC is the default for these OSes.
- ;;
- mingw* | cygwin* | os2* | pw32* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- # Although the cygwin gcc ignores -fPIC, still need this for old-style
- # (--disable-auto-import) libraries
- lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
- ;;
- darwin* | rhapsody*)
- # PIC is the default on this platform
- # Common symbols not allowed in MH_DYLIB files
- lt_prog_compiler_pic_CXX='-fno-common'
- ;;
- *djgpp*)
- # DJGPP does not support shared libraries at all
- lt_prog_compiler_pic_CXX=
- ;;
- haiku*)
- # PIC is the default for Haiku.
- # The "-static" flag exists, but is broken.
- lt_prog_compiler_static_CXX=
- ;;
- interix[3-9]*)
- # Interix 3.x gcc -fpic/-fPIC options generate broken code.
- # Instead, we relocate shared libraries at runtime.
- ;;
- sysv4*MP*)
- if test -d /usr/nec; then
- lt_prog_compiler_pic_CXX=-Kconform_pic
- fi
- ;;
- hpux*)
- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
- # sets the default TLS model and affects inlining.
- case $host_cpu in
- hppa*64*)
- ;;
- *)
- lt_prog_compiler_pic_CXX='-fPIC'
- ;;
- esac
- ;;
- *qnx* | *nto*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- lt_prog_compiler_pic_CXX='-fPIC -shared'
- ;;
- *)
- lt_prog_compiler_pic_CXX='-fPIC'
- ;;
- esac
- else
- case $host_os in
- aix[4-9]*)
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- lt_prog_compiler_static_CXX='-Bstatic'
- else
- lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
- fi
- ;;
- chorus*)
- case $cc_basename in
- cxch68*)
- # Green Hills C++ Compiler
- # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
- ;;
- esac
- ;;
- mingw* | cygwin* | os2* | pw32* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
- ;;
- dgux*)
- case $cc_basename in
- ec++*)
- lt_prog_compiler_pic_CXX='-KPIC'
- ;;
- ghcx*)
- # Green Hills C++ Compiler
- lt_prog_compiler_pic_CXX='-pic'
- ;;
- *)
- ;;
- esac
- ;;
- freebsd* | dragonfly*)
- # FreeBSD uses GNU C++
- ;;
- hpux9* | hpux10* | hpux11*)
- case $cc_basename in
- CC*)
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
- if test "$host_cpu" != ia64; then
- lt_prog_compiler_pic_CXX='+Z'
- fi
- ;;
- aCC*)
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
- case $host_cpu in
- hppa*64*|ia64*)
- # +Z the default
- ;;
- *)
- lt_prog_compiler_pic_CXX='+Z'
- ;;
- esac
- ;;
- *)
- ;;
- esac
- ;;
- interix*)
- # This is c89, which is MS Visual C++ (no shared libs)
- # Anyone wants to do a port?
- ;;
- irix5* | irix6* | nonstopux*)
- case $cc_basename in
- CC*)
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_static_CXX='-non_shared'
- # CC pic flag -KPIC is the default.
- ;;
- *)
- ;;
- esac
- ;;
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
- case $cc_basename in
- KCC*)
- # KAI C++ Compiler
- lt_prog_compiler_wl_CXX='--backend -Wl,'
- lt_prog_compiler_pic_CXX='-fPIC'
- ;;
- ecpc* )
- # old Intel C++ for x86_64 which still supported -KPIC.
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_pic_CXX='-KPIC'
- lt_prog_compiler_static_CXX='-static'
- ;;
- icpc* )
- # Intel C++, used to be incompatible with GCC.
- # ICC 10 doesn't accept -KPIC any more.
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_pic_CXX='-fPIC'
- lt_prog_compiler_static_CXX='-static'
- ;;
- pgCC* | pgcpp*)
- # Portland Group C++ compiler
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_pic_CXX='-fpic'
- lt_prog_compiler_static_CXX='-Bstatic'
- ;;
- cxx*)
- # Compaq C++
- # Make sure the PIC flag is empty. It appears that all Alpha
- # Linux and Compaq Tru64 Unix objects are PIC.
- lt_prog_compiler_pic_CXX=
- lt_prog_compiler_static_CXX='-non_shared'
- ;;
- xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
- # IBM XL 8.0, 9.0 on PPC and BlueGene
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_pic_CXX='-qpic'
- lt_prog_compiler_static_CXX='-qstaticlink'
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
- lt_prog_compiler_pic_CXX='-KPIC'
- lt_prog_compiler_static_CXX='-Bstatic'
- lt_prog_compiler_wl_CXX='-Qoption ld '
- ;;
- esac
- ;;
- esac
- ;;
- lynxos*)
- ;;
- m88k*)
- ;;
- mvs*)
- case $cc_basename in
- cxx*)
- lt_prog_compiler_pic_CXX='-W c,exportall'
- ;;
- *)
- ;;
- esac
- ;;
- netbsd*)
- ;;
- *qnx* | *nto*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- lt_prog_compiler_pic_CXX='-fPIC -shared'
- ;;
- osf3* | osf4* | osf5*)
- case $cc_basename in
- KCC*)
- lt_prog_compiler_wl_CXX='--backend -Wl,'
- ;;
- RCC*)
- # Rational C++ 2.4.1
- lt_prog_compiler_pic_CXX='-pic'
- ;;
- cxx*)
- # Digital/Compaq C++
- lt_prog_compiler_wl_CXX='-Wl,'
- # Make sure the PIC flag is empty. It appears that all Alpha
- # Linux and Compaq Tru64 Unix objects are PIC.
- lt_prog_compiler_pic_CXX=
- lt_prog_compiler_static_CXX='-non_shared'
- ;;
- *)
- ;;
- esac
- ;;
- psos*)
- ;;
- solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # Sun C++ 4.2, 5.x and Centerline C++
- lt_prog_compiler_pic_CXX='-KPIC'
- lt_prog_compiler_static_CXX='-Bstatic'
- lt_prog_compiler_wl_CXX='-Qoption ld '
- ;;
- gcx*)
- # Green Hills C++ Compiler
- lt_prog_compiler_pic_CXX='-PIC'
- ;;
- *)
- ;;
- esac
- ;;
- sunos4*)
- case $cc_basename in
- CC*)
- # Sun C++ 4.x
- lt_prog_compiler_pic_CXX='-pic'
- lt_prog_compiler_static_CXX='-Bstatic'
- ;;
- lcc*)
- # Lucid
- lt_prog_compiler_pic_CXX='-pic'
- ;;
- *)
- ;;
- esac
- ;;
- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
- case $cc_basename in
- CC*)
- lt_prog_compiler_wl_CXX='-Wl,'
- lt_prog_compiler_pic_CXX='-KPIC'
- lt_prog_compiler_static_CXX='-Bstatic'
- ;;
- esac
- ;;
- tandem*)
- case $cc_basename in
- NCC*)
- # NonStop-UX NCC 3.20
- lt_prog_compiler_pic_CXX='-KPIC'
- ;;
- *)
- ;;
- esac
- ;;
- vxworks*)
- ;;
- *)
- lt_prog_compiler_can_build_shared_CXX=no
- ;;
- esac
- fi
-
-case $host_os in
- # For platforms which do not support PIC, -DPIC is meaningless:
- *djgpp*)
- lt_prog_compiler_pic_CXX=
- ;;
- *)
- lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
- ;;
-esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
-lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
-if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_pic_works_CXX=no
- ac_outfile=conftest.$ac_objext
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
- lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- # The option is referenced via a variable to avoid confusing sed.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_pic_works_CXX=yes
- fi
- fi
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
- case $lt_prog_compiler_pic_CXX in
- "" | " "*) ;;
- *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
- esac
-else
- lt_prog_compiler_pic_CXX=
- lt_prog_compiler_can_build_shared_CXX=no
-fi
-
-fi
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_static_works_CXX=no
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
- echo "$lt_simple_link_test_code" > conftest.$ac_ext
- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
- # The linker can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if diff conftest.exp conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_static_works_CXX=yes
- fi
- else
- lt_cv_prog_compiler_static_works_CXX=yes
- fi
- fi
- $RM -r conftest*
- LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
- :
-else
- lt_prog_compiler_static_CXX=
-fi
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_c_o_CXX=no
- $RM -r conftest 2>/dev/null
- mkdir conftest
- cd conftest
- mkdir out
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- lt_compiler_flag="-o out/conftest2.$ac_objext"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_c_o_CXX=yes
- fi
- fi
- chmod u+w . 2>&5
- $RM conftest*
- # SGI C++ compiler will create directory out/ii_files/ for
- # template instantiation
- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
- $RM out/* && rmdir out
- cd ..
- $RM -r conftest
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_prog_compiler_c_o_CXX=no
- $RM -r conftest 2>/dev/null
- mkdir conftest
- cd conftest
- mkdir out
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- lt_compiler_flag="-o out/conftest2.$ac_objext"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
- lt_cv_prog_compiler_c_o_CXX=yes
- fi
- fi
- chmod u+w . 2>&5
- $RM conftest*
- # SGI C++ compiler will create directory out/ii_files/ for
- # template instantiation
- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
- $RM out/* && rmdir out
- cd ..
- $RM -r conftest
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
- # do not overwrite the value of need_locks provided by the user
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
- hard_links=yes
- $RM conftest*
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- touch conftest.a
- ln conftest.a conftest.b 2>&5 || hard_links=no
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
- if test "$hard_links" = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
- need_locks=warn
- fi
-else
- need_locks=no
-fi
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
- case $host_os in
- aix[4-9]*)
- # If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to AIX nm, but means don't demangle with GNU nm
- # Also, AIX nm treats weak defined symbols like other global defined
- # symbols, whereas GNU nm marks them as "W".
- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- else
- export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- fi
- ;;
- pw32*)
- export_symbols_cmds_CXX="$ltdll_cmds"
- ;;
- cygwin* | mingw* | cegcc*)
- case $cc_basename in
- cl*)
- exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
- ;;
- *)
- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
- exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
- ;;
- esac
- ;;
- *)
- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- ;;
- esac
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
-test "$ld_shlibs_CXX" = no && can_build_shared=no
-
-with_gnu_ld_CXX=$with_gnu_ld
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_CXX" in
-x|xyes)
- # Assume -lc should be added
- archive_cmds_need_lc_CXX=yes
-
- if test "$enable_shared" = yes && test "$GCC" = yes; then
- case $archive_cmds_CXX in
- *'~'*)
- # FIXME: we may have to deal with multi-command sequences.
- ;;
- '$CC '*)
- # Test whether the compiler implicitly links with -lc since on some
- # systems, -lgcc has to come before -lc. If gcc already passes -lc
- # to ld, don't add -lc before -lgcc.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- $RM conftest*
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } 2>conftest.err; then
- soname=conftest
- lib=conftest
- libobjs=conftest.$ac_objext
- deplibs=
- wl=$lt_prog_compiler_wl_CXX
- pic_flag=$lt_prog_compiler_pic_CXX
- compiler_flags=-v
- linker_flags=-v
- verstring=
- output_objdir=.
- libname=conftest
- lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
- allow_undefined_flag_CXX=
- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
- (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- then
- lt_cv_archive_cmds_need_lc_CXX=no
- else
- lt_cv_archive_cmds_need_lc_CXX=yes
- fi
- allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
- else
- cat conftest.err 1>&5
- fi
- $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
- archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
- ;;
- esac
- fi
- ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
- shlibpath_var=LIBPATH
-
- # AIX 3 has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}${shared_ext}$major'
- ;;
-
-aix[4-9]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- hardcode_into_libs=yes
- if test "$host_cpu" = ia64; then
- # AIX 5 supports IA64
- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- else
- # With GCC up to 2.95.x, collect2 would create an import file
- # for dependence libraries. The import file would start with
- # the line `#! .'. This would cause the generated library to
- # depend on `.', always an invalid library. This was fixed in
- # development snapshots of GCC prior to 3.0.
- case $host_os in
- aix4 | aix4.[01] | aix4.[01].*)
- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
- echo ' yes '
- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
- :
- else
- can_build_shared=no
- fi
- ;;
- esac
- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
- # soname into executable. Probably we can add versioning support to
- # collect2, so additional links can be useful in future.
- if test "$aix_use_runtimelinking" = yes; then
- # If using run time linking (on AIX 4.2 or later) use lib<name>.so
- # instead of lib<name>.a to let people know that these are not
- # typical AIX shared libraries.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- else
- # We preserve .a as extension for shared libraries through AIX4.2
- # and later when we are not doing run time linking.
- library_names_spec='${libname}${release}.a $libname.a'
- soname_spec='${libname}${release}${shared_ext}$major'
- fi
- shlibpath_var=LIBPATH
- fi
- ;;
-
-amigaos*)
- case $host_cpu in
- powerpc)
- # Since July 2007 AmigaOS4 officially supports .so libraries.
- # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- ;;
- m68k)
- library_names_spec='$libname.ixlibrary $libname.a'
- # Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
- ;;
- esac
- ;;
-
-beos*)
- library_names_spec='${libname}${shared_ext}'
- dynamic_linker="$host_os ld.so"
- shlibpath_var=LIBRARY_PATH
- ;;
-
-bsdi[45]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
- # the default ld.so.conf also contains /usr/contrib/lib and
- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
- # libtool to hard-code these into programs
- ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
- version_type=windows
- shrext_cmds=".dll"
- need_version=no
- need_lib_prefix=no
-
- case $GCC,$cc_basename in
- yes,*)
- # gcc
- library_names_spec='$libname.dll.a'
- # DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname~
- chmod a+x \$dldir/$dlname~
- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
- fi'
- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $RM \$dlpath'
- shlibpath_overrides_runpath=yes
-
- case $host_os in
- cygwin*)
- # Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
- ;;
- mingw* | cegcc*)
- # MinGW DLLs use traditional 'lib' prefix
- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- ;;
- pw32*)
- # pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- ;;
- esac
- dynamic_linker='Win32 ld.exe'
- ;;
-
- *,cl*)
- # Native MSVC
- libname_spec='$name'
- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- library_names_spec='${libname}.dll.lib'
-
- case $build_os in
- mingw*)
- sys_lib_search_path_spec=
- lt_save_ifs=$IFS
- IFS=';'
- for lt_path in $LIB
- do
- IFS=$lt_save_ifs
- # Let DOS variable expansion print the short 8.3 style file name.
- lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
- sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
- done
- IFS=$lt_save_ifs
- # Convert to MSYS style.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
- ;;
- cygwin*)
- # Convert to unix form, then to dos form, then back to unix form
- # but this time dos style (no spaces!) so that the unix form looks
- # like /cygdrive/c/PROGRA~1:/cygdr...
- sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
- sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
- sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- ;;
- *)
- sys_lib_search_path_spec="$LIB"
- if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
- # It is most probably a Windows format PATH.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
- else
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- fi
- # FIXME: find the short name or the path components, as spaces are
- # common. (e.g. "Program Files" -> "PROGRA~1")
- ;;
- esac
-
- # DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname'
- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $RM \$dlpath'
- shlibpath_overrides_runpath=yes
- dynamic_linker='Win32 link.exe'
- ;;
-
- *)
- # Assume MSVC wrapper
- library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
- dynamic_linker='Win32 ld.exe'
- ;;
- esac
- # FIXME: first we should search . and the directory the executable is in
- shlibpath_var=PATH
- ;;
-
-darwin* | rhapsody*)
- dynamic_linker="$host_os dyld"
- version_type=darwin
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
- soname_spec='${libname}${release}${major}$shared_ext'
- shlibpath_overrides_runpath=yes
- shlibpath_var=DYLD_LIBRARY_PATH
- shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
- sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
- ;;
-
-dgux*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-freebsd* | dragonfly*)
- # DragonFly does not have aout. When/if they implement a new
- # versioning mechanism, adjust this.
- if test -x /usr/bin/objformat; then
- objformat=`/usr/bin/objformat`
- else
- case $host_os in
- freebsd[23].*) objformat=aout ;;
- *) objformat=elf ;;
- esac
- fi
- version_type=freebsd-$objformat
- case $version_type in
- freebsd-elf*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- need_version=no
- need_lib_prefix=no
- ;;
- freebsd-*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
- need_version=yes
- ;;
- esac
- shlibpath_var=LD_LIBRARY_PATH
- case $host_os in
- freebsd2.*)
- shlibpath_overrides_runpath=yes
- ;;
- freebsd3.[01]* | freebsdelf3.[01]*)
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
- freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
- freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
- *) # from 4.6 on, and DragonFly
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
- esac
- ;;
-
-gnu*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-haiku*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- dynamic_linker="$host_os runtime_loader"
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
- hardcode_into_libs=yes
- ;;
-
-hpux9* | hpux10* | hpux11*)
- # Give a soname corresponding to the major version so that dld.sl refuses to
- # link against other versions.
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- case $host_cpu in
- ia64*)
- shrext_cmds='.so'
- hardcode_into_libs=yes
- dynamic_linker="$host_os dld.so"
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- if test "X$HPUX_IA64_MODE" = X32; then
- sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
- else
- sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
- fi
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
- ;;
- hppa*64*)
- shrext_cmds='.sl'
- hardcode_into_libs=yes
- dynamic_linker="$host_os dld.sl"
- shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
- ;;
- *)
- shrext_cmds='.sl'
- dynamic_linker="$host_os dld.sl"
- shlibpath_var=SHLIB_PATH
- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- ;;
- esac
- # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
- postinstall_cmds='chmod 555 $lib'
- # or fails outright, so override atomically:
- install_override_mode=555
- ;;
-
-interix[3-9]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-irix5* | irix6* | nonstopux*)
- case $host_os in
- nonstopux*) version_type=nonstopux ;;
- *)
- if test "$lt_cv_prog_gnu_ld" = yes; then
- version_type=linux # correct to gnu/linux during the next big refactor
- else
- version_type=irix
- fi ;;
- esac
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
- case $host_os in
- irix5* | nonstopux*)
- libsuff= shlibsuff=
- ;;
- *)
- case $LD in # libtool.m4 will add one of these switches to LD
- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
- libsuff= shlibsuff= libmagic=32-bit;;
- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
- libsuff=32 shlibsuff=N32 libmagic=N32;;
- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
- libsuff=64 shlibsuff=64 libmagic=64-bit;;
- *) libsuff= shlibsuff= libmagic=never-match;;
- esac
- ;;
- esac
- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
- hardcode_into_libs=yes
- ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
- dynamic_linker=no
- ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
-
- # Some binutils ld are patched to set DT_RUNPATH
- if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- lt_cv_shlibpath_overrides_runpath=no
- save_LDFLAGS=$LDFLAGS
- save_libdir=$libdir
- eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
- LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
- if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
- lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS=$save_LDFLAGS
- libdir=$save_libdir
-
-fi
-
- shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
- # This implies no fast_install, which is unacceptable.
- # Some rework will be needed to allow for fast_install
- # before this can be enabled.
- hardcode_into_libs=yes
-
- # Add ABI-specific directories to the system library path.
- sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
-
- # Append ld.so.conf contents to the search path
- if test -f /etc/ld.so.conf; then
- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
- sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
-
- fi
-
- # We used to test for /lib/ld.so.1 and disable shared libraries on
- # powerpc, because MkLinux only supported shared libraries with the
- # GNU dynamic linker. Since this was broken with cross compilers,
- # most powerpc-linux boxes support dynamic linking these days and
- # people can always --disable-shared, the test was removed, and we
- # assume the GNU/Linux dynamic linker is in use.
- dynamic_linker='GNU/Linux ld.so'
- ;;
-
-netbsd*)
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- dynamic_linker='NetBSD (a.out) ld.so'
- else
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- dynamic_linker='NetBSD ld.elf_so'
- fi
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
-
-newsos6)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- ;;
-
-*nto* | *qnx*)
- version_type=qnx
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- dynamic_linker='ldqnx.so'
- ;;
-
-openbsd*)
- version_type=sunos
- sys_lib_dlsearch_path_spec="/usr/lib"
- need_lib_prefix=no
- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
- case $host_os in
- openbsd3.3 | openbsd3.3.*) need_version=yes ;;
- *) need_version=no ;;
- esac
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- case $host_os in
- openbsd2.[89] | openbsd2.[89].*)
- shlibpath_overrides_runpath=no
- ;;
- *)
- shlibpath_overrides_runpath=yes
- ;;
- esac
- else
- shlibpath_overrides_runpath=yes
- fi
- ;;
-
-os2*)
- libname_spec='$name'
- shrext_cmds=".dll"
- need_lib_prefix=no
- library_names_spec='$libname${shared_ext} $libname.a'
- dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
- ;;
-
-osf3* | osf4* | osf5*)
- version_type=osf
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
- ;;
-
-rdos*)
- dynamic_linker=no
- ;;
-
-solaris*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- # ldd complains unless libraries are executable
- postinstall_cmds='chmod +x $lib'
- ;;
-
-sunos4*)
- version_type=sunos
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- if test "$with_gnu_ld" = yes; then
- need_lib_prefix=no
- fi
- need_version=yes
- ;;
-
-sysv4 | sysv4.3*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- case $host_vendor in
- sni)
- shlibpath_overrides_runpath=no
- need_lib_prefix=no
- runpath_var=LD_RUN_PATH
- ;;
- siemens)
- need_lib_prefix=no
- ;;
- motorola)
- need_lib_prefix=no
- need_version=no
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
- ;;
- esac
- ;;
-
-sysv4*MP*)
- if test -d /usr/nec ;then
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
- soname_spec='$libname${shared_ext}.$major'
- shlibpath_var=LD_LIBRARY_PATH
- fi
- ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- version_type=freebsd-elf
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- if test "$with_gnu_ld" = yes; then
- sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
- else
- sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
- case $host_os in
- sco3.2v5*)
- sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
- ;;
- esac
- fi
- sys_lib_dlsearch_path_spec='/usr/lib'
- ;;
-
-tpf*)
- # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-uts4*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-*)
- dynamic_linker=no
- ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action_CXX=
-if test -n "$hardcode_libdir_flag_spec_CXX" ||
- test -n "$runpath_var_CXX" ||
- test "X$hardcode_automatic_CXX" = "Xyes" ; then
-
- # We can hardcode non-existent directories.
- if test "$hardcode_direct_CXX" != no &&
- # If the only mechanism to avoid hardcoding is shlibpath_var, we
- # have to relink, otherwise we might link with an installed library
- # when we should be linking with a yet-to-be-installed one
- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
- test "$hardcode_minus_L_CXX" != no; then
- # Linking always hardcodes the temporary library directory.
- hardcode_action_CXX=relink
- else
- # We can link without hardcoding, and we can hardcode nonexisting dirs.
- hardcode_action_CXX=immediate
- fi
-else
- # We cannot hardcode anything, or else we can only hardcode existing
- # directories.
- hardcode_action_CXX=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
-$as_echo "$hardcode_action_CXX" >&6; }
-
-if test "$hardcode_action_CXX" = relink ||
- test "$inherit_rpath_CXX" = yes; then
- # Fast installation is not supported
- enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
- test "$enable_shared" = no; then
- # Fast installation is not necessary
- enable_fast_install=needless
-fi
-
-
-
-
-
-
-
- fi # test -n "$compiler"
-
- CC=$lt_save_CC
- CFLAGS=$lt_save_CFLAGS
- LDCXX=$LD
- LD=$lt_save_LD
- GCC=$lt_save_GCC
- with_gnu_ld=$lt_save_with_gnu_ld
- lt_cv_path_LDCXX=$lt_cv_path_LD
- lt_cv_path_LD=$lt_save_path_LD
- lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
- lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-
-
-
-ac_config_files="$ac_config_files Makefile tests/compat.sh jellyfish-1.1.pc"
-
-
-
-if test "x$MD5" = "x"; then :
- # Extract the first word of "md5sum", so it can be a program name with args.
-set dummy md5sum; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MD5+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$MD5"; then
- ac_cv_prog_MD5="$MD5" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_MD5="md5sum"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-MD5=$ac_cv_prog_MD5
-if test -n "$MD5"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MD5" >&5
-$as_echo "$MD5" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test "x$MD5" = "x"; then :
- # Extract the first word of "md5", so it can be a program name with args.
-set dummy md5; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MD5+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$MD5"; then
- ac_cv_prog_MD5="$MD5" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_MD5="md5 -r"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-MD5=$ac_cv_prog_MD5
-if test -n "$MD5"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MD5" >&5
-$as_echo "$MD5" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test "x$MD5" = "x"; then :
- as_fn_error $? "Could not find md5 hashing program in your path" "$LINENO" 5
-fi
-
-
-# Check whether --with-sse was given.
-if test "${with_sse+set}" = set; then :
- withval=$with_sse;
-else
- with_sse=no
-fi
-
-if test "x$with_sse" != xno; then :
-
-$as_echo "#define HAVE_SSE 1" >>confdefs.h
-
-fi
-
-
-# Check whether --with-half was given.
-if test "${with_half+set}" = set; then :
- withval=$with_half;
-else
- with_half=no
-fi
-
-if test "x$with_half" = "xyes"; then :
-
-$as_echo "#define HALF_FLOATS 1" >>confdefs.h
-
-fi
-
-ac_fn_cxx_check_type "$LINENO" "__int128" "ac_cv_type___int128" "$ac_includes_default"
-if test "x$ac_cv_type___int128" = xyes; then :
-
-$as_echo "#define HAVE_INT128 1" >>confdefs.h
-
-fi
-
-
-
-# Check the version of strerror_r
-ac_fn_cxx_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default"
-if test "x$ac_cv_have_decl_strerror_r" = xyes; then :
- ac_have_decl=1
-else
- ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_STRERROR_R $ac_have_decl
-_ACEOF
-
-for ac_func in strerror_r
-do :
- ac_fn_cxx_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r"
-if test "x$ac_cv_func_strerror_r" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_STRERROR_R 1
-_ACEOF
-
-fi
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5
-$as_echo_n "checking whether strerror_r returns char *... " >&6; }
-if ${ac_cv_func_strerror_r_char_p+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- ac_cv_func_strerror_r_char_p=no
- if test $ac_cv_have_decl_strerror_r = yes; then
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$ac_includes_default
-int
-main ()
-{
-
- char buf[100];
- char x = *strerror_r (0, buf, sizeof buf);
- char *p = strerror_r (0, buf, sizeof buf);
- return !p || x;
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_cv_func_strerror_r_char_p=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- else
- # strerror_r is not declared. Choose between
- # systems that have relatively inaccessible declarations for the
- # function. BeOS and DEC UNIX 4.0 fall in this category, but the
- # former has a strerror_r that returns char*, while the latter
- # has a strerror_r that returns `int'.
- # This test should segfault on the DEC system.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$ac_includes_default
- extern char *strerror_r ();
-int
-main ()
-{
-char buf[100];
- char x = *strerror_r (0, buf, sizeof buf);
- return ! isalpha (x);
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_run "$LINENO"; then :
- ac_cv_func_strerror_r_char_p=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
- fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5
-$as_echo "$ac_cv_func_strerror_r_char_p" >&6; }
-if test $ac_cv_func_strerror_r_char_p = yes; then
-
-$as_echo "#define STRERROR_R_CHAR_P 1" >>confdefs.h
-
-fi
-
-
-
-for ac_header in execinfo.h sys/syscall.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-ac_fn_cxx_check_member "$LINENO" "siginfo_t" "si_int" "ac_cv_member_siginfo_t_si_int" "#include <signal.h>
-"
-if test "x$ac_cv_member_siginfo_t_si_int" = xyes; then :
-
-$as_echo "#define HAVE_SI_INT 1" >>confdefs.h
-
-fi
-
-
-# --enable-all-static
-# Do not use libtool if building all static
-# Check whether --enable-all-static was given.
-if test "${enable_all_static+set}" = set; then :
- enableval=$enable_all_static;
-fi
-
-STATIC_FLAGS=
-if test x$enable_all_static = xyes; then :
- STATIC_FLAGS=-all-static
-
-fi
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems. If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
- for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
- eval ac_val=\$$ac_var
- case $ac_val in #(
- *${as_nl}*)
- case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
- esac
- case $ac_var in #(
- _ | IFS | as_nl) ;; #(
- BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
- *) { eval $ac_var=; unset $ac_var;} ;;
- esac ;;
- esac
- done
-
- (set) 2>&1 |
- case $as_nl`(ac_space=' '; set) 2>&1` in #(
- *${as_nl}ac_space=\ *)
- # `set' does not quote correctly, so add quotes: double-quote
- # substitution turns \\\\ into \\, and sed turns \\ into \.
- sed -n \
- "s/'/'\\\\''/g;
- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
- ;; #(
- *)
- # `set' quotes correctly as required by POSIX, so do not add quotes.
- sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
- ;;
- esac |
- sort
-) |
- sed '
- /^ac_cv_env_/b end
- t clear
- :clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
- t end
- s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
- :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
- if test -w "$cache_file"; then
- if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
- if test ! -f "$cache_file" || test -h "$cache_file"; then
- cat confcache >"$cache_file"
- else
- case $cache_file in #(
- */* | ?:*)
- mv -f confcache "$cache_file"$$ &&
- mv -f "$cache_file"$$ "$cache_file" ;; #(
- *)
- mv -f confcache "$cache_file" ;;
- esac
- fi
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
- fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-U=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
- # 1. Remove the extension, and $U if already installed.
- ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
- # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
- # will be set to the directory where LIBOBJS objects are built.
- as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
- as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
- if test -n "$EXEEXT"; then
- am__EXEEXT_TRUE=
- am__EXEEXT_FALSE='#'
-else
- am__EXEEXT_TRUE='#'
- am__EXEEXT_FALSE=
-fi
-
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
- as_fn_error $? "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
- as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
- as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-: "${CONFIG_STATUS=./config.status}"
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
- emulate sh
- NULLCMD=:
- # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
- setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in #(
- *posix*) :
- set -o posix ;; #(
- *) :
- ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- PATH_SEPARATOR=:
- (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
- (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
- PATH_SEPARATOR=';'
- }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
-# Find who we are. Look in the path if we contain no directory separator.
-as_myself=
-case $0 in #((
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
- as_myself=$0
-fi
-if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
- exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
- as_status=$1; test $as_status -eq 0 && as_status=1
- if test "$4"; then
- as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
- fi
- $as_echo "$as_me: error: $2" >&2
- as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
- return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
- set +e
- as_fn_set_status $1
- exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
- { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
- eval 'as_fn_append ()
- {
- eval $1+=\$2
- }'
-else
- as_fn_append ()
- {
- eval $1=\$$1\$2
- }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
- eval 'as_fn_arith ()
- {
- as_val=$(( $* ))
- }'
-else
- as_fn_arith ()
- {
- as_val=`expr "$@" || test $? -eq 1`
- }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
- test "X`expr 00001 : '.*\(...\)'`" = X001; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
- as_basename=basename
-else
- as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
- as_dirname=dirname
-else
- as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{
- s//\1/
- q
- }
- /^X\/\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\/\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
- case `echo 'xy\c'` in
- *c*) ECHO_T=' ';; # ECHO_T is single tab character.
- xy) ECHO_C='\c';;
- *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
- ECHO_T=' ';;
- esac;;
-*)
- ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
- rm -f conf$$.dir/conf$$.file
-else
- rm -f conf$$.dir
- mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
- if ln -s conf$$.file conf$$ 2>/dev/null; then
- as_ln_s='ln -s'
- # ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -p'.
- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -p'
- elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
- else
- as_ln_s='cp -p'
- fi
-else
- as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
- case $as_dir in #(
- -*) as_dir=./$as_dir;;
- esac
- test -d "$as_dir" || eval $as_mkdir_p || {
- as_dirs=
- while :; do
- case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
- *) as_qdir=$as_dir;;
- esac
- as_dirs="'$as_qdir' $as_dirs"
- as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_dir" : 'X\(//\)[^/]' \| \
- X"$as_dir" : 'X\(//\)$' \| \
- X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- test -d "$as_dir" && break
- done
- test -z "$as_dirs" || eval "mkdir $as_dirs"
- } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
- as_mkdir_p='mkdir -p "$as_dir"'
-else
- test -d ./-p && rmdir ./-p
- as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
- as_test_x='test -x'
-else
- if ls -dL / >/dev/null 2>&1; then
- as_ls_L_option=L
- else
- as_ls_L_option=
- fi
- as_test_x='
- eval sh -c '\''
- if test -d "$1"; then
- test -d "$1/.";
- else
- case $1 in #(
- -*)set "./$1";;
- esac;
- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
- ???[sx]*):;;*)false;;esac;fi
- '\'' sh
- '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# Save the log message, to keep $0 and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by jellyfish $as_me 1.1.11, which was
-generated by GNU Autoconf 2.68. Invocation command line was
-
- CONFIG_FILES = $CONFIG_FILES
- CONFIG_HEADERS = $CONFIG_HEADERS
- CONFIG_LINKS = $CONFIG_LINKS
- CONFIG_COMMANDS = $CONFIG_COMMANDS
- $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-case $ac_config_headers in *"
-"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
-esac
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration. Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
- -h, --help print this help, then exit
- -V, --version print version number and configuration settings, then exit
- --config print configuration, then exit
- -q, --quiet, --silent
- do not print progress messages
- -d, --debug don't remove temporary files
- --recheck update $as_me by reconfiguring in the same conditions
- --file=FILE[:TEMPLATE]
- instantiate the configuration file FILE
- --header=FILE[:TEMPLATE]
- instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to <gmarcais at umd.edu>."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
-ac_cs_version="\\
-jellyfish config.status 1.1.11
-configured by $0, generated by GNU Autoconf 2.68,
- with options \\"\$ac_cs_config\\"
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-AWK='$AWK'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
- case $1 in
- --*=?*)
- ac_option=`expr "X$1" : 'X\([^=]*\)='`
- ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
- ac_shift=:
- ;;
- --*=)
- ac_option=`expr "X$1" : 'X\([^=]*\)='`
- ac_optarg=
- ac_shift=:
- ;;
- *)
- ac_option=$1
- ac_optarg=$2
- ac_shift=shift
- ;;
- esac
-
- case $ac_option in
- # Handling of the options.
- -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
- ac_cs_recheck=: ;;
- --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
- --config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
- --debug | --debu | --deb | --de | --d | -d )
- debug=: ;;
- --file | --fil | --fi | --f )
- $ac_shift
- case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
- '') as_fn_error $? "missing file argument" ;;
- esac
- as_fn_append CONFIG_FILES " '$ac_optarg'"
- ac_need_defaults=false;;
- --header | --heade | --head | --hea )
- $ac_shift
- case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
- esac
- as_fn_append CONFIG_HEADERS " '$ac_optarg'"
- ac_need_defaults=false;;
- --he | --h)
- # Conflict between --help and --header
- as_fn_error $? "ambiguous option: \`$1'
-Try \`$0 --help' for more information.";;
- --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil | --si | --s)
- ac_cs_silent=: ;;
-
- # This is an error.
- -*) as_fn_error $? "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
- *) as_fn_append ac_config_targets " $1"
- ac_need_defaults=false ;;
-
- esac
- shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
- exec 6>/dev/null
- ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
- set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
- shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
- CONFIG_SHELL='$SHELL'
- export CONFIG_SHELL
- exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
- echo
- sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
- $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#
-# INIT-COMMANDS
-#
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
-enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
-SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
-ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
-PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
-host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
-host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
-host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
-build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
-build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
-build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
-SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
-Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
-GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
-EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
-FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
-LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
-NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
-LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
-exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
-lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
-lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
-file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
-want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
-DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
-sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
-AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
-archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
-STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
-lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
-CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
-compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
-GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
-nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
-lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
-objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
-need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
-MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
-LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
-libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
-postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
-need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
-version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
-install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
-striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
-predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
-postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
-predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
-postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
-LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
-reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
-reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
-GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
-inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
-always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
-include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
-prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
-file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
-hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
-predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
-postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
-predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
-postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
-compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
-
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
- eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in SHELL \
-ECHO \
-PATH_SEPARATOR \
-SED \
-GREP \
-EGREP \
-FGREP \
-LD \
-NM \
-LN_S \
-lt_SP2NL \
-lt_NL2SP \
-reload_flag \
-OBJDUMP \
-deplibs_check_method \
-file_magic_cmd \
-file_magic_glob \
-want_nocaseglob \
-DLLTOOL \
-sharedlib_from_linklib_cmd \
-AR \
-AR_FLAGS \
-archiver_list_spec \
-STRIP \
-RANLIB \
-CC \
-CFLAGS \
-compiler \
-lt_cv_sys_global_symbol_pipe \
-lt_cv_sys_global_symbol_to_cdecl \
-lt_cv_sys_global_symbol_to_c_name_address \
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-nm_file_list_spec \
-lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_pic \
-lt_prog_compiler_wl \
-lt_prog_compiler_static \
-lt_cv_prog_compiler_c_o \
-need_locks \
-MANIFEST_TOOL \
-DSYMUTIL \
-NMEDIT \
-LIPO \
-OTOOL \
-OTOOL64 \
-shrext_cmds \
-export_dynamic_flag_spec \
-whole_archive_flag_spec \
-compiler_needs_object \
-with_gnu_ld \
-allow_undefined_flag \
-no_undefined_flag \
-hardcode_libdir_flag_spec \
-hardcode_libdir_separator \
-exclude_expsyms \
-include_expsyms \
-file_list_spec \
-variables_saved_for_relink \
-libname_spec \
-library_names_spec \
-soname_spec \
-install_override_mode \
-finish_eval \
-old_striplib \
-striplib \
-compiler_lib_search_dirs \
-predep_objects \
-postdep_objects \
-predeps \
-postdeps \
-compiler_lib_search_path \
-LD_CXX \
-reload_flag_CXX \
-compiler_CXX \
-lt_prog_compiler_no_builtin_flag_CXX \
-lt_prog_compiler_pic_CXX \
-lt_prog_compiler_wl_CXX \
-lt_prog_compiler_static_CXX \
-lt_cv_prog_compiler_c_o_CXX \
-export_dynamic_flag_spec_CXX \
-whole_archive_flag_spec_CXX \
-compiler_needs_object_CXX \
-with_gnu_ld_CXX \
-allow_undefined_flag_CXX \
-no_undefined_flag_CXX \
-hardcode_libdir_flag_spec_CXX \
-hardcode_libdir_separator_CXX \
-exclude_expsyms_CXX \
-include_expsyms_CXX \
-file_list_spec_CXX \
-compiler_lib_search_dirs_CXX \
-predep_objects_CXX \
-postdep_objects_CXX \
-predeps_CXX \
-postdeps_CXX \
-compiler_lib_search_path_CXX; do
- case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
- *[\\\\\\\`\\"\\\$]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
- ;;
- *)
- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
- ;;
- esac
-done
-
-# Double-quote double-evaled strings.
-for var in reload_cmds \
-old_postinstall_cmds \
-old_postuninstall_cmds \
-old_archive_cmds \
-extract_expsyms_cmds \
-old_archive_from_new_cmds \
-old_archive_from_expsyms_cmds \
-archive_cmds \
-archive_expsym_cmds \
-module_cmds \
-module_expsym_cmds \
-export_symbols_cmds \
-prelink_cmds \
-postlink_cmds \
-postinstall_cmds \
-postuninstall_cmds \
-finish_cmds \
-sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec \
-reload_cmds_CXX \
-old_archive_cmds_CXX \
-old_archive_from_new_cmds_CXX \
-old_archive_from_expsyms_cmds_CXX \
-archive_cmds_CXX \
-archive_expsym_cmds_CXX \
-module_cmds_CXX \
-module_expsym_cmds_CXX \
-export_symbols_cmds_CXX \
-prelink_cmds_CXX \
-postlink_cmds_CXX; do
- case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
- *[\\\\\\\`\\"\\\$]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
- ;;
- *)
- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
- ;;
- esac
-done
-
-ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
- setopt NO_GLOB_SUBST
-fi
-
-
- PACKAGE='$PACKAGE'
- VERSION='$VERSION'
- TIMESTAMP='$TIMESTAMP'
- RM='$RM'
- ofile='$ofile'
-
-
-
-
-
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
- case $ac_config_target in
- "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
- "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
- "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
- "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
- "tests/compat.sh") CONFIG_FILES="$CONFIG_FILES tests/compat.sh" ;;
- "jellyfish-1.1.pc") CONFIG_FILES="$CONFIG_FILES jellyfish-1.1.pc" ;;
-
- *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
- esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used. Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
- test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
- test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience. Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
- tmp= ac_tmp=
- trap 'exit_status=$?
- : "${ac_tmp:=$tmp}"
- { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
-' 0
- trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
- tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
- test -d "$tmp"
-} ||
-{
- tmp=./conf$$-$RANDOM
- (umask 077 && mkdir "$tmp")
-} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
-ac_tmp=$tmp
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
- eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
- ac_cs_awk_cr='\\r'
-else
- ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
-_ACEOF
-
-
-{
- echo "cat >conf$$subs.awk <<_ACEOF" &&
- echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
- echo "_ACEOF"
-} >conf$$subs.sh ||
- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
- . ./conf$$subs.sh ||
- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-
- ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
- if test $ac_delim_n = $ac_delim_num; then
- break
- elif $ac_last_try; then
- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
- else
- ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
- fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\)..*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\)..*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
- N
- s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
- for (key in S) S_is_set[key] = 1
- FS = ""
-
-}
-{
- line = $ 0
- nfields = split(line, field, "@")
- substed = 0
- len = length(field[1])
- for (i = 2; i < nfields; i++) {
- key = field[i]
- keylen = length(key)
- if (S_is_set[key]) {
- value = S[key]
- line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
- len += length(value) + length(field[++i])
- substed = 1
- } else
- len += 1 + keylen
- }
-
- print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
- sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
- cat
-fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
- || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
- ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
-h
-s///
-s/^/:/
-s/[ ]*$/:/
-s/:\$(srcdir):/:/g
-s/:\${srcdir}:/:/g
-s/:@srcdir@:/:/g
-s/^:*//
-s/:*$//
-x
-s/\(=[ ]*\).*/\1/
-G
-s/\n//
-s/^[^=]*=[ ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-# Set up the scripts for CONFIG_HEADERS section.
-# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
-if test -n "$CONFIG_HEADERS"; then
-cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
-BEGIN {
-_ACEOF
-
-# Transform confdefs.h into an awk script `defines.awk', embedded as
-# here-document in config.status, that substitutes the proper values into
-# config.h.in to produce config.h.
-
-# Create a delimiter string that does not exist in confdefs.h, to ease
-# handling of long lines.
-ac_delim='%!_!# '
-for ac_last_try in false false :; do
- ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
- if test -z "$ac_tt"; then
- break
- elif $ac_last_try; then
- as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
- else
- ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
- fi
-done
-
-# For the awk script, D is an array of macro values keyed by name,
-# likewise P contains macro parameters if any. Preserve backslash
-# newline sequences.
-
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-sed -n '
-s/.\{148\}/&'"$ac_delim"'/g
-t rset
-:rset
-s/^[ ]*#[ ]*define[ ][ ]*/ /
-t def
-d
-:def
-s/\\$//
-t bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3"/p
-s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
-d
-:bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3\\\\\\n"\\/p
-t cont
-s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
-t cont
-d
-:cont
-n
-s/.\{148\}/&'"$ac_delim"'/g
-t clear
-:clear
-s/\\$//
-t bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/"/p
-d
-:bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
-b cont
-' <confdefs.h | sed '
-s/'"$ac_delim"'/"\\\
-"/g' >>$CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
- for (key in D) D_is_set[key] = 1
- FS = ""
-}
-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
- line = \$ 0
- split(line, arg, " ")
- if (arg[1] == "#") {
- defundef = arg[2]
- mac1 = arg[3]
- } else {
- defundef = substr(arg[1], 2)
- mac1 = arg[2]
- }
- split(mac1, mac2, "(") #)
- macro = mac2[1]
- prefix = substr(line, 1, index(line, defundef) - 1)
- if (D_is_set[macro]) {
- # Preserve the white space surrounding the "#".
- print prefix "define", macro P[macro] D[macro]
- next
- } else {
- # Replace #undef with comments. This is necessary, for example,
- # in the case of _POSIX_SOURCE, which is predefined and required
- # on some systems where configure will not decide to define it.
- if (defundef == "undef") {
- print "/*", prefix defundef, macro, "*/"
- next
- }
- }
-}
-{ print }
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
- as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
-fi # test -n "$CONFIG_HEADERS"
-
-
-eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
-shift
-for ac_tag
-do
- case $ac_tag in
- :[FHLC]) ac_mode=$ac_tag; continue;;
- esac
- case $ac_mode$ac_tag in
- :[FHL]*:*);;
- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
- :[FH]-) ac_tag=-:-;;
- :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
- esac
- ac_save_IFS=$IFS
- IFS=:
- set x $ac_tag
- IFS=$ac_save_IFS
- shift
- ac_file=$1
- shift
-
- case $ac_mode in
- :L) ac_source=$1;;
- :[FH])
- ac_file_inputs=
- for ac_f
- do
- case $ac_f in
- -) ac_f="$ac_tmp/stdin";;
- *) # Look for the file first in the build tree, then in the source tree
- # (if the path is not absolute). The absolute path cannot be DOS-style,
- # because $ac_f cannot contain `:'.
- test -f "$ac_f" ||
- case $ac_f in
- [\\/$]*) false;;
- *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
- esac ||
- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
- esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
- as_fn_append ac_file_inputs " '$ac_f'"
- done
-
- # Let's still pretend it is `configure' which instantiates (i.e., don't
- # use $as_me), people would be surprised to read:
- # /* config.h. Generated by config.status. */
- configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
- `' by configure.'
- if test x"$ac_file" != x-; then
- configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
- fi
- # Neutralize special characters interpreted by sed in replacement strings.
- case $configure_input in #(
- *\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
- sed 's/[\\\\&|]/\\\\&/g'`;; #(
- *) ac_sed_conf_input=$configure_input;;
- esac
-
- case $ac_tag in
- *:-:* | *:-) cat >"$ac_tmp/stdin" \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
- esac
- ;;
- esac
-
- ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$ac_file" : 'X\(//\)[^/]' \| \
- X"$ac_file" : 'X\(//\)$' \| \
- X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- as_dir="$ac_dir"; as_fn_mkdir_p
- ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
- # A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
- case $ac_top_builddir_sub in
- "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
- *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
- esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
- .) # We are building in place.
- ac_srcdir=.
- ac_top_srcdir=$ac_top_builddir_sub
- ac_abs_top_srcdir=$ac_pwd ;;
- [\\/]* | ?:[\\/]* ) # Absolute name.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir
- ac_abs_top_srcdir=$srcdir ;;
- *) # Relative name.
- ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_build_prefix$srcdir
- ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
- case $ac_mode in
- :F)
- #
- # CONFIG_FILE
- #
-
- case $INSTALL in
- [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
- *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
- esac
- ac_MKDIR_P=$MKDIR_P
- case $MKDIR_P in
- [\\/$]* | ?:[\\/]* ) ;;
- */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
- esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
- p
- q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
- ac_datarootdir_hack='
- s&@datadir@&$datadir&g
- s&@docdir@&$docdir&g
- s&@infodir@&$infodir&g
- s&@localedir@&$localedir&g
- s&@mandir@&$mandir&g
- s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
- >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
- { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
- "$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined. Please make sure it is defined" >&2;}
-
- rm -f "$ac_tmp/stdin"
- case $ac_file in
- -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
- *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
- esac \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- ;;
- :H)
- #
- # CONFIG_HEADER
- #
- if test x"$ac_file" != x-; then
- {
- $as_echo "/* $configure_input */" \
- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
- } >"$ac_tmp/config.h" \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
- else
- rm -f "$ac_file"
- mv "$ac_tmp/config.h" "$ac_file" \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- fi
- else
- $as_echo "/* $configure_input */" \
- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
- || as_fn_error $? "could not create -" "$LINENO" 5
- fi
-# Compute "$ac_file"'s index in $config_headers.
-_am_arg="$ac_file"
-_am_stamp_count=1
-for _am_header in $config_headers :; do
- case $_am_header in
- $_am_arg | $_am_arg:* )
- break ;;
- * )
- _am_stamp_count=`expr $_am_stamp_count + 1` ;;
- esac
-done
-echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
-$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$_am_arg" : 'X\(//\)[^/]' \| \
- X"$_am_arg" : 'X\(//\)$' \| \
- X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$_am_arg" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`/stamp-h$_am_stamp_count
- ;;
-
- :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
- ;;
- esac
-
-
- case $ac_file$ac_mode in
- "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
- # Autoconf 2.62 quotes --file arguments for eval, but not when files
- # are listed without --file. Let's play safe and only enable the eval
- # if we detect the quoting.
- case $CONFIG_FILES in
- *\'*) eval set x "$CONFIG_FILES" ;;
- *) set x $CONFIG_FILES ;;
- esac
- shift
- for mf
- do
- # Strip MF so we end up with the name of the file.
- mf=`echo "$mf" | sed -e 's/:.*$//'`
- # Check whether this is an Automake generated Makefile or not.
- # We used to match only the files named `Makefile.in', but
- # some people rename them; so instead we look at the file content.
- # Grep'ing the first line is not enough: some people post-process
- # each Makefile.in and add a new line on top of each file to say so.
- # Grep'ing the whole file is not good either: AIX grep has a line
- # limit of 2048, but all sed's we know have understand at least 4000.
- if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
- dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$mf" : 'X\(//\)[^/]' \| \
- X"$mf" : 'X\(//\)$' \| \
- X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- else
- continue
- fi
- # Extract the definition of DEPDIR, am__include, and am__quote
- # from the Makefile without running `make'.
- DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
- test -z "$DEPDIR" && continue
- am__include=`sed -n 's/^am__include = //p' < "$mf"`
- test -z "am__include" && continue
- am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
- # When using ansi2knr, U may be empty or an underscore; expand it
- U=`sed -n 's/^U = //p' < "$mf"`
- # Find all dependency output files, they are included files with
- # $(DEPDIR) in their names. We invoke sed twice because it is the
- # simplest approach to changing $(DEPDIR) to its actual value in the
- # expansion.
- for file in `sed -n "
- s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
- # Make sure the directory exists.
- test -f "$dirpart/$file" && continue
- fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$file" : 'X\(//\)[^/]' \| \
- X"$file" : 'X\(//\)$' \| \
- X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- as_dir=$dirpart/$fdir; as_fn_mkdir_p
- # echo "creating $dirpart/$file"
- echo '# dummy' > "$dirpart/$file"
- done
- done
-}
- ;;
- "libtool":C)
-
- # See if we are running on zsh, and set the options which allow our
- # commands through without removal of \ escapes.
- if test -n "${ZSH_VERSION+set}" ; then
- setopt NO_GLOB_SUBST
- fi
-
- cfgfile="${ofile}T"
- trap "$RM \"$cfgfile\"; exit 1" 1 2 15
- $RM "$cfgfile"
-
- cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# Written by Gordon Matzigkeit, 1996
-#
-# This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING. If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-# The names of the tagged configurations supported by this script.
-available_tags="CXX "
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Which release of libtool.m4 was used?
-macro_version=$macro_version
-macro_revision=$macro_revision
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# What type of objects to build.
-pic_mode=$pic_mode
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# An echo program that protects backslashes.
-ECHO=$lt_ECHO
-
-# The PATH separator for the build system.
-PATH_SEPARATOR=$lt_PATH_SEPARATOR
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="\$SED -e 1s/^X//"
-
-# A grep program that handles long lines.
-GREP=$lt_GREP
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# A literal string matcher.
-FGREP=$lt_FGREP
-
-# A BSD- or MS-compatible name lister.
-NM=$lt_NM
-
-# Whether we need soft or hard links.
-LN_S=$lt_LN_S
-
-# What is the maximum length of a command?
-max_cmd_len=$max_cmd_len
-
-# Object file suffix (normally "o").
-objext=$ac_objext
-
-# Executable file suffix (normally "").
-exeext=$exeext
-
-# whether the shell understands "unset".
-lt_unset=$lt_unset
-
-# turn spaces into newlines.
-SP2NL=$lt_lt_SP2NL
-
-# turn newlines into spaces.
-NL2SP=$lt_lt_NL2SP
-
-# convert \$build file names to \$host format.
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-
-# convert \$build files to toolchain format.
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-
-# An object symbol dumper.
-OBJDUMP=$lt_OBJDUMP
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method = "file_magic".
-file_magic_cmd=$lt_file_magic_cmd
-
-# How to find potential files when deplibs_check_method = "file_magic".
-file_magic_glob=$lt_file_magic_glob
-
-# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
-want_nocaseglob=$lt_want_nocaseglob
-
-# DLL creation program.
-DLLTOOL=$lt_DLLTOOL
-
-# Command to associate shared and link libraries.
-sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
-
-# The archiver.
-AR=$lt_AR
-
-# Flags to create an archive.
-AR_FLAGS=$lt_AR_FLAGS
-
-# How to feed a file listing to the archiver.
-archiver_list_spec=$lt_archiver_list_spec
-
-# A symbol stripping program.
-STRIP=$lt_STRIP
-
-# Commands used to install an old-style archive.
-RANLIB=$lt_RANLIB
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Whether to use a lock for old archive extraction.
-lock_old_archive_extraction=$lock_old_archive_extraction
-
-# A C compiler.
-LTCC=$lt_CC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_CFLAGS
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration.
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair.
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# Transform the output of nm in a C name address pair when lib prefix is needed.
-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-
-# Specify filename containing input files for \$NM.
-nm_file_list_spec=$lt_nm_file_list_spec
-
-# The root where to search for dependent libraries,and in which our libraries should be installed.
-lt_sysroot=$lt_sysroot
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# Used to examine libraries when file_magic_cmd begins with "file".
-MAGIC_CMD=$MAGIC_CMD
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Manifest tool.
-MANIFEST_TOOL=$lt_MANIFEST_TOOL
-
-# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
-DSYMUTIL=$lt_DSYMUTIL
-
-# Tool to change global to local symbols on Mac OS X.
-NMEDIT=$lt_NMEDIT
-
-# Tool to manipulate fat objects and archives on Mac OS X.
-LIPO=$lt_LIPO
-
-# ldd/readelf like tool for Mach-O binaries on Mac OS X.
-OTOOL=$lt_OTOOL
-
-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
-OTOOL64=$lt_OTOOL64
-
-# Old archive suffix (normally "a").
-libext=$libext
-
-# Shared library suffix (normally ".so").
-shrext_cmds=$lt_shrext_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at link time.
-variables_saved_for_relink=$lt_variables_saved_for_relink
-
-# Do we need the "lib" prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Library versioning type.
-version_type=$version_type
-
-# Shared library runtime path variable.
-runpath_var=$runpath_var
-
-# Shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names. First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Permission mode override for installation of shared libraries.
-install_override_mode=$lt_install_override_mode
-
-# Command to use after installation of a shared archive.
-postinstall_cmds=$lt_postinstall_cmds
-
-# Command to use after uninstallation of a shared archive.
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# As "finish_cmds", except a single script fragment to be evaled but
-# not shown.
-finish_eval=$lt_finish_eval
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Compile-time system search path for libraries.
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds
-
-# A language specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds
-
-# Commands necessary for finishing linking programs.
-postlink_cmds=$lt_postlink_cmds
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects
-postdep_objects=$lt_postdep_objects
-predeps=$lt_predeps
-postdeps=$lt_postdeps
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path
-
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
- case $host_os in
- aix3*)
- cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program. For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
-fi
-_LT_EOF
- ;;
- esac
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-
- # We use sed instead of cat because bash on DJGPP gets confused if
- # if finds mixed CR/LF and LF-only lines. Since sed operates in
- # text mode, it properly converts lines to CR/LF. This bash problem
- # is reportedly fixed, but why not run on old versions too?
- sed '$q' "$ltmain" >> "$cfgfile" \
- || (rm -f "$cfgfile"; exit 1)
-
- if test x"$xsi_shell" = xyes; then
- sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
-func_dirname ()\
-{\
-\ case ${1} in\
-\ */*) func_dirname_result="${1%/*}${2}" ;;\
-\ * ) func_dirname_result="${3}" ;;\
-\ esac\
-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_basename ()$/,/^} # func_basename /c\
-func_basename ()\
-{\
-\ func_basename_result="${1##*/}"\
-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
-func_dirname_and_basename ()\
-{\
-\ case ${1} in\
-\ */*) func_dirname_result="${1%/*}${2}" ;;\
-\ * ) func_dirname_result="${3}" ;;\
-\ esac\
-\ func_basename_result="${1##*/}"\
-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
-func_stripname ()\
-{\
-\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
-\ # positional parameters, so assign one to ordinary parameter first.\
-\ func_stripname_result=${3}\
-\ func_stripname_result=${func_stripname_result#"${1}"}\
-\ func_stripname_result=${func_stripname_result%"${2}"}\
-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
-func_split_long_opt ()\
-{\
-\ func_split_long_opt_name=${1%%=*}\
-\ func_split_long_opt_arg=${1#*=}\
-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
-func_split_short_opt ()\
-{\
-\ func_split_short_opt_arg=${1#??}\
-\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
-func_lo2o ()\
-{\
-\ case ${1} in\
-\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
-\ *) func_lo2o_result=${1} ;;\
-\ esac\
-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_xform ()$/,/^} # func_xform /c\
-func_xform ()\
-{\
- func_xform_result=${1%.*}.lo\
-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_arith ()$/,/^} # func_arith /c\
-func_arith ()\
-{\
- func_arith_result=$(( $* ))\
-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_len ()$/,/^} # func_len /c\
-func_len ()\
-{\
- func_len_result=${#1}\
-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-fi
-
-if test x"$lt_shell_append" = xyes; then
- sed -e '/^func_append ()$/,/^} # func_append /c\
-func_append ()\
-{\
- eval "${1}+=\\${2}"\
-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
-func_append_quoted ()\
-{\
-\ func_quote_for_eval "${2}"\
-\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- # Save a `func_append' function call where possible by direct use of '+='
- sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
- test 0 -eq $? || _lt_function_replace_fail=:
-else
- # Save a `func_append' function call even when '+=' is not available
- sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
- test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
-fi
-
-
- mv -f "$cfgfile" "$ofile" ||
- (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
- chmod +x "$ofile"
-
-
- cat <<_LT_EOF >> "$ofile"
-
-# ### BEGIN LIBTOOL TAG CONFIG: CXX
-
-# The linker used to build libraries.
-LD=$lt_LD_CXX
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag_CXX
-reload_cmds=$lt_reload_cmds_CXX
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds_CXX
-
-# A language specific compiler.
-CC=$lt_compiler_CXX
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC_CXX
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_CXX
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_CXX
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_CXX
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_CXX
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object_CXX
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds_CXX
-archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds_CXX
-module_expsym_cmds=$lt_module_expsym_cmds_CXX
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld_CXX
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_CXX
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_CXX
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct_CXX
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute_CXX
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L_CXX
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic_CXX
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath_CXX
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_CXX
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols_CXX
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_CXX
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_CXX
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_CXX
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds_CXX
-
-# Commands necessary for finishing linking programs.
-postlink_cmds=$lt_postlink_cmds_CXX
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec_CXX
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_CXX
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects_CXX
-postdep_objects=$lt_postdep_objects_CXX
-predeps=$lt_predeps_CXX
-postdeps=$lt_postdeps_CXX
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
-
-# ### END LIBTOOL TAG CONFIG: CXX
-_LT_EOF
-
- ;;
-
- esac
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
- as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded. So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status. When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
- ac_cs_success=:
- ac_config_status_args=
- test "$silent" = yes &&
- ac_config_status_args="$ac_config_status_args --quiet"
- exec 5>/dev/null
- $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
- exec 5>>config.log
- # Use ||, not &&, to avoid exiting from the if with $? = 1, which
- # would make configure fail if this is the last instruction.
- $ac_cs_success || as_fn_exit 1
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
-
-
diff --git a/configure.ac b/configure.ac
index d650d0f..fba0614 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,23 +1,33 @@
-AC_INIT([jellyfish], [1.1.11], [gmarcais at umd.edu])
+AC_INIT([jellyfish], [2.1.4], [gmarcais at umd.edu])
AC_CANONICAL_HOST
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([subdir-objects foreign parallel-tests color-tests])
AM_SILENT_RULES([yes])
AC_CONFIG_SRCDIR([jellyfish])
AC_CONFIG_HEADERS([config.h])
-AC_CONFIG_MACRO_DIR([m4])
AC_PROG_LIBTOOL
# Change default compilation flags
-#AC_SUBST([ALL_CXXFLAGS], [-std=c++0x])
-#CXXFLAGS="-std=c++0x $CXXFLAGS"
+AC_SUBST([ALL_CXXFLAGS], [-std=c++0x])
+CXXFLAGS="-std=c++0x $CXXFLAGS"
AC_LANG(C++)
AC_PROG_CXX
+# Major version of the library
+AC_SUBST([PACKAGE_LIB], [2.0])
+
+# Check for md5 or md5sum
+AC_ARG_VAR([MD5], [Path to md5 hashing program])
+AS_IF([test "x$MD5" = "x"], AC_CHECK_PROG([MD5], [md5sum], [md5sum]), [])
+AS_IF([test "x$MD5" = "x"], AC_CHECK_PROG([MD5], [md5], [md5 -r]), [])
+AS_IF([test "x$MD5" = "x"], AC_MSG_ERROR([Could not find md5 hashing program in your path]), [])
+
+# Check for yaggo
+AC_ARG_VAR([YAGGO], [Yaggo switch parser generator])
+AS_IF([test "x$YAGGO" = "x"], [AC_PATH_PROG([YAGGO], [yaggo], [false])])
dnl define([concat], $1$2$3)dnl
-dnl define([PC_FILE], concat([jellyfish-],AC_PACKAGE_VERSION,[.pc]))
-define([PC_FILE], jellyfish-1.1.pc)
+define([PC_FILE], jellyfish-2.0.pc)
AC_CONFIG_FILES([
Makefile
tests/compat.sh
@@ -25,14 +35,10 @@ AC_CONFIG_FILES([
PC_FILE
)
-AC_ARG_VAR([MD5], [Path to md5 hashing program])
-AS_IF([test "x$MD5" = "x"], AC_CHECK_PROG([MD5], [md5sum], [md5sum]), [])
-AS_IF([test "x$MD5" = "x"], AC_CHECK_PROG([MD5], [md5], [md5 -r]), [])
-AS_IF([test "x$MD5" = "x"], AC_MSG_ERROR([Could not find md5 hashing program in your path]), [])
AC_ARG_WITH([sse],
[AS_HELP_STRING([--with-sse], [enable SSE])],
- [], [with_sse=no])
+ [], [with_sse=yes])
AS_IF([test "x$with_sse" != xno],
[AC_DEFINE([HAVE_SSE], [1], [Define if you have SSE])],
[])
@@ -44,15 +50,39 @@ AS_IF([test "x$with_half" = "xyes"],
[AC_DEFINE([HALF_FLOATS], [1], [Define if you use half floats for qmer counting])],
[])
-AC_CHECK_TYPE([__int128],
- [AC_DEFINE([HAVE_INT128], [1], [Define if type __int128 is supported])])
+# Use valgrind to check memory allocation with mmap
+AC_ARG_ENABLE([valgrind],
+ [AS_HELP_STRING([--enable-valgrind], [Instrument mmap memory allocation with valgrind])])
+AS_IF([test "x$enable_valgrind" = xyes],
+ [AC_DEFINE([HAVE_VALGRIND], [1], [Define is using Valgrind])]
+ [PKG_CHECK_MODULES([VALGRIND], [valgrind >= 1.8.0])])
+# Check that type __int128 is supported and if the
+# std::numeric_limits<__int128> specialization exists
+AC_ARG_WITH([int128],
+ [AS_HELP_STRING([--with-int128], [enable int128])],
+ [], [with_int128=yes])
+AS_IF([test "x$with_int128" != xno],
+ [AC_CHECK_TYPE([__int128],
+ [AC_DEFINE([HAVE_INT128], [1], [Define if type __int128 is supported])])
+ AC_MSG_CHECKING([for std::numeric_limits<__int128>])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <limits>
+ template<bool> struct StaticAssert; template<> struct StaticAssert<true> { static void assert() { } };]],
+ [[StaticAssert<std::numeric_limits<__int128>::is_specialized>::assert();]])],
+ [AC_MSG_RESULT([yes])]
+ [AC_DEFINE([HAVE_NUMERIC_LIMITS128], [1], [Define if numeric limits specialization exists for __int128])],
+ [AC_MSG_RESULT([no])])])
-# Check the version of strerror_r
-AC_FUNC_STRERROR_R
-
-AC_CHECK_HEADERS([execinfo.h sys/syscall.h])
+# On MacOS X, use _NSGetExecutablePath to find path to own executable
+AC_MSG_CHECKING([for _NSGetExecutablePath])
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <mach-o/dyld.h>]],
+ [[_NSGetExecutablePath(0, 0);]])],
+ [AC_MSG_RESULT([yes])]
+ [AC_DEFINE([HAVE_NSGETEXECUTABLEPATH], [1], [Used to find executable path on MacOS X])],
+ [AC_MSG_RESULT([no])])
+# Check the version of strerror_r
+AC_CHECK_HEADERS_ONCE([execinfo.h ext/stdio_filebuf.h])
AC_CHECK_MEMBER([siginfo_t.si_int],
[AC_DEFINE([HAVE_SI_INT], [1], [Define if siginfo_t.si_int exists])],
[], [[#include <signal.h>]])
diff --git a/depcomp b/depcomp
deleted file mode 100755
index 25a39e6..0000000
--- a/depcomp
+++ /dev/null
@@ -1,708 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2012-03-27.16; # UTC
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
-# 2011, 2012 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva at dcc.unicamp.br>.
-
-case $1 in
- '')
- echo "$0: No command. Try '$0 --help' for more information." 1>&2
- exit 1;
- ;;
- -h | --h*)
- cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
- depmode Dependency tracking mode.
- source Source file read by 'PROGRAMS ARGS'.
- object Object file output by 'PROGRAMS ARGS'.
- DEPDIR directory where to store dependencies.
- depfile Dependency file to output.
- tmpdepfile Temporary file to use when outputting dependencies.
- libtool Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake at gnu.org>.
-EOF
- exit $?
- ;;
- -v | --v*)
- echo "depcomp $scriptversion"
- exit $?
- ;;
-esac
-
-# A tabulation character.
-tab=' '
-# A newline character.
-nl='
-'
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
- echo "depcomp: Variables source, object and depmode must be set" 1>&2
- exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
- sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags. We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write. Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
- # HP compiler uses -M and no extra arg.
- gccflag=-M
- depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
- # This is just like dashmstdout with a different argument.
- dashmflag=-xM
- depmode=dashmstdout
-fi
-
-cygpath_u="cygpath -u -f -"
-if test "$depmode" = msvcmsys; then
- # This is just like msvisualcpp but w/o cygpath translation.
- # Just convert the backslash-escaped backslashes to single forward
- # slashes to satisfy depend.m4
- cygpath_u='sed s,\\\\,/,g'
- depmode=msvisualcpp
-fi
-
-if test "$depmode" = msvc7msys; then
- # This is just like msvc7 but w/o cygpath translation.
- # Just convert the backslash-escaped backslashes to single forward
- # slashes to satisfy depend.m4
- cygpath_u='sed s,\\\\,/,g'
- depmode=msvc7
-fi
-
-if test "$depmode" = xlc; then
- # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations.
- gccflag=-qmakedep=gcc,-MF
- depmode=gcc
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want. Yay! Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff. Hmm.
-## Unfortunately, FreeBSD c89 acceptance of flags depends upon
-## the command line argument order; so add the flags where they
-## appear in depend2.am. Note that the slowdown incurred here
-## affects only configure: in makefiles, %FASTDEP% shortcuts this.
- for arg
- do
- case $arg in
- -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
- *) set fnord "$@" "$arg" ;;
- esac
- shift # fnord
- shift # $arg
- done
- "$@"
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- mv "$tmpdepfile" "$depfile"
- ;;
-
-gcc)
-## There are various ways to get dependency output from gcc. Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-## up in a subdir. Having to rename by hand is ugly.
-## (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-## -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-## than renaming).
- if test -z "$gccflag"; then
- gccflag=-MD,
- fi
- "$@" -Wp,"$gccflag$tmpdepfile"
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- rm -f "$depfile"
- echo "$object : \\" > "$depfile"
- alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
- sed -e 's/^[^:]*: / /' \
- -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the "deleted header file" problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header). We avoid this by adding
-## dummy dependencies for each header file. Too bad gcc doesn't do
-## this for us directly.
- tr ' ' "$nl" < "$tmpdepfile" |
-## Some versions of gcc put a space before the ':'. On the theory
-## that the space means something, we add a space to the output as
-## well. hp depmode also adds that space, but also prefixes the VPATH
-## to the object. Take care to not repeat it in the output.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
- | sed -e 's/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-hp)
- # This case exists only to let depend.m4 do its work. It works by
- # looking at the text of this script. This case will never be run,
- # since it is checked for above.
- exit 1
- ;;
-
-sgi)
- if test "$libtool" = yes; then
- "$@" "-Wp,-MDupdate,$tmpdepfile"
- else
- "$@" -MDupdate "$tmpdepfile"
- fi
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- rm -f "$depfile"
-
- if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
- echo "$object : \\" > "$depfile"
-
- # Clip off the initial element (the dependent). Don't try to be
- # clever and replace this with sed code, as IRIX sed won't handle
- # lines with more than a fixed number of characters (4096 in
- # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
- # the IRIX cc adds comments like '#:fec' to the end of the
- # dependency line.
- tr ' ' "$nl" < "$tmpdepfile" \
- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
- tr "$nl" ' ' >> "$depfile"
- echo >> "$depfile"
-
- # The second pass generates a dummy entry for each header file.
- tr ' ' "$nl" < "$tmpdepfile" \
- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
- >> "$depfile"
- else
- # The sourcefile does not contain any dependencies, so just
- # store a dummy comment line, to avoid errors with the Makefile
- # "include basename.Plo" scheme.
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile"
- ;;
-
-xlc)
- # This case exists only to let depend.m4 do its work. It works by
- # looking at the text of this script. This case will never be run,
- # since it is checked for above.
- exit 1
- ;;
-
-aix)
- # The C for AIX Compiler uses -M and outputs the dependencies
- # in a .u file. In older versions, this file always lives in the
- # current directory. Also, the AIX compiler puts '$object:' at the
- # start of each line; $object doesn't have directory information.
- # Version 6 uses the directory in both cases.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
- if test "$libtool" = yes; then
- tmpdepfile1=$dir$base.u
- tmpdepfile2=$base.u
- tmpdepfile3=$dir.libs/$base.u
- "$@" -Wc,-M
- else
- tmpdepfile1=$dir$base.u
- tmpdepfile2=$dir$base.u
- tmpdepfile3=$dir$base.u
- "$@" -M
- fi
- stat=$?
-
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
- exit $stat
- fi
-
- for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
- do
- test -f "$tmpdepfile" && break
- done
- if test -f "$tmpdepfile"; then
- # Each line is of the form 'foo.o: dependent.h'.
- # Do two passes, one to just change these to
- # '$object: dependent.h' and one to simply 'dependent.h:'.
- sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
- sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
- else
- # The sourcefile does not contain any dependencies, so just
- # store a dummy comment line, to avoid errors with the Makefile
- # "include basename.Plo" scheme.
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile"
- ;;
-
-icc)
- # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'.
- # However on
- # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c
- # ICC 7.0 will fill foo.d with something like
- # foo.o: sub/foo.c
- # foo.o: sub/foo.h
- # which is wrong. We want
- # sub/foo.o: sub/foo.c
- # sub/foo.o: sub/foo.h
- # sub/foo.c:
- # sub/foo.h:
- # ICC 7.1 will output
- # foo.o: sub/foo.c sub/foo.h
- # and will wrap long lines using '\':
- # foo.o: sub/foo.c ... \
- # sub/foo.h ... \
- # ...
- # tcc 0.9.26 (FIXME still under development at the moment of writing)
- # will emit a similar output, but also prepend the continuation lines
- # with horizontal tabulation characters.
- "$@" -MD -MF "$tmpdepfile"
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- rm -f "$depfile"
- # Each line is of the form 'foo.o: dependent.h',
- # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'.
- # Do two passes, one to just change these to
- # '$object: dependent.h' and one to simply 'dependent.h:'.
- sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \
- < "$tmpdepfile" > "$depfile"
- sed '
- s/[ '"$tab"'][ '"$tab"']*/ /g
- s/^ *//
- s/ *\\*$//
- s/^[^:]*: *//
- /^$/d
- /:$/d
- s/$/ :/
- ' < "$tmpdepfile" >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-hp2)
- # The "hp" stanza above does not work with aCC (C++) and HP's ia64
- # compilers, which have integrated preprocessors. The correct option
- # to use with these is +Maked; it writes dependencies to a file named
- # 'foo.d', which lands next to the object file, wherever that
- # happens to be.
- # Much of this is similar to the tru64 case; see comments there.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
- if test "$libtool" = yes; then
- tmpdepfile1=$dir$base.d
- tmpdepfile2=$dir.libs/$base.d
- "$@" -Wc,+Maked
- else
- tmpdepfile1=$dir$base.d
- tmpdepfile2=$dir$base.d
- "$@" +Maked
- fi
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile1" "$tmpdepfile2"
- exit $stat
- fi
-
- for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
- do
- test -f "$tmpdepfile" && break
- done
- if test -f "$tmpdepfile"; then
- sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
- # Add 'dependent.h:' lines.
- sed -ne '2,${
- s/^ *//
- s/ \\*$//
- s/$/:/
- p
- }' "$tmpdepfile" >> "$depfile"
- else
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile" "$tmpdepfile2"
- ;;
-
-tru64)
- # The Tru64 compiler uses -MD to generate dependencies as a side
- # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
- # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
- # dependencies in 'foo.d' instead, so we check for that too.
- # Subdirectories are respected.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
- if test "$libtool" = yes; then
- # With Tru64 cc, shared objects can also be used to make a
- # static library. This mechanism is used in libtool 1.4 series to
- # handle both shared and static libraries in a single compilation.
- # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
- #
- # With libtool 1.5 this exception was removed, and libtool now
- # generates 2 separate objects for the 2 libraries. These two
- # compilations output dependencies in $dir.libs/$base.o.d and
- # in $dir$base.o.d. We have to check for both files, because
- # one of the two compilations can be disabled. We should prefer
- # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
- # automatically cleaned when .libs/ is deleted, while ignoring
- # the former would cause a distcleancheck panic.
- tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
- tmpdepfile2=$dir$base.o.d # libtool 1.5
- tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
- tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
- "$@" -Wc,-MD
- else
- tmpdepfile1=$dir$base.o.d
- tmpdepfile2=$dir$base.d
- tmpdepfile3=$dir$base.d
- tmpdepfile4=$dir$base.d
- "$@" -MD
- fi
-
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
- exit $stat
- fi
-
- for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
- do
- test -f "$tmpdepfile" && break
- done
- if test -f "$tmpdepfile"; then
- sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
- sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
- else
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile"
- ;;
-
-msvc7)
- if test "$libtool" = yes; then
- showIncludes=-Wc,-showIncludes
- else
- showIncludes=-showIncludes
- fi
- "$@" $showIncludes > "$tmpdepfile"
- stat=$?
- grep -v '^Note: including file: ' "$tmpdepfile"
- if test "$stat" = 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- rm -f "$depfile"
- echo "$object : \\" > "$depfile"
- # The first sed program below extracts the file names and escapes
- # backslashes for cygpath. The second sed program outputs the file
- # name when reading, but also accumulates all include files in the
- # hold buffer in order to output them again at the end. This only
- # works with sed implementations that can handle large buffers.
- sed < "$tmpdepfile" -n '
-/^Note: including file: *\(.*\)/ {
- s//\1/
- s/\\/\\\\/g
- p
-}' | $cygpath_u | sort -u | sed -n '
-s/ /\\ /g
-s/\(.*\)/'"$tab"'\1 \\/p
-s/.\(.*\) \\/\1:/
-H
-$ {
- s/.*/'"$tab"'/
- G
- p
-}' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-msvc7msys)
- # This case exists only to let depend.m4 do its work. It works by
- # looking at the text of this script. This case will never be run,
- # since it is checked for above.
- exit 1
- ;;
-
-#nosideeffect)
- # This comment above is used by automake to tell side-effect
- # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
- # Important note: in order to support this mode, a compiler *must*
- # always write the preprocessed file to stdout, regardless of -o.
- "$@" || exit $?
-
- # Remove the call to Libtool.
- if test "$libtool" = yes; then
- while test "X$1" != 'X--mode=compile'; do
- shift
- done
- shift
- fi
-
- # Remove '-o $object'.
- IFS=" "
- for arg
- do
- case $arg in
- -o)
- shift
- ;;
- $object)
- shift
- ;;
- *)
- set fnord "$@" "$arg"
- shift # fnord
- shift # $arg
- ;;
- esac
- done
-
- test -z "$dashmflag" && dashmflag=-M
- # Require at least two characters before searching for ':'
- # in the target name. This is to cope with DOS-style filenames:
- # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
- "$@" $dashmflag |
- sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile"
- rm -f "$depfile"
- cat < "$tmpdepfile" > "$depfile"
- tr ' ' "$nl" < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-dashXmstdout)
- # This case only exists to satisfy depend.m4. It is never actually
- # run, as this mode is specially recognized in the preamble.
- exit 1
- ;;
-
-makedepend)
- "$@" || exit $?
- # Remove any Libtool call
- if test "$libtool" = yes; then
- while test "X$1" != 'X--mode=compile'; do
- shift
- done
- shift
- fi
- # X makedepend
- shift
- cleared=no eat=no
- for arg
- do
- case $cleared in
- no)
- set ""; shift
- cleared=yes ;;
- esac
- if test $eat = yes; then
- eat=no
- continue
- fi
- case "$arg" in
- -D*|-I*)
- set fnord "$@" "$arg"; shift ;;
- # Strip any option that makedepend may not understand. Remove
- # the object too, otherwise makedepend will parse it as a source file.
- -arch)
- eat=yes ;;
- -*|$object)
- ;;
- *)
- set fnord "$@" "$arg"; shift ;;
- esac
- done
- obj_suffix=`echo "$object" | sed 's/^.*\././'`
- touch "$tmpdepfile"
- ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
- rm -f "$depfile"
- # makedepend may prepend the VPATH from the source file name to the object.
- # No need to regex-escape $object, excess matching of '.' is harmless.
- sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
- sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile" "$tmpdepfile".bak
- ;;
-
-cpp)
- # Important note: in order to support this mode, a compiler *must*
- # always write the preprocessed file to stdout.
- "$@" || exit $?
-
- # Remove the call to Libtool.
- if test "$libtool" = yes; then
- while test "X$1" != 'X--mode=compile'; do
- shift
- done
- shift
- fi
-
- # Remove '-o $object'.
- IFS=" "
- for arg
- do
- case $arg in
- -o)
- shift
- ;;
- $object)
- shift
- ;;
- *)
- set fnord "$@" "$arg"
- shift # fnord
- shift # $arg
- ;;
- esac
- done
-
- "$@" -E |
- sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
- -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
- sed '$ s: \\$::' > "$tmpdepfile"
- rm -f "$depfile"
- echo "$object : \\" > "$depfile"
- cat < "$tmpdepfile" >> "$depfile"
- sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-msvisualcpp)
- # Important note: in order to support this mode, a compiler *must*
- # always write the preprocessed file to stdout.
- "$@" || exit $?
-
- # Remove the call to Libtool.
- if test "$libtool" = yes; then
- while test "X$1" != 'X--mode=compile'; do
- shift
- done
- shift
- fi
-
- IFS=" "
- for arg
- do
- case "$arg" in
- -o)
- shift
- ;;
- $object)
- shift
- ;;
- "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
- set fnord "$@"
- shift
- shift
- ;;
- *)
- set fnord "$@" "$arg"
- shift
- shift
- ;;
- esac
- done
- "$@" -E 2>/dev/null |
- sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
- rm -f "$depfile"
- echo "$object : \\" > "$depfile"
- sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
- echo "$tab" >> "$depfile"
- sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-msvcmsys)
- # This case exists only to let depend.m4 do its work. It works by
- # looking at the text of this script. This case will never be run,
- # since it is checked for above.
- exit 1
- ;;
-
-none)
- exec "$@"
- ;;
-
-*)
- echo "Unknown depmode $depmode" 1>&2
- exit 1
- ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/development.mk b/development.mk
new file mode 100644
index 0000000..7043903
--- /dev/null
+++ b/development.mk
@@ -0,0 +1,22 @@
+AM_CXXFLAGS += -Werror
+
+# Count lines of code
+.PHONY: cloc cloc_jellyfish
+cloc:
+ cloc --force-lang="Ruby,yaggo" --force-lang="make,am" --force-lang="make,mk" \
+ --exclude-dir="gtest" --ignored=cloc_ignored_src_files \
+ $(top_srcdir)/jellyfish $(top_srcdir)/include $(top_srcdir)/lib $(top_srcdir)/sub_commands $(top_srcdir)/tests $(top_srcdir)/unit_tests \
+ $(top_srcdir)/Makefile.am $(top_srcdir)/*.mk
+
+cloc_jellyfish:
+ cloc $(top_srcdir)/jellyfish $(top_srcdir)/include $(top_srcdir)/lib $(top_srcdir)/sub_commands
+
+cloc_library:
+ cloc $(top_srcdir)/include $(top_srcdir)/lib
+
+# Make a dependency on yaggo the software
+$(YAGGO_SOURCES): $(YAGGO)
+
+# Launch unit tests
+unittests:
+ @$(MAKE) check TESTS=unit_tests/unit_tests.sh
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000..332f618
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,37 @@
+L2M = latex2man -t transfile
+MI = makeinfo
+PDFLATEX = pdflatex
+M4 = m4
+
+TARGETS = jellyfish.man jellyfish.html jellyfish.pdf
+all: $(TARGETS)
+
+man: jellyfish.man
+ man ./$<
+
+options.tex: generate_options_tex.sh
+ sh $< > $@
+
+%-full.tex: %.tex options.tex
+ $(M4) $< > $@
+
+%.man: %-full.tex
+ $(L2M) $< $@
+
+%.html: %-full.tex
+ $(L2M) -H $< $@
+
+%.texi: %-full.tex
+ $(L2M) -T $< $@
+
+%.info: %.texi
+ $(MI) --force $< $@
+
+%.latex: %-full.tex
+ $(L2M) -L $< $@
+
+%.pdf: %.latex
+ $(PDFLATEX) $<
+
+clean:
+ rm -f $(TARGETS) *-full.tex options.tex
diff --git a/doc/UserGuide.lyx b/doc/UserGuide.lyx
new file mode 100644
index 0000000..7a1c426
--- /dev/null
+++ b/doc/UserGuide.lyx
@@ -0,0 +1,1515 @@
+#LyX 2.0 created this file. For more info see http://www.lyx.org/
+\lyxformat 413
+\begin_document
+\begin_header
+\textclass report
+\begin_preamble
+\usepackage[letterpaper]{geometry}
+\usepackage{siunitx}
+\end_preamble
+\use_default_options true
+\begin_modules
+theorems-ams
+eqs-within-sections
+figs-within-sections
+\end_modules
+\maintain_unincluded_children false
+\language english
+\language_package default
+\inputencoding auto
+\fontencoding global
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\use_non_tex_fonts false
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\default_output_format default
+\output_sync 0
+\bibtex_command default
+\index_command default
+\paperfontsize default
+\spacing single
+\use_hyperref false
+\papersize default
+\use_geometry false
+\use_amsmath 1
+\use_esint 1
+\use_mhchem 1
+\use_mathdots 1
+\cite_engine basic
+\use_bibtopic false
+\use_indices false
+\paperorientation portrait
+\suppress_date false
+\use_refstyle 1
+\index Index
+\shortcut idx
+\color #008000
+\end_index
+\secnumdepth 2
+\tocdepth 2
+\paragraph_separation indent
+\paragraph_indentation default
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\html_math_output 0
+\html_css_as_file 0
+\html_be_strict false
+\end_header
+
+\begin_body
+
+\begin_layout Title
+Jellyfish 2 User Guide
+\end_layout
+
+\begin_layout Standard
+\begin_inset CommandInset toc
+LatexCommand tableofcontents
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset FormulaMacro
+\newcommand{\switch}[1]{\texttt{-\@-#1}}
+\end_inset
+
+
+\begin_inset FormulaMacro
+\newcommand{\opt}[1]{\texttt{-#1}}
+\end_inset
+
+
+\end_layout
+
+\begin_layout Chapter
+Getting started
+\end_layout
+
+\begin_layout Section
+Counting all
+\begin_inset Formula $k$
+\end_inset
+
+-mers
+\end_layout
+
+\begin_layout Standard
+The basic command to count all
+\begin_inset Formula $k$
+\end_inset
+
+-mers is as follows:
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish count -m 21 -s 100M -t 10 -C reads.fasta
+\end_layout
+
+\begin_layout Standard
+This will count canonical (
+\begin_inset Formula $\opt C$
+\end_inset
+
+)
+\begin_inset Formula $21$
+\end_inset
+
+-mers (
+\family sans
+
+\begin_inset Formula $\opt m\,21$
+\end_inset
+
+
+\family default
+), using a hash with 100 million elements (
+\family sans
+
+\begin_inset Formula $\opt s\,\unit[100]{M}$
+\end_inset
+
+
+\family default
+) and 10 threads (
+\family sans
+
+\begin_inset Formula $\opt t\,10$
+\end_inset
+
+
+\family default
+) in the sequences in the file
+\family sans
+reads.fasta
+\family default
+.
+ The output is written in the file '
+\family sans
+mer_counts.jf
+\family default
+' by default (change with
+\family sans
+
+\begin_inset Formula $\opt o$
+\end_inset
+
+
+\family default
+ switch).
+
+\end_layout
+
+\begin_layout Standard
+To compute the histogram of the
+\begin_inset Formula $k$
+\end_inset
+
+-mer occurrences, use the
+\family sans
+histo
+\family default
+ subcommand (see section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:histo"
+
+\end_inset
+
+):
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish histo mer_counts.jf
+\end_layout
+
+\begin_layout Standard
+To query the counts of a particular
+\begin_inset Formula $k$
+\end_inset
+
+-mer, use the
+\family sans
+query
+\family default
+ subcommand (see section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:query"
+
+\end_inset
+
+):
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish query mer_counts.jf AACGTTG
+\end_layout
+
+\begin_layout Standard
+To output all the counts for all the
+\begin_inset Formula $k$
+\end_inset
+
+-mers in the file, use the
+\family sans
+dump
+\family default
+ subcommand (see section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:dump"
+
+\end_inset
+
+):
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish dump mer_counts.jf > mer_counts_dumps.fa
+\end_layout
+
+\begin_layout Standard
+To get some information on how, when and where this jellyfish file was generated
+, use the
+\family sans
+info
+\family default
+ subcommand (see section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:info"
+
+\end_inset
+
+):
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish info mer_counts.jf
+\end_layout
+
+\begin_layout Standard
+For more detail information, see the relevant sections in this document.
+ All commands understand
+\begin_inset Formula $\switch{help}$
+\end_inset
+
+ and will produce some information about the switches available.
+\end_layout
+
+\begin_layout Subsection
+Counting
+\begin_inset Formula $k$
+\end_inset
+
+-mers in sequencing reads
+\end_layout
+
+\begin_layout Standard
+In sequencing reads, it is unknown which strands of the DNA is sequenced.
+ As a consequence, a
+\begin_inset Formula $k$
+\end_inset
+
+-mer or its reverse complement are essentially equivalent.
+ The canonical representative of a
+\begin_inset Formula $k$
+\end_inset
+
+-mer
+\begin_inset Formula $m$
+\end_inset
+
+ is by definition
+\begin_inset Formula $m$
+\end_inset
+
+ or the reverse complement of
+\begin_inset Formula $m$
+\end_inset
+
+, whichever comes first lexicographically.
+ The
+\family sans
+
+\begin_inset Formula $\opt C$
+\end_inset
+
+
+\family default
+ switch instructs to save in the hash only canonical
+\begin_inset Formula $k$
+\end_inset
+
+-mers, while the count is the number of occurrences of both a
+\begin_inset Formula $k$
+\end_inset
+
+-mer and it reverse complement.
+\end_layout
+
+\begin_layout Standard
+The size parameter (given with
+\begin_inset Formula $\opt s$
+\end_inset
+
+) is an indication of the number
+\begin_inset Formula $k$
+\end_inset
+
+-mers that will be stored in the hash.
+ For sequencing reads, one this size should be the size of the genome plus
+ the
+\begin_inset Formula $k$
+\end_inset
+
+-mers generated by sequencing errors.
+ For example, if the error rate is
+\begin_inset Formula $e$
+\end_inset
+
+ (e.g.
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+@
+\end_layout
+
+\end_inset
+
+ Illumina reads, usually
+\begin_inset Formula $e\approx1\%$
+\end_inset
+
+), with an estimated genome size of
+\begin_inset Formula $G$
+\end_inset
+
+ and a coverage of
+\begin_inset Formula $c$
+\end_inset
+
+, the number of expected
+\begin_inset Formula $k$
+\end_inset
+
+-mers is
+\begin_inset Formula $G+Gcek$
+\end_inset
+
+.
+ This assume
+\end_layout
+
+\begin_layout Quote
+NOTE: unlike in Jellyfish 1, this
+\family sans
+-s
+\family default
+ parameter is only an estimation.
+ If the size given is too small to fit all the
+\begin_inset Formula $k$
+\end_inset
+
+-mers, the hash size will be increased automatically or partial results
+ will be written to disk and finally merged automatically.
+ Running '
+\family sans
+jellyfish merge
+\family default
+' should never be necessary, as now jellyfish now takes care of this task
+ on its own.
+\end_layout
+
+\begin_layout Standard
+If the low frequency
+\begin_inset Formula $k$
+\end_inset
+
+-mers (
+\begin_inset Formula $k$
+\end_inset
+
+-mers occurring only once), which are mostly due to sequencing errors, are
+ not of interest, one might consider counting only high-frequency
+\begin_inset Formula $k$
+\end_inset
+
+-mers (see section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Counting-high-frequency--mers"
+
+\end_inset
+
+), which uses less memory and is potentially faster.
+\end_layout
+
+\begin_layout Subsection
+Counting
+\begin_inset Formula $k$
+\end_inset
+
+-mers in a genome
+\end_layout
+
+\begin_layout Standard
+In an actual genome or finished sequence, a
+\begin_inset Formula $k$
+\end_inset
+
+-mer and its reverse complement are not equivalent, hence using the
+\family sans
+
+\begin_inset Formula $\opt C$
+\end_inset
+
+
+\family default
+ switch does not make sense.
+ In addition, the size for the hash can be set directly to the size of the
+ genome.
+\end_layout
+
+\begin_layout Section
+Counting high-frequency
+\begin_inset Formula $k$
+\end_inset
+
+-mers
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:Counting-high-frequency--mers"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Jellyfish offers two way to count only high-frequency
+\begin_inset Formula $k$
+\end_inset
+
+-mers (meaning only
+\begin_inset Formula $k$
+\end_inset
+
+-mers with count
+\begin_inset Formula $>1$
+\end_inset
+
+), which reduces significantly the memory usage.
+ Both methods are based on using Bloom filters.
+ The first method is a one pass method, which provides approximate count
+ for some percentage of the
+\begin_inset Formula $k$
+\end_inset
+
+-mers.
+ The second method is a two pass method which provides exact count.
+ In both methods, most of the low-frequency
+\begin_inset Formula $k$
+\end_inset
+
+-mers are not reported.
+\end_layout
+
+\begin_layout Subsection
+One pass method
+\begin_inset CommandInset label
+LatexCommand label
+name "sub:One-pass-method"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Adding the
+\family sans
+
+\begin_inset Formula $\switch{bf-size}$
+\end_inset
+
+
+\family default
+ switch make jellyfish first insert all
+\begin_inset Formula $k$
+\end_inset
+
+-mers first into a Bloom filter and only insert into the hash the
+\begin_inset Formula $k$
+\end_inset
+
+-mers which have already been seen at least once.
+ The argument to
+\begin_inset Formula $\switch{bf-size}$
+\end_inset
+
+ should the total number of
+\begin_inset Formula $k$
+\end_inset
+
+-mer expected in the data set while the
+\family sans
+
+\begin_inset Formula $\switch{size}$
+\end_inset
+
+ argument should be the number of
+\begin_inset Formula $k$
+\end_inset
+
+-mers occurring more than once.
+ For example:
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish count -m 25 -s 3G --bf-size 100G -t 16 homo_sapiens.fa
+\end_layout
+
+\begin_layout Standard
+would be appropriate for counting
+\begin_inset Formula $25$
+\end_inset
+
+-mers in human reads at
+\begin_inset Formula $30\times$
+\end_inset
+
+ coverage.
+ The approximate memory usage is
+\begin_inset Formula $\SI{9}{bits}$
+\end_inset
+
+ per
+\begin_inset Formula $k$
+\end_inset
+
+-mer in the Bloom filter.
+\end_layout
+
+\begin_layout Standard
+The count reported for each
+\begin_inset Formula $k$
+\end_inset
+
+-mer (by '
+\family sans
+jellyfish dump
+\family default
+' or '
+\family sans
+jellyfish query
+\family default
+') is one less than the actual count.
+ Meaning, the count
+\begin_inset Formula $1$
+\end_inset
+
+
+\begin_inset Formula $k$
+\end_inset
+
+-mer are not reported, count
+\begin_inset Formula $2$
+\end_inset
+
+
+\begin_inset Formula $k$
+\end_inset
+
+-mer are reported to have count
+\begin_inset Formula $1$
+\end_inset
+
+, etc.
+\end_layout
+
+\begin_layout Standard
+The drawback of this method is some percentage of the
+\begin_inset Formula $k$
+\end_inset
+
+-mer that should not be reported (because they occur only once) are reported.
+ This is due to the random nature of the Bloom filter data structure.
+ The percentage is
+\begin_inset Formula $<1\%$
+\end_inset
+
+ by default and can be changed with the
+\begin_inset Formula $\switch{bf-fp}$
+\end_inset
+
+ switch.
+\end_layout
+
+\begin_layout Subsection
+Two pass method
+\end_layout
+
+\begin_layout Standard
+In the two pass method, first a Bloom counter is created from the reads
+ with '
+\family sans
+jellyfish bc
+\family default
+'.
+ Then this Bloom counter is given to the '
+\family sans
+jelllyfish count
+\family default
+' command and only the
+\begin_inset Formula $k$
+\end_inset
+
+-mers which have been seen twice in the first pass will be inserted in the
+ hash.
+ For example, with a human data set similar that in section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sub:One-pass-method"
+
+\end_inset
+
+:
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish bc -m 25 -s 100G -t 16 -o homo_sapiens.bc homo_sapiens.fa
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish count -m 25 -s 3G -t 16 --bc homo_sapiens.bc homo_sapiens.fa
+\end_layout
+
+\begin_layout Standard
+The advantage of this method is that the counts reported for the
+\begin_inset Formula $k$
+\end_inset
+
+-mers are all correct.
+ Most count
+\begin_inset Formula $1$
+\end_inset
+
+
+\begin_inset Formula $k$
+\end_inset
+
+-mer are not reported, except for a small percentage (set by the
+\family sans
+
+\begin_inset Formula $\opt f$
+\end_inset
+
+
+\family default
+ switch of the
+\family sans
+bc
+\family default
+ subcommand) of them which are reported (correctly with count
+\begin_inset Formula $1$
+\end_inset
+
+).
+ All other
+\begin_inset Formula $k$
+\end_inset
+
+-mers are reported with the correct count.
+\end_layout
+
+\begin_layout Standard
+The drawback of this method is that it requires to parse the entire reads
+ data set twice and the memory usage of the Bloom counter is greater than
+ that of the Bloom filter (slightly less than twice as much).
+\end_layout
+
+\begin_layout Chapter
+FAQ
+\end_layout
+
+\begin_layout Section
+How to read compressed files (or other format)?
+\end_layout
+
+\begin_layout Standard
+Jellyfish only reads FASTA or FASTQ formatted input files.
+ By reading from pipes, jellyfish can read compressed files, like this:
+\end_layout
+
+\begin_layout LyX-Code
+zcat *.fastq.gz | jellyfish count /dev/fd/0 ...
+\end_layout
+
+\begin_layout Standard
+or by using the
+\family sans
+'<()
+\family default
+'
+\family sans
+redirection
+\family default
+ provided by the shell (e.g.
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+@
+\end_layout
+
+\end_inset
+
+ bash, zsh):
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish count <(zcat file1.fastq.gz) <(zcat file2.fasta.gz) ...
+\end_layout
+
+\begin_layout Section
+How to read multiple files at once?
+\end_layout
+
+\begin_layout Standard
+Often, jellyfish can parse an input sequence file faster than
+\family sans
+gzip
+\family default
+ or
+\family sans
+fastq-dump
+\family default
+ (to parse SRA files) can output the sequence.
+ This leads to many threads in jellyfish going partially unused.
+ Jellyfish can be instructed to open multiple file at once.
+ For example, to read two short read archive files simultaneously:
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish count -F 2 <(fastq-dump -Z file1.sra) <(fastq-dump -Z file2.sra)
+ ...
+\end_layout
+
+\begin_layout Standard
+Another way is to use
+\begin_inset Quotes eld
+\end_inset
+
+generators
+\begin_inset Quotes erd
+\end_inset
+
+.
+ First, create a file containing, one per line, commands to generate sequence.
+ Then pass this file to jellyfish and the number of generators to run simultaneo
+usly.
+ Jellyfish will spawn subprocesses running the commands passed and read
+ their standard output for sequence.
+ By default, the commands are run using the shell in the SHELL environment
+ variable, and this can be changed by the
+\family sans
+
+\begin_inset Formula $\opt S$
+\end_inset
+
+
+\family default
+ switch.
+ Multiple generators will be run simultaneously as specified by the
+\family sans
+
+\begin_inset Formula $\opt G$
+\end_inset
+
+
+\family default
+ switch.
+ For example:
+\end_layout
+
+\begin_layout LyX-Code
+ls *.fasta.gz | xargs -n 1 echo gunzip -c > generators
+\end_layout
+
+\begin_layout LyX-Code
+jellyfish count -g generators -G 4 ...
+\end_layout
+
+\begin_layout Standard
+The first command created the command list into the '
+\family sans
+generators
+\family default
+' file, each command unzipping one FASTA file in the current directory.
+ The second command runs jellyfish with
+\begin_inset Formula $4$
+\end_inset
+
+ concurrent generators.
+\end_layout
+
+\begin_layout Section
+How to reduce the output size?
+\end_layout
+
+\begin_layout Standard
+The output file was design to be easy to read, but the file generated can
+ be rather large.
+ By default, a
+\begin_inset Formula $\SI{4}{bytes}$
+\end_inset
+
+ counter value is saved for every
+\begin_inset Formula $k$
+\end_inset
+
+-mer (i.e.
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+@
+\end_layout
+
+\end_inset
+
+ a maximum count of over 4 billion).
+ Instead, a counter size of
+\begin_inset Formula $\SI{2}{bytes}$
+\end_inset
+
+ or
+\begin_inset Formula $\SI{1}{byte}$
+\end_inset
+
+ can be used with the switch
+\begin_inset Formula $\switch{out-counter-len}$
+\end_inset
+
+, which reduces significantly the output size.
+\end_layout
+
+\begin_layout Standard
+The count of
+\begin_inset Formula $k$
+\end_inset
+
+-mers which cannot be represented with the given number of bytes will have
+ a value equal to the maximum value that can be represented.
+ Meaning, if the counter field uses
+\begin_inset Formula $\SI{1}{byte}$
+\end_inset
+
+, any
+\begin_inset Formula $k$
+\end_inset
+
+-mers with count greater or equal to
+\begin_inset Formula $255$
+\end_inset
+
+ will be reported of having a count
+\begin_inset Formula $255$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+Also, low frequency and high frequency
+\begin_inset Formula $k$
+\end_inset
+
+-mers can be skipped using the
+\family sans
+
+\begin_inset Formula $\opt L$
+\end_inset
+
+
+\family default
+ and
+\family sans
+
+\begin_inset Formula $\opt U$
+\end_inset
+
+
+\family default
+ switches respectively.
+ Although it might be more appropriate to filter out the low frequency
+\begin_inset Formula $k$
+\end_inset
+
+-mers using Bloom filters, as shown in section
+\begin_inset space ~
+\end_inset
+
+
+\begin_inset CommandInset ref
+LatexCommand ref
+reference "sec:Counting-high-frequency--mers"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Section
+How much memory is needed?
+\end_layout
+
+\begin_layout Standard
+The memory needed to count
+\begin_inset Formula $k$
+\end_inset
+
+-mers, given the various parameters of the
+\family sans
+count
+\family default
+subcommand is obtained by using the
+\family sans
+mem
+\family default
+ subcommand.
+ It understand all the same switches, but only the
+\begin_inset Formula $\switch{mer-len}$
+\end_inset
+
+ (
+\begin_inset Formula $\opt m$
+\end_inset
+
+),
+\begin_inset Formula $\switch{size}$
+\end_inset
+
+ (
+\begin_inset Formula $\opt s$
+\end_inset
+
+),
+\begin_inset Formula $\switch{counter-len}$
+\end_inset
+
+ (
+\begin_inset Formula $\opt c$
+\end_inset
+
+) and
+\begin_inset Formula $\switch{reprobes}$
+\end_inset
+
+ (
+\begin_inset Formula $\opt p$
+\end_inset
+
+) switches are taken into account.
+\end_layout
+
+\begin_layout Standard
+For example, for
+\begin_inset Formula $24$
+\end_inset
+
+-mers, with an initial hash size of 1 billion, and default parameters otherwise,
+ the memory usage is:
+\end_layout
+
+\begin_layout LyX-Code
+$ jellyfish mem -m 24 -s 1G
+\end_layout
+
+\begin_layout LyX-Code
+4521043056 (4G)
+\end_layout
+
+\begin_layout Standard
+Conversely, if the
+\begin_inset Formula $\switch{size}$
+\end_inset
+
+ switch is not given by the
+\begin_inset Formula $\switch{mem}$
+\end_inset
+
+ switch is, then the maximum initial hash size that would fit in the given
+ memory is returned.
+ For example, this is the maximum hash size for
+\begin_inset Formula $31$
+\end_inset
+
+-mers in
+\begin_inset Formula $\unit[8]{Gb}$
+\end_inset
+
+ of RAM:
+\end_layout
+
+\begin_layout LyX-Code
+$ jellyfish mem -m 31 --mem 8g
+\end_layout
+
+\begin_layout LyX-Code
+1073741824 (1G)
+\end_layout
+
+\begin_layout Chapter
+Subcommands
+\end_layout
+
+\begin_layout Section
+
+\family sans
+histo
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:histo"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The
+\family sans
+histo
+\family default
+ subcommand outputs the histogram of
+\begin_inset Formula $k$
+\end_inset
+
+-mers frequencies.
+ The last bin, with value one above the high setting set by the
+\family sans
+
+\begin_inset Formula $\opt h$
+\end_inset
+
+
+\family default
+ switch (
+\begin_inset Formula $10\,000$
+\end_inset
+
+ by default), is a catch all: all
+\begin_inset Formula $k$
+\end_inset
+
+-mers with a count greater than the high setting are tallied in that one
+ bin.
+ If the low setting is set (
+\family sans
+
+\begin_inset Formula $\opt l$
+\end_inset
+
+
+\family default
+ switch), then the first bin, with value one below the low setting, is also
+ similarly a catch all.
+\end_layout
+
+\begin_layout Standard
+By default, the bins with a zero count are skipped.
+ This can be changed with the
+\family sans
+
+\begin_inset Formula $\opt f$
+\end_inset
+
+
+\family default
+ switch.
+\end_layout
+
+\begin_layout Section
+
+\family sans
+dump
+\family default
+
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:dump"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The
+\family sans
+dump
+\family default
+ subcommand outputs a list of all the
+\begin_inset Formula $k$
+\end_inset
+
+-mers in the file associated with their count.
+ By default, the output is in FASTA format, where the header line contains
+ the count of the
+\begin_inset Formula $k$
+\end_inset
+
+-mer and the sequence part is the sequence of the
+\begin_inset Formula $k$
+\end_inset
+
+-mer.
+ This format has the advantage that the output contains the sequence of
+
+\begin_inset Formula $k$
+\end_inset
+
+-mers and can be directly fed into another program expecting the very common
+ FASTA format.
+ A more convenient column format (for human beings) is selected with the
+
+\family sans
+-c
+\family default
+ switch.
+\end_layout
+
+\begin_layout Standard
+Low frequency and high frequency
+\begin_inset Formula $k$
+\end_inset
+
+-mers can be skipped with the
+\family sans
+
+\begin_inset Formula $\opt L$
+\end_inset
+
+
+\family default
+ and
+\family sans
+
+\begin_inset Formula $\opt U$
+\end_inset
+
+
+\family default
+ switches respectively.
+\end_layout
+
+\begin_layout Standard
+In the output of the
+\family sans
+dump
+\family default
+ subcommand, the
+\begin_inset Formula $k$
+\end_inset
+
+-mers are sorted according to the hash function used by Jellyfish.
+ The output can be considered to be
+\begin_inset Quotes eld
+\end_inset
+
+fairly pseudo-random
+\begin_inset Quotes erd
+\end_inset
+
+.
+ By
+\begin_inset Quotes eld
+\end_inset
+
+fairly
+\begin_inset Quotes erd
+\end_inset
+
+ we mean that NO guarantee is made about the actual randomness of this order,
+ it is just good enough for the hash table to work properly.
+ And by
+\begin_inset Quotes eld
+\end_inset
+
+pseudo-random
+\begin_inset Quotes erd
+\end_inset
+
+ we mean that the order is actually deterministic: given the same hash function,
+ the output will be always the same and two different files generated with
+ the same hash function can be merged easily.
+\end_layout
+
+\begin_layout Section
+
+\family sans
+query
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:query"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The
+\family sans
+query
+\family default
+ subcommand outputs the
+\begin_inset Formula $k$
+\end_inset
+
+-mers and their counts for some subset of
+\begin_inset Formula $k$
+\end_inset
+
+-mers.
+ It will outputs the counts of all the
+\begin_inset Formula $k$
+\end_inset
+
+-mers passed on the command line or of all the
+\begin_inset Formula $k$
+\end_inset
+
+-mers in the sequence read from the FASTA or FASTQ formatted file passed
+ to the switch
+\family sans
+
+\begin_inset Formula $\opt s$
+\end_inset
+
+
+\family default
+ (this switch can be given multiple times).
+\end_layout
+
+\begin_layout Section
+
+\family sans
+info
+\family default
+
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:info"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The
+\family sans
+info
+\family default
+ subcommand outputs some information about the jellyfish file and the command
+ used to generated it, in which directory and at what time the command was
+ run.
+ Hopefully, the information given should be enough to rerun jellyfish under
+ the same conditions and reproduce the output file.
+ In particular, the
+\family sans
+
+\begin_inset Formula $\opt c$
+\end_inset
+
+
+\family default
+ switch outputs the command, properly escaped and ready to run in a shell.
+\end_layout
+
+\begin_layout Standard
+The header is saved in JSON format and contains more information than is
+ written by the default.
+ The full header in JSON format can be written out using the
+\family sans
+-j
+\family default
+ switch.
+\end_layout
+
+\begin_layout Section
+
+\family sans
+merge
+\family default
+
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:merge"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The
+\family sans
+merge
+\family default
+ subcommand is a little direct use with version version 2 of jellyfish.
+ When intermediary files were written to disk, because not all
+\begin_inset Formula $k$
+\end_inset
+
+-mers would fit in memory, they can be merged into one file containing the
+ final result with the
+\family sans
+merge
+\family default
+ subcommand.
+ The
+\family sans
+count
+\family default
+ will merge intermediary files automatically as needed.
+\end_layout
+
+\begin_layout Section
+stats
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:stats"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The
+\family sans
+stats
+\family default
+ subcommand computes some statistics about the mers.
+ Although these statistics could be computed from the histogram, it provides
+ quick summary information.
+ The fields are:
+\end_layout
+
+\begin_layout Description
+Unique The number of
+\begin_inset Formula $k$
+\end_inset
+
+-mer occuring exactly once
+\end_layout
+
+\begin_layout Description
+Distinct The number of
+\begin_inset Formula $k$
+\end_inset
+
+-mers, ignoring their multiplicity (i.e.
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+@
+\end_layout
+
+\end_inset
+
+ the cardinality of the set of
+\begin_inset Formula $k$
+\end_inset
+
+-mers)
+\end_layout
+
+\begin_layout Description
+Total The number of
+\begin_inset Formula $k$
+\end_inset
+
+-mers with multiplicity (i.e.
+\begin_inset ERT
+status open
+
+\begin_layout Plain Layout
+
+
+\backslash
+@
+\end_layout
+
+\end_inset
+
+ the sum of the number of occurence of all the mers)
+\end_layout
+
+\begin_layout Description
+Max_count The maximum of the number of occurences
+\end_layout
+
+\begin_layout Section
+mem
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:mem"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The
+\family sans
+mem
+\family default
+ subcommand shows how much memory a count subcommand will need or conversely
+ how large of a hash size will fit in a given amount of memory.
+\end_layout
+
+\begin_layout Section
+cite
+\begin_inset CommandInset label
+LatexCommand label
+name "sec:cite"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The
+\family sans
+cite
+\family default
+ subcommand prints the citation for the jellyfish paper.
+ With the
+\begin_inset Formula $\opt b$
+\end_inset
+
+, it is formatted in Bibtex format.
+ How convenient!
+\end_layout
+
+\end_body
+\end_document
diff --git a/doc/generate_options_tex.sh b/doc/generate_options_tex.sh
new file mode 100755
index 0000000..1497830
--- /dev/null
+++ b/doc/generate_options_tex.sh
@@ -0,0 +1,7 @@
+#! /bin/sh
+
+for i in count stats histo dump merge query qhisto qdump qmerge cite; do
+ echo "\\subsection{$i}"
+ jellyfish $i --help | ruby option_to_tex /dev/fd/0
+ echo
+done
diff --git a/doc/help_parse.rb b/doc/help_parse.rb
new file mode 100644
index 0000000..bee2c47
--- /dev/null
+++ b/doc/help_parse.rb
@@ -0,0 +1,451 @@
+# Autogenerated from a Treetop grammar. Edits may be lost.
+
+
+module HelpGrammar
+ include Treetop::Runtime
+
+ def root
+ @root ||= :line
+ end
+
+ module Line0
+ def spaces
+ elements[0]
+ end
+
+ def sws
+ elements[1]
+ end
+
+ def text
+ elements[2]
+ end
+
+ end
+
+ module Line1
+ def to_tex(opened)
+ res = ""
+ unless sws.empty?
+ if !opened.is_open
+ res << "\\begin{description}\n"
+ opened.is_open = true
+ end
+ res << "\\item["
+ res << sws.elements.map { |s| s.to_tex }.join(",")
+ res << "] "
+ end
+ res << "\\noindent " unless text.text_value.empty?
+ res << quote(text.text_value)
+ end
+ end
+
+ def _nt_line
+ start_index = index
+ if node_cache[:line].has_key?(index)
+ cached = node_cache[:line][index]
+ if cached
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
+ @index = cached.interval.end
+ end
+ return cached
+ end
+
+ i0, s0 = index, []
+ r1 = _nt_spaces
+ s0 << r1
+ if r1
+ s2, i2 = [], index
+ loop do
+ r3 = _nt_switches
+ if r3
+ s2 << r3
+ else
+ break
+ end
+ end
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
+ s0 << r2
+ if r2
+ r4 = _nt_text
+ s0 << r4
+ if r4
+ s5, i5 = [], index
+ loop do
+ if has_terminal?('\G[\\n]', true, index)
+ r6 = true
+ @index += 1
+ else
+ r6 = nil
+ end
+ if r6
+ s5 << r6
+ else
+ break
+ end
+ end
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
+ s0 << r5
+ end
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(Line0)
+ r0.extend(Line1)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:line][start_index] = r0
+
+ r0
+ end
+
+ def _nt_spaces
+ start_index = index
+ if node_cache[:spaces].has_key?(index)
+ cached = node_cache[:spaces][index]
+ if cached
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
+ @index = cached.interval.end
+ end
+ return cached
+ end
+
+ s0, i0 = [], index
+ loop do
+ if has_terminal?('\G[\\s]', true, index)
+ r1 = true
+ @index += 1
+ else
+ r1 = nil
+ end
+ if r1
+ s0 << r1
+ else
+ break
+ end
+ end
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+
+ node_cache[:spaces][start_index] = r0
+
+ r0
+ end
+
+ module Switches0
+ def sw
+ elements[1]
+ end
+ end
+
+ module Switches1
+ def to_tex
+ sw.to_tex
+ end
+ end
+
+ def _nt_switches
+ start_index = index
+ if node_cache[:switches].has_key?(index)
+ cached = node_cache[:switches][index]
+ if cached
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
+ @index = cached.interval.end
+ end
+ return cached
+ end
+
+ i0, s0 = index, []
+ if has_terminal?("-", false, index)
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure("-")
+ r1 = nil
+ end
+ s0 << r1
+ if r1
+ i2 = index
+ r3 = _nt_short_switch
+ if r3
+ r2 = r3
+ else
+ r4 = _nt_long_switch
+ if r4
+ r2 = r4
+ else
+ @index = i2
+ r2 = nil
+ end
+ end
+ s0 << r2
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(Switches0)
+ r0.extend(Switches1)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:switches][start_index] = r0
+
+ r0
+ end
+
+ module ShortSwitch0
+ def name
+ elements[0]
+ end
+
+ def spaces
+ elements[2]
+ end
+ end
+
+ module ShortSwitch1
+ def to_tex
+ "\\Opt{-#{name.text_value}}"
+ end
+ end
+
+ def _nt_short_switch
+ start_index = index
+ if node_cache[:short_switch].has_key?(index)
+ cached = node_cache[:short_switch][index]
+ if cached
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
+ @index = cached.interval.end
+ end
+ return cached
+ end
+
+ i0, s0 = index, []
+ if has_terminal?('\G[a-zA-Z]', true, index)
+ r1 = true
+ @index += 1
+ else
+ r1 = nil
+ end
+ s0 << r1
+ if r1
+ if has_terminal?(",", false, index)
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure(",")
+ r3 = nil
+ end
+ if r3
+ r2 = r3
+ else
+ r2 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s0 << r2
+ if r2
+ r4 = _nt_spaces
+ s0 << r4
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(ShortSwitch0)
+ r0.extend(ShortSwitch1)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:short_switch][start_index] = r0
+
+ r0
+ end
+
+ module LongSwitch0
+ end
+
+ module LongSwitch1
+ def name
+ elements[1]
+ end
+
+ def val
+ elements[2]
+ end
+
+ def spaces
+ elements[4]
+ end
+ end
+
+ module LongSwitch2
+ def to_tex
+ val.empty? ? "\\LOpt{#{quote(name.text_value)}}" : "\\LOptArg{#{quote(name.text_value)}}{#{quote(val.text_value)}}"
+ end
+ end
+
+ def _nt_long_switch
+ start_index = index
+ if node_cache[:long_switch].has_key?(index)
+ cached = node_cache[:long_switch][index]
+ if cached
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
+ @index = cached.interval.end
+ end
+ return cached
+ end
+
+ i0, s0 = index, []
+ if has_terminal?("-", false, index)
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure("-")
+ r1 = nil
+ end
+ s0 << r1
+ if r1
+ s2, i2 = [], index
+ loop do
+ if has_terminal?('\G[^,\\s=]', true, index)
+ r3 = true
+ @index += 1
+ else
+ r3 = nil
+ end
+ if r3
+ s2 << r3
+ else
+ break
+ end
+ end
+ if s2.empty?
+ @index = i2
+ r2 = nil
+ else
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
+ end
+ s0 << r2
+ if r2
+ i5, s5 = index, []
+ if has_terminal?("=", false, index)
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure("=")
+ r6 = nil
+ end
+ s5 << r6
+ if r6
+ s7, i7 = [], index
+ loop do
+ if has_terminal?('\G[^,\\s]', true, index)
+ r8 = true
+ @index += 1
+ else
+ r8 = nil
+ end
+ if r8
+ s7 << r8
+ else
+ break
+ end
+ end
+ if s7.empty?
+ @index = i7
+ r7 = nil
+ else
+ r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
+ end
+ s5 << r7
+ end
+ if s5.last
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
+ r5.extend(LongSwitch0)
+ else
+ @index = i5
+ r5 = nil
+ end
+ if r5
+ r4 = r5
+ else
+ r4 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s0 << r4
+ if r4
+ if has_terminal?(",", false, index)
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
+ @index += 1
+ else
+ terminal_parse_failure(",")
+ r10 = nil
+ end
+ if r10
+ r9 = r10
+ else
+ r9 = instantiate_node(SyntaxNode,input, index...index)
+ end
+ s0 << r9
+ if r9
+ r11 = _nt_spaces
+ s0 << r11
+ end
+ end
+ end
+ end
+ if s0.last
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+ r0.extend(LongSwitch1)
+ r0.extend(LongSwitch2)
+ else
+ @index = i0
+ r0 = nil
+ end
+
+ node_cache[:long_switch][start_index] = r0
+
+ r0
+ end
+
+ def _nt_text
+ start_index = index
+ if node_cache[:text].has_key?(index)
+ cached = node_cache[:text][index]
+ if cached
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
+ @index = cached.interval.end
+ end
+ return cached
+ end
+
+ s0, i0 = [], index
+ loop do
+ if has_terminal?('\G[^\\n]', true, index)
+ r1 = true
+ @index += 1
+ else
+ r1 = nil
+ end
+ if r1
+ s0 << r1
+ else
+ break
+ end
+ end
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
+
+ node_cache[:text][start_index] = r0
+
+ r0
+ end
+
+end
+
+class HelpGrammarParser < Treetop::Runtime::CompiledParser
+ include HelpGrammar
+end
+
diff --git a/doc/help_parse.treetop b/doc/help_parse.treetop
new file mode 100644
index 0000000..2b35c09
--- /dev/null
+++ b/doc/help_parse.treetop
@@ -0,0 +1,52 @@
+grammar HelpGrammar
+ rule line
+ spaces sws:switches* text [\n]* {
+ def to_tex(opened)
+ res = ""
+ unless sws.empty?
+ if !opened.is_open
+ res << "\\begin{description}\n"
+ opened.is_open = true
+ end
+ res << "\\item["
+ res << sws.elements.map { |s| s.to_tex }.join(",")
+ res << "] "
+ end
+ res << "\\noindent " unless text.text_value.empty?
+ res << quote(text.text_value)
+ end
+ }
+ end
+
+ rule spaces
+ [\s]*
+ end
+
+ rule switches
+ "-" sw:( short_switch / long_switch ) {
+ def to_tex
+ sw.to_tex
+ end
+ }
+ end
+
+ rule short_switch
+ name:[a-zA-Z] ","? spaces {
+ def to_tex
+ "\\Opt{-#{name.text_value}}"
+ end
+ }
+ end
+
+ rule long_switch
+ "-" name:[^,\s=]+ val:("=" [^,\s]+)? ","? spaces {
+ def to_tex
+ val.empty? ? "\\LOpt{#{quote(name.text_value)}}" : "\\LOptArg{#{quote(name.text_value)}}{#{quote(val.text_value)}}"
+ end
+ }
+ end
+
+ rule text
+ [^\n]*
+ end
+end
diff --git a/doc/jellyfish.html b/doc/jellyfish.html
new file mode 100644
index 0000000..fa9d5d0
--- /dev/null
+++ b/doc/jellyfish.html
@@ -0,0 +1,802 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!-- Manual page created with latex2man on Wed Feb 29 10:58:49 EST 2012 --
+-- Author of latex2man: Juergen.Vollmer at informatik-vollmer.de --
+-- NOTE: This file is generated, DO NOT EDIT. -->
+<html>
+<head><title>JELLYFISH</title></head>
+<body bgcolor="white">
+<h1 align=center>
+Jellyfish: A fast k-mer counter
+</h1>
+<h4 align=center>G. Marcais and C. Kingsford </h4>
+<h4 align=center>2010/10/1</h4>
+<h4 align=center>Version 1.1.4</h4>
+<p>
+<tt>Jellyfish</tt>
+is a software to count k-mers in DNA sequences.
+<p>
+<h3>Table of Contents</h3>
+<ul>
+<li><a href="#section_1">Synopsis </a></li>
+<li><a href="#section_2">Description </a>
+<ul>
+<li><a href="#section_3">Counting and merging </a></li>
+<li><a href="#section_4">Orientation </a></li>
+<li><a href="#section_5">Choosing the hash size </a></li>
+<li><a href="#section_6">Choosing the counting field size </a></li>
+</ul>
+<li><a href="#section_7">Subcommands and options </a>
+<ul>
+<li><a href="#section_8">count </a></li>
+<li><a href="#section_9">stats </a></li>
+<li><a href="#section_10">histo </a></li>
+<li><a href="#section_11">dump </a></li>
+<li><a href="#section_12">merge </a></li>
+<li><a href="#section_13">query </a></li>
+<li><a href="#section_14">qhisto </a></li>
+<li><a href="#section_15">qdump </a></li>
+<li><a href="#section_16">qmerge </a></li>
+<li><a href="#section_17">cite </a></li>
+</ul>
+<li><a href="#section_18">Version </a></li>
+<li><a href="#section_19">Bugs </a></li>
+<li><a href="#section_20">Copyright & License </a></li>
+<li><a href="#section_21">Authors </a></li>
+</ul>
+<p>
+<h2><a name="section_1">Synopsis</a></h2>
+
+<tt>jellyfish count</tt>
+[<b>-o</b><i>prefix</i>]
+[<b>-m</b><i>merlength</i>]
+[<b>-t</b><i>threads</i>]
+[<b>-s</b><i>hashsize</i>]
+[<b>--both-strands</b>]
+<i>fasta</i>
+[<i>fasta ...</i>]
+<br>
+<tt>jellyfish merge</tt>
+<i>hash1</i>
+<i>hash2</i>
+...<br>
+<tt>jellyfish dump</tt>
+<i>hash</i>
+<br>
+<tt>jellyfish stats</tt>
+<i>hash</i>
+<br>
+<tt>jellyfish histo</tt>
+[<b>-h</b><i>high</i>]
+[<b>-l</b><i>low</i>]
+[<b>-i</b><i>increment</i>]
+<i>hash</i>
+<br>
+<tt>jellyfish query</tt>
+<i>hash</i>
+<br>
+<tt>jellyfish cite</tt>
+<br>
+<p>
+Plus equivalent version for <tt>Quake</tt>
+mode: <tt>qhisto</tt>,
+<tt>qdump</tt>
+and <tt>qmerge</tt>.
+<p>
+<h2><a name="section_2">Description</a></h2>
+
+<p>
+<tt>Jellyfish</tt>
+is a k-mer counter based on a multi-threaded hash
+table implementation.
+<p>
+<h4><a name="section_3">Counting and merging</a></h4>
+
+<p>
+To count k-mers, use a command like:
+<p>
+<pre>
+jellyfish count -m 22 -o output -c 3 -s 10000000 -t 32 input.fasta
+</pre>
+<p>
+This will count the the 22-mers in input.fasta with 32 threads. The
+counter field in the hash uses only 3 bits and the hash has at least
+10 million entries.
+<p>
+The output files will be named output_0, output_1, etc. (the prefix
+is specified with the <b>-o</b>
+switch). If the hash is large enough
+(has specified by the <b>-s</b>
+switch) to fit all the k-mers, there
+will be only one output file named output_0. If the hash filled up
+before all the mers were read, the hash is dumped to disk, zeroed out
+and reading in mers resumes. Multiple intermediary files will be
+present on the disks, named output_0, output_1, etc.
+<p>
+To obtain correct results from the other sub-commands (such as histo,
+stats, etc.), the multiple output files, if any, need to be merged into one
+with the merge command. For example with the following command:
+<p>
+<pre>
+jellyfish merge -o output.jf output\_*
+</pre>
+<p>
+Should you get many intermediary output files (say hundreds), the size
+of the hash table is too small. Rerunning <tt>Jellyfish</tt>
+with a
+larger size (option <b>-s</b>)
+is probably faster than merging all the
+intermediary files.
+<p>
+<h4><a name="section_4">Orientation</a></h4>
+
+When the orientation of the sequences in the input fasta file is not
+known, e.g. in sequencing reads, using <b>--both-strands</b>
+(<b>-C</b>)
+makes the most sense.
+<p>
+For any k-mer m, its canonical representation is m itself or its
+reverse-complement, whichever comes first lexicographically. With the
+option <b>-C</b>,
+only the canonical representation of the mers are
+stored in the hash and the count value is the number of occurrences of
+both the mer and its reverse-complement.
+<p>
+<h4><a name="section_5">Choosing the hash size</a></h4>
+
+<p>
+To achieve the best performance, a minimum number of intermediary
+files should be written to disk. So the parameter <b>-s</b>
+should be
+chosen to fit as many k-mers as possible (ideally all of them) while
+still fitting in memory.
+<p>
+We consider to examples: counting mers in sequencing reads and in a
+finished genome.
+<p>
+First, suppose we count k-mers in short sequencing reads:
+there are n reads and there is an average of 1 error per reads where
+each error generates k unique mers. If the genome size is G, the
+size of the hash (option <b>-s</b>)
+to fit all k-mers at once is estimated to: $(G +
+k*n)/0.8$. The division by 0.8 compensates for the maximum usage of
+approximately $80%$ of the hash table.
+<p>
+On the other hand, when counting k-mers in an assembled sequence of
+length G, setting <b>-s</b>
+to G is appropriate.
+<p>
+As a matter of convenience, Jellyfish understands ISO suffixes for the
+size of the hash. Hence '-s 10M' stands 10 million entries while '-s
+50G' stands for 50 billion entries.
+<p>
+The actual memory usage of the hash table can be computed as
+follow. The actual size of the hash will be rounded up to the next
+power of 2: s=2^l. The parameter r is such that the maximum
+reprobe value (<b>-p</b>)
+plus one is less than 2^r. Then the memory usage per
+entry in the hash is (in bits, not bytes) 2k-l+r+1. The total memory
+usage of the hash table in bytes is: 2^l*(2k-l+r+1)/8.
+<p>
+<h4><a name="section_6">Choosing the counting field size</a></h4>
+
+To save space, the hash table supports variable length counter, i.e. a
+k-mer occurring only a few times will use a small counter, a k-mer
+occurring many times will used multiple entries in the hash.
+<p>
+Important: the size of the couting field does NOT change the result,
+it only impacts the amount of memory used. In particular, there is no
+maximum value in the hash. Even if the counting field uses 5 bits, a
+k-mer occuring 2 million times will have a value reported of 2
+million (i.e., it is not capped at 2^5).
+<p>
+The <b>-c</b>
+specify the length (in bits) of the counting field. The
+trade off is as follows: a low value will save space per entry in the
+hash but can potentially increase the number of entries used, hence
+maybe requiring a larger hash.
+<p>
+In practice, use a value for <b>-c</b>
+so that most of you k-mers
+require only 1 entry. For example, to count k-mers in a genome,
+where most of the sequence is unique, use <b>-c</b><i>1</i>
+or
+<b>-c</b><i>2</i>.
+For sequencing reads, use a value for <b>-c</b>
+large
+enough to counts up to twice the coverage. For example, if the
+coverage is 10X, choose a counter length of 5 (<b>-c</b><i>5</i>)
+as $2^5 > 20$.
+<p>
+<h2><a name="section_7">Subcommands and options</a></h2>
+
+<h4><a name="section_8">count</a></h4>
+
+Usage: jellyfish count [options] file:path+
+<p>
+Count k-mers or qmers in fasta or fastq files
+<p>
+Options (default value in (), *required):
+<dl compact>
+<dt><b>-m</b>,
+<b>--mer-len</b><i>=uint32</i>
+</dt>
+<dd> *Length of mer
+</dd>
+<dt><b>-s</b>,
+<b>--size</b><i>=uint64</i>
+</dt>
+<dd> *Hash size
+</dd>
+<dt><b>-t</b>,
+<b>--threads</b><i>=uint32</i>
+</dt>
+<dd> Number of threads (1)
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output prefix (mer_counts)
+</dd>
+<dt><b>-c</b>,
+<b>--counter-len</b><i>=Length</i>
+</dt>
+<dd> in bits Length of counting field (7)
+</dd>
+<dt><b>--out-counter-len</b><i>=Length</i>
+</dt>
+<dd> in bytes Length of counter field in output (4)
+</dd>
+<dt><b>-C</b>,<b>--both-strands</b>
+</dt>
+<dd> Count both strand, canonical representation (false)
+</dd>
+<dt><b>-p</b>,
+<b>--reprobes</b><i>=uint32</i>
+</dt>
+<dd> Maximum number of reprobes (62)
+</dd>
+<dt><b>-r</b>,<b>--raw</b>
+</dt>
+<dd> Write raw database (false)
+</dd>
+<dt><b>-q</b>,<b>--quake</b>
+</dt>
+<dd> Quake compatibility mode (false)
+</dd>
+<dt><b>--quality-start</b><i>=uint32</i>
+</dt>
+<dd> Starting ASCII for quality values (64)
+</dd>
+<dt><b>--min-quality</b><i>=uint32</i>
+</dt>
+<dd> Minimum quality. A base with lesser quality becomes an N (0)
+</dd>
+<dt><b>-L</b>,
+<b>--lower-count</b><i>=uint64</i>
+</dt>
+<dd> Don't output k-mer with count < lower-count
+</dd>
+<dt><b>-U</b>,
+<b>--upper-count</b><i>=uint64</i>
+</dt>
+<dd> Don't output k-mer with count > upper-count
+</dd>
+<dt><b>--matrix</b><i>=Matrix</i>
+</dt>
+<dd> file Hash function binary matrix
+</dd>
+<dt><b>--timing</b><i>=Timing</i>
+</dt>
+<dd> file Print timing information
+</dd>
+<dt><b>--stats</b><i>=Stats</i>
+</dt>
+<dd> file Print stats
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message
+</dd>
+<dt><b>--full-help</b>
+</dt>
+<dd> Detailed help
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version
+</dd>
+</dl>
+<p>
+<h4><a name="section_9">stats</a></h4>
+
+Usage: jellyfish stats [options] db:path
+<p>
+Statistics
+<p>
+Display some statistics about the k-mers in the hash:
+<p>
+Unique: Number of k-mers which occur only once.
+Distinct: Number of k-mers, not counting multiplicity.
+Total: Number of k-mers, including multiplicity.
+Max_count: Maximum number of occurrence of a k-mer.
+<p>
+Options (default value in (), *required):
+<dl compact>
+<dt><b>-L</b>,
+<b>--lower-count</b><i>=uint64</i>
+</dt>
+<dd> Don't consider k-mer with count < lower-count
+</dd>
+<dt><b>-U</b>,
+<b>--upper-count</b><i>=uint64</i>
+</dt>
+<dd> Don't consider k-mer with count > upper-count
+</dd>
+<dt><b>-v</b>,<b>--verbose</b>
+</dt>
+<dd> Verbose (false)
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message
+</dd>
+<dt><b>--full-help</b>
+</dt>
+<dd> Detailed help
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version
+</dd>
+</dl>
+<p>
+<h4><a name="section_10">histo</a></h4>
+
+Usage: jellyfish histo [options] db:path
+<p>
+Create an histogram of k-mer occurrences
+<p>
+Create an histogram with the number of k-mers having a given
+count. In bucket 'i' are tallied the k-mers which have a count 'c'
+satisfying 'low+i*inc <= c < low+(i+1)*inc'. Buckets in the output are
+labeled by the low end point (low+i*inc).
+<p>
+The last bucket in the output behaves as a catchall: it tallies all
+k-mers with a count greater or equal to the low end point of this
+bucket.
+<p>
+Options (default value in (), *required):
+<dl compact>
+<dt><b>-l</b>,
+<b>--low</b><i>=uint64</i>
+</dt>
+<dd> Low count value of histogram (1)
+</dd>
+<dt><b>-h</b>,
+<b>--high</b><i>=uint64</i>
+</dt>
+<dd> High count value of histogram (10000)
+</dd>
+<dt><b>-i</b>,
+<b>--increment</b><i>=uint64</i>
+</dt>
+<dd> Increment value for buckets (1)
+</dd>
+<dt><b>-t</b>,
+<b>--threads</b><i>=uint32</i>
+</dt>
+<dd> Number of threads (1)
+</dd>
+<dt><b>-f</b>,<b>--full</b>
+</dt>
+<dd> Full histo. Don't skip count 0. (false)
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file
+</dd>
+<dt><b>-v</b>,<b>--verbose</b>
+</dt>
+<dd> Output information (false)
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage
+</dd>
+<dt><b>--help</b>
+</dt>
+<dd> This message
+</dd>
+<dt><b>--full-help</b>
+</dt>
+<dd> Detailed help
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version
+</dd>
+</dl>
+<p>
+<h4><a name="section_11">dump</a></h4>
+
+Usage: jellyfish dump [options] db:path
+<p>
+Dump k-mer counts
+<p>
+By default, dump in a fasta format where the header is the count and
+the sequence is the sequence of the k-mer. The column format is a 2
+column output: k-mer count.
+<p>
+Options (default value in (), *required):
+<dl compact>
+<dt><b>-c</b>,<b>--column</b>
+</dt>
+<dd> Column format (false)
+</dd>
+<dt><b>-t</b>,<b>--tab</b>
+</dt>
+<dd> Tab separator (false)
+</dd>
+<dt><b>-L</b>,
+<b>--lower-count</b><i>=uint64</i>
+</dt>
+<dd> Don't output k-mer with count < lower-count
+</dd>
+<dt><b>-U</b>,
+<b>--upper-count</b><i>=uint64</i>
+</dt>
+<dd> Don't output k-mer with count > upper-count
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version
+</dd>
+</dl>
+<p>
+<h4><a name="section_12">merge</a></h4>
+
+Usage: jellyfish merge [options] input:string+
+<p>
+Merge jellyfish databases
+<p>
+Options (default value in (), *required):
+<dl compact>
+<dt><b>-s</b>,
+<b>--buffer-size</b><i>=Buffer</i>
+</dt>
+<dd> length Length in bytes of input buffer (10000000)
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file (mer_counts_merged.jf)
+</dd>
+<dt><b>--out-counter-len</b><i>=uint32</i>
+</dt>
+<dd> Length (in bytes) of counting field in output (4)
+</dd>
+<dt><b>--out-buffer-size</b><i>=uint64</i>
+</dt>
+<dd> Size of output buffer per thread (10000000)
+</dd>
+<dt><b>-v</b>,<b>--verbose</b>
+</dt>
+<dd> Be verbose (false)
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version
+</dd>
+</dl>
+<p>
+<h4><a name="section_13">query</a></h4>
+
+Usage: jellyfish query [options] db:path
+<p>
+Query from a compacted database
+<p>
+Query a hash. It reads k-mers from the standard input and write the counts on the standard output.
+<p>
+Options (default value in (), *required):
+<dl compact>
+<dt><b>-C</b>,<b>--both-strands</b>
+</dt>
+<dd> Both strands (false)
+</dd>
+<dt><b>-c</b>,<b>--cary-bit</b>
+</dt>
+<dd> Value field as the cary bit information (false)
+</dd>
+<dt><b>-i</b>,
+<b>--input</b><i>=file</i>
+</dt>
+<dd> Input file
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=file</i>
+</dt>
+<dd> Output file
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version
+</dd>
+</dl>
+<p>
+<h4><a name="section_14">qhisto</a></h4>
+
+Usage: jellyfish qhisto [options] db:string
+<p>
+Create an histogram of k-mer occurences
+<p>
+Options (default value in (), *required):
+<dl compact>
+<dt><b>-l</b>,
+<b>--low</b><i>=double</i>
+</dt>
+<dd> Low count value of histogram (0.0)
+</dd>
+<dt><b>-h</b>,
+<b>--high</b><i>=double</i>
+</dt>
+<dd> High count value of histogram (10000.0)
+</dd>
+<dt><b>-i</b>,
+<b>--increment</b><i>=double</i>
+</dt>
+<dd> Increment value for buckets (1.0)
+</dd>
+<dt><b>-f</b>,<b>--full</b>
+</dt>
+<dd> Full histo. Don't skip count 0. (false)
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage
+</dd>
+<dt><b>--help</b>
+</dt>
+<dd> This message
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version
+</dd>
+</dl>
+<p>
+<h4><a name="section_15">qdump</a></h4>
+
+Usage: jellyfish qdump [options] db:path
+<p>
+Dump k-mer from a qmer database
+<p>
+By default, dump in a fasta format where the header is the count and
+the sequence is the sequence of the k-mer. The column format is a 2
+column output: k-mer count.
+<p>
+Options (default value in (), *required):
+<dl compact>
+<dt><b>-c</b>,<b>--column</b>
+</dt>
+<dd> Column format (false)
+</dd>
+<dt><b>-t</b>,<b>--tab</b>
+</dt>
+<dd> Tab separator (false)
+</dd>
+<dt><b>-L</b>,
+<b>--lower-count</b><i>=double</i>
+</dt>
+<dd> Don't output k-mer with count < lower-count
+</dd>
+<dt><b>-U</b>,
+<b>--upper-count</b><i>=double</i>
+</dt>
+<dd> Don't output k-mer with count > upper-count
+</dd>
+<dt><b>-v</b>,<b>--verbose</b>
+</dt>
+<dd> Be verbose (false)
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version
+</dd>
+</dl>
+<p>
+<h4><a name="section_16">qmerge</a></h4>
+
+Usage: jellyfish merge [options] db:string+
+<p>
+Merge quake databases
+<p>
+Options (default value in (), *required):
+<dl compact>
+<dt><b>-s</b>,
+<b>--size</b><i>=uint64</i>
+</dt>
+<dd> *Merged hash table size
+</dd>
+<dt><b>-m</b>,
+<b>--mer-len</b><i>=uint32</i>
+</dt>
+<dd> *Mer length
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file (merged.jf)
+</dd>
+<dt><b>-p</b>,
+<b>--reprobes</b><i>=uint32</i>
+</dt>
+<dd> Maximum number of reprobes (62)
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message
+</dd>
+<dt><b>--full-help</b>
+</dt>
+<dd> Detailed help
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version
+</dd>
+</dl>
+<p>
+<h4><a name="section_17">cite</a></h4>
+
+Usage: jellyfish cite [options]
+<p>
+How to cite Jellyfish's paper
+<p>
+Citation of paper
+<p>
+Options (default value in (), *required):
+<dl compact>
+<dt><b>-b</b>,<b>--bibtex</b>
+</dt>
+<dd> Bibtex format (false)
+</dd>
+<dt><b>-o</b>,
+<b>--output</b><i>=string</i>
+</dt>
+<dd> Output file
+</dd>
+<dt><b>--usage</b>
+</dt>
+<dd> Usage
+</dd>
+<dt><b>-h</b>,<b>--help</b>
+</dt>
+<dd> This message
+</dd>
+<dt><b>-V</b>,<b>--version</b>
+</dt>
+<dd> Version
+</dd>
+</dl>
+<p>
+<h2><a name="section_18">Version</a></h2>
+
+<p>
+Version: 1.1.4 of 2010/10/1
+<p>
+<h2><a name="section_19">Bugs</a></h2>
+
+<p>
+<ul compact>
+<li><tt>jellyfish merge</tt> has not been parallelized and is
+relatively slow.
+</li>
+<li>The hash table does not grow in memory automatically and
+<tt>jellyfish merge</tt>
+is not called automatically on the
+intermediary files (if any).
+</li>
+</ul>
+<p>
+<h2><a name="section_20">Copyright & License</a></h2>
+
+<dl compact>
+<dt>Copyright</dt>
+<dd> © 2010, Guillaume Marcais <a href ="mailto:guillaume at marcais.net"><tt>guillaume at marcais.net</tt></a>
+and Carl Kingsford <a href ="mailto:carlk at umiacs.umd.edu"><tt>carlk at umiacs.umd.edu</tt></a>.
+<p>
+</dd>
+<dt>License</dt>
+<dd> This program is free software: you can redistribute it
+and/or modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation, either version 3 of
+the License, or (at your option) any later version. <br>
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details. <br>
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see
+<a href ="http://www.gnu.org/licenses/"><tt>http://www.gnu.org/licenses/</tt></a>.
+</dd>
+</dl>
+<p>
+<h2><a name="section_21">Authors</a></h2>
+
+Guillaume Marcais <br>
+
+University of Maryland <br>
+
+<a href ="mailto:gmarcais at umd.edu"><tt>gmarcais at umd.edu</tt></a>
+<p>
+Carl Kingsford <br>
+
+University of Maryland <br>
+
+<a href ="mailto:carlk at umiacs.umd.edu"><tt>carlk at umiacs.umd.edu</tt></a>
+<p>
+</body>
+</html>
+<!-- NOTE: This file is generated, DO NOT EDIT. -->
diff --git a/doc/jellyfish.tex b/doc/jellyfish.tex
new file mode 100644
index 0000000..c329e11
--- /dev/null
+++ b/doc/jellyfish.tex
@@ -0,0 +1,205 @@
+\documentclass[english]{article}
+\usepackage[latin1]{inputenc}
+\usepackage{babel}
+\usepackage{verbatim}
+
+%% do we have the hyperref package?
+\IfFileExists{hyperref.sty}{
+ \usepackage[bookmarksopen,bookmarksnumbered]{hyperref}
+}{}
+
+%% do we have the fancyhdr package?
+\IfFileExists{fancyhdr.sty}{
+\usepackage[fancyhdr]{latex2man}
+}{
+%% do we have the fancyheadings package?
+\IfFileExists{fancyheadings.sty}{
+\usepackage[fancy]{latex2man}
+}{
+\usepackage[nofancy]{latex2man}
+\message{no fancyhdr or fancyheadings package present, discard it}
+}}
+\usepackage[letterpaper]{geometry}
+
+\newcommand{\ddash}[1]{-\,-#1}
+\newcommand{\LOpt}[1]{\Opt{\ddash{#1}}}
+\newcommand{\LoOpt}[1]{\oOpt{\ddash{#1}}}
+\newcommand{\LOptArg}[2]{\OptArg{\ddash{#1}}{#2}}
+\newcommand{\LoOptArg}[2]{\oOptArg{\ddash{#1}}{#2}}
+\newcommand{\LoOptoArg}[2]{\oOptoArg{\ddash{#1}}{#2}}
+
+\setVersion{1.1.4}
+\setDate{2010/10/1}
+
+\begin{document}
+
+\begin{Name}{1}{jellyfish}{G. Marcais and C. Kingsford}{k-mer counter}{Jellyfish: A fast k-mer counter}
+
+\Prog{Jellyfish} is a software to count $k$-mers in DNA sequences.
+
+\end{Name}
+
+\section{Synopsis}
+\Prog{jellyfish count} \oOptArg{-o}{prefix} \oOptArg{-m}{merlength} \oOptArg{-t}{threads} \oOptArg{-s}{hashsize} \LoOpt{both-strands} \Arg{fasta} \oArg{fasta \Dots} \\
+\Prog{jellyfish merge} \Arg{hash1} \Arg{hash2} \Dots \\
+\Prog{jellyfish dump} \Arg{hash} \\
+\Prog{jellyfish stats} \Arg{hash} \\
+\Prog{jellyfish histo} \oOptArg{-h}{high} \oOptArg{-l}{low} \oOptArg{-i}{increment} \Arg{hash} \\
+\Prog{jellyfish query} \Arg{hash} \\
+\Prog{jellyfish cite} \\
+
+
+Plus equivalent version for \Prog{Quake} mode: \Prog{qhisto}, \Prog{qdump} and \Prog{qmerge}.
+
+\section{Description}
+
+\Prog{Jellyfish} is a $k$-mer counter based on a multi-threaded hash
+table implementation.
+
+\subsection{Counting and merging}
+
+To count $k$-mers, use a command like:
+
+\begin{verbatim}
+jellyfish count -m 22 -o output -c 3 -s 10000000 -t 32 input.fasta
+\end{verbatim}
+
+This will count the the 22-mers in input.fasta with 32 threads. The
+counter field in the hash uses only 3 bits and the hash has at least
+10 million entries.
+
+The output files will be named output\_0, output\_1, etc. (the prefix
+is specified with the \Opt{-o} switch). If the hash is large enough
+(has specified by the \Opt{-s} switch) to fit all the $k$-mers, there
+will be only one output file named output\_0. If the hash filled up
+before all the mers were read, the hash is dumped to disk, zeroed out
+and reading in mers resumes. Multiple intermediary files will be
+present on the disks, named output\_0, output\_1, etc.
+
+To obtain correct results from the other sub-commands (such as histo,
+stats, etc.), the multiple output files, if any, need to be merged into one
+with the merge command. For example with the following command:
+
+\begin{verbatim}
+jellyfish merge -o output.jf output\_*
+\end{verbatim}
+
+Should you get many intermediary output files (say hundreds), the size
+of the hash table is too small. Rerunning \Prog{Jellyfish} with a
+larger size (option \Opt{-s}) is probably faster than merging all the
+intermediary files.
+
+\subsection{Orientation}
+When the orientation of the sequences in the input fasta file is not
+known, e.g. in sequencing reads, using \LOpt{both-strands} (\Opt{-C})
+makes the most sense.
+
+For any $k$-mer $m$, its canonical representation is $m$ itself or its
+reverse-complement, whichever comes first lexicographically. With the
+option \Opt{-C}, only the canonical representation of the mers are
+stored in the hash and the count value is the number of occurrences of
+both the mer and its reverse-complement.
+
+
+\subsection{Choosing the hash size}
+
+To achieve the best performance, a minimum number of intermediary
+files should be written to disk. So the parameter \Opt{-s} should be
+chosen to fit as many $k$-mers as possible (ideally all of them) while
+still fitting in memory.
+
+We consider to examples: counting mers in sequencing reads and in a
+finished genome.
+
+First, suppose we count $k$-mers in short sequencing reads:
+there are $n$ reads and there is an average of 1 error per reads where
+each error generates $k$ unique mers. If the genome size is $G$, the
+size of the hash (option \Opt{-s}) to fit all $k$-mers at once is estimated to: $(G +
+k*n)/0.8$. The division by $0.8$ compensates for the maximum usage of
+approximately $80\%$ of the hash table.
+
+On the other hand, when counting $k$-mers in an assembled sequence of
+length $G$, setting \Opt{-s} to $G$ is appropriate.
+
+As a matter of convenience, Jellyfish understands ISO suffixes for the
+size of the hash. Hence '-s 10M' stands 10 million entries while '-s
+50G' stands for 50 billion entries.
+
+The actual memory usage of the hash table can be computed as
+follow. The actual size of the hash will be rounded up to the next
+power of 2: $s=2^l$. The parameter $r$ is such that the maximum
+reprobe value (\Opt{-p}) plus one is less than $2^r$. Then the memory usage per
+entry in the hash is (in bits, not bytes) $2k-l+r+1$. The total memory
+usage of the hash table in bytes is: $2^l*(2k-l+r+1)/8$.
+
+\subsection{Choosing the counting field size}
+To save space, the hash table supports variable length counter, i.e. a
+$k$-mer occurring only a few times will use a small counter, a $k$-mer
+occurring many times will used multiple entries in the hash.
+
+Important: the size of the couting field does NOT change the result,
+it only impacts the amount of memory used. In particular, there is no
+maximum value in the hash. Even if the counting field uses 5 bits, a
+$k$-mer occuring 2 million times will have a value reported of 2
+million (i.e., it is not capped at $2^5$).
+
+The \Opt{-c} specify the length (in bits) of the counting field. The
+trade off is as follows: a low value will save space per entry in the
+hash but can potentially increase the number of entries used, hence
+maybe requiring a larger hash.
+
+In practice, use a value for \Opt{-c} so that most of you $k$-mers
+require only 1 entry. For example, to count $k$-mers in a genome,
+where most of the sequence is unique, use \OptArg{-c}{1} or
+\OptArg{-c}{2}. For sequencing reads, use a value for \Opt{-c} large
+enough to counts up to twice the coverage. For example, if the
+coverage is 10X, choose a counter length of $5$ (\OptArg{-c}{5}) as $2^5 > 20$.
+
+
+\section{Subcommands and options}
+include(options.tex)
+
+\section{Version}
+
+Version: \Version\ of \Date
+
+\section{Bugs}
+
+\begin{itemize}
+\item \Prog{jellyfish merge} has not been parallelized and is
+ relatively slow.
+\item The hash table does not grow in memory automatically and
+ \Prog{jellyfish merge} is not called automatically on the
+ intermediary files (if any).
+\end{itemize}
+
+\section{Copyright \& License}
+\begin{description}
+\item[Copyright] \copyright\ 2010, Guillaume Marcais \Email{guillaume at marcais.net} and Carl Kingsford \Email{carlk at umiacs.umd.edu}.
+
+\item[License] This program is free software: you can redistribute it
+ and/or modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, either version 3 of
+ the License, or (at your option) any later version. \\
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details. \\
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see
+ \URL{http://www.gnu.org/licenses/}.
+\end{description}
+
+\section{Authors}
+\noindent
+Guillaume Marcais \\
+University of Maryland \\
+\Email{gmarcais at umd.edu}
+
+\noindent
+Carl Kingsford \\
+University of Maryland \\
+\Email{carlk at umiacs.umd.edu}
+
+\LatexManEnd
+\end{document}
diff --git a/doc/option_to_tex b/doc/option_to_tex
new file mode 100644
index 0000000..97dad8d
--- /dev/null
+++ b/doc/option_to_tex
@@ -0,0 +1,35 @@
+#! /usr/bin/env ruby
+
+exit 1 if ARGV[0].nil?
+
+require 'rubygems'
+require 'treetop'
+
+
+def quote(str)
+ str.gsub(/_/, "\\_")
+end
+require 'help_parse.rb'
+
+
+class IsOpen
+ attr_accessor :is_open
+ def initialize
+ @is_open = false
+ end
+end
+opened = IsOpen.new
+
+
+parser = HelpGrammarParser.new
+open(ARGV[0]) { |fd|
+ fd.each { |l|
+ r = parser.parse(l)
+ if r.nil?
+ raise "Got nil for: #{l}"
+ else
+ puts r.to_tex(opened)
+ end
+ }
+ puts("\\end{description}") if opened.is_open
+}
diff --git a/doc/options.tex b/doc/options.tex
new file mode 100644
index 0000000..f9e4532
--- /dev/null
+++ b/doc/options.tex
@@ -0,0 +1,210 @@
+\subsection{count}
+\noindent Usage: jellyfish count [options] file:path+
+
+\noindent Count k-mers or qmers in fasta or fastq files
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-m},\LOptArg{mer-len}{=uint32}] \noindent *Length of mer
+\item[\Opt{-s},\LOptArg{size}{=uint64}] \noindent *Hash size
+\item[\Opt{-t},\LOptArg{threads}{=uint32}] \noindent Number of threads (1)
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output prefix (mer\_counts)
+\item[\Opt{-c},\LOptArg{counter-len}{=Length}] \noindent in bits Length of counting field (7)
+\item[\LOptArg{out-counter-len}{=Length}] \noindent in bytes Length of counter field in output (4)
+\item[\Opt{-C},\LOpt{both-strands}] \noindent Count both strand, canonical representation (false)
+\item[\Opt{-p},\LOptArg{reprobes}{=uint32}] \noindent Maximum number of reprobes (62)
+\item[\Opt{-r},\LOpt{raw}] \noindent Write raw database (false)
+\item[\Opt{-q},\LOpt{quake}] \noindent Quake compatibility mode (false)
+\item[\LOptArg{quality-start}{=uint32}] \noindent Starting ASCII for quality values (64)
+\item[\LOptArg{min-quality}{=uint32}] \noindent Minimum quality. A base with lesser quality becomes an N (0)
+\item[\Opt{-L},\LOptArg{lower-count}{=uint64}] \noindent Don't output k-mer with count < lower-count
+\item[\Opt{-U},\LOptArg{upper-count}{=uint64}] \noindent Don't output k-mer with count > upper-count
+\item[\LOptArg{matrix}{=Matrix}] \noindent file Hash function binary matrix
+\item[\LOptArg{timing}{=Timing}] \noindent file Print timing information
+\item[\LOptArg{stats}{=Stats}] \noindent file Print stats
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\LOpt{full-help}] \noindent Detailed help
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{stats}
+\noindent Usage: jellyfish stats [options] db:path
+
+\noindent Statistics
+
+\noindent Display some statistics about the k-mers in the hash:
+
+\noindent Unique: Number of k-mers which occur only once.
+\noindent Distinct: Number of k-mers, not counting multiplicity.
+\noindent Total: Number of k-mers, including multiplicity.
+\noindent Max\_count: Maximum number of occurrence of a k-mer.
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-L},\LOptArg{lower-count}{=uint64}] \noindent Don't consider k-mer with count < lower-count
+\item[\Opt{-U},\LOptArg{upper-count}{=uint64}] \noindent Don't consider k-mer with count > upper-count
+\item[\Opt{-v},\LOpt{verbose}] \noindent Verbose (false)
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\LOpt{full-help}] \noindent Detailed help
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{histo}
+\noindent Usage: jellyfish histo [options] db:path
+
+\noindent Create an histogram of k-mer occurrences
+
+\noindent Create an histogram with the number of k-mers having a given
+\noindent count. In bucket 'i' are tallied the k-mers which have a count 'c'
+\noindent satisfying 'low+i*inc <= c < low+(i+1)*inc'. Buckets in the output are
+\noindent labeled by the low end point (low+i*inc).
+
+\noindent The last bucket in the output behaves as a catchall: it tallies all
+\noindent k-mers with a count greater or equal to the low end point of this
+\noindent bucket.
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-l},\LOptArg{low}{=uint64}] \noindent Low count value of histogram (1)
+\item[\Opt{-h},\LOptArg{high}{=uint64}] \noindent High count value of histogram (10000)
+\item[\Opt{-i},\LOptArg{increment}{=uint64}] \noindent Increment value for buckets (1)
+\item[\Opt{-t},\LOptArg{threads}{=uint32}] \noindent Number of threads (1)
+\item[\Opt{-f},\LOpt{full}] \noindent Full histo. Don't skip count 0. (false)
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file
+\item[\Opt{-v},\LOpt{verbose}] \noindent Output information (false)
+\item[\LOpt{usage}] \noindent Usage
+\item[\LOpt{help}] \noindent This message
+\item[\LOpt{full-help}] \noindent Detailed help
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{dump}
+\noindent Usage: jellyfish dump [options] db:path
+
+\noindent Dump k-mer counts
+
+\noindent By default, dump in a fasta format where the header is the count and
+\noindent the sequence is the sequence of the k-mer. The column format is a 2
+\noindent column output: k-mer count.
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-c},\LOpt{column}] \noindent Column format (false)
+\item[\Opt{-t},\LOpt{tab}] \noindent Tab separator (false)
+\item[\Opt{-L},\LOptArg{lower-count}{=uint64}] \noindent Don't output k-mer with count < lower-count
+\item[\Opt{-U},\LOptArg{upper-count}{=uint64}] \noindent Don't output k-mer with count > upper-count
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{merge}
+\noindent Usage: jellyfish merge [options] input:string+
+
+\noindent Merge jellyfish databases
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-s},\LOptArg{buffer-size}{=Buffer}] \noindent length Length in bytes of input buffer (10000000)
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file (mer\_counts\_merged.jf)
+\item[\LOptArg{out-counter-len}{=uint32}] \noindent Length (in bytes) of counting field in output (4)
+\item[\LOptArg{out-buffer-size}{=uint64}] \noindent Size of output buffer per thread (10000000)
+\item[\Opt{-v},\LOpt{verbose}] \noindent Be verbose (false)
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{query}
+\noindent Usage: jellyfish query [options] db:path
+
+\noindent Query from a compacted database
+
+\noindent Query a hash. It reads k-mers from the standard input and write the counts on the standard output.
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-C},\LOpt{both-strands}] \noindent Both strands (false)
+\item[\Opt{-c},\LOpt{cary-bit}] \noindent Value field as the cary bit information (false)
+\item[\Opt{-i},\LOptArg{input}{=file}] \noindent Input file
+\item[\Opt{-o},\LOptArg{output}{=file}] \noindent Output file
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{qhisto}
+\noindent Usage: jellyfish qhisto [options] db:string
+
+\noindent Create an histogram of k-mer occurences
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-l},\LOptArg{low}{=double}] \noindent Low count value of histogram (0.0)
+\item[\Opt{-h},\LOptArg{high}{=double}] \noindent High count value of histogram (10000.0)
+\item[\Opt{-i},\LOptArg{increment}{=double}] \noindent Increment value for buckets (1.0)
+\item[\Opt{-f},\LOpt{full}] \noindent Full histo. Don't skip count 0. (false)
+\item[\LOpt{usage}] \noindent Usage
+\item[\LOpt{help}] \noindent This message
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{qdump}
+\noindent Usage: jellyfish qdump [options] db:path
+
+\noindent Dump k-mer from a qmer database
+
+\noindent By default, dump in a fasta format where the header is the count and
+\noindent the sequence is the sequence of the k-mer. The column format is a 2
+\noindent column output: k-mer count.
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-c},\LOpt{column}] \noindent Column format (false)
+\item[\Opt{-t},\LOpt{tab}] \noindent Tab separator (false)
+\item[\Opt{-L},\LOptArg{lower-count}{=double}] \noindent Don't output k-mer with count < lower-count
+\item[\Opt{-U},\LOptArg{upper-count}{=double}] \noindent Don't output k-mer with count > upper-count
+\item[\Opt{-v},\LOpt{verbose}] \noindent Be verbose (false)
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{qmerge}
+\noindent Usage: jellyfish merge [options] db:string+
+
+\noindent Merge quake databases
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-s},\LOptArg{size}{=uint64}] \noindent *Merged hash table size
+\item[\Opt{-m},\LOptArg{mer-len}{=uint32}] \noindent *Mer length
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file (merged.jf)
+\item[\Opt{-p},\LOptArg{reprobes}{=uint32}] \noindent Maximum number of reprobes (62)
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\LOpt{full-help}] \noindent Detailed help
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
+\subsection{cite}
+\noindent Usage: jellyfish cite [options]
+
+\noindent How to cite Jellyfish's paper
+
+\noindent Citation of paper
+
+\noindent Options (default value in (), *required):
+\begin{description}
+\item[\Opt{-b},\LOpt{bibtex}] \noindent Bibtex format (false)
+\item[\Opt{-o},\LOptArg{output}{=string}] \noindent Output file
+\item[\LOpt{usage}] \noindent Usage
+\item[\Opt{-h},\LOpt{help}] \noindent This message
+\item[\Opt{-V},\LOpt{version}] \noindent Version
+\end{description}
+
diff --git a/doc/transfile b/doc/transfile
new file mode 100644
index 0000000..964dbde
--- /dev/null
+++ b/doc/transfile
@@ -0,0 +1,19 @@
+my @opt1_types = ('Opt', 'oOpt');
+for my $otype (@opt1_types) {
+ $manMacro1a{'L' . $otype} = $manMacro1a{$otype} . '--';
+ $manMacro1b{'L' . $otype} = $manMacro1b{$otype};
+
+ $htmlMacro1a{'L' . $otype} = $htmlMacro1a{$otype} . '--';
+ $htmlMacro1b{'L' . $otype} = $htmlMacro1b{$otype};
+}
+
+my @opt2_types = ('OptArg', 'oOptArg', 'OptoArg', 'oOptoArg');
+for my $otype (@opt2_types) {
+ $manMacro2a{'L' . $otype} = $manMacro2a{$otype} . '--';
+ $manMacro2b{'L' . $otype} = $manMacro2b{$otype};
+ $manMacro2c{'L' . $otype} = $manMacro2c{$otype};
+
+ $htmlMacro2a{'L' . $otype} = $htmlMacro2a{$otype} . '--';
+ $htmlMacro2b{'L' . $otype} = $htmlMacro2b{$otype};
+ $htmlMacro2c{'L' . $otype} = $htmlMacro2c{$otype};
+}
diff --git a/examples/README b/examples/README
new file mode 100644
index 0000000..0be53be
--- /dev/null
+++ b/examples/README
@@ -0,0 +1,15 @@
+What is it?
+===========
+
+Here are some examples on how to use the Jellyfish library and
+potentially useful programs to compute data from Jellyfish
+output. Each directory is an independent project which relies on
+Jellyfish between installed and is available with pkg-config. Meaning
+'pkg-config --print-provides jellyfish-2.0' returns something like
+'jellyfish-2.0 = 2.1.1'.
+
+Disclaimer
+==========
+
+Notice that the code in these directory is not as well tested as the
+rest of the Jellyfish code. It should work but no guaranteed is made.
diff --git a/examples/count_in_file/Makefile b/examples/count_in_file/Makefile
new file mode 100644
index 0000000..4b6358c
--- /dev/null
+++ b/examples/count_in_file/Makefile
@@ -0,0 +1,7 @@
+CC = g++
+CXXFLAGS = $(shell pkg-config --cflags jellyfish-2.0) -std=c++0x -Wall -O3
+LDFLAGS = $(shell pkg-config --libs jellyfish-2.0) -Wl,--rpath=$(shell pkg-config --libs-only-L jellyfish-2.0 | sed -e 's/-L//g')
+
+all: count_in_file
+clean:
+ rm -f *.o count_in_file
diff --git a/examples/count_in_file/README b/examples/count_in_file/README
new file mode 100644
index 0000000..139df1b
--- /dev/null
+++ b/examples/count_in_file/README
@@ -0,0 +1,40 @@
+What is it?
+===========
+
+Given a number of jellyfish databases, it outputs for all the k-mers
+(in the union of the database) the number of occurrences in each of
+the database.
+
+LIMITATION: all the database must have been created with the same size
+parameter to Jellyfish. It is adivsed to use the --disk switch of
+'jellyfish count' to ensure that all the database are created with the
+same size. For example: jellyfish count -s 100M --disk ...
+
+The output is a column format where the first column is
+the k-mer and the remaining columns are the counts in each of the
+databases, in the same order as given on the command line.
+
+For example:
+
+$ ./count_in_file db1.jf db2.jf
+GCCACGACTCGTGCA 1 0
+CAAGCTGTGTGGCCG 0 2
+CATAGAAATCGATAA 3 5
+TACTATATAAGCAAA 2 0
+...
+
+Some details
+============
+
+The Jellyfish database are sorted list of k-mers. The sorting order is
+based on the hash function (a random binary matrix). The program works
+similarly to how merging sorted lists is done, but instead of summing
+the count of each k-mers, it displays the count in each of the sorted
+list.
+
+Because all the files must be sorted according to the same criteria,
+the size of the hash (and therefore the hash function) must be the
+same for all the input files. See the LIMITATION paragraph above to
+run Jellyfish properly. Note that the size passed to 'jellyfish count'
+is NOT a limit on the number k-mers in the file (only a limit on the
+number of mers in memory).
diff --git a/examples/count_in_file/count_in_file.cc b/examples/count_in_file/count_in_file.cc
new file mode 100644
index 0000000..095204f
--- /dev/null
+++ b/examples/count_in_file/count_in_file.cc
@@ -0,0 +1,158 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <memory>
+#include <string>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/mer_heap.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+#include <jellyfish/cpp_array.hpp>
+
+// From a list of jellyfish database, output for each mers how many
+// times it occurs in each db. It is very similar to merging (and the
+// code is copied/adapted from jellyfish/merge_files.cc).
+
+namespace err = jellyfish::err;
+
+using jellyfish::file_header;
+using jellyfish::RectangularBinaryMatrix;
+using jellyfish::mer_dna;
+using jellyfish::cpp_array;
+typedef std::unique_ptr<binary_reader> binary_reader_ptr;
+typedef std::unique_ptr<text_reader> text_reader_ptr;
+
+struct file_info {
+ std::ifstream is;
+ file_header header;
+
+ file_info(const char* path) :
+ is(path),
+ header(is)
+ { }
+};
+
+
+struct common_info {
+ unsigned int key_len;
+ size_t max_reprobe_offset;
+ size_t size;
+ unsigned int out_counter_len;
+ std::string format;
+ RectangularBinaryMatrix matrix;
+
+ common_info(RectangularBinaryMatrix&& m) : matrix(std::move(m))
+ { }
+};
+
+common_info read_headers(int argc, char* input_files[], cpp_array<file_info>& files) {
+ // Read first file
+ files.init(0, input_files[0]);
+ if(!files[0].is.good())
+ err::die(err::msg() << "Failed to open input file '" << input_files[0] << "'");
+
+ file_header& h = files[0].header;
+ common_info res(h.matrix());
+ res.key_len = h.key_len();
+ res.max_reprobe_offset = h.max_reprobe_offset();
+ res.size = h.size();
+ res.format = h.format();
+ size_t reprobes[h.max_reprobe() + 1];
+ h.get_reprobes(reprobes);
+ res.out_counter_len = h.counter_len();
+
+ // Other files must match
+ for(int i = 1; i < argc; i++) {
+ files.init(i, input_files[i]);
+ file_header& nh = files[i].header;
+ if(!files[i].is.good())
+ err::die(err::msg() << "Failed to open input file '" << input_files[i] << "'");
+ if(res.format != nh.format())
+ err::die(err::msg() << "Can't compare files with different formats (" << res.format << ", " << nh.format() << ")");
+ if(res.key_len != nh.key_len())
+ err::die(err::msg() << "Can't compare hashes of different key lengths (" << res.key_len << ", " << nh.key_len() << ")");
+ if(res.max_reprobe_offset != nh.max_reprobe_offset())
+ err::die("Can't compare hashes with different reprobing strategies");
+ if(res.size != nh.size())
+ err::die(err::msg() << "Can't compare hash with different size (" << res.size << ", " << nh.size() << ")");
+ if(res.matrix != nh.matrix())
+ err::die("Can't compare hash with different hash function");
+ }
+
+ return res;
+}
+
+template<typename reader_type>
+void output_counts(cpp_array<file_info>& files) {
+ cpp_array<reader_type> readers(files.size());
+ typedef jellyfish::mer_heap::heap<mer_dna, reader_type> heap_type;
+ typedef typename heap_type::const_item_t heap_item;
+ heap_type heap(files.size());
+
+ // Prime heap
+ for(size_t i = 0; i < files.size(); ++i) {
+ readers.init(i, files[i].is, &files[i].header);
+ if(readers[i].next())
+ heap.push(readers[i]);
+ }
+
+ heap_item head = heap.head();
+ mer_dna key;
+ const int num_files = files.size();
+ const reader_type* base = &readers[0];
+ uint64_t counts[num_files];
+ while(heap.is_not_empty()) {
+ key = head->key_;
+ memset(counts, '\0', sizeof(uint64_t) * num_files);
+ do {
+ counts[head->it_ - base] = head->val_;
+ heap.pop();
+ if(head->it_->next())
+ heap.push(*head->it_);
+ head = heap.head();
+ } while(head->key_ == key && heap.is_not_empty());
+ std::cout << key;
+ for(int i = 0; i < num_files; ++i)
+ std::cout << " " << counts[i];
+ std::cout << "\n";
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ // Check number of input files
+ if(argc < 3)
+ err::die(err::msg() << "Usage: " << argv[0] << " file1 file2 ...");
+
+ // Read the header of each input files and do sanity checks.
+ cpp_array<file_info> files(argc - 1);
+ common_info cinfo = read_headers(argc - 1, argv + 1, files);
+ mer_dna::k(cinfo.key_len / 2);
+
+ if(cinfo.format == binary_dumper::format)
+ output_counts<binary_reader>(files);
+ else if(cinfo.format == text_dumper::format)
+ output_counts<text_reader>(files);
+ else
+ err::die(err::msg() << "Format '" << cinfo.format << "' not supported\n");
+
+ return 0;
+}
diff --git a/examples/query_per_sequence/Makefile b/examples/query_per_sequence/Makefile
new file mode 100644
index 0000000..b9d824d
--- /dev/null
+++ b/examples/query_per_sequence/Makefile
@@ -0,0 +1,10 @@
+CC = g++
+CXXFLAGS = $(shell pkg-config --cflags jellyfish-2.0) -std=c++0x -Wall -O3
+LDFLAGS = $(shell pkg-config --libs jellyfish-2.0) -Wl,--rpath=$(shell pkg-config --libs-only-L jellyfish-2.0 | sed -e 's/-L//g')
+
+all: query_per_sequence
+query_per_sequence: query_per_sequence.cc sequence_mers.hpp
+clean:
+ rm -f *.o query_per_sequence
+
+
diff --git a/examples/query_per_sequence/README b/examples/query_per_sequence/README
new file mode 100644
index 0000000..49af770
--- /dev/null
+++ b/examples/query_per_sequence/README
@@ -0,0 +1,18 @@
+What is it?
+===========
+
+Given a jellyfish database and one or more input fast[aq] files, it
+output for each sequence in the fast[aq] files the count in the
+database of each of the k-mers. The output format is fasta, where the
+header is copied from the input files and the content is a number for
+each of the k-mers. If the sequence has length n, there will be n-k+1
+numbers, corresponding in order to the n-k+1 k-mers in the sequence.
+
+For example:
+
+$ ./query_per_sequence db.jf sequence.fa
+>read1
+0 0 0 1 1 2 3 3 3 4 2
+>read2
+15 16 17 13 12 11 12 12 10 7 6
+...
diff --git a/examples/query_per_sequence/query_per_sequence.cc b/examples/query_per_sequence/query_per_sequence.cc
new file mode 100644
index 0000000..f6ba59f
--- /dev/null
+++ b/examples/query_per_sequence/query_per_sequence.cc
@@ -0,0 +1,86 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <vector>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/stream_manager.hpp>
+#include <jellyfish/whole_sequence_parser.hpp>
+#include <jellyfish/mer_dna_bloom_counter.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include "sequence_mers.hpp"
+
+namespace err = jellyfish::err;
+
+using jellyfish::mer_dna;
+using jellyfish::mer_dna_bloom_counter;
+typedef jellyfish::whole_sequence_parser<jellyfish::stream_manager<char**> > sequence_parser;
+
+template<typename PathIterator, typename Database>
+void query_from_sequence(PathIterator file_begin, PathIterator file_end, const Database& db,
+ bool canonical) {
+ jellyfish::stream_manager<PathIterator> streams(file_begin, file_end);
+ sequence_parser parser(4, 100, 1, streams);
+ sequence_mers mers(canonical);
+ const sequence_mers mers_end(canonical);
+
+ while(true) {
+ sequence_parser::job j(parser);
+ if(j.is_empty()) break;
+ for(size_t i = 0; i < j->nb_filled; ++i) {
+ std::cout << ">" << j->data[i].header << "\n";
+ mers = j->data[i].seq;
+ if(mers != mers_end) {
+ std::cout << db.check(*mers);
+ ++mers;
+ }
+ for( ; mers != mers_end; ++mers)
+ std::cout << " " << db.check(*mers);
+ std::cout << "\n";
+ }
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ if(argc < 3)
+ err::die(err::msg() << "Usage: " << argv[0] << "db.jf file.fa [...]");
+
+ std::ifstream in(argv[1], std::ios::in|std::ios::binary);
+ jellyfish::file_header header(in);
+ if(!in.good())
+ err::die(err::msg() << "Failed to parse header of file '" << argv[1] << "'");
+ mer_dna::k(header.key_len() / 2);
+ if(header.format() == "bloomcounter") {
+ jellyfish::hash_pair<mer_dna> fns(header.matrix(1), header.matrix(2));
+ mer_dna_bloom_counter filter(header.size(), header.nb_hashes(), in, fns);
+ if(!in.good())
+ err::die("Bloom filter file is truncated");
+ in.close();
+ query_from_sequence(argv + 2, argv + argc, filter, header.canonical());
+ } else if(header.format() == binary_dumper::format) {
+ jellyfish::mapped_file binary_map(argv[1]);
+ binary_query bq(binary_map.base() + header.offset(), header.key_len(), header.counter_len(), header.matrix(),
+ header.size() - 1, binary_map.length() - header.offset());
+ query_from_sequence(argv + 2, argv + argc, bq, header.canonical());
+ } else {
+ err::die(err::msg() << "Unsupported format '" << header.format() << "'. Must be a bloom counter or binary list.");
+ }
+
+ return 0;
+}
diff --git a/examples/query_per_sequence/sequence_mers.hpp b/examples/query_per_sequence/sequence_mers.hpp
new file mode 100644
index 0000000..4eb3a9a
--- /dev/null
+++ b/examples/query_per_sequence/sequence_mers.hpp
@@ -0,0 +1,99 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __SEQUENCE_MERS_H__
+#define __SEQUENCE_MERS_H__
+
+#include <iterator>
+#include <jellyfish/mer_dna.hpp>
+
+class sequence_mers : public std::iterator<std::input_iterator_tag, jellyfish::mer_dna> {
+public:
+ typedef jellyfish::mer_dna mer_type;
+
+private:
+ const char* cseq_;
+ const char* eseq_;
+ const bool canonical_;
+ unsigned int filled_;
+ mer_type m_; // mer
+ mer_type rcm_; // reverse complement mer
+
+public:
+ explicit sequence_mers(bool canonical = false) :
+ cseq_(0), eseq_(0), canonical_(canonical), filled_(0)
+ { }
+
+ sequence_mers(const sequence_mers& rhs) :
+ cseq_(rhs.cseq_), eseq_(rhs.eseq_), canonical_(rhs.canonical_), filled_(rhs.filled_),
+ m_(rhs.m_), rcm_(rhs.rcm_)
+ { }
+
+ sequence_mers(sequence_mers&& rhs) :
+ cseq_(rhs.cseq_), eseq_(rhs.eseq_), canonical_(rhs.canonical_), filled_(rhs.filled_),
+ m_(std::move(rhs.m_)), rcm_(std::move(rcm_))
+ { }
+
+ void reset(const char* seq, const char* seqe) {
+ cseq_ = seq;
+ eseq_ = seqe;
+ filled_ = 0;
+ this->operator++();
+ }
+
+ sequence_mers& operator=(const std::string& seq) {
+ reset(seq.c_str(), seq.c_str() + seq.size());
+ return *this;
+ }
+
+ sequence_mers& operator=(const char* seq) {
+ reset(seq, seq + strlen(seq));
+ return *this;
+ }
+
+ bool operator==(const sequence_mers& rhs) const { return cseq_ == rhs.cseq_; }
+ bool operator!=(const sequence_mers& rhs) const { return cseq_ != rhs.cseq_; }
+
+ operator void*() const { return (void*)cseq_; }
+ const mer_type& operator*() const { return !canonical_ || m_ < rcm_ ? m_ : rcm_; }
+ const mer_type* operator->() const { return &this->operator*(); }
+ sequence_mers& operator++() {
+ if(cseq_ >= eseq_) {
+ cseq_ = eseq_ = 0;
+ return *this;
+ }
+
+ do {
+ int code = m_.code(*cseq_++);
+ if(code >= 0) {
+ m_.shift_left(code);
+ if(canonical_)
+ rcm_.shift_right(rcm_.complement(code));
+ filled_ = std::min(filled_ + 1, jellyfish::mer_dna::k());
+ } else
+ filled_ = 0;
+ } while(filled_ < jellyfish::mer_dna::k() && cseq_ < eseq_);
+
+ return *this;
+ }
+ sequence_mers operator++(int) {
+ sequence_mers res(*this);
+ ++*this;
+ return res;
+ }
+};
+
+#endif /* __SEQUENCE_MERS_H__ */
diff --git a/gtest.mk b/gtest.mk
index 007e84d..9ae1440 100755
--- a/gtest.mk
+++ b/gtest.mk
@@ -2,48 +2,17 @@
# Gtest build.
##############################
# Build rules for libraries.
-# check_LTLIBRARIES = libgtest.la libgtest_main.la
-check_LIBRARIES = libgtest.a libgtest_main.a
+check_LTLIBRARIES = libgtest.la libgtest_main.la
-libgtest_a_SOURCES = unit_tests/gtest/src/gtest-all.cc
-libgtest_main_a_SOURCES = unit_tests/gtest/src/gtest_main.cc
-libgtest_main_a_LIBADD = libgtest.a
-libgtest_a_CXXFLAGS = -I$(top_srcdir)/unit_tests/gtest \
--I$(top_srcdir)/unit_tests/gtest/include
-libgtest_main_a_CXXFLAGS = -I$(top_srcdir)/unit_tests/gtest \
--I$(top_srcdir)/unit_tests/gtest/include
+libgtest_la_SOURCES = unit_tests/gtest/src/gtest-all.cc
+libgtest_main_la_SOURCES = unit_tests/gtest/src/gtest_main.cc
+libgtest_main_la_LIBADD = libgtest.la
+libgtest_la_CXXFLAGS = -I$(top_srcdir)/unit_tests
+libgtest_main_la_CXXFLAGS = -I$(top_srcdir)/unit_tests
-# gtest source files that we don't compile directly. They are
-# #included by gtest-all.cc.
-GTEST_SRC = unit_tests/gtest/src/gtest-death-test.cc \
- unit_tests/gtest/src/gtest-filepath.cc \
- unit_tests/gtest/src/gtest-internal-inl.h \
- unit_tests/gtest/src/gtest-port.cc \
- unit_tests/gtest/src/gtest-printers.cc \
- unit_tests/gtest/src/gtest-test-part.cc \
- unit_tests/gtest/src/gtest-typed-test.cc \
- unit_tests/gtest/src/gtest.cc
+GTEST_SRC = unit_tests/gtest/src/gtest-all.cc \
+ unit_tests/gtest/src/gtest_main.cc \
+ unit_tests/gtest/gtest.h
EXTRA_DIST += $(GTEST_SRC)
-# Headers, not installed
-GTEST_I = unit_tests/gtest/include/gtest
-noinst_HEADERS = $(GTEST_I)/gtest-death-test.h \
- $(GTEST_I)/gtest-message.h \
- $(GTEST_I)/gtest-param-test.h \
- $(GTEST_I)/gtest-printers.h $(GTEST_I)/gtest-spi.h \
- $(GTEST_I)/gtest-test-part.h \
- $(GTEST_I)/gtest-typed-test.h $(GTEST_I)/gtest.h \
- $(GTEST_I)/gtest_pred_impl.h $(GTEST_I)/gtest_prod.h \
- $(GTEST_I)/internal/gtest-death-test-internal.h \
- $(GTEST_I)/internal/gtest-filepath.h \
- $(GTEST_I)/internal/gtest-internal.h \
- $(GTEST_I)/internal/gtest-linked_ptr.h \
- $(GTEST_I)/internal/gtest-param-util-generated.h \
- $(GTEST_I)/internal/gtest-param-util.h \
- $(GTEST_I)/internal/gtest-port.h \
- $(GTEST_I)/internal/gtest-string.h \
- $(GTEST_I)/internal/gtest-tuple.h \
- $(GTEST_I)/internal/gtest-type-util.h
-
-
diff --git a/jellyfish/reversible_hash_function.hpp b/header-license
similarity index 82%
rename from jellyfish/reversible_hash_function.hpp
rename to header-license
index c6ad942..7e35220 100644
--- a/jellyfish/reversible_hash_function.hpp
+++ b/header-license
@@ -13,10 +13,3 @@
You should have received a copy of the GNU General Public License
along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
*/
-
-#ifndef __JELLYFISH_REVERSIBLE_HASH_FUNCTION_HPP__
-#define __JELLYFISH_REVERSIBLE_HASH_FUNCTION_HPP__
-
-
-
-#endif // __REVERSIBLE_HASH_FUNCTION_HPP__
diff --git a/include/jellyfish/allocators_mmap.hpp b/include/jellyfish/allocators_mmap.hpp
new file mode 100644
index 0000000..041e9fd
--- /dev/null
+++ b/include/jellyfish/allocators_mmap.hpp
@@ -0,0 +1,78 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_ALLOCATORS_MMAP_HPP__
+#define __JELLYFISH_ALLOCATORS_MMAP_HPP__
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <algorithm>
+
+namespace allocators {
+class mmap {
+ void *ptr_;
+ size_t size_;
+
+public:
+ mmap() : ptr_(MAP_FAILED), size_(0) {}
+ explicit mmap(size_t _size) : ptr_(MAP_FAILED), size_(0) {
+ realloc(_size);
+ }
+ mmap(mmap&& rhs) : ptr_(rhs.ptr_), size_(rhs.size_) {
+ rhs.ptr_ = MAP_FAILED;
+ rhs.size_ = 0;
+ }
+ ~mmap() { free(); }
+
+ mmap& operator=(mmap&& rhs) {
+ swap(rhs);
+ return *this;
+ }
+
+ void swap(mmap& rhs) {
+ std::swap(ptr_, rhs.ptr_);
+ std::swap(size_, rhs.size_);
+ }
+
+ void *get_ptr() const { return ptr_ != MAP_FAILED ? ptr_ : NULL; }
+ size_t get_size() const { return size_; }
+ void free();
+ void *realloc(size_t new_size);
+ int lock() { return mlock(ptr_, size_); }
+ int unlock() { return munlock(ptr_, size_); }
+
+ // Return a a number of bytes which is a number of whole pages at
+ // least as large as size.
+ static size_t round_to_page(size_t _size);
+
+private:
+ static const int nb_threads = 4;
+ struct tinfo {
+ pthread_t thid;
+ char *start, *end;
+ size_t pgsize;
+ };
+ void fast_zero();
+ static void * _fast_zero(void *_info);
+};
+inline void swap(mmap& a, mmap& b) { a.swap(b); }
+}
+
+#endif
diff --git a/include/jellyfish/atomic_bits_array.hpp b/include/jellyfish/atomic_bits_array.hpp
new file mode 100644
index 0000000..9b27165
--- /dev/null
+++ b/include/jellyfish/atomic_bits_array.hpp
@@ -0,0 +1,202 @@
+/* Quorum
+ * Copyright (C) 2012 Genome group at University of Maryland.
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __JELLYFISH_ATOMIC_BITS_ARRAY_HPP__
+#define __JELLYFISH_ATOMIC_BITS_ARRAY_HPP__
+
+#include <stdexcept>
+#include <iterator>
+
+#include <jellyfish/allocators_mmap.hpp>
+#include <jellyfish/atomic_gcc.hpp>
+#include <jellyfish/divisor.hpp>
+
+namespace jellyfish {
+template<typename Value, typename T, typename Derived>
+class atomic_bits_array_base {
+ static const int w_ = sizeof(T) * 8;
+ const int bits_;
+ const size_t size_;
+ const T mask_;
+ const jflib::divisor64 d_;
+ size_t size_bytes_;
+ T* data_;
+ static atomic::gcc atomic_;
+
+ friend class iterator;
+ class iterator : public std::iterator<std::input_iterator_tag, Value> {
+ friend class atomic_bits_array_base;
+ const atomic_bits_array_base& ary_;
+ T* word_;
+ T mask_;
+ int off_;
+
+ iterator(const atomic_bits_array_base& a, T* w, T m, int o) : ary_(a), word_(w), mask_(m), off_(o) { }
+ public:
+ bool operator==(const iterator& rhs) const { return word_ == rhs.word_ && off_ == rhs.off_; }
+ bool operator!=(const iterator& rhs) const { return word_ != rhs.word_ || off_ != rhs.off_; }
+ Value operator*() const { return static_cast<Value>((*word_ & mask_) >> off_); }
+ Value* operator->() const { return 0; }
+ iterator& operator++() {
+ off_ += ary_.bits_;
+ if(off_ + ary_.bits_ < w_) {
+ mask_ <<= ary_.bits_;
+ } else {
+ ++word_;
+ mask_ = ary_.mask_;
+ off_ = 0;
+ }
+ return *this;
+ }
+ iterator operator++(int) {
+ iterator res(*this);
+ ++*this;
+ return res;
+ }
+ };
+
+ class element_proxy {
+ T* word_;
+ const T mask_;
+ const int off_;
+ T prev_word_;
+
+ Value get_val(T v) const {
+ return static_cast<Value>((v & mask_) >> off_);
+ }
+
+ public:
+ element_proxy(T* word, T mask, int off) :
+ word_(word), mask_(mask), off_(off)
+ { }
+
+ operator Value() const { return get_val(*word_); }
+ Value get() {
+ prev_word_ = *word_;
+ return get_val(prev_word_);
+ }
+
+ bool set(Value& nval) {
+ Value pval;
+ Value cval = get_val(prev_word_);
+ do {
+ pval = cval;
+ const T new_word = (prev_word_ & ~mask_) | ((static_cast<T>(nval) << off_) & mask_);
+ const T actual_word = atomic_.cas(word_, prev_word_, new_word);
+ if(__builtin_expect(actual_word == prev_word_, 1))
+ return true;
+ prev_word_ = actual_word;
+ cval = get_val(prev_word_);
+ } while(pval == cval);
+ nval = cval;
+ return false;
+ }
+ };
+
+public:
+ atomic_bits_array_base(int bits, // Number of bits per entry
+ size_t size) : // Number of entries
+ bits_(bits),
+ size_(size),
+ mask_((T)-1 >> (w_ - bits)), // mask of one entry at the LSB of a word
+ d_(w_ / bits), // divisor of the number of entries per word
+ size_bytes_((size / d_ + (size % d_ != 0)) * sizeof(T)),
+ data_(static_cast<Derived*>(this)->alloc_data(size_bytes_))
+ {
+ static_assert(sizeof(T) >= sizeof(Value), "Container type T must have at least as many bits as value type");
+ if((size_t)bits > sizeof(Value) * 8)
+ throw std::runtime_error("The number of bits per entry must be less than the number of bits in the value type");
+ if(!data_)
+ throw std::runtime_error("Can't allocate memory for atomic_bits_array");
+ }
+
+ // Return the element at position pos. No check for out of bounds.
+ element_proxy operator[](size_t pos) {
+ uint64_t q, r;
+ d_.division(pos, q, r);
+ const int off = r * bits_;
+ return element_proxy(data_ + q, mask_ << off, off);
+ }
+ const element_proxy operator[](size_t pos) const {
+ uint64_t q, r;
+ d_.division(pos, q, r);
+ const int off = r * bits_;
+ return element_proxy(data_ + q, mask_ << off, off);
+ }
+ void write(std::ostream& os) const {
+ os.write((const char*)data_, size_bytes_);
+ }
+ size_t size_bytes() const { return size_bytes_; }
+ int bits() const { return bits_; }
+
+ iterator begin() const { return iterator(*this, data_, mask_, 0); }
+ iterator end() const {
+ uint64_t q, r;
+ d_.division(size_, q, r);
+ const int off = r * bits_;
+ return iterator(*this, data_ + q, mask_ << off, off);
+ }
+};
+
+template<typename Value, typename T = uint64_t>
+class atomic_bits_array :
+ protected allocators::mmap,
+ public atomic_bits_array_base<Value, T, atomic_bits_array<Value, T> >
+{
+ typedef atomic_bits_array_base<Value, T, atomic_bits_array<Value, T> > super;
+ friend class atomic_bits_array_base<Value, T, atomic_bits_array<Value, T> >;
+public:
+ atomic_bits_array(int bits, size_t size) :
+ allocators::mmap(),
+ super(bits, size)
+ { }
+
+protected:
+ T* alloc_data(size_t s) {
+ allocators::mmap::realloc(s);
+ return (T*)allocators::mmap::get_ptr();
+ }
+};
+
+struct mem_info {
+ void* ptr_;
+ size_t bytes_;
+ mem_info(void* ptr, size_t bytes) : ptr_(ptr), bytes_(bytes) { }
+};
+template<typename Value, typename T = uint64_t>
+class atomic_bits_array_raw :
+ protected mem_info,
+ public atomic_bits_array_base<Value, T, atomic_bits_array_raw<Value, T> >
+{
+ typedef atomic_bits_array_base<Value, T, atomic_bits_array_raw<Value, T> > super;
+ friend class atomic_bits_array_base<Value, T, atomic_bits_array_raw<Value, T> >;
+public:
+ atomic_bits_array_raw(void* ptr, size_t bytes, int bits, size_t size) :
+ mem_info(ptr, bytes),
+ super(bits, size)
+ { }
+
+protected:
+ T* alloc_data(size_t s) {
+ assert(bytes_ == s);
+ return (T*)ptr_;
+ }
+};
+
+} // namespace jellyfish
+
+#endif /* __JELLYFISH_ATOMIC_BITS_ARRAY_HPP__ */
diff --git a/include/jellyfish/atomic_field.hpp b/include/jellyfish/atomic_field.hpp
new file mode 100644
index 0000000..5fcc297
--- /dev/null
+++ b/include/jellyfish/atomic_field.hpp
@@ -0,0 +1,157 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __JELLYFISH_ATOMIC_FIELD_HPP__
+#define __JELLYFISH_ATOMIC_FIELD_HPP__
+
+#include <jellyfish/compare_and_swap.hpp>
+
+namespace jflib {
+ /* Define a_get, a_set and a_update
+ */
+ template <typename T>
+ T a_load(T *x) { return *(volatile T*)x; }
+ template<typename T, typename U>
+ T a_store(T* lhs, const U& rhs) {
+ return (*(volatile T*)lhs = rhs);
+ }
+ template<typename T>
+ T* a_load_ptr(T* x) { return a_load((T**)&x); }
+ template<typename T, typename U>
+ T* a_store_ptr(T* x, const U& rhs) { return a_store((T**)&x, rhs); }
+
+ /** Set value to f(value).
+ * @return f(value)
+ *
+ * The function f may be called more than once. Be careful about
+ * side effects (probably better if f has no side effects).
+ */
+ template<typename T>
+ T a_update(T* x, T (*f)(T)) {
+ T ov(a_load(x));
+ T nv(f(ov));
+ while(!cas(x, ov, nv, &ov)) { nv = f(ov); }
+ return nv;
+ }
+ template<typename T>
+ T a_load(T &x) { return a_load(&x); }
+ template<typename T, typename U>
+ T a_store(T &lhs, const U& rhs) { return a_store(&lhs, rhs); }
+
+ /* POD with atomic operators.
+ */
+ template<typename T>
+ struct atomic_pod {
+ typedef T type;
+ T x;
+ };
+
+#define AF_COMPOUND_ASSIGN(op) \
+ template<typename T, typename U> \
+ T operator op ## = (atomic_pod<T> &x, const U &rhs) { \
+ T ov(a_load(&x.x)); \
+ T nv(ov op rhs); \
+ while(!cas(&x.x, ov, nv, &ov)) { nv = ov op rhs; } \
+ return nv; \
+ }
+ AF_COMPOUND_ASSIGN(+);
+ AF_COMPOUND_ASSIGN(-);
+ AF_COMPOUND_ASSIGN(*);
+ AF_COMPOUND_ASSIGN(/);
+ AF_COMPOUND_ASSIGN(%);
+ AF_COMPOUND_ASSIGN(>>);
+ AF_COMPOUND_ASSIGN(<<);
+ AF_COMPOUND_ASSIGN(&);
+ AF_COMPOUND_ASSIGN(|);
+ AF_COMPOUND_ASSIGN(^);
+
+ /** Set value to f(value).
+ * @return f(value)
+ *
+ * The function f may be called more than once. Be careful about
+ * side effects (probably better if f has no side effects).
+ */
+ template<typename T>
+ T a_load(atomic_pod<T> &x) { return a_load(&x.x); }
+ template<typename T, typename U>
+ T a_store(atomic_pod<T> &lhs, const U &rhs) {
+ return a_store(&lhs.x, rhs);
+ }
+ template<typename T>
+ T a_update(atomic_pod<T> &x, T (*f)(T)) {
+ return a_update(&x.x, f);
+ }
+
+ /* Similar to an atomic_pod, but not a POD, because of its
+ constructor and other member functions. Easier to use.
+ */
+ template<typename T>
+ class atomic_field : public atomic_pod<T> {
+ public:
+ typedef typename atomic_pod<T>::type type;
+ explicit atomic_field() { }
+ explicit atomic_field(const T& v) { a_store(&this->x, v); }
+ atomic_field& operator=(const atomic_pod<T>& rhs) { a_store(&this->x, rhs.x); return *this; }
+ atomic_field& operator=(const T& v) { a_store(&this->x, v); return *this; }
+ operator T() const { return a_load(&this->x); }
+ T update(T (*f)(T)) { return a_update(&this->x, f); }
+ };
+
+ template<typename T>
+ T a_load(atomic_field<T> &x) { return a_load((atomic_pod<T>&)x); }
+ template<typename T, typename U>
+ atomic_field<T>& a_store(atomic_field<T>& lhs, const U& rhs) { a_store((atomic_pod<T>&)lhs, rhs); return lhs; }
+ template<typename T>
+ T a_update(atomic_field<T>& x, T (*f)(T)) { return a_update((atomic_pod<T>&)x, f); }
+
+
+ /* Allows atomic operation on any (already allocated) data.
+ */
+ template<typename T>
+ class atomic_ref {
+ T *ptr;
+ public:
+ typedef T type;
+ explicit atomic_ref(T& x) : ptr(&x) { }
+ explicit atomic_ref(T* x) : ptr(x) { }
+ atomic_ref& operator=(const T& v) { a_store(ptr, v); return *this; }
+ operator T() const { assert(ptr != 0); return a_load(ptr); }
+ T* operator&() const { return ptr; }
+ };
+
+#define AR_COMPOUND_ASSIGN(op) \
+ template<typename T, typename U> \
+ T operator op ## = (atomic_ref<T> &x, const U &rhs) { \
+ T ov(x); \
+ T nv(ov op rhs); \
+ while(!cas(&x, ov, nv, &ov)) { nv = ov op rhs; } \
+ return nv; \
+ }
+ AR_COMPOUND_ASSIGN(+);
+ AR_COMPOUND_ASSIGN(-);
+ AR_COMPOUND_ASSIGN(*);
+ AR_COMPOUND_ASSIGN(/);
+ AR_COMPOUND_ASSIGN(%);
+ AR_COMPOUND_ASSIGN(>>);
+ AR_COMPOUND_ASSIGN(<<);
+ AR_COMPOUND_ASSIGN(&);
+ AR_COMPOUND_ASSIGN(|);
+ AR_COMPOUND_ASSIGN(^);
+}
+
+
+#endif /* __JELLYFISH_ATOMIC_FIELD_HPP__ */
diff --git a/jellyfish/atomic_gcc.hpp b/include/jellyfish/atomic_gcc.hpp
similarity index 97%
rename from jellyfish/atomic_gcc.hpp
rename to include/jellyfish/atomic_gcc.hpp
index aafa968..f888dd5 100644
--- a/jellyfish/atomic_gcc.hpp
+++ b/include/jellyfish/atomic_gcc.hpp
@@ -47,7 +47,7 @@ namespace atomic
T ncount = *ptr, count;
do {
count = ncount;
- ncount = cas((T *)ptr, count, count + x);
+ ncount = cas((T *)ptr, count, (T)(count + x));
} while(ncount != count);
return count;
}
diff --git a/jellyfish/backtrace.hpp b/include/jellyfish/backtrace.hpp
similarity index 100%
rename from jellyfish/backtrace.hpp
rename to include/jellyfish/backtrace.hpp
diff --git a/include/jellyfish/binary_dumper.hpp b/include/jellyfish/binary_dumper.hpp
new file mode 100644
index 0000000..09cb610
--- /dev/null
+++ b/include/jellyfish/binary_dumper.hpp
@@ -0,0 +1,224 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_BINARY_DUMPER_HPP__
+#define __JELLYFISH_BINARY_DUMPER_HPP__
+
+#include <iostream>
+#include <cmath>
+
+#include <jellyfish/sorted_dumper.hpp>
+
+namespace jellyfish {
+template<typename Key, typename Val>
+class binary_writer {
+ int val_len_;
+ Val max_val_;
+ int key_len_; // length of output key field in bytes
+
+public:
+ binary_writer(int val_len, // length of value field in bytes
+ int key_len) : // length of key field in bits
+ val_len_(val_len),
+ max_val_(((Val)1 << (8 * val_len)) - 1),
+ key_len_(key_len / 8 + (key_len % 8 != 0))
+ { }
+
+ int val_len() const { return val_len_; }
+ Val max_val() const { return max_val_; }
+ int key_len() const { return key_len_; }
+
+ void write(std::ostream& out, const Key& key, const Val val) {
+ out.write((const char*)key.data(), key_len_);
+ Val v = std::min(max_val_, val);
+ out.write((const char*)&v, val_len_);
+ }
+};
+
+/// Dump a hash array in sorted binary format. The key/value pairs are
+/// written in a sorted list according to the hash function order. The
+/// k-mer and count are written in binary, byte aligned.
+template<typename storage_t>
+class binary_dumper : public sorted_dumper<binary_dumper<storage_t>, storage_t> {
+ typedef sorted_dumper<binary_dumper<storage_t>, storage_t> super;
+ binary_writer<typename super::key_type, uint64_t> writer;
+
+public:
+ static const char* format;
+
+ binary_dumper(int val_len, // length of value field in bytes
+ int key_len, // length of key field in bits
+ int nb_threads, const char* file_prefix,
+ file_header* header = 0) :
+ super(nb_threads, file_prefix, header),
+ writer(val_len, key_len)
+ { }
+
+ virtual void _dump(storage_t* ary) {
+ if(super::header_) {
+ super::header_->update_from_ary(*ary);
+ super::header_->format(format);
+ super::header_->counter_len(writer.val_len());
+ }
+ super::_dump(ary);
+ }
+
+ void write_key_value_pair(std::ostream& out, typename super::heap_item item) {
+ writer.write(out, item->key_, item->val_);
+ }
+};
+template<typename storage_t>
+const char* jellyfish::binary_dumper<storage_t>::format = "binary/sorted";
+
+/// Reader of the format written by binary_dumper. Behaves like an
+/// iterator (has next() method which behaves similarly to the next()
+/// method of the hash array).
+/// The header should be of format binary/sorted, but no check is made.
+template<typename Key, typename Val>
+class binary_reader {
+ std::istream& is_;
+ const int val_len_;
+ Key key_;
+ Val val_;
+ const RectangularBinaryMatrix m_;
+ const size_t size_mask_;
+
+public:
+ binary_reader(std::istream& is, // stream containing data (past any header)
+ file_header* header) : // header which contains counter_len, matrix, size and key_len
+ is_(is), val_len_(header->counter_len()), key_(header->key_len() / 2),
+ m_(header->matrix()),
+ size_mask_(header->size() - 1)
+ { }
+
+ const Key& key() const { return key_; }
+ const Val& val() const { return val_; }
+ size_t pos() const { return m_.times(key_) & size_mask_; }
+
+ bool next() {
+ key_.template read<1>(is_);
+ val_ = 0;
+ is_.read((char*)&val_, val_len_);
+ return is_.good();
+ }
+};
+
+template<typename Key, typename Val>
+class binary_query_base {
+ const char* const data_;
+ const unsigned int val_len_; // In bytes
+ const unsigned int key_len_; // In bytes
+ const RectangularBinaryMatrix m_;
+ const size_t mask_;
+ const size_t record_len_;
+ const size_t last_id_;
+ Key first_key_, last_key_;
+ mutable Key mid_key_;
+ uint64_t first_pos_, last_pos_;
+
+public:
+ // key_len passed in bits
+ binary_query_base(const char* data, unsigned int key_len, unsigned int val_len, const RectangularBinaryMatrix& m, size_t mask,
+ size_t size) :
+ data_(data),
+ val_len_(val_len),
+ key_len_(key_len / 8 + (key_len % 8 != 0)),
+ m_(m),
+ mask_(mask),
+ record_len_(val_len + key_len_),
+ last_id_(size / record_len_),
+ first_key_(key_len / 2),
+ last_key_(key_len / 2),
+ mid_key_(key_len / 2)
+ {
+ if(size % record_len_ != 0)
+ throw std::length_error(err::msg() << "Size of database (" << size << ") must be a multiple of the length of a record ("
+ << record_len_ << ")");
+ key_at(0, first_key_);
+ first_pos_ = key_pos(first_key_);
+ key_at(last_id_ - 1, last_key_);
+ last_pos_ = key_pos(last_key_);
+ }
+
+ bool val_id(const Key& key, Val* res, uint64_t* id) const {
+ if(last_id_ == 0) return false;
+ uint64_t first = 0;
+ uint64_t last = last_id_;
+ uint64_t first_pos = first_pos_;
+ uint64_t last_pos = last_pos_;
+ const uint64_t pos = key_pos(key);
+ uint64_t cid = 0;
+ if(key == first_key_) goto found;
+ cid = last_id_ - 1;
+ if(key == last_key_) goto found;
+ if(pos < first_pos_ || pos > last_pos_) return false;
+
+ // First a guided binary search
+ for(uint64_t diff = last - first; diff >= 8; diff = last - first) {
+ cid = first + lrint(diff * ((double)(pos - first_pos) / (double)(last_pos - first_pos)));
+ cid = std::max(first + 1, cid);
+ cid = std::min(cid, last - 1);
+ key_at(cid, mid_key_);
+ if(key == mid_key_) goto found;
+ uint64_t mid_pos = key_pos(mid_key_);
+ if(mid_pos > pos || (mid_pos == pos && mid_key_ > key)) {
+ last = cid;
+ last_pos = mid_pos;
+ } else {
+ first = cid;
+ first_pos = mid_pos;
+ }
+ }
+
+ // Then a linear search (avoids matrix computation)
+ for(cid = first + 1; cid < last; ++cid) {
+ key_at(cid, mid_key_);
+ if(key == mid_key_) goto found;
+ }
+ return false;
+
+ found:
+ val_at(cid, res);
+ *id = cid;
+ return true;
+ }
+
+ Val operator[](const Key& key) const {
+ Val res;
+ uint64_t id;
+ if(!val_id(key, &res, &id))
+ return 0;
+ return res;
+ }
+
+ inline Val check(const Key& key) const { return (*this)[key]; }
+
+protected:
+ void key_at(size_t id, Key& key) const {
+ memcpy(key.data__(), data_ + id * record_len_, key_len_);
+ key.clean_msw();
+ }
+ void val_at(size_t id, Val* val) const {
+ *val = 0;
+ memcpy(val, data_ + id * record_len_ + key_len_, val_len_);
+ }
+ uint64_t key_pos(const Key& key) const {
+ return m_.times(key) & mask_;
+ }
+};
+}
+
+#endif /* __JELLYFISH_BINARY_DUMPER_HPP__ */
diff --git a/include/jellyfish/bloom_common.hpp b/include/jellyfish/bloom_common.hpp
new file mode 100644
index 0000000..cc3804a
--- /dev/null
+++ b/include/jellyfish/bloom_common.hpp
@@ -0,0 +1,129 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_BLOOM_COMMON_HPP__
+#define __JELLYFISH_BLOOM_COMMON_HPP__
+
+#include <math.h>
+#include <jellyfish/divisor.hpp>
+#include <jellyfish/atomic_gcc.hpp>
+
+namespace jellyfish {
+template<typename Key>
+struct hash_pair { };
+
+template<typename Key, typename Derived, typename HashPair = hash_pair<Key> >
+class bloom_base {
+protected:
+ struct prefetch_info {
+ size_t boff;
+ unsigned char* pos;
+ };
+
+ // The number of bits in the structure, previously known as m_, is
+ // know stored as d_.d()
+ const jflib::divisor64 d_;
+ const unsigned long k_;
+ unsigned char * const data_;
+ HashPair hash_fns_;
+
+public:
+ typedef Key key_type;
+
+ bloom_base(size_t m, unsigned long k, unsigned char* ptr, const HashPair& fns = HashPair()) :
+ d_(m), k_(k), data_(ptr), hash_fns_(fns)
+ { }
+
+ bloom_base(const bloom_base& rhs) = delete;
+ bloom_base(bloom_base&& rhs) :
+ d_(rhs.d_), k_(rhs.k_), data_(rhs.data_), hash_fns_(std::move(rhs.hash_fns_))
+ { }
+
+
+ void write_bits(std::ostream& out) {
+ out.write((char*)data_, static_cast<Derived*>(this)->nb_bytes());
+ }
+
+ // Number of hash functions
+ unsigned long k() const { return k_; }
+ // Size of bit vector
+ size_t m() const { return d_.d(); }
+ const HashPair& hash_functions() const { return hash_fns_; }
+
+ static const double LOG2;
+ static const double LOG2_SQ;
+
+ static size_t opt_m(const double fp, const size_t n) {
+ return n * (size_t)lrint(-log(fp) / LOG2_SQ);
+ }
+ static unsigned long opt_k(const double fp) {
+ return lrint(-log(fp) / LOG2);
+ }
+
+ // Insert key k. Returns previous value of k
+ unsigned int insert(const Key &k) {
+ uint64_t hashes[2];
+ hash_fns_(k, hashes);
+ return static_cast<Derived*>(this)->insert__(hashes);
+ }
+
+ unsigned int check(const Key &k) const {
+ uint64_t hashes[2];
+ hash_fns_(k, hashes);
+ return static_cast<const Derived*>(this)->check__(hashes);
+ }
+
+
+
+ // Limited std::map interface compatibility
+ class element_proxy {
+ Derived& bc_;
+ const Key& k_;
+
+ public:
+ element_proxy(Derived& bc, const Key& k) : bc_(bc), k_(k) { }
+
+ unsigned int operator++() {
+ unsigned int res = bc_.insert(k_);
+ return res == 0 ? 1 : 2;
+ }
+
+ unsigned int operator++(int) { return bc_.insert(k_); }
+ unsigned int operator*() const { return bc_.check(k_); }
+ operator unsigned int() const { return bc_.check(k_); }
+ };
+
+ class const_element_proxy {
+ const Derived& bc_;
+ const Key& k_;
+
+ public:
+ const_element_proxy(const Derived& bc, const Key& k) : bc_(bc), k_(k) { }
+
+ unsigned int operator*() const { return bc_.check(k_); }
+ operator unsigned int() const { return bc_.check(k_); }
+ };
+ element_proxy operator[](const Key& k) { return element_proxy(*static_cast<Derived*>(this), k); }
+ const_element_proxy operator[](const Key& k) const { return const_element_proxy(*static_cast<const Derived*>(this), k); }
+};
+template<typename Key, typename Derived, typename HashPair>
+const double bloom_base<Key, Derived, HashPair>::LOG2 = 0.6931471805599453;
+template<typename Key, typename Derived, typename HashPair>
+const double bloom_base<Key, Derived, HashPair>::LOG2_SQ = 0.4804530139182014;
+
+}
+
+#endif /* __JELLYFISH_BLOOM_COMMON_HPP__ */
diff --git a/include/jellyfish/bloom_counter2.hpp b/include/jellyfish/bloom_counter2.hpp
new file mode 100644
index 0000000..71a503a
--- /dev/null
+++ b/include/jellyfish/bloom_counter2.hpp
@@ -0,0 +1,221 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __BLOOM_COUNTER2_HPP__
+#define __BLOOM_COUNTER2_HPP__
+
+#include <assert.h>
+#include <math.h>
+#include <limits.h>
+#include <jellyfish/bloom_common.hpp>
+#include <jellyfish/mapped_file.hpp>
+#include <jellyfish/allocators_mmap.hpp>
+#include <jellyfish/divisor.hpp>
+#include <jellyfish/atomic_gcc.hpp>
+#include <jellyfish/atomic_field.hpp>
+
+#include <jellyfish/err.hpp>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+namespace jellyfish {
+/* Bloom counter with 3 values: 0, 1 or 2. It is thread safe and lock free.
+ */
+template<typename Key, typename HashPair = hash_pair<Key>, typename atomic_t = ::atomic::gcc>
+class bloom_counter2_base : public bloom_base<Key, bloom_counter2_base<Key, HashPair, atomic_t>, HashPair> {
+ typedef bloom_base<Key, bloom_counter2_base<Key, HashPair, atomic_t>, HashPair> super;
+
+ atomic_t atomic_;
+
+
+protected:
+ static size_t nb_bytes__(size_t l) {
+ return l / 5 + (l % 5 != 0);
+ }
+
+public:
+ bloom_counter2_base(size_t m, unsigned long k, unsigned char* ptr, const HashPair& fns = HashPair()) :
+ super(m, k, ptr, fns)
+ { }
+ bloom_counter2_base(bloom_counter2_base&& rhs) :
+ super(std::move(rhs))
+ { }
+ size_t nb_bytes() const {
+ return nb_bytes__(super::d_.d());
+ }
+
+ // Insert key with given hashes
+ unsigned int insert__(const uint64_t* hashes) {
+ // Prefetch memory locations
+ static_assert(std::is_pod<typename super::prefetch_info>::value, "prefetch_info must be a POD");
+ typename super::prefetch_info pinfo[super::k_];
+ const size_t base = super::d_.remainder(hashes[0]);
+ const size_t inc = super::d_.remainder(hashes[1]);
+ for(unsigned long i = 0; i < super::k_; ++i) {
+ const size_t p = super::d_.remainder(base + i * inc);
+ const size_t off = p / 5;
+ pinfo[i].boff = p % 5;
+ pinfo[i].pos = super::data_ + off;
+ // prefetch_write_no(pinfo[i].pos);
+ __builtin_prefetch(pinfo[i].pos, 1, 0);
+ }
+
+ // Insert element
+ unsigned char res = 2;
+ for(unsigned long i = 0; i < super::k_; ++i) {
+ size_t boff = pinfo[i].boff;
+ unsigned char v = jflib::a_load(pinfo[i].pos);
+
+ while(true) {
+ unsigned char w = v;
+ switch(boff) {
+ case 0: break;
+ case 1: w /= 3; break;
+ case 2: w /= 9; break;
+ case 3: w /= 27; break;
+ case 4: w /= 81; break;
+ }
+ w = w % 3;
+ if(w == 2) break;
+ unsigned char nv = v;
+
+ switch(boff) {
+ case 0: nv += 1; break;
+ case 1: nv += 3; break;
+ case 2: nv += 9; break;
+ case 3: nv += 27; break;
+ case 4: nv += 81; break;
+ }
+ unsigned char cv = atomic_.cas(pinfo[i].pos, v, nv);
+ if(cv == v) {
+ if(w < res)
+ res = w;
+ break;
+ }
+ v = cv;
+ }
+ }
+ return res;
+ }
+
+ unsigned int check__(uint64_t *hashes) const {
+ // Prefetch memory locations
+ static_assert(std::is_pod<typename super::prefetch_info>::value, "prefetch_info must be a POD");
+ typename super::prefetch_info pinfo[super::k_];
+ const size_t base = super::d_.remainder(hashes[0]);
+ const size_t inc = super::d_.remainder(hashes[1]);
+ for(unsigned long i = 0; i < super::k_; ++i) {
+ const size_t p = super::d_.remainder(base + i * inc);
+ const size_t off = p / 5;
+ pinfo[i].boff = p % 5;
+ pinfo[i].pos = super::data_ + off;
+ // prefetch_read_no(pinfo[i].pos);
+ __builtin_prefetch(pinfo[i].pos, 0, 0);
+ }
+
+ // Check element
+ unsigned char res = 2;
+ for(unsigned long i = 0; i < super::k_; ++i) {
+ size_t boff = pinfo[i].boff;
+ unsigned char w = jflib::a_load(pinfo[i].pos);
+
+ switch(boff) {
+ case 0: break;
+ case 1: w /= 3; break;
+ case 2: w /= 9; break;
+ case 3: w /= 27; break;
+ case 4: w /= 81; break;
+ }
+ w = w % 3;
+ if(w < res)
+ res = w;
+ }
+ return res;
+ }
+};
+
+template<typename Key, typename HashPair = hash_pair<Key>, typename atomic_t = ::atomic::gcc,
+ typename mem_block_t = allocators::mmap>
+class bloom_counter2:
+ protected mem_block_t,
+ public bloom_counter2_base<Key, HashPair, atomic_t>
+{
+ typedef bloom_counter2_base<Key, HashPair, atomic_t> super;
+
+public:
+ typedef typename super::key_type key_type;
+
+ bloom_counter2(const double fp, const size_t n, const HashPair& fns = HashPair()) :
+ mem_block_t(super::nb_bytes__(super::opt_m(fp, n))),
+ super(super::opt_m(fp, n), super::opt_k(fp), (unsigned char*)mem_block_t::get_ptr(), fns)
+ {
+ if(!mem_block_t::get_ptr())
+ throw std::runtime_error(err::msg() << "Failed to allocate " << super::nb_bytes__(super::opt_m(fp, n))
+ << " bytes of memory for bloom_counter");
+ }
+
+ bloom_counter2(size_t m, unsigned long k, const HashPair& fns = HashPair()) :
+ mem_block_t(super::nb_bytes__(m)),
+ super(m, k, (unsigned char*)mem_block_t::get_ptr(), fns)
+ {
+ if(!mem_block_t::get_ptr())
+ throw std::runtime_error(err::msg() << "Failed to allocate " << super::nb_bytes__(m) << " bytes of memory for bloom_counter");
+ }
+
+ bloom_counter2(size_t m, unsigned long k, std::istream& is, const HashPair& fns = HashPair()) :
+ mem_block_t(super::nb_bytes__(m)),
+ super(m, k, (unsigned char*)mem_block_t::get_ptr(), fns)
+ {
+ if(!mem_block_t::get_ptr())
+ throw std::runtime_error(err::msg() << "Failed to allocate " << super::nb_bytes__(m) << " bytes of memory for bloom_counter");
+
+ is.read((char*)mem_block_t::get_ptr(), mem_block_t::get_size());
+ }
+
+ bloom_counter2(const bloom_counter2& rhs) = delete;
+ bloom_counter2(bloom_counter2&& rhs) :
+ mem_block_t(std::move(rhs)),
+ super(std::move(rhs))
+ { }
+};
+
+template<typename Key, typename HashPair = hash_pair<Key>, typename atomic_t = ::atomic::gcc>
+class bloom_counter2_file :
+ protected mapped_file,
+ public bloom_counter2_base<Key, HashPair, atomic_t>
+{
+ typedef bloom_counter2_base<Key, HashPair, atomic_t> super;
+public:
+ typedef typename super::key_type key_type;
+
+ bloom_counter2_file(size_t m, unsigned long k, const char* path, const HashPair& fns = HashPair(), off_t offset = 0) :
+ mapped_file(path),
+ super(m, k, (unsigned char*)mapped_file::base() + offset, fns)
+ { }
+
+ bloom_counter2_file(const bloom_counter2_file& rhs) = delete;
+ bloom_counter2_file(bloom_counter2_file&& rhs) :
+ mapped_file(std::move(rhs)),
+ super(std::move(rhs))
+ { }
+};
+
+} // namespace jellyfish {
+
+#endif // __BLOOM_COUNTER2_HPP__
diff --git a/include/jellyfish/bloom_filter.hpp b/include/jellyfish/bloom_filter.hpp
new file mode 100644
index 0000000..4d3d7c8
--- /dev/null
+++ b/include/jellyfish/bloom_filter.hpp
@@ -0,0 +1,164 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_BLOOM_FILTER_HPP__
+#define __JELLYFISH_BLOOM_FILTER_HPP__
+
+#include <jellyfish/allocators_mmap.hpp>
+#include <jellyfish/atomic_gcc.hpp>
+#include <jellyfish/bloom_common.hpp>
+
+namespace jellyfish {
+template<typename Key, typename HashPair = hash_pair<Key>, typename atomic_t = ::atomic::gcc>
+class bloom_filter_base :
+ public bloom_base<Key, bloom_filter_base<Key, HashPair>, HashPair>
+{
+ typedef bloom_base<Key, bloom_filter_base<Key, HashPair>, HashPair> super;
+
+protected:
+ static size_t nb_bytes__(size_t l) {
+ return l / 8 + (l % 8 != 0);
+ }
+
+public:
+ bloom_filter_base(size_t m, unsigned long k, unsigned char* ptr, const HashPair& fns = HashPair()) :
+ super(m, k, ptr, fns)
+ { }
+
+ bloom_filter_base(bloom_filter_base&& rhs) :
+ super(std::move(rhs))
+ { }
+
+ size_t nb_bytes() const {
+ return nb_bytes__(super::d_.d());
+ }
+
+ // Insert key with given hashes
+ unsigned int insert__(const uint64_t *hashes) {
+ // Prefetch memory locations
+ // This static_assert make clang++ happy...
+ static_assert(std::is_pod<typename super::prefetch_info>::value, "prefetch_info must be a POD");
+
+ typename super::prefetch_info pinfo[super::k_];
+ const size_t base = super::d_.remainder(hashes[0]);
+ const size_t inc = super::d_.remainder(hashes[1]);
+ for(unsigned long i = 0; i < super::k_; ++i) {
+ const size_t pos = super::d_.remainder(base + i * inc);
+ const size_t elt_i = pos / 8;
+ pinfo[i].boff = pos % 8;
+ pinfo[i].pos = super::data_ + elt_i;
+ __builtin_prefetch(pinfo[i].pos, 1, 0);
+ }
+
+ // Check if element present
+ bool present = true;
+ for(unsigned long i = 0; i < super::k_; ++i) {
+ const char mask = (char)1 << pinfo[i].boff;
+ const char prev = __sync_fetch_and_or(pinfo[i].pos, mask);
+ present = present && (prev & mask);
+ }
+
+ return present;
+ }
+
+ // Compute hashes of key k
+ void hash(const Key &k, uint64_t *hashes) const { hash_fns_(k, hashes); }
+
+ unsigned int check__(const uint64_t *hashes) const {
+ // Prefetch memory locations
+ typename super::prefetch_info pinfo[super::k_];
+ const size_t base = super::d_.remainder(hashes[0]);
+ const size_t inc = super::d_.remainder(hashes[1]);
+ for(unsigned long i = 0; i < super::k_; ++i) {
+ const size_t pos = super::d_.remainder(base + i * inc);
+ const size_t elt_i = pos / 8;
+ pinfo[i].boff = pos % 8;
+ pinfo[i].pos = super::data_ + elt_i;
+ __builtin_prefetch(pinfo[i].pos, 0, 0);
+ }
+
+ for(unsigned long i = 0; i < super::k_; ++i)
+ if(!(jflib::a_load(pinfo[i].pos) & ((char)1 << pinfo[i].boff)))
+ return 0;
+ return 1;
+ }
+};
+
+template<typename Key, typename HashPair = hash_pair<Key>, typename atomic_t = ::atomic::gcc,
+ typename mem_block_t = allocators::mmap>
+class bloom_filter :
+ protected mem_block_t,
+ public bloom_filter_base<Key, HashPair, atomic_t>
+{
+ typedef bloom_filter_base<Key, HashPair, atomic_t> super;
+public:
+ bloom_filter(double fp, size_t n, const HashPair& fns = HashPair()) :
+ mem_block_t(super::nb_bytes__(super::opt_m(fp, n))),
+ super(super::opt_m(fp, n), super::opt_k(fp), (unsigned char*)mem_block_t::get_ptr(), fns)
+ {
+ if(!mem_block_t::get_ptr())
+ throw std::runtime_error(err::msg() << "Failed to allocate " << super::nb_bytes__(super::opt_m(fp, n))
+ << " bytes of memory for bloom_filter");
+ }
+
+ bloom_filter(size_t m, unsigned long k, const HashPair& fns = HashPair()) :
+ mem_block_t(super::nb_bytes__(m)),
+ super(m, k, (unsigned char*)mem_block_t::get_ptr(), fns)
+ {
+ if(!mem_block_t::get_ptr())
+ throw std::runtime_error(err::msg() << "Failed to allocate " << super::nb_bytes__(m) << " bytes of memory for bloom_filter");
+ }
+
+ bloom_filter(size_t m, unsigned long k, std::istream& is, const HashPair& fns = HashPair()) :
+ mem_block_t(super::nb_bytes__(m)),
+ super(m, k, (unsigned char*)mem_block_t::get_ptr(), fns)
+ {
+ if(!mem_block_t::get_ptr())
+ throw std::runtime_error(err::msg() << "Failed to allocate " << super::nb_bytes__(m) << " bytes of memory for bloom_filter");
+
+ is.read((char*)mem_block_t::get_ptr(), mem_block_t::get_size());
+ }
+
+ bloom_filter(bloom_filter&& rhs) :
+ mem_block_t(std::move(rhs)),
+ super(std::move(rhs))
+ { }
+};
+
+template<typename Key, typename HashPair = hash_pair<Key>, typename atomic_t = ::atomic::gcc>
+class bloom_filter_file :
+ protected mapped_file,
+ public bloom_filter_base<Key, HashPair, atomic_t>
+{
+ typedef bloom_filter_base<Key, HashPair, atomic_t> super;
+public:
+ typedef typename super::key_type key_type;
+
+ bloom_filter_file(size_t m, unsigned long k, const char* path, const HashPair& fns = HashPair(), off_t offset = 0) :
+ mapped_file(path),
+ super(m, k, (unsigned char*)mapped_file::base() + offset, fns)
+ { }
+
+ bloom_filter_file(const bloom_filter_file& rhs) = delete;
+ bloom_filter_file(bloom_filter_file&& rhs) :
+ mapped_file(std::move(rhs)),
+ super(std::move(rhs))
+ { }
+};
+
+}
+
+#endif /* __JELLYFISH_BLOOM_FILTER_HPP__ */
diff --git a/include/jellyfish/circular_buffer.hpp b/include/jellyfish/circular_buffer.hpp
new file mode 100644
index 0000000..a1fcd3c
--- /dev/null
+++ b/include/jellyfish/circular_buffer.hpp
@@ -0,0 +1,200 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __JELLYFISH_CIRCULAR_BUFFER_HPP__
+#define __JELLYFISH_CIRCULAR_BUFFER_HPP__
+
+#include <limits>
+
+#include <jellyfish/compare_and_swap.hpp>
+#include <jellyfish/atomic_field.hpp>
+#include <jellyfish/divisor.hpp>
+
+namespace jflib {
+ template<typename T, unsigned int n, T g = ((T)1 << n) - 1>
+ class basic_circular_buffer {
+ static const unsigned int m = std::numeric_limits<T>::digits - n;
+ struct splitT {
+ T id:m;
+ T val:n;
+ };
+ union elt {
+ T binary;
+ splitT split;
+ };
+ // size_t _size;
+ divisor64 _size;
+ T *_buffer;
+ size_t _head;
+ size_t _tail;
+ bool _closed;
+
+ public:
+ typedef T value_type;
+ static const T guard = g;
+
+ basic_circular_buffer(size_t size) :
+ _size(size+1), _buffer(new T[_size.d()]), _head(0), _tail(0), _closed(false)
+ {
+ elt init;
+ init.split.id = 0;
+ init.split.val = guard;
+ for(size_t i = 0; i < _size.d(); ++i)
+ _buffer[i] = init.binary;
+ }
+ virtual ~basic_circular_buffer() {
+ if(_buffer)
+ delete [] _buffer;
+ }
+
+ /** Enqueue an element.
+ * @return false if the FIFO is full.
+ */
+ bool enqueue(const T &v);
+ /** Enqueue an element, optimization. No check is made that the
+ * FIFO is full. Undetermined behavior if an element is inserted
+ * in a full FIFO.
+ */
+ void enqueue_no_check(const T &v);
+ /** Dequeue an element.
+ * @return 0 if the FIFO is empty.
+ */
+ T dequeue();
+ bool is_closed() const { return a_load(_closed); }
+ void close() { a_store(_closed, true); }
+
+ /// Return capacity of circular buffer
+ size_t size() { return _size.d(); }
+ /// Return the number of element currently in circular buffer
+ size_t fill() {
+ size_t head, tail;
+ size_t nhead = a_load(_head);
+ do {
+ head = nhead;
+ tail = a_load(_tail);
+ } while(head != (nhead = a_load(_head)));
+
+ return head >= tail ? head - tail : head + _size.d() - tail;
+ }
+ };
+
+ template<typename T, T g = (T)-1>
+ class circular_buffer : public basic_circular_buffer<uint64_t, std::numeric_limits<T>::digits, g> {
+ public:
+ circular_buffer(size_t size) :
+ basic_circular_buffer<uint64_t, std::numeric_limits<T>::digits, g>(size) { }
+ virtual ~circular_buffer() { }
+
+ bool enqueue(const T &v) {
+ return basic_circular_buffer<uint64_t, std::numeric_limits<T>::digits, g>::enqueue((uint64_t)v);
+ }
+ T dequeue() {
+ return basic_circular_buffer<uint64_t, std::numeric_limits<T>::digits, g>::dequeue();
+ }
+ };
+}
+
+template<typename T, unsigned int n, T guard>
+bool jflib::basic_circular_buffer<T,n,guard>::enqueue(const T &v) {
+ bool done = false;
+
+ size_t chead = a_load(_head);
+ while(!done) {
+ size_t ctail = a_load(_tail);
+ elt celt;
+ celt.binary = a_load(_buffer[chead % _size]);
+ size_t achead = a_load(_head);
+ if(achead != chead) {
+ chead = achead;
+ continue;
+ }
+ size_t nhead = chead + 1;
+ if(nhead % _size == ctail % _size)
+ return false;
+ if(celt.split.val == guard) {
+ // entry is empty
+ elt nelt;
+ nelt.split.id = celt.split.id + 1;
+ nelt.split.val = v;
+ done = cas(&_buffer[chead % _size], celt.binary, nelt.binary);
+ // done == true <=> sucessfully written entry
+ }
+ cas(&_head, chead, nhead, &chead);
+ }
+
+ return true;
+}
+
+template<typename T, unsigned int n, T guard>
+void jflib::basic_circular_buffer<T,n,guard>::enqueue_no_check(const T &v) {
+ bool done = false;
+
+ size_t chead = a_load(_head);
+ while(!done) {
+ elt celt;
+ celt.binary = a_load(_buffer[chead % _size]);
+ size_t achead = a_load(_head);
+ if(achead != chead) {
+ chead = achead;
+ continue;
+ }
+ size_t nhead = chead + 1;
+ if(celt.split.val == guard) {
+ // entry is empty
+ elt nelt;
+ nelt.split.id = celt.split.id + 1;
+ nelt.split.val = v;
+ done = cas(&_buffer[chead % _size], celt.binary, nelt.binary);
+ // done == true <=> sucessfully written entry
+ }
+ cas(&_head, chead, nhead, &chead);
+ }
+}
+
+template<typename T, unsigned int n, T guard>
+T jflib::basic_circular_buffer<T,n,guard>::dequeue() {
+ bool done = false;
+ elt res;
+
+ size_t ctail = a_load(_tail);
+ while(!done) {
+ bool dequeued = false;
+ do {
+ if(ctail % _size == a_load(_head) % _size)
+ return guard;
+ size_t ntail = ctail + 1;
+ dequeued = cas(&_tail, ctail, ntail, &ctail);
+ } while(!dequeued);
+
+ res.binary = a_load(_buffer[ctail % _size]);
+ elt nres;
+ nres.split.val = guard;
+ while(true) {
+ nres.split.id = res.split.id + 1;
+ if(res.split.val == guard) {
+ if(cas(&_buffer[ctail % _size], res.binary, nres.binary, &res.binary))
+ break;
+ } else {
+ done = cas(&_buffer[ctail % _size], res.binary, nres.binary);
+ break;
+ }
+ }
+ }
+
+ return res.split.val;
+}
+#endif /* __JELLYFISH_CIRCULAR_BUFFER_HPP__ */
diff --git a/include/jellyfish/compare_and_swap.hpp b/include/jellyfish/compare_and_swap.hpp
new file mode 100644
index 0000000..2defb97
--- /dev/null
+++ b/include/jellyfish/compare_and_swap.hpp
@@ -0,0 +1,80 @@
+/* This file is part of Jflib.
+
+ Jflib is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jflib is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jflib. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef _JFLIB_COMPARE_AND_SWAP_H_
+#define _JFLIB_COMPARE_AND_SWAP_H_
+
+#include <sys/types.h>
+#include <stdint.h>
+
+namespace jflib {
+ // // Atomic load (get) and store (set). For now assume that the
+ // // architecture does this based on the virtual key word (true for
+ // // x86_64). TODO: improve on other architectures.
+ // template<typename T>
+ // T a_get(const T &x) { return *(volatile T*)&x; }
+ // template<typename T, typename U>
+ // T &a_set(T &lhs, const U &rhs) {
+ // *(volatile T*)&lhs = rhs;
+ // return lhs;
+ // }
+
+ // Numeric type of length rounded up to the size of a
+ // word. Undefined, and raise a compilation error, if the length is
+ // not a machine word size
+ template<typename T, size_t n> union word_t;
+ template<typename T> union word_t<T, 1> { typedef uint8_t w_t; T v; w_t w; };
+ template<typename T> union word_t<T, 2> { typedef uint16_t w_t; T v; w_t w; };
+ template<typename T> union word_t<T, 4> { typedef uint32_t w_t; T v; w_t w; };
+ template<typename T> union word_t<T, 8> { typedef uint64_t w_t; T v; w_t w; };
+
+ /** Type safe version of CAS.
+ * @param [in] ptr Memory location.
+ * @param [in] ov Presumed value at location.
+ * @param [in] nv Value to write.
+ * @param [out] cv Value at location at time of call.
+ * @return true if CAS is successful.
+ *
+ * The CAS operation is successful if, at the time of call, ov is
+ * equal to *ptr, the value at the memory location. In that case, nv
+ * is written to *ptr, and when the call returns, cv == ov.
+ *
+ * If it fails, cv contains *ptr at the time of call.
+ */
+ template<typename T>
+ bool cas(T *ptr, const T &ov, const T &nv, T *cv) {
+ typedef word_t<T, sizeof(T)> val_t;
+ val_t _cv, _ov, _nv;
+ _ov.v = ov;
+ _nv.v = nv;
+ _cv.w = __sync_val_compare_and_swap((typename val_t::w_t *)ptr, _ov.w, _nv.w);
+ *cv = _cv.v;
+ return _cv.w == _ov.w;
+ }
+
+ /** Type safe version of CAS. Identical to 4 argument version,
+ * except does not return the previous value.
+ */
+ template<typename T>
+ bool cas(T *ptr, const T &ov, const T &nv) {
+ T cv;
+ return cas(ptr, ov, nv, &cv);
+ }
+}
+
+
+#endif /* _JFLIB_COMPARE_AND_SWAP_H_ */
diff --git a/include/jellyfish/cooperative_pool.hpp b/include/jellyfish/cooperative_pool.hpp
new file mode 100644
index 0000000..788aea4
--- /dev/null
+++ b/include/jellyfish/cooperative_pool.hpp
@@ -0,0 +1,258 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __JELLYFISH_COOPERATIVE_POOL_HPP__
+#define __JELLYFISH_COOPERATIVE_POOL_HPP__
+
+#include <assert.h>
+#include <unistd.h>
+
+#include <jellyfish/circular_buffer.hpp>
+#include <jellyfish/compare_and_swap.hpp>
+#include <jellyfish/locks_pthread.hpp>
+
+/// Cooperative pool. Provide a link between a producer and many
+/// consumers. It is cooperative in the sense that there is no
+/// dedicated thread to the producer. When the number of elements in
+/// the queue from the producer to the consumer is less than half,
+/// then the thread requesting an element attempts to become the
+/// producer. It stays a producer until the producer to consumer queue
+/// is full.
+///
+/// This class must be subclassed using CRTP. `T` is the type of the
+/// element passed around in the queues. The derived class must
+/// implement the method `bool produce(T& e)`. It is called when a
+/// thread has become a producer. It must set in `e` the new element,
+/// unless there is nothing more to produce. It returns `true` if
+/// there is nothing more to produce (and `e` is not used), `false`
+/// otherwise.
+///
+/// The following example will produce the integers `[0, 1000000]`:
+///
+/// ~~~{.cc}
+/// class sequence : public cooperative_bool<sequence, int> {
+/// int cur_;
+/// public:
+/// sequence() : cur_(0) { }
+/// bool produce(int& e) {
+/// if(cur_ <= 1000000) {
+/// e = cur_++;
+/// return false;
+/// }
+/// return true;
+/// }
+/// };
+/// ~~~
+///
+/// To access the elements (or the jobs) of the sequence, instantiate
+/// a `sequence::job` object and check that it is not empty. If empty,
+/// the sequence is over.
+///
+/// ~~~{.cc}
+/// sequence seq; // Sequence, instantiated in main thread
+/// // In each consumer thread:
+/// while(true) {
+/// sequence::job j(seq);
+/// if(j.is_empty())
+/// break;
+/// // Do computation using *j and j->
+/// }
+/// ~~~
+
+namespace jellyfish {
+template<typename D, typename T>
+class cooperative_pool {
+public:
+ typedef jflib::circular_buffer<uint32_t> cbT;
+ typedef T element_type;
+
+private:
+ uint32_t size_;
+ element_type* elts_;
+ cbT cons_prod_; // FIFO from Consumers to Producers
+ cbT prod_cons_; // FIFO from Producers to Consumers
+ int has_producer_; // Tell whether a thread is acting as a producer
+
+ // RAII token.
+ class take_token {
+ int* const token_;
+ const bool has_token_;
+ public:
+ take_token(int* token) : token_(token), has_token_(jflib::cas(token_, 0, 1)) { }
+ ~take_token() {
+ if(has_token_)
+ // cas(token_, 1, 0); // Guaranteed to succeed. Memory barrier
+ jflib::a_store(token_, 0);
+ }
+ bool has_token() const { return has_token_; }
+ };
+
+ explicit cooperative_pool(const cooperative_pool& rhs) : size_(0), elts_(0), cons_prod_(0), prod_cons_(0), has_producer_(0) { }
+public:
+ cooperative_pool(uint32_t size) :
+ size_(size),
+ elts_(new element_type[size_]),
+ cons_prod_(size_ + 100),
+ prod_cons_(size_ + 100),
+ has_producer_(0)
+ {
+ // Every element is empty and ready to be filled by the producer
+ for(size_t i = 0; i < size_; ++i)
+ cons_prod_.enqueue_no_check(i);
+ }
+
+ ~cooperative_pool() { delete [] elts_; }
+
+ uint32_t size() const { return size_; }
+
+ element_type* element_begin() { return elts_; }
+ element_type* element_end() { return elts_ + size_; }
+
+ // Contains a filled element or is empty. In which case the producer
+ // is done and we should stop processing.
+ class job {
+ cooperative_pool& cp_;
+ uint32_t i_; // Index of element
+ public:
+ job(cooperative_pool& cp) : cp_(cp), i_(cp_.get_element()) { }
+ ~job() { release(); }
+
+ void release() {
+ if(!is_empty()) {
+ cp_.cons_prod_.enqueue_no_check(i_);
+ }
+ }
+ bool is_empty() const { return i_ == cbT::guard; }
+ void next() {
+ release();
+ i_ = cp_.get_element();
+ }
+
+ element_type& operator*() { return cp_.elts_[i_]; }
+ element_type* operator->() { return &cp_.elts_[i_]; }
+
+ private:
+ // Disable copy of job
+ job(const job& rhs) { }
+ job& operator=(const job& rhs) { }
+ };
+ friend class job;
+
+ /// STL compliant iterator
+ class iterator : public std::iterator<std::input_iterator_tag, element_type> {
+ job* j_;
+ public:
+ iterator() : j_(0) { }
+ iterator(cooperative_pool& cp) : j_(new job(cp)) { }
+ iterator(const iterator& rhs) : j_(rhs.j_) { }
+
+ bool operator==(const iterator& rhs) const { return j_ == rhs.j_; }
+ bool operator!=(const iterator& rhs) const { return j_ != rhs.j_; }
+ element_type& operator*() { return j_->operator*(); }
+ element_type* operator->() { return j_->operator->(); }
+
+ iterator& operator++() {
+ j_->next();
+ if(j_->is_empty()) {
+ delete j_;
+ j_ = 0;
+ }
+ return *this;
+ }
+
+ iterator operator++(int) {
+ iterator res(*this);
+ ++*this;
+ return res;
+ }
+ };
+ iterator begin() { return iterator(*this); }
+ const iterator begin() const { return iterator(*this); }
+ const iterator end() const { return iterator(); }
+
+private:
+ enum PRODUCER_STATUS { PRODUCER_PRODUCED, PRODUCER_DONE, PRODUCER_EXISTS };
+ uint32_t get_element() {
+ int iteration = 0;
+
+ while(true) {
+ // If less than half full -> try to fill up producer to consumer
+ // queue. Disregard return value: in any every case will
+ // attempt to get an element for ourselves
+ if(prod_cons_.fill() < prod_cons_.size() / 2)
+ become_producer();
+
+ uint32_t i = prod_cons_.dequeue();
+ if(i != cbT::guard)
+ return i;
+
+ // Try to become producer
+ switch(become_producer()) {
+ case PRODUCER_PRODUCED:
+ iteration = 0; // Produced. Attempt anew to get an element
+ break;
+ case PRODUCER_DONE:
+ return prod_cons_.dequeue();
+ case PRODUCER_EXISTS:
+ delay(iteration++); // Already a producer. Wait a bit it adds things to queue
+ break;
+ }
+ }
+ }
+
+ PRODUCER_STATUS become_producer() {
+ if(prod_cons_.is_closed())
+ return PRODUCER_DONE;
+
+ // Mark that we have a produce (myself). If not, return. Token
+ // will be release automatically at end of method.
+ take_token producer_token(&has_producer_);
+ if(!producer_token.has_token())
+ return PRODUCER_EXISTS;
+
+ uint32_t i = cbT::guard;
+ try {
+ while(true) { // Only way out is if produce method is done (returns true or throw an exception)
+ i = cons_prod_.dequeue();
+ if(i == cbT::guard)
+ return PRODUCER_PRODUCED;
+
+ if(static_cast<D*>(this)->produce(elts_[i])) // produce returns true if done
+ break;
+
+ prod_cons_.enqueue_no_check(i);
+ }
+ } catch(...) { } // Threw an exception -> same as being done
+
+ // Producing is done
+ cons_prod_.enqueue_no_check(i);
+ prod_cons_.close();
+
+ return PRODUCER_DONE;
+ }
+
+ // First 16 operations -> no delay. Then exponential back-off up to a second.
+ void delay(int iteration) {
+ if(iteration < 16)
+ return;
+ int shift = 10 - std::min(iteration - 16, 10);
+ usleep((1000000 - 1) >> shift);
+ }
+};
+
+} // namespace jellyfish {
+#endif /* __JELLYFISH_COOPERATIVE_POOL_HPP__ */
diff --git a/include/jellyfish/cooperative_pool2.hpp b/include/jellyfish/cooperative_pool2.hpp
new file mode 100644
index 0000000..2872f63
--- /dev/null
+++ b/include/jellyfish/cooperative_pool2.hpp
@@ -0,0 +1,283 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __JELLYFISH_COOPERATIVE_POOL2_HPP__
+#define __JELLYFISH_COOPERATIVE_POOL2_HPP__
+
+#include <assert.h>
+#include <unistd.h>
+
+#include <jellyfish/circular_buffer.hpp>
+#include <jellyfish/compare_and_swap.hpp>
+#include <jellyfish/locks_pthread.hpp>
+
+/// Cooperative pool. Provide a link between many producers and many
+/// consumers. It is cooperative in the sense that there is no
+/// dedicated threads as producer. When the number of elements in the
+/// queue from the producer to the consumer is less than half, then
+/// the thread requesting an element attempts to become an additional
+/// producer. It stays a producer until the producer to consumer queue
+/// is full.
+///
+/// This class must be subclassed using CRTP. `T` is the type of the
+/// element passed around in the queues. The derived class must
+/// implement the method `bool produce(uint32_t i, T& e)`. It is
+/// called when a thread has become a producer. It must set in `e` the
+/// new element, unless there is nothing more to produce. It returns
+/// `true` if there is nothing more to produce (and `e` is not used),
+/// `false` otherwise.
+///
+/// The maximum number of producers is specified to the constructor of
+/// the class (`max_producers`). The parameter `i` passed to `produce`
+/// is in [0, max_producers) and it is guaranteed that at any given
+/// time, no two producers have the same `i`.
+///
+/// The following example will produce the integers `[0, 1000 * max)`,
+/// with max producers.
+///
+/// ~~~{.cc}
+/// class sequence : public cooperative_bool<sequence, int> {
+/// const uint32_t max_;
+/// std::vector cur_;
+/// uint32_t done_;
+/// public:
+/// sequence(uint32_t max) : max_(max), cur_(max, 0), done_(0) { }
+/// bool produce(uint32_t i, int& e) {
+/// int& cur = cur_[i];
+/// if(cur < max_) {
+/// e = i * max_ + cur++;
+/// return false;
+/// }
+/// return true;
+/// }
+/// };
+/// ~~~
+///
+/// To access the elements (or the jobs) of the sequence, instantiate
+/// a `sequence::job` object and check that it is not empty. If empty,
+/// the sequence is over.
+///
+/// ~~~{.cc}
+/// sequence seq; // Sequence, instantiated in main thread
+/// // In each consumer thread:
+/// while(true) {
+/// sequence::job j(seq);
+/// if(j.is_empty())
+/// break;
+/// // Do computation using *j and j->
+/// }
+/// ~~~
+
+namespace jellyfish {
+template<typename D, typename T>
+class cooperative_pool2 {
+public:
+ typedef jflib::circular_buffer<uint32_t> cbT;
+ typedef T element_type;
+
+private:
+ uint32_t size_;
+ element_type* elts_;
+ cbT cons_prod_; // FIFO from Consumers to Producers
+ cbT prod_cons_; // FIFO from Producers to Consumers
+ cbT tokens_; // FIFO with producer tokens
+ const uint32_t max_producers_;
+ uint32_t done_; // Number of producer that are done
+
+ // RAII token.
+ struct take_token {
+ cbT& tokens_;
+ uint32_t token_;
+ bool drop_;
+
+ take_token(cbT& tokens) : tokens_(tokens), token_(tokens.dequeue()), drop_(false) { }
+ ~take_token() {
+ if(has_token() && !drop_) {
+ tokens_.enqueue_no_check(token_);
+ // assert(tokens_.enqueue(token_));
+ }
+ }
+ bool has_token() const { return token_ != cbT::guard; }
+ void drop() { drop_ = true; }
+ };
+
+ // explicit cooperative_pool2(const cooperative_pool2& rhs) : size_(0), elts_(0), cons_prod_(0), prod_cons_(0) { }
+public:
+ cooperative_pool2(uint32_t max_producers, uint32_t size) :
+ size_(size),
+ elts_(new element_type[size_]),
+ cons_prod_(size_ + 100),
+ prod_cons_(size_ + 100),
+ tokens_(max_producers + 1),
+ max_producers_(max_producers),
+ done_(0)
+ {
+ // Every element is empty and ready to be filled by the producer
+ for(size_t i = 0; i < size_; ++i)
+ cons_prod_.enqueue_no_check(i);
+
+ // Every producer token is free
+ for(uint32_t i = 0; i < max_producers_; ++i)
+ tokens_.enqueue(i);
+ // tokens_.enqueue_no_check(i);
+ }
+
+ ~cooperative_pool2() { delete [] elts_; }
+
+ uint32_t size() const { return size_; }
+
+ element_type* element_begin() { return elts_; }
+ element_type* element_end() { return elts_ + size_; }
+
+ // Contains a filled element or is empty. In which case the producer
+ // is done and we should stop processing.
+ class job {
+ cooperative_pool2& cp_;
+ uint32_t i_; // Index of element
+ public:
+ job(cooperative_pool2& cp) : cp_(cp), i_(cp_.get_element()) { }
+ ~job() { release(); }
+
+ void release() {
+ if(!is_empty()) {
+ cp_.cons_prod_.enqueue_no_check(i_);
+ }
+ }
+ bool is_empty() const { return i_ == cbT::guard; }
+ void next() {
+ release();
+ i_ = cp_.get_element();
+ }
+
+ element_type& operator*() { return cp_.elts_[i_]; }
+ element_type* operator->() { return &cp_.elts_[i_]; }
+
+ private:
+ // Disable copy of job
+ job(const job& rhs) { }
+ job& operator=(const job& rhs) { }
+ };
+ friend class job;
+
+ /// STL compliant iterator
+ class iterator : public std::iterator<std::input_iterator_tag, element_type> {
+ job* j_;
+ public:
+ iterator() : j_(0) { }
+ iterator(cooperative_pool2& cp) : j_(new job(cp)) { }
+ iterator(const iterator& rhs) : j_(rhs.j_) { }
+
+ bool operator==(const iterator& rhs) const { return j_ == rhs.j_; }
+ bool operator!=(const iterator& rhs) const { return j_ != rhs.j_; }
+ element_type& operator*() { return j_->operator*(); }
+ element_type* operator->() { return j_->operator->(); }
+
+ iterator& operator++() {
+ j_->next();
+ if(j_->is_empty()) {
+ delete j_;
+ j_ = 0;
+ }
+ return *this;
+ }
+
+ iterator operator++(int) {
+ iterator res(*this);
+ ++*this;
+ return res;
+ }
+ };
+ iterator begin() { return iterator(*this); }
+ const iterator begin() const { return iterator(*this); }
+ const iterator end() const { return iterator(); }
+
+private:
+ enum PRODUCER_STATUS { PRODUCER_PRODUCED, PRODUCER_DONE, PRODUCER_EXISTS };
+ uint32_t get_element() {
+ int iteration = 0;
+
+ while(true) {
+ // If less than half full -> try to fill up producer to consumer
+ // queue. Disregard return value: in any every case will
+ // attempt to get an element for ourselves
+ if(prod_cons_.fill() < prod_cons_.size() / 2)
+ become_producer();
+
+ uint32_t i = prod_cons_.dequeue();
+ if(i != cbT::guard)
+ return i;
+
+ // Try to become producer
+ switch(become_producer()) {
+ case PRODUCER_PRODUCED:
+ iteration = 0; // Produced. Attempt anew to get an element
+ break;
+ case PRODUCER_DONE:
+ return prod_cons_.dequeue();
+ case PRODUCER_EXISTS:
+ delay(iteration++); // Already a producer. Wait a bit it adds things to queue
+ break;
+ }
+ }
+ }
+
+ PRODUCER_STATUS become_producer() {
+ if(prod_cons_.is_closed())
+ return PRODUCER_DONE;
+
+ // Mark that we have a produce (myself). If not, return. Token
+ // will be release automatically at end of method.
+ take_token producer_token(tokens_);
+ if(!producer_token.has_token())
+ return PRODUCER_EXISTS;
+
+ uint32_t i = cbT::guard;
+ try {
+ while(true) { // Only way out is if produce method is done (returns true or throw an exception)
+ i = cons_prod_.dequeue();
+ if(i == cbT::guard)
+ return PRODUCER_PRODUCED;
+
+ if(static_cast<D*>(this)->produce(producer_token.token_, elts_[i])) // produce returns true if done
+ break;
+
+ prod_cons_.enqueue_no_check(i);
+ }
+ } catch(...) { } // Threw an exception -> same as being done
+
+ // Producing is done for this producer
+ cons_prod_.enqueue_no_check(i);
+ producer_token.drop();
+ uint32_t is_done = __sync_add_and_fetch(&done_, (uint32_t)1);
+ if(is_done < max_producers_)
+ return PRODUCER_PRODUCED;
+
+ prod_cons_.close();
+ return PRODUCER_DONE;
+ }
+
+ // First 16 operations -> no delay. Then exponential back-off up to a second.
+ void delay(int iteration) {
+ if(iteration < 16)
+ return;
+ int shift = 10 - std::min(iteration - 16, 10);
+ usleep((1000000 - 1) >> shift);
+ }
+};
+
+} // namespace jellyfish {
+#endif /* __JELLYFISH_COOPERATIVE_POOL2_HPP__ */
diff --git a/include/jellyfish/cpp_array.hpp b/include/jellyfish/cpp_array.hpp
new file mode 100644
index 0000000..952827a
--- /dev/null
+++ b/include/jellyfish/cpp_array.hpp
@@ -0,0 +1,156 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_CPP_ARRAY_HPP_
+#define __JELLYFISH_CPP_ARRAY_HPP_
+
+#include <cstddef>
+#include <memory>
+
+namespace jellyfish {
+
+/// Fix length array of type T. An element is initialized with the init method.
+/// new (this->data() + i) T(
+template<typename T>
+class cpp_array {
+protected:
+ std::pair<T*, ptrdiff_t> data_;
+ std::pair<bool*, ptrdiff_t> init_;
+ size_t size_;
+
+public:
+ cpp_array(size_t size) :
+ data_(std::get_temporary_buffer<T>(size)),
+ init_(std::get_temporary_buffer<bool>(size)),
+ size_(size) {
+ if(data_.first == 0 || init_.first == 0) {
+ std::return_temporary_buffer(data_.first);
+ std::return_temporary_buffer(init_.first);
+ throw std::bad_alloc();
+ }
+ memset(init_.first, '\0', sizeof(bool) * size_);
+ }
+
+ ~cpp_array() {
+ clear();
+ std::return_temporary_buffer(data_.first);
+ std::return_temporary_buffer(init_.first);
+ }
+
+ /// Initialize element i with 0 argument
+ void init(size_t i) {
+ release(i);
+ new (data_.first + i) T();
+ init_.first[i] = true;
+ }
+
+ /// Initialize element i with 1 argument
+ template<typename A1>
+ void init(size_t i, A1& a1) {
+ release(i);
+ new (data_.first + i) T(a1);
+ init_.first[i] = true;
+ }
+ template<typename A1>
+ void init(size_t i, A1* a1) {
+ release(i);
+ new (data_.first + i) T(a1);
+ init_.first[i] = true;
+ }
+ /// Initialize element i with 2 arguments
+ template<typename A1, typename A2>
+ void init(size_t i, A1& a1, A2& a2) {
+ release(i);
+ new (data_.first + i) T(a1, a2);
+ init_.first[i] = true;
+ }
+ template<typename A1, typename A2>
+ void init(size_t i, A1* a1, A2& a2) {
+ release(i);
+ new (data_.first + i) T(a1, a2);
+ init_.first[i] = true;
+ }
+ template<typename A1, typename A2>
+ void init(size_t i, A1& a1, A2* a2) {
+ release(i);
+ new (data_.first + i) T(a1, a2);
+ init_.first[i] = true;
+ }
+ template<typename A1, typename A2>
+ void init(size_t i, A1* a1, A2* a2) {
+ release(i);
+ new (data_.first + i) T(a1, a2);
+ init_.first[i] = true;
+ }
+
+ /// Initialize element i with 3 arguments
+ template<typename A1, typename A2, typename A3>
+ void init(size_t i, A1 a1, A2 a2, A3 a3) {
+ release(i);
+ new (data_.first + i) T(a1, a2, a3);
+ init_.first[i] = true;
+ }
+ /// Initialize element i with 4 arguments
+ template<typename A1, typename A2, typename A3, typename A4>
+ void init(size_t i, A1 a1, A2 a2, A3 a3, A4 a4) {
+ release(i);
+ new (data_.first + i) T(a1, a2, a3, a4);
+ init_.first[i] = true;
+ }
+ /// Initialize element i with 5 arguments
+ template<typename A1, typename A2, typename A3, typename A4, typename A5>
+ void init(size_t i, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
+ release(i);
+ new (data_.first + i) T(a1, a2, a3, a4, a5);
+ init_.first[i] = true;
+ }
+
+ void release(size_t i) {
+ if(init_.first[i]) {
+ data_.first[i].~T();
+ init_.first[i] = false;
+ }
+ }
+
+ size_t size() const { return size_; }
+ bool empty() const { return size_ == 0; }
+ T& operator[](size_t i) { return data_.first[i]; }
+ const T& operator[](size_t i) const { return data_.first[i]; }
+ bool initialized(size_t i) const { return init_.first[i]; }
+
+ T* begin() { return data_.first; }
+ T* end() { return data_.first + size_; }
+ const T* begin() const { return data_.first; }
+ const T* end() const { return data_.end + size_; }
+ const T* cbegin() const { return data_.first; }
+ const T* cend() const { return data_.end + size_; }
+
+ T* data() { return data_.first; }
+ const T* data() const { return data_.first; }
+
+ T& front() { return data_.first[0]; }
+ T& back() { return data_.first[size_ - 1]; }
+ const T& front() const { return data_.first[0]; }
+ const T& back() const { return data_.first[size_ - 1]; }
+
+ void clear() {
+ for(size_t i = 0; i < size_; ++i)
+ release(i);
+ }
+};
+} // namespace jellyfish
+
+#endif /* __JELLYFISH_CPP_ARRAY_HPP_ */
diff --git a/include/jellyfish/divisor.hpp b/include/jellyfish/divisor.hpp
new file mode 100644
index 0000000..6c47b31
--- /dev/null
+++ b/include/jellyfish/divisor.hpp
@@ -0,0 +1,150 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+
+#ifndef __JELLYFISH_DIVISOR_HPP__
+#define __JELLYFISH_DIVISOR_HPP__
+
+#include <stdint.h>
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+namespace jflib {
+class divisor64 {
+ const uint64_t d_;
+#ifdef HAVE_INT128
+ const uint16_t p_;
+ const unsigned __int128 m_;
+#endif
+ template<typename T>
+ static T div_ceil(T x, T y) {
+ T q = x / y;
+ T r = x % y;
+ return q + (r > 0);
+ }
+
+ template<typename T>
+ static uint16_t ceilLog2(T x, uint16_t r = 0, uint16_t i = 0) {
+ if(x > 1)
+ return ceilLog2(x >> 1, r + 1, i | (x & 1));
+ return r + i;
+ }
+
+public:
+ explicit divisor64(uint64_t d) :
+ d_(d)
+#ifdef HAVE_INT128
+ , p_(ceilLog2(d_)),
+ m_((div_ceil((unsigned __int128)1 << (64 + p_), (unsigned __int128)d_)) & (uint64_t)-1)
+#endif
+ { }
+
+ divisor64() :
+ d_(0)
+#ifdef HAVE_INT128
+ , p_(0), m_(0)
+#endif
+ { }
+
+ explicit divisor64(const divisor64& rhs) :
+ d_(rhs.d_)
+#ifdef HAVE_INT128
+ , p_(rhs.p_),
+ m_(rhs.m_)
+#endif
+ { }
+
+ inline uint64_t divide(const uint64_t n) const {
+#ifdef HAVE_INT128
+ switch(m_) {
+ case 0:
+ return n >> p_;
+ default:
+ const unsigned __int128 n_ = (unsigned __int128)n;
+ return (n_ + ((n_ * m_) >> 64)) >> p_;
+ }
+#else
+ return n / d_;
+#endif
+ }
+
+ inline uint64_t remainder(uint64_t n) const {
+#ifdef HAVE_INT128
+ switch(m_) {
+ case 0:
+ return n & (((uint64_t)1 << p_) - 1);
+ default:
+ return n - divide(n) * d_;
+ }
+#else
+ return n % d_;
+#endif
+ }
+
+ // Euclidian division: d.division(n, q, r) sets q <- n / d and r
+ // <- n % d. This is faster than doing each independently.
+ inline void division(uint64_t n, uint64_t &q, uint64_t &r) const {
+#ifdef HAVE_INT128
+ switch(m_) {
+ case 0:
+ q = n >> p_;
+ r = n & (((uint64_t)1 << p_) - 1);
+ break;
+ default:
+ q = divide(n);
+ r = n - q * d_;
+ break;
+ }
+#else
+ q = n / d_;
+ r = n % d_;
+#endif
+ }
+
+ uint64_t d() const { return d_; }
+ uint64_t p() const {
+#ifdef HAVE_INT128
+ return p_;
+#else
+ return 0;
+#endif
+ }
+ uint64_t m() const {
+#ifdef HAVE_INT128
+ return m_;
+#else
+ return 0;
+#endif
+ }
+};
+
+inline uint64_t operator/(uint64_t n, const divisor64& d) {
+ return d.divide(n);
+}
+inline uint64_t operator%(uint64_t n, const divisor64& d) {
+ return d.remainder(n);
+}
+
+inline std::ostream& operator<<(std::ostream& os, const divisor64& d) {
+ return os << "d:" << d.d() << ",p:" << d.p() << ",m:" << d.m();
+}
+
+} // namespace jflib
+
+#endif /* __JELLYFISH_DIVISOR_HPP__ */
+
diff --git a/include/jellyfish/dumper.hpp b/include/jellyfish/dumper.hpp
new file mode 100644
index 0000000..f12d604
--- /dev/null
+++ b/include/jellyfish/dumper.hpp
@@ -0,0 +1,103 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_DUMPER_HPP__
+#define __JELLYFISH_DUMPER_HPP__
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <vector>
+#include <string>
+#include <jellyfish/err.hpp>
+#include <jellyfish/time.hpp>
+
+/**
+ * A dumper is responsible to dump the hash array to permanent storage
+ * and zero out the array.
+ **/
+namespace jellyfish {
+template<typename storage_t>
+class dumper_t {
+ Time writing_time_;
+ int index_;
+ bool one_file_;
+ std::vector<std::string> file_names_;
+
+protected:
+ uint64_t min_;
+ uint64_t max_;
+
+public:
+ define_error_class(ErrorWriting);
+
+protected:
+ /// Open the next file with given prefix. If one_file is false,
+ /// append _0, _1, etc. to the prefix for actual file name. If
+ /// one_file is true, the prefix is the file name. The first time
+ /// the file is open in trunc mode, the subsequent times in append
+ /// mode.
+ void open_next_file(const char *prefix, std::ofstream &out) {
+ std::ostringstream name;
+ name << prefix;
+ std::ios::openmode mode = std::ios::out;
+ if(one_file_) {
+ mode |= (index_++ ? std::ios::ate : std::ios::trunc);
+ } else {
+ name << index_++;
+ mode |= std::ios::trunc;
+ }
+ file_names_.push_back(name.str());
+
+ out.open(name.str().c_str());
+ if(out.fail())
+ throw ErrorWriting(err::msg() << "'" << name.str() << "': "
+ << "Can't open file for writing" << err::no);
+ }
+
+public:
+ dumper_t() : writing_time_(::Time::zero), index_(0), one_file_(false),
+ min_(0), max_(std::numeric_limits<uint64_t>::max())
+ {}
+
+ void dump(storage_t* ary) {
+ Time start;
+ _dump(ary);
+ Time end;
+ writing_time_ += end - start;
+ }
+
+ bool one_file() const { return one_file_; }
+ void one_file(bool v) { one_file_ = v; }
+
+ virtual void _dump(storage_t* ary) = 0;
+ uint64_t min() const { return min_; }
+ void min(uint64_t m) { min_ = m; }
+ uint64_t max() const { return max_; }
+ void max(uint64_t m) { max_ = m; }
+ Time get_writing_time() const { return writing_time_; }
+ int nb_files() const { return index_; }
+ std::vector<std::string> file_names() { return file_names_; }
+ std::vector<const char*> file_names_cstr() {
+ std::vector<const char*> res;
+ for(size_t i = 0; i < file_names_.size(); ++i)
+ res.push_back(file_names_[i].c_str());
+ return res;
+ }
+ virtual ~dumper_t() {};
+};
+}
+#endif // __DUMPER_HPP__
diff --git a/include/jellyfish/err.hpp b/include/jellyfish/err.hpp
new file mode 100644
index 0000000..d30c026
--- /dev/null
+++ b/include/jellyfish/err.hpp
@@ -0,0 +1,99 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_ERR_HPP__
+#define __JELLYFISH_ERR_HPP__
+
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+#include <exception>
+#include <stdexcept>
+#include <cstdlib>
+#include <cstring>
+#include <cerrno>
+
+namespace jellyfish {
+namespace err {
+struct msg {
+ std::ostringstream msg_;
+
+ msg() { }
+ explicit msg(const std::exception& e) { *this << e; }
+ template<typename T>
+ explicit msg(const T& x) { *this << x; }
+
+ operator std::string() const { return msg_.str(); }
+
+ template<typename T>
+ msg& operator<<(const T& x) {
+ msg_ << x;
+ return *this;
+ }
+
+ msg& operator<<(const std::exception& e) {
+ msg_ << e.what();
+ // try {
+ // std::rethrow_if_nested(e);
+ // } catch (const std::exception& nested) {
+ // msg_ << '\n';
+ // return *this << nested;
+ // }
+ return *this;
+ }
+
+ msg& operator<<(msg& (*pf)(msg&)) { return pf(*this); }
+
+};
+
+// Select the correct version (GNU or XSI) version of
+// ::strerror_r. err::strerror_ behaves like the GNU version of strerror_r,
+// regardless of which version is provided by the system.
+inline const char* strerror__(char* buf, int res) {
+ return res != -1 ? buf : "error";
+}
+inline const char* strerror__(char* buf, char* res) {
+ return res;
+}
+inline const char* strerror_r(int err, char* buf, size_t buflen) {
+ return strerror__(buf, ::strerror_r(err, buf, buflen));
+}
+
+inline std::ostream& no(std::ostream& os) {
+ char buf[128];
+ return os << strerror_r(errno, buf, sizeof(buf));
+}
+
+inline msg& no(msg& m) {
+ char buf[128];
+ return m << strerror_r(errno, buf, sizeof(buf));
+}
+
+inline void die(int code, std::string msg) {
+ std::cerr << msg << '\n';
+ exit(code);
+}
+
+inline void die(std::string msg) { die(1, msg); }
+} // namespace err
+} // namespace jellyfish
+
+#define define_error_class(name) \
+ class name : public std::runtime_error { \
+ public: explicit name(const std::string &txt) : std::runtime_error(txt) {} \
+ }
+
+#endif // __JELLYFISH_ERR_HPP__
diff --git a/include/jellyfish/file_header.hpp b/include/jellyfish/file_header.hpp
new file mode 100644
index 0000000..c43f736
--- /dev/null
+++ b/include/jellyfish/file_header.hpp
@@ -0,0 +1,112 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_FILE_HEADER_HPP__
+#define __JELLYFISH_FILE_HEADER_HPP__
+
+#include <string>
+#include <jellyfish/generic_file_header.hpp>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+
+namespace jellyfish {
+/// A header with jellyfish hash specific entries: size, matrix, etc.
+class file_header : public generic_file_header {
+public:
+ file_header() : generic_file_header(sizeof(uint64_t)) { }
+ file_header(std::istream& is) : generic_file_header(sizeof(uint64_t)) {
+ this->read(is);
+ }
+
+ template<typename storage>
+ void update_from_ary(const storage& ary) {
+ this->size(ary.size());
+ this->key_len(ary.key_len());
+ this->val_len(ary.val_len());
+ this->matrix(ary.matrix());
+ this->max_reprobe(ary.max_reprobe());
+ this->set_reprobes(ary.reprobes());
+ }
+
+ RectangularBinaryMatrix matrix(int i = 1) const {
+ std::string name("matrix");
+ name += std::to_string((long long int)i); // Cast to make gcc4.4 happy!
+ const unsigned int r = root_[name]["r"].asUInt();
+ const unsigned int c = root_[name]["c"].asUInt();
+ std::vector<uint64_t> raw(c, (uint64_t)0);
+ for(unsigned int i = 0; i < c; ++i)
+ raw[i] = root_[name]["columns"][i].asUInt64();
+ return RectangularBinaryMatrix(raw.data(), r, c);
+ }
+
+ void matrix(const RectangularBinaryMatrix& m, int i = 1) {
+ std::string name("matrix");
+ name += std::to_string((long long int)i);
+ root_[name].clear();
+ root_[name]["r"] = m.r();
+ root_[name]["c"] = m.c();
+ for(unsigned int i = 0; i < m.c(); ++i) {
+ Json::UInt64 x = m[i];
+ root_[name]["columns"].append(x);
+ }
+ }
+
+ size_t size() const { return root_["size"].asLargestUInt(); }
+ void size(size_t s) { root_["size"] = (Json::UInt64)s; }
+
+ unsigned int key_len() const { return root_["key_len"].asUInt(); }
+ void key_len(unsigned int k) { root_["key_len"] = (Json::UInt)k; }
+
+ unsigned int val_len() const { return root_["val_len"].asUInt(); }
+ void val_len(unsigned int k) { root_["val_len"] = (Json::UInt)k; }
+
+ unsigned int max_reprobe() const { return root_["max_reprobe"].asUInt(); }
+ void max_reprobe(unsigned int m) { root_["max_reprobe"] = (Json::UInt)m; }
+
+ size_t max_reprobe_offset() const { return root_["reprobes"][max_reprobe()].asLargestUInt(); }
+
+ double fpr() const { return root_["fpr"].asDouble(); }
+ void fpr(double f) { root_["fpr"] = f; }
+
+ unsigned long nb_hashes() const { return root_["nb_hashes"].asUInt(); }
+ void nb_hashes(unsigned long nbh) { root_["nb_hashes"] = (Json::UInt)nbh; }
+
+ bool canonical() const { return root_.get("canonical", false).asBool(); }
+ void canonical(bool v) { root_["canonical"] = v; }
+
+ /// reprobes must be at least max_reprobe() + 1 long
+ void get_reprobes(size_t* reprobes) const {
+ for(unsigned int i = 0; i <= max_reprobe(); ++i)
+ reprobes[i] = root_["reprobes"][i].asLargestUInt();
+ }
+
+ /// This must be call after max_reprobe has been set. reprobes must
+ /// be at least max_reprobe() + 1 long.
+ void set_reprobes(const size_t* reprobes) {
+ root_["reprobes"].clear();
+ for(unsigned int i = 0; i <= max_reprobe(); ++i)
+ root_["reprobes"].append((Json::UInt64)reprobes[i]);
+ }
+
+ /// Length of counter field in binary/sorted format
+ unsigned int counter_len() const { return root_["counter_len"].asUInt(); }
+ void counter_len(unsigned int l) { root_["counter_len"] = (Json::UInt)l; }
+
+ std::string format() const { return root_["format"].asString(); }
+ void format(const std::string& s) { root_["format"] = s; }
+};
+} // namespace jellyfish
+
+#endif /* __JELLYFISH_FILE_HEADER_HPP__ */
diff --git a/include/jellyfish/generator_manager.hpp b/include/jellyfish/generator_manager.hpp
new file mode 100644
index 0000000..ece2dd5
--- /dev/null
+++ b/include/jellyfish/generator_manager.hpp
@@ -0,0 +1,163 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __JELLYFISH_SPAWN_EXTERNAL_HPP_
+#define __JELLYFISH_SPAWN_EXTERNAL_HPP_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <iostream>
+#include <vector>
+#include <map>
+#include <stdexcept>
+
+#ifdef HAVE_EXT_STDIO_FILEBUF_H
+#include <ext/stdio_filebuf.h>
+#define STDIO_FILEBUF_TYPE __gnu_cxx::stdio_filebuf<std::istream::char_type>
+#else
+#include <jellyfish/stdio_filebuf.hpp>
+#define STDIO_FILEBUF_TYPE jellyfish::stdio_filebuf<std::istream::char_type>
+#endif
+
+#include <jellyfish/err.hpp>
+
+namespace jellyfish {
+// Open a path and set CLOEXEC flags
+int open_cloexec(const char* path, int flags);
+
+// Input stream (inherit from std::istream, behaves mostly like an
+// ifstream), with flag O_CLOEXEC (close-on-exec) turned on.
+class cloexec_istream : public std::istream
+{
+ static std::streambuf* open_file(const char* path) {
+ int fd = open_cloexec(path, O_RDONLY);
+ return new STDIO_FILEBUF_TYPE(fd, std::ios::in);
+ }
+
+public:
+ cloexec_istream(const cloexec_istream&) = delete;
+ cloexec_istream(const char* path) :
+ std::istream((open_file(path)))
+ { }
+ cloexec_istream(const std::string& path) :
+ std::istream(open_file(path.c_str()))
+ { }
+ virtual ~cloexec_istream() { close(); }
+ void close() { delete std::istream::rdbuf(0); }
+};
+
+
+// This class is responsible for creating a tmp directory and
+// populating it with fifos.
+class tmp_pipes {
+ static std::string create_tmp_dir();
+ std::vector<std::string> create_pipes(const std::string& tmpdir, int nb_pipes);
+
+ std::string tmpdir_;
+ std::vector<std::string> pipes_;
+ std::vector<const char*> pipes_paths_;
+
+public:
+ tmp_pipes(int nb_pipes):
+ tmpdir_(create_tmp_dir()),
+ pipes_(create_pipes(tmpdir_, nb_pipes))
+ {
+ for(auto it = pipes_.cbegin(); it != pipes_.cend(); ++it)
+ pipes_paths_.push_back(it->c_str());
+ }
+ ~tmp_pipes() { cleanup(); }
+
+ size_t size() const { return pipes_.size(); }
+ const char* operator[](int i) const { return pipes_[i].c_str(); }
+ std::vector<const char*>::const_iterator begin() const { return pipes_paths_.cbegin(); }
+ std::vector<const char*>::const_iterator end() const { return pipes_paths_.cend(); }
+
+ // Discard a pipe: unlink it while it is open for writing. The
+ // reading process will get no data and won't be able to reopen the
+ // file, marking the end of this pipe.
+ void discard(int i);
+ // Discard all pipes
+ void cleanup();
+};
+
+// This class creates a new process which manages a bunch of
+// "generators", sub-processes that writes into a fifo (named pipe)
+// and generate sequence.
+class generator_manager {
+ cloexec_istream cmds_;
+ tmp_pipes pipes_;
+ pid_t manager_pid_;
+ const char* shell_;
+ int kill_signal_; // if >0, process has received that signal
+
+ struct cmd_info_type {
+ std::string command;
+ int pipe;
+ };
+ typedef std::map<pid_t, cmd_info_type> pid2pipe_type;
+ pid2pipe_type pid2pipe_;
+
+public:
+ generator_manager(const char* cmds, int nb_pipes, const char* shell = 0) :
+ cmds_(cmds),
+ pipes_(nb_pipes),
+ manager_pid_(-1),
+ shell_(shell),
+ kill_signal_(0)
+ {
+ if(!cmds_.good())
+ throw std::runtime_error(err::msg() << "Failed to open cmds file '" << cmds << "'");
+ if(!shell_)
+ shell_ = getenv("SHELL");
+ if(!shell_)
+ shell_ = "/bin/sh";
+ }
+ ~generator_manager() { wait(); }
+
+ const tmp_pipes& pipes() const { return pipes_; }
+ pid_t pid() const { return manager_pid_; }
+
+ // Start the manager process
+ void start();
+ // Wait for manager process to finish. Return true if it finishes
+ // with no error, false otherwise.
+ bool wait();
+
+private:
+ /// Read commands from the cmds stream. There is one command per
+ /// line. Empty lines or lines whose first non-white space character
+ /// is a # are ignored. Return an empty string when no more commands
+ /// are available.
+ std::string get_cmd();
+ void start_commands();
+ void start_one_command(const std::string& command, int pipe);
+ bool display_status(int status, const std::string& command);
+ void setup_signal_handlers();
+ void unset_signal_handlers();
+ static void signal_handler(int signal);
+ void cleanup();
+};
+}
+
+#endif /* __JELLYFISH_SPAWN_EXTERNAL_HPP_ */
diff --git a/include/jellyfish/generic_file_header.hpp b/include/jellyfish/generic_file_header.hpp
new file mode 100644
index 0000000..a8ddf82
--- /dev/null
+++ b/include/jellyfish/generic_file_header.hpp
@@ -0,0 +1,255 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_GENERIC_FILE_HEADER_HPP__
+#define __JELLYFISH_GENERIC_FILE_HEADER_HPP__
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_NSGETEXECUTABLEPATH
+#include <mach-o/dyld.h>
+#endif
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/utsname.h>
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+
+#include <jellyfish/json.h>
+
+namespace jellyfish {
+/// Generic file header. It contains by default the hostname, the
+/// current time, the current working directory and the path to the
+/// executable.
+class generic_file_header {
+protected:
+ static const int MAX_HEADER_DIGITS = 9;
+ Json::Value root_;
+ size_t offset_; // Nb of bytes past header
+
+ struct buffer {
+ char* data;
+ buffer(size_t size) : data(new char[size]) { }
+ ~buffer() { delete [] data; }
+ };
+
+ struct restore_fmtflags {
+ std::ostream& os_;
+ std::ios::fmtflags flags_;
+ std::streamsize width_;
+ char fill_;
+ restore_fmtflags(std::ostream& os) :
+ os_(os), flags_(os.flags(std::ios::fmtflags())), width_(os.width()), fill_(os.fill())
+ { }
+ ~restore_fmtflags() {
+ os_.flags(flags_);
+ os_.width(width_);
+ os_.fill(fill_);
+ }
+ };
+
+ static void chomp(std::string& s) {
+ size_t found = s.find_last_not_of(" \t\f\v\n\r");
+ if (found != std::string::npos)
+ s.erase(found+1);
+ else
+ s.clear();
+ }
+
+public:
+ explicit generic_file_header(int alignment = 0)
+ {
+ root_["alignment"] = alignment;
+ }
+
+ bool operator==(const generic_file_header& rhs) const {
+ std::cerr << "operator== " << (root_ == rhs.root_) << "\n";
+ return root_ == rhs.root_;
+ }
+ bool operator!=(const generic_file_header& rhs) const { return root_ != rhs.root_; }
+
+ /// Write the header to an output stream. The format will be: the
+ /// length written in text and decimal, followed by the header in
+ /// terse JSON format, followed by some padding to align according
+ /// to the `alignment_` member.
+ void write(std::ostream& os) {
+ restore_fmtflags flags(os);
+ Json::FastWriter writer;
+ std::string header = writer.write(root_);
+ chomp(header);
+
+ int align = alignment();
+ int padding = 0;
+ size_t hlen = header.size();
+ if(align > 0) {
+ padding = (MAX_HEADER_DIGITS + header.size()) % align;
+ if(padding)
+ hlen += align - padding;
+ }
+ os << std::dec << std::right << std::setw(MAX_HEADER_DIGITS) << std::setfill('0') << hlen;
+ os.write(header.c_str(), header.size());
+ offset_ = MAX_HEADER_DIGITS + hlen;
+
+ if(padding) {
+ char pad[align - padding];
+ memset(pad, '\0', align - padding);
+ os.write(pad, align - padding);
+ }
+ }
+
+ /// Read an input stream to search for a header. If one is found,
+ /// true is returned. In that case, the position in the input stream points after the header and padding.
+ ///
+ /// If false is returned, the parsing failed. The
+ /// position in the input stream may have changed and the keys
+ /// present in this header may be anything.
+ bool read(std::istream& is) {
+ std::string len;
+ int i;
+ for(i = 0; i < MAX_HEADER_DIGITS && isdigit(is.peek()); ++i)
+ len += is.get();
+ if(is.peek() != '{')
+ return false;
+ unsigned long hlen = atol(len.c_str());
+ if(hlen < 2)
+ return false;
+
+ offset_ = MAX_HEADER_DIGITS + hlen;
+ buffer hbuf(hlen);
+ is.read(hbuf.data, hlen);
+ if(!is.good())
+ return false;
+ const char* end = hbuf.data + hlen;
+ while(end > hbuf.data && *(end - 1) == '\0') --end;
+
+ Json::Reader reader;
+ if(!reader.parse(hbuf.data, end, root_, false))
+ return false;
+
+ return true;
+ }
+
+ const Json::Value root() const { return root_; }
+
+ void fill_standard() {
+ root_["hostname"] = get_hostname();
+ root_["pwd"] = get_pwd();
+ root_["time"] = get_localtime();
+ root_["exe_path"] = get_exe_path();
+ }
+
+ std::string operator[](const std::string& key) const { return root_.get(key, "").asString(); }
+ std::string operator[](const char* key) const { return root_.get(key, "").asString(); }
+ int alignment() const { return std::max(0, root_.get("alignment", 0).asInt()); }
+ size_t offset() const { return offset_; }
+
+ std::vector<std::string> cmdline() const {
+ std::vector<std::string> res;
+ for(unsigned int i = 0; i < root_["cmdline"].size(); ++i)
+ res.push_back(root_["cmdline"][i].asString());
+ return res;
+ }
+
+
+ void set_cmdline(int argc, char* argv[]) {
+ root_["cmdline"].clear();
+ for(int i = 0; i < argc; i++)
+ root_["cmdline"].append(argv[i]);
+ }
+
+protected:
+ std::string get_hostname() const {
+ struct utsname buf;
+ if(uname(&buf) == -1)
+ return "";
+ return buf.nodename;
+ }
+
+ std::string get_pwd() const {
+#ifdef PATH_MAX
+ size_t len = PATH_MAX;
+#else
+ size_t len = 1024;
+#endif
+ char path[len + 1];
+
+ if(!getcwd(path, len + 1))
+ path[0] = '\0';
+ return path;
+ }
+
+ std::string get_localtime() const {
+ time_t t = time(0);
+ std::string res(ctime(&t));
+ chomp(res);
+ return res;
+ }
+
+ std::string get_exe_path() const {
+#ifdef HAVE_NSGETEXECUTABLEPATH
+ return get_exe_path_macosx();
+#else
+ return get_exe_path_linux();
+#endif
+ }
+
+#ifdef HAVE_NSGETEXECUTABLEPATH
+ std::string get_exe_path_macosx() const {
+#ifdef MAXPATHLEN
+ size_t len = MAXPATHLEN;
+#else
+ size_t len = 1024;
+#endif
+
+ char path[len + 1];
+ if(_NSGetExecutablePath(path, (uint32_t*)&len) == -1)
+ return "";
+
+ return std::string(path);
+ }
+#endif // HAVE_NSGETEXECUTABLEPATH
+
+ std::string get_exe_path_linux() const {
+#ifdef PATH_MAX
+ size_t len = PATH_MAX;
+#else
+ size_t len = 1024;
+#endif
+
+ char path[len + 1];
+ ssize_t l = readlink("/proc/self/exe", path, len + 1);
+ if(l == -1)
+ return "";
+ return std::string(path, l);
+ }
+};
+
+inline std::ostream& operator<<(std::ostream& os, const generic_file_header& h) {
+ Json::StyledWriter w;
+ return os << w.write(h.root());
+}
+
+} // namespace jellyfish
+
+#endif /* __JELLYFISH_GENERIC_FILE_HEADER_HPP__ */
diff --git a/include/jellyfish/hash_counter.hpp b/include/jellyfish/hash_counter.hpp
new file mode 100644
index 0000000..9b18bab
--- /dev/null
+++ b/include/jellyfish/hash_counter.hpp
@@ -0,0 +1,244 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __HASH_COUNTER_HPP__
+#define __HASH_COUNTER_HPP__
+
+#include <stdexcept>
+
+#include <jellyfish/large_hash_array.hpp>
+#include <jellyfish/locks_pthread.hpp>
+#include <jellyfish/dumper.hpp>
+
+/// Cooperative version of the hash_counter. In this implementation,
+/// it is expected that the given number of threads will call the
+/// `add` method regularly. In case the hash table is full, it gets
+/// enlarged using all the threads. After the work is done, every
+/// thread must call promptly the `done` method.
+
+namespace jellyfish{ namespace cooperative {
+
+template<typename Key, typename word = uint64_t, typename atomic_t = ::atomic::gcc, typename mem_block_t = ::allocators::mmap>
+class hash_counter {
+public:
+ typedef typename large_hash::array<Key, word, atomic_t, mem_block_t> array;
+ typedef typename array::key_type key_type;
+ typedef typename array::mapped_type mapped_type;
+ typedef typename array::value_type value_type;
+ typedef typename array::reference reference;
+ typedef typename array::const_reference const_reference;
+ typedef typename array::pointer pointer;
+ typedef typename array::const_pointer const_pointer;
+ typedef typename array::eager_iterator eager_iterator;
+ typedef typename array::lazy_iterator lazy_iterator;
+
+protected:
+ array* ary_;
+ array* new_ary_;
+ uint16_t nb_threads_;
+ locks::pthread::barrier size_barrier_;
+ volatile uint16_t size_thid_, done_threads_;
+ bool do_size_doubling_;
+ dumper_t<array>* dumper_;
+
+public:
+ hash_counter(size_t size, // Size of hash. To be rounded up to a power of 2
+ uint16_t key_len, // Size of key in bits
+ uint16_t val_len, // Size of val in bits
+ uint16_t nb_threads, // Number of threads accessing this hash
+ uint16_t reprobe_limit = 126, // Maximum reprobe
+ const size_t* reprobes = jellyfish::quadratic_reprobes) :
+ ary_(new array(size, key_len, val_len, reprobe_limit, reprobes)),
+ new_ary_(0),
+ nb_threads_(nb_threads),
+ size_barrier_(nb_threads),
+ size_thid_(0),
+ done_threads_(0),
+ do_size_doubling_(true),
+ dumper_(0)
+ { }
+
+ ~hash_counter() {
+ delete ary_;
+ }
+
+ array* ary() { return ary_; }
+ const array* ary() const { return ary_; }
+ size_t size() const { return ary_->size(); }
+ uint16_t key_len() const { return ary_->key_len(); }
+ uint16_t val_len() const { return ary_->val_len(); }
+ uint16_t nb_threads() const { return nb_threads; }
+ uint16_t reprobe_limit() const { return ary_->max_reprobe(); }
+
+
+ /// Whether we attempt to double the size of the hash when full.
+ bool do_size_doubling() const { return do_size_doubling_; }
+ /// Set whether we attempt to double the size of the hash when full.
+ void do_size_doubling(bool v) { do_size_doubling_ = v; }
+
+ /// Set dumper responsible for cleaning out the array.
+ void dumper(dumper_t<array> *d) { dumper_ = d; }
+
+ /// Add `v` to the entry `k`. It returns in `is_new` true if the
+ /// entry `k` did not exist in the hash. In `id` is returned the
+ /// final position of `k` in the hash array.
+ void add(const Key& k, uint64_t v, bool* is_new, size_t* id) {
+ unsigned int carry_shift = 0;
+ bool* is_new_ptr = is_new;
+ size_t* id_ptr = id;
+ bool is_new_void = false;
+ size_t id_void = false;
+
+ while(!ary_->add(k, v, &carry_shift, is_new_ptr, id_ptr)) {
+ handle_full_ary();
+ v &= ~(uint64_t)0 << carry_shift;
+ // If carry_shift == 0, failed to allocate the first field for
+ // key, hence status of is_new and value for id are not
+ // determined yet. On the other hand, if carry_shift > 0, we
+ // failed while adding extra field for large key, so the status
+ // of is_new and value of id are known. We do not update them in future
+ // calls.
+ if(carry_shift) {
+ is_new_ptr = &is_new_void;
+ id_ptr = &id_void;
+ }
+ }
+ }
+
+ /// Add `v` to the entry `k`. This method is multi-thread safe. If
+ /// the entry for `k` does not exists, it is inserted.
+ ///
+ /// @param k Key to add to
+ /// @param v Value to add
+ inline void add(const Key& k, uint64_t v) {
+ bool is_new;
+ size_t id;
+ add(k, v, &is_new, &id);
+ }
+
+ /// Insert the key `k` in the hash. The value is not changed or set
+ /// to 0 if not already in the hash.
+ ///
+ /// @param k Key to insert
+ inline void set(const Key& k) {
+ bool is_new;
+ size_t id;
+ set(k, &is_new, &id);
+ }
+
+ /// Insert the key `k` in the hash. The value is not changed or set
+ /// to 0 if not already in the hash. Set `is_new` to true if `k` did
+ /// not already exist in the hash. In `id` is returned the final
+ /// position of `k` in the hash.
+ void set(const Key& k, bool* is_new, size_t* id) {
+ while(!ary_->set(k, is_new, id))
+ handle_full_ary();
+ }
+
+ /// Update the value of key `k` by adding `v`, if `k` is already
+ /// present in the hash, otherwise this nothing happens. Returns
+ /// true if `k` is already in the hash, false otherwise.
+ bool update_add(const Key& k, uint64_t v) {
+ Key tmp_key;
+ return update_add(k, v, tmp_key);
+ }
+
+ bool update_add(const Key& k, uint64_t v, Key& tmp_key) {
+ unsigned int carry_shift = 0;
+
+ while(true) {
+ if(ary_->update_add(k, v, &carry_shift, tmp_key))
+ return true;
+ if(carry_shift == 0)
+ return false;
+ handle_full_ary();
+ v &= ~(uint64_t)0 << carry_shift;
+ }
+ }
+
+ /// Signify that thread is done and wait for all threads to be done.
+ void done() {
+ atomic_t::fetch_add(&done_threads_, (uint16_t)1);
+ while(!handle_full_ary()) ;
+ }
+
+protected:
+ // Double the size of the hash and return false. Unless all the
+ // thread have reported they are done, in which case do nothing and
+ // return true.
+ bool handle_full_ary() {
+ bool serial_thread = size_barrier_.wait();
+ if(done_threads_ >= nb_threads_) // All done?
+ return true;
+
+ bool success = false;
+ if(do_size_doubling_)
+ success = success || double_size(serial_thread);
+
+ if(!success && dumper_) {
+ if(serial_thread)
+ dumper_->dump(ary_);
+ success = true;
+ size_barrier_.wait();
+ }
+
+ if(!success)
+ throw std::runtime_error("Hash full");
+
+ return false;
+ }
+
+ bool double_size(bool serial_thread) {
+ if(serial_thread) {// Allocate new array for size doubling
+ try {
+ new_ary_ = new array(ary_->size() * 2, ary_->key_len(), ary_->val_len(),
+ ary_->max_reprobe(), ary_->reprobes());
+ } catch(typename array::ErrorAllocation e) {
+ new_ary_ = 0;
+ }
+ }
+ size_thid_ = 0;
+
+ size_barrier_.wait();
+ array* my_ary = *(array* volatile*)&new_ary_;
+ if(!my_ary) // Allocation failed
+ return false;
+
+ // Copy data from old to new
+ uint16_t id = atomic_t::fetch_add(&size_thid_, (uint16_t)1);
+ // Why doesn't the following work? Seems like a bug to
+ // me. Equivalent call works in test_large_hash_array. Or am I
+ // missing something?
+ // eager_iterator it = ary_->iterator_slice<eager_iterator>(id, nb_threads_);
+ eager_iterator it = ary_->eager_slice(id, nb_threads_);
+ while(it.next())
+ my_ary->add(it.key(), it.val());
+
+ size_barrier_.wait();
+
+ if(serial_thread) { // Set new ary to be current and free old
+ delete ary_;
+ ary_ = new_ary_;
+ }
+
+ // Done. Last sync point
+ size_barrier_.wait();
+ return true;
+ }
+};
+
+} } // namespace jellyfish { namespace cooperative {
+#endif /* __HASH_COUNTER_HPP__ */
diff --git a/include/jellyfish/int128.hpp b/include/jellyfish/int128.hpp
new file mode 100644
index 0000000..56ab25a
--- /dev/null
+++ b/include/jellyfish/int128.hpp
@@ -0,0 +1,203 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _INT128_H_
+#define _INT128_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#ifndef HAVE_INT128
+#error "The type __int128 is not supported"
+#endif
+#endif
+
+#include <unistd.h>
+#include <stdint.h>
+#include <iostream>
+#include <sstream>
+#include <limits>
+#include <cstring>
+
+// Output of __int128: this might be slow
+namespace __int128_ns {
+template<int base>
+void __print_digits(std::ostream& os, unsigned __int128 x,
+ bool lower = true) {
+ char buf[50];
+ char* ptr = buf + sizeof(buf);
+ do {
+ int o = x % base;
+ if(o < 10) {
+ *--ptr = '0' + o;
+ } else {
+ *--ptr = (lower ? 'a' : 'A') + o - 10;
+ }
+ x /= base;
+ } while (x > 0);
+ os.write(ptr, buf + sizeof(buf) - ptr);
+}
+
+inline bool is_negative(unsigned __int128 x) { return false; }
+inline bool is_negative(__int128 x) { return x < 0; }
+
+template<typename T>
+void __print_decimal(std::ostream& prefix, std::ostream& os, T x,
+ const std::ios::fmtflags& ff) {
+ if((ff & std::ios::showpos) && x > 0)
+ prefix << "+";
+ if(x == 0) {
+ os << "0";
+ return;
+ }
+ if(is_negative(x)) {
+ prefix << "-";
+ x = -x;
+ }
+ __print_digits<10>(os, x);
+}
+
+void __print_bases(std::ostream& prefix, std::ostream& os,
+ unsigned __int128 x,
+ const std::ios::fmtflags& ff);
+
+template<typename T>
+void __print_buf(std::ostream& prefix, std::ostream& os, T x,
+ const std::ios::fmtflags& ff) {
+ if(ff & std::ios::dec)
+ __print_decimal(prefix, os, x, ff);
+ else
+ __print_bases(prefix, os, (unsigned __int128)x, ff);
+}
+
+template<typename T>
+void __print(std::ostream&os, T x) {
+ const std::ios_base::fmtflags ff = os.flags();
+
+ if(!(ff & std::ios::adjustfield))
+ return __print_buf(os, os, x, ff);
+
+ std::ostringstream prefix;
+ std::ostringstream buf;
+ __print_buf(prefix, buf, x, ff);
+ ssize_t nb_padding = os.width() - (prefix.str().size() + buf.str().size());
+ if(nb_padding <= 0) {
+ os.write(prefix.str().c_str(), prefix.tellp());
+ os.write(buf.str().c_str(), buf.tellp());
+ return;
+ }
+
+ char padding[nb_padding];
+ memset(padding, os.fill(), nb_padding);
+ if(ff & std::ios::right)
+ os.write(padding, nb_padding);
+ os.write(prefix.str().c_str(), prefix.tellp());
+ if(ff & std::ios::internal)
+ os.write(padding, nb_padding);
+ os.write(buf.str().c_str(), buf.tellp());
+ if(ff & std::ios::left)
+ os.write(padding, nb_padding);
+}
+}
+
+inline
+std::ostream& operator<<(std::ostream& os, __int128 x) {
+ __int128_ns::__print(os, x);
+ return os;
+}
+
+inline
+std::ostream& operator<<(std::ostream& os, unsigned __int128 x) {
+ __int128_ns::__print(os, x);
+ return os;
+}
+
+#ifndef HAVE_NUMERIC_LIMITS128
+namespace std {
+template<>
+class numeric_limits<__int128> {
+public:
+ static const bool is_specialized = true;
+ static __int128 max() { return (unsigned __int128)-1 >> 1; }
+ static __int128 min() { return max() + 1; }
+ static const int digits = 127;
+ static const int digits10 = 38;
+#define NLS64 numeric_limits<int64_t>
+ static const bool is_signed = NLS64::is_signed;
+ static const bool is_integer = NLS64::is_integer;
+ static const bool is_exact = NLS64::is_exact;
+ static const int radix = NLS64::radix;
+ static __int128 epsilon() { return NLS64::epsilon(); }
+ static __int128 round_error() { return NLS64::round_error(); }
+ static const int min_exponent = NLS64::min_exponent;
+ static const int min_exponent10 = NLS64::min_exponent10;
+ static const int max_exponent = NLS64::max_exponent;
+ static const int max_exponent10 = NLS64::max_exponent10;
+ static const bool has_infinity = NLS64::has_infinity;
+ static const bool has_quiet_NaN = NLS64::has_quiet_NaN;
+ static const bool has_signaling_NaN = NLS64::has_signaling_NaN;
+ static const float_denorm_style has_denorm = NLS64::has_denorm;
+ static const bool has_denorm_loss = NLS64::has_denorm_loss;
+ static __int128 infinity() { return NLS64::infinity(); }
+ static __int128 quiet_NaN() { return NLS64::quiet_NaN(); }
+ static __int128 signaling_NaN() { return NLS64::signaling_NaN(); }
+ static __int128 denorm_min() { return NLS64::denorm_min(); }
+ static const bool is_iec559 = NLS64::is_iec559;
+ static const bool is_bounded = NLS64::is_bounded;
+ static const bool is_modulo = NLS64::is_modulo;
+ static const bool traps = NLS64::traps;
+ static const bool tinyness_before = NLS64::tinyness_before;
+ static const float_round_style round_style = NLS64::round_style;
+};
+
+template<>
+class numeric_limits<unsigned __int128> {
+public:
+ static const bool is_specialized = true;
+ static __int128 max() { return (unsigned __int128)-1; }
+ static __int128 min() { return 0; }
+ static const int digits = 128;
+ static const int digits10 = 39;
+#define NLU64 numeric_limits<uint64_t>
+ static const bool is_signed = NLU64::is_signed;
+ static const bool is_integer = NLU64::is_integer;
+ static const bool is_exact = NLU64::is_exact;
+ static const int radix = NLU64::radix;
+ static __int128 epsilon() { return NLU64::epsilon(); }
+ static __int128 round_error() { return NLU64::round_error(); }
+ static const int min_exponent = NLU64::min_exponent;
+ static const int min_exponent10 = NLU64::min_exponent10;
+ static const int max_exponent = NLU64::max_exponent;
+ static const int max_exponent10 = NLU64::max_exponent10;
+ static const bool has_infinity = NLU64::has_infinity;
+ static const bool has_quiet_NaN = NLU64::has_quiet_NaN;
+ static const bool has_signaling_NaN = NLU64::has_signaling_NaN;
+ static const float_denorm_style has_denorm = NLU64::has_denorm;
+ static const bool has_denorm_loss = NLU64::has_denorm_loss;
+ static __int128 infinity() { return NLU64::infinity(); }
+ static __int128 quiet_NaN() { return NLU64::quiet_NaN(); }
+ static __int128 signaling_NaN() { return NLU64::signaling_NaN(); }
+ static __int128 denorm_min() { return NLU64::denorm_min(); }
+ static const bool is_iec559 = NLU64::is_iec559;
+ static const bool is_bounded = NLU64::is_bounded;
+ static const bool is_modulo = NLU64::is_modulo;
+ static const bool traps = NLU64::traps;
+ static const bool tinyness_before = NLU64::tinyness_before;
+ static const float_round_style round_style = NLU64::round_style;
+};
+} // namespace std
+#endif /* HAVE_NUMERIC_LIMITS128 */
+
+#endif /* _INT128_H_ */
diff --git a/include/jellyfish/jellyfish.hpp b/include/jellyfish/jellyfish.hpp
new file mode 100644
index 0000000..eec4e84
--- /dev/null
+++ b/include/jellyfish/jellyfish.hpp
@@ -0,0 +1,37 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_JELLYFISH_HPP__
+#define __JELLYFISH_JELLYFISH_HPP__
+
+#include <stdint.h>
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/hash_counter.hpp>
+#include <jellyfish/text_dumper.hpp>
+#include <jellyfish/binary_dumper.hpp>
+
+typedef jellyfish::cooperative::hash_counter<jellyfish::mer_dna> mer_hash;
+typedef mer_hash::array mer_array;
+typedef jellyfish::text_dumper<mer_array> text_dumper;
+typedef jellyfish::text_reader<jellyfish::mer_dna, uint64_t> text_reader;
+typedef jellyfish::binary_dumper<mer_array> binary_dumper;
+typedef jellyfish::binary_reader<jellyfish::mer_dna, uint64_t> binary_reader;
+typedef jellyfish::binary_query_base<jellyfish::mer_dna, uint64_t> binary_query;
+typedef jellyfish::binary_writer<jellyfish::mer_dna, uint64_t> binary_writer;
+typedef jellyfish::text_writer<jellyfish::mer_dna, uint64_t> text_writer;
+
+
+#endif /* __JELLYFISH_JELLYFISH_HPP__ */
diff --git a/include/jellyfish/json.h b/include/jellyfish/json.h
new file mode 100644
index 0000000..3f81d01
--- /dev/null
+++ b/include/jellyfish/json.h
@@ -0,0 +1,1855 @@
+/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/).
+/// It is intented to be used with #include <jellyfish/json.h>
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: LICENSE
+// //////////////////////////////////////////////////////////////////////
+
+/*
+The JsonCpp library's source code, including accompanying documentation,
+tests and demonstration applications, are licensed under the following
+conditions...
+
+The author (Baptiste Lepilleur) explicitly disclaims copyright in all
+jurisdictions which recognize such a disclaimer. In such jurisdictions,
+this software is released into the Public Domain.
+
+In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
+2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
+released under the terms of the MIT License (see below).
+
+In jurisdictions which recognize Public Domain property, the user of this
+software may choose to accept it either as 1) Public Domain, 2) under the
+conditions of the MIT License (see below), or 3) under the terms of dual
+Public Domain/MIT License conditions described here, as they choose.
+
+The MIT License is about as close to Public Domain as a license can get, and is
+described in clear, concise terms at:
+
+ http://en.wikipedia.org/wiki/MIT_License
+
+The full text of the MIT License follows:
+
+========================================================================
+Copyright (c) 2007-2010 Baptiste Lepilleur
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+========================================================================
+(END LICENSE TEXT)
+
+The MIT license is compatible with both the GPL and commercial
+software, affording one all of the rights of Public Domain with the
+minor nuisance of being required to keep the above copyright notice
+and license text in the source code. Note also that by accepting the
+Public Domain "license" you can re-license your copy using whatever
+license you like.
+
+*/
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: LICENSE
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+#ifndef JSON_AMALGATED_H_INCLUDED
+# define JSON_AMALGATED_H_INCLUDED
+/// If defined, indicates that the source file is amalgated
+/// to prevent private header inclusion.
+#define JSON_IS_AMALGATED
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: include/json/config.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef JSON_CONFIG_H_INCLUDED
+# define JSON_CONFIG_H_INCLUDED
+
+/// If defined, indicates that json library is embedded in CppTL library.
+//# define JSON_IN_CPPTL 1
+
+/// If defined, indicates that json may leverage CppTL library
+//# define JSON_USE_CPPTL 1
+/// If defined, indicates that cpptl vector based map should be used instead of std::map
+/// as Value container.
+//# define JSON_USE_CPPTL_SMALLMAP 1
+/// If defined, indicates that Json specific container should be used
+/// (hash table & simple deque container with customizable allocator).
+/// THIS FEATURE IS STILL EXPERIMENTAL! There is know bugs: See #3177332
+//# define JSON_VALUE_USE_INTERNAL_MAP 1
+/// Force usage of standard new/malloc based allocator instead of memory pool based allocator.
+/// The memory pools allocator used optimization (initializing Value and ValueInternalLink
+/// as if it was a POD) that may cause some validation tool to report errors.
+/// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined.
+//# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1
+
+/// If defined, indicates that Json use exception to report invalid type manipulation
+/// instead of C assert macro.
+/// # define JSON_USE_EXCEPTION 1
+
+/// If defined, indicates that the source file is amalgated
+/// to prevent private header inclusion.
+/// Remarks: it is automatically defined in the generated amalgated header.
+#define JSON_IS_AMALGAMATION 1
+
+
+# ifdef JSON_IN_CPPTL
+# include <cpptl/config.h>
+# ifndef JSON_USE_CPPTL
+# define JSON_USE_CPPTL 1
+# endif
+# endif
+
+# ifdef JSON_IN_CPPTL
+# define JSON_API CPPTL_API
+# elif defined(JSON_DLL_BUILD)
+# define JSON_API __declspec(dllexport)
+# elif defined(JSON_DLL)
+# define JSON_API __declspec(dllimport)
+# else
+# define JSON_API
+# endif
+
+// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for integer
+// Storages, and 64 bits integer support is disabled.
+// #define JSON_NO_INT64 1
+
+#if defined(_MSC_VER) && _MSC_VER <= 1200 // MSVC 6
+// Microsoft Visual Studio 6 only support conversion from __int64 to double
+// (no conversion from unsigned __int64).
+#define JSON_USE_INT64_DOUBLE_CONVERSION 1
+#endif // if defined(_MSC_VER) && _MSC_VER < 1200 // MSVC 6
+
+#if defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008
+/// Indicates that the following function is deprecated.
+# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
+#endif
+
+#if !defined(JSONCPP_DEPRECATED)
+# define JSONCPP_DEPRECATED(message)
+#endif // if !defined(JSONCPP_DEPRECATED)
+
+namespace Json {
+ typedef int Int;
+ typedef unsigned int UInt;
+# if defined(JSON_NO_INT64)
+ typedef int LargestInt;
+ typedef unsigned int LargestUInt;
+# undef JSON_HAS_INT64
+# else // if defined(JSON_NO_INT64)
+ // For Microsoft Visual use specific types as long long is not supported
+# if defined(_MSC_VER) // Microsoft Visual Studio
+ typedef __int64 Int64;
+ typedef unsigned __int64 UInt64;
+# else // if defined(_MSC_VER) // Other platforms, use long long
+ typedef long long int Int64;
+ typedef unsigned long long int UInt64;
+# endif // if defined(_MSC_VER)
+ typedef Int64 LargestInt;
+ typedef UInt64 LargestUInt;
+# define JSON_HAS_INT64
+# endif // if defined(JSON_NO_INT64)
+} // end namespace Json
+
+
+#endif // JSON_CONFIG_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: include/json/config.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: include/json/forwards.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef JSON_FORWARDS_H_INCLUDED
+# define JSON_FORWARDS_H_INCLUDED
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include "config.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+
+namespace Json {
+
+ // writer.h
+ class FastWriter;
+ class StyledWriter;
+
+ // reader.h
+ class Reader;
+
+ // features.h
+ class Features;
+
+ // value.h
+ typedef unsigned int ArrayIndex;
+ class StaticString;
+ class Path;
+ class PathArgument;
+ class Value;
+ class ValueIteratorBase;
+ class ValueIterator;
+ class ValueConstIterator;
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+ class ValueMapAllocator;
+ class ValueInternalLink;
+ class ValueInternalArray;
+ class ValueInternalMap;
+#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
+
+} // namespace Json
+
+
+#endif // JSON_FORWARDS_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: include/json/forwards.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: include/json/features.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef CPPTL_JSON_FEATURES_H_INCLUDED
+# define CPPTL_JSON_FEATURES_H_INCLUDED
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include "forwards.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+
+namespace Json {
+
+ /** \brief Configuration passed to reader and writer.
+ * This configuration object can be used to force the Reader or Writer
+ * to behave in a standard conforming way.
+ */
+ class JSON_API Features
+ {
+ public:
+ /** \brief A configuration that allows all features and assumes all strings are UTF-8.
+ * - C & C++ comments are allowed
+ * - Root object can be any JSON value
+ * - Assumes Value strings are encoded in UTF-8
+ */
+ static Features all();
+
+ /** \brief A configuration that is strictly compatible with the JSON specification.
+ * - Comments are forbidden.
+ * - Root object must be either an array or an object value.
+ * - Assumes Value strings are encoded in UTF-8
+ */
+ static Features strictMode();
+
+ /** \brief Initialize the configuration like JsonConfig::allFeatures;
+ */
+ Features();
+
+ /// \c true if comments are allowed. Default: \c true.
+ bool allowComments_;
+
+ /// \c true if root must be either an array or an object value. Default: \c false.
+ bool strictRoot_;
+ };
+
+} // namespace Json
+
+#endif // CPPTL_JSON_FEATURES_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: include/json/features.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: include/json/value.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef CPPTL_JSON_H_INCLUDED
+# define CPPTL_JSON_H_INCLUDED
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include "forwards.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+# include <string>
+# include <vector>
+
+# ifndef JSON_USE_CPPTL_SMALLMAP
+# include <map>
+# else
+# include <cpptl/smallmap.h>
+# endif
+# ifdef JSON_USE_CPPTL
+# include <cpptl/forwards.h>
+# endif
+
+/** \brief JSON (JavaScript Object Notation).
+ */
+namespace Json {
+
+ /** \brief Type of the value held by a Value object.
+ */
+ enum ValueType
+ {
+ nullValue = 0, ///< 'null' value
+ intValue, ///< signed integer value
+ uintValue, ///< unsigned integer value
+ realValue, ///< double value
+ stringValue, ///< UTF-8 string value
+ booleanValue, ///< bool value
+ arrayValue, ///< array value (ordered list)
+ objectValue ///< object value (collection of name/value pairs).
+ };
+
+ enum CommentPlacement
+ {
+ commentBefore = 0, ///< a comment placed on the line before a value
+ commentAfterOnSameLine, ///< a comment just after a value on the same line
+ commentAfter, ///< a comment on the line after a value (only make sense for root value)
+ numberOfCommentPlacement
+ };
+
+//# ifdef JSON_USE_CPPTL
+// typedef CppTL::AnyEnumerator<const char *> EnumMemberNames;
+// typedef CppTL::AnyEnumerator<const Value &> EnumValues;
+//# endif
+
+ /** \brief Lightweight wrapper to tag static string.
+ *
+ * Value constructor and objectValue member assignement takes advantage of the
+ * StaticString and avoid the cost of string duplication when storing the
+ * string or the member name.
+ *
+ * Example of usage:
+ * \code
+ * Json::Value aValue( StaticString("some text") );
+ * Json::Value object;
+ * static const StaticString code("code");
+ * object[code] = 1234;
+ * \endcode
+ */
+ class JSON_API StaticString
+ {
+ public:
+ explicit StaticString( const char *czstring )
+ : str_( czstring )
+ {
+ }
+
+ operator const char *() const
+ {
+ return str_;
+ }
+
+ const char *c_str() const
+ {
+ return str_;
+ }
+
+ private:
+ const char *str_;
+ };
+
+ /** \brief Represents a <a HREF="http://www.json.org">JSON</a> value.
+ *
+ * This class is a discriminated union wrapper that can represents a:
+ * - signed integer [range: Value::minInt - Value::maxInt]
+ * - unsigned integer (range: 0 - Value::maxUInt)
+ * - double
+ * - UTF-8 string
+ * - boolean
+ * - 'null'
+ * - an ordered list of Value
+ * - collection of name/value pairs (javascript object)
+ *
+ * The type of the held value is represented by a #ValueType and
+ * can be obtained using type().
+ *
+ * values of an #objectValue or #arrayValue can be accessed using operator[]() methods.
+ * Non const methods will automatically create the a #nullValue element
+ * if it does not exist.
+ * The sequence of an #arrayValue will be automatically resize and initialized
+ * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue.
+ *
+ * The get() methods can be used to obtanis default value in the case the required element
+ * does not exist.
+ *
+ * It is possible to iterate over the list of a #objectValue values using
+ * the getMemberNames() method.
+ */
+ class JSON_API Value
+ {
+ friend class ValueIteratorBase;
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ friend class ValueInternalLink;
+ friend class ValueInternalMap;
+# endif
+ public:
+ typedef std::vector<std::string> Members;
+ typedef ValueIterator iterator;
+ typedef ValueConstIterator const_iterator;
+ typedef Json::UInt UInt;
+ typedef Json::Int Int;
+# if defined(JSON_HAS_INT64)
+ typedef Json::UInt64 UInt64;
+ typedef Json::Int64 Int64;
+#endif // defined(JSON_HAS_INT64)
+ typedef Json::LargestInt LargestInt;
+ typedef Json::LargestUInt LargestUInt;
+ typedef Json::ArrayIndex ArrayIndex;
+
+ static const Value null;
+ /// Minimum signed integer value that can be stored in a Json::Value.
+ static const LargestInt minLargestInt;
+ /// Maximum signed integer value that can be stored in a Json::Value.
+ static const LargestInt maxLargestInt;
+ /// Maximum unsigned integer value that can be stored in a Json::Value.
+ static const LargestUInt maxLargestUInt;
+
+ /// Minimum signed int value that can be stored in a Json::Value.
+ static const Int minInt;
+ /// Maximum signed int value that can be stored in a Json::Value.
+ static const Int maxInt;
+ /// Maximum unsigned int value that can be stored in a Json::Value.
+ static const UInt maxUInt;
+
+ /// Minimum signed 64 bits int value that can be stored in a Json::Value.
+ static const Int64 minInt64;
+ /// Maximum signed 64 bits int value that can be stored in a Json::Value.
+ static const Int64 maxInt64;
+ /// Maximum unsigned 64 bits int value that can be stored in a Json::Value.
+ static const UInt64 maxUInt64;
+
+ private:
+#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+# ifndef JSON_VALUE_USE_INTERNAL_MAP
+ class CZString
+ {
+ public:
+ enum DuplicationPolicy
+ {
+ noDuplication = 0,
+ duplicate,
+ duplicateOnCopy
+ };
+ CZString( ArrayIndex index );
+ CZString( const char *cstr, DuplicationPolicy allocate );
+ CZString( const CZString &other );
+ ~CZString();
+ CZString &operator =( const CZString &other );
+ bool operator<( const CZString &other ) const;
+ bool operator==( const CZString &other ) const;
+ ArrayIndex index() const;
+ const char *c_str() const;
+ bool isStaticString() const;
+ private:
+ void swap( CZString &other );
+ const char *cstr_;
+ ArrayIndex index_;
+ };
+
+ public:
+# ifndef JSON_USE_CPPTL_SMALLMAP
+ typedef std::map<CZString, Value> ObjectValues;
+# else
+ typedef CppTL::SmallMap<CZString, Value> ObjectValues;
+# endif // ifndef JSON_USE_CPPTL_SMALLMAP
+# endif // ifndef JSON_VALUE_USE_INTERNAL_MAP
+#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+
+ public:
+ /** \brief Create a default Value of the given type.
+
+ This is a very useful constructor.
+ To create an empty array, pass arrayValue.
+ To create an empty object, pass objectValue.
+ Another Value can then be set to this one by assignment.
+ This is useful since clear() and resize() will not alter types.
+
+ Examples:
+ \code
+ Json::Value null_value; // null
+ Json::Value arr_value(Json::arrayValue); // []
+ Json::Value obj_value(Json::objectValue); // {}
+ \endcode
+ */
+ Value( ValueType type = nullValue );
+ Value( Int value );
+ Value( UInt value );
+#if defined(JSON_HAS_INT64)
+ Value( Int64 value );
+ Value( UInt64 value );
+#endif // if defined(JSON_HAS_INT64)
+ Value( double value );
+ Value( const char *value );
+ Value( const char *beginValue, const char *endValue );
+ /** \brief Constructs a value from a static string.
+
+ * Like other value string constructor but do not duplicate the string for
+ * internal storage. The given string must remain alive after the call to this
+ * constructor.
+ * Example of usage:
+ * \code
+ * Json::Value aValue( StaticString("some text") );
+ * \endcode
+ */
+ Value( const StaticString &value );
+ Value( const std::string &value );
+# ifdef JSON_USE_CPPTL
+ Value( const CppTL::ConstString &value );
+# endif
+ Value( bool value );
+ Value( const Value &other );
+ ~Value();
+
+ Value &operator=( const Value &other );
+ /// Swap values.
+ /// \note Currently, comments are intentionally not swapped, for
+ /// both logic and efficiency.
+ void swap( Value &other );
+
+ ValueType type() const;
+
+ bool operator <( const Value &other ) const;
+ bool operator <=( const Value &other ) const;
+ bool operator >=( const Value &other ) const;
+ bool operator >( const Value &other ) const;
+
+ bool operator ==( const Value &other ) const;
+ bool operator !=( const Value &other ) const;
+
+ int compare( const Value &other ) const;
+
+ const char *asCString() const;
+ std::string asString() const;
+# ifdef JSON_USE_CPPTL
+ CppTL::ConstString asConstString() const;
+# endif
+ Int asInt() const;
+ UInt asUInt() const;
+ Int64 asInt64() const;
+ UInt64 asUInt64() const;
+ LargestInt asLargestInt() const;
+ LargestUInt asLargestUInt() const;
+ float asFloat() const;
+ double asDouble() const;
+ bool asBool() const;
+
+ bool isNull() const;
+ bool isBool() const;
+ bool isInt() const;
+ bool isUInt() const;
+ bool isIntegral() const;
+ bool isDouble() const;
+ bool isNumeric() const;
+ bool isString() const;
+ bool isArray() const;
+ bool isObject() const;
+
+ bool isConvertibleTo( ValueType other ) const;
+
+ /// Number of values in array or object
+ ArrayIndex size() const;
+
+ /// \brief Return true if empty array, empty object, or null;
+ /// otherwise, false.
+ bool empty() const;
+
+ /// Return isNull()
+ bool operator!() const;
+
+ /// Remove all object members and array elements.
+ /// \pre type() is arrayValue, objectValue, or nullValue
+ /// \post type() is unchanged
+ void clear();
+
+ /// Resize the array to size elements.
+ /// New elements are initialized to null.
+ /// May only be called on nullValue or arrayValue.
+ /// \pre type() is arrayValue or nullValue
+ /// \post type() is arrayValue
+ void resize( ArrayIndex size );
+
+ /// Access an array element (zero based index ).
+ /// If the array contains less than index element, then null value are inserted
+ /// in the array so that its size is index+1.
+ /// (You may need to say 'value[0u]' to get your compiler to distinguish
+ /// this from the operator[] which takes a string.)
+ Value &operator[]( ArrayIndex index );
+
+ /// Access an array element (zero based index ).
+ /// If the array contains less than index element, then null value are inserted
+ /// in the array so that its size is index+1.
+ /// (You may need to say 'value[0u]' to get your compiler to distinguish
+ /// this from the operator[] which takes a string.)
+ Value &operator[]( int index );
+
+ /// Access an array element (zero based index )
+ /// (You may need to say 'value[0u]' to get your compiler to distinguish
+ /// this from the operator[] which takes a string.)
+ const Value &operator[]( ArrayIndex index ) const;
+
+ /// Access an array element (zero based index )
+ /// (You may need to say 'value[0u]' to get your compiler to distinguish
+ /// this from the operator[] which takes a string.)
+ const Value &operator[]( int index ) const;
+
+ /// If the array contains at least index+1 elements, returns the element value,
+ /// otherwise returns defaultValue.
+ Value get( ArrayIndex index,
+ const Value &defaultValue ) const;
+ /// Return true if index < size().
+ bool isValidIndex( ArrayIndex index ) const;
+ /// \brief Append value to array at the end.
+ ///
+ /// Equivalent to jsonvalue[jsonvalue.size()] = value;
+ Value &append( const Value &value );
+
+ /// Access an object value by name, create a null member if it does not exist.
+ Value &operator[]( const char *key );
+ /// Access an object value by name, returns null if there is no member with that name.
+ const Value &operator[]( const char *key ) const;
+ /// Access an object value by name, create a null member if it does not exist.
+ Value &operator[]( const std::string &key );
+ /// Access an object value by name, returns null if there is no member with that name.
+ const Value &operator[]( const std::string &key ) const;
+ /** \brief Access an object value by name, create a null member if it does not exist.
+
+ * If the object as no entry for that name, then the member name used to store
+ * the new entry is not duplicated.
+ * Example of use:
+ * \code
+ * Json::Value object;
+ * static const StaticString code("code");
+ * object[code] = 1234;
+ * \endcode
+ */
+ Value &operator[]( const StaticString &key );
+# ifdef JSON_USE_CPPTL
+ /// Access an object value by name, create a null member if it does not exist.
+ Value &operator[]( const CppTL::ConstString &key );
+ /// Access an object value by name, returns null if there is no member with that name.
+ const Value &operator[]( const CppTL::ConstString &key ) const;
+# endif
+ /// Return the member named key if it exist, defaultValue otherwise.
+ Value get( const char *key,
+ const Value &defaultValue ) const;
+ /// Return the member named key if it exist, defaultValue otherwise.
+ Value get( const std::string &key,
+ const Value &defaultValue ) const;
+# ifdef JSON_USE_CPPTL
+ /// Return the member named key if it exist, defaultValue otherwise.
+ Value get( const CppTL::ConstString &key,
+ const Value &defaultValue ) const;
+# endif
+ /// \brief Remove and return the named member.
+ ///
+ /// Do nothing if it did not exist.
+ /// \return the removed Value, or null.
+ /// \pre type() is objectValue or nullValue
+ /// \post type() is unchanged
+ Value removeMember( const char* key );
+ /// Same as removeMember(const char*)
+ Value removeMember( const std::string &key );
+
+ /// Return true if the object has a member named key.
+ bool isMember( const char *key ) const;
+ /// Return true if the object has a member named key.
+ bool isMember( const std::string &key ) const;
+# ifdef JSON_USE_CPPTL
+ /// Return true if the object has a member named key.
+ bool isMember( const CppTL::ConstString &key ) const;
+# endif
+
+ /// \brief Return a list of the member names.
+ ///
+ /// If null, return an empty list.
+ /// \pre type() is objectValue or nullValue
+ /// \post if type() was nullValue, it remains nullValue
+ Members getMemberNames() const;
+
+//# ifdef JSON_USE_CPPTL
+// EnumMemberNames enumMemberNames() const;
+// EnumValues enumValues() const;
+//# endif
+
+ /// Comments must be //... or /* ... */
+ void setComment( const char *comment,
+ CommentPlacement placement );
+ /// Comments must be //... or /* ... */
+ void setComment( const std::string &comment,
+ CommentPlacement placement );
+ bool hasComment( CommentPlacement placement ) const;
+ /// Include delimiters and embedded newlines.
+ std::string getComment( CommentPlacement placement ) const;
+
+ std::string toStyledString() const;
+
+ const_iterator begin() const;
+ const_iterator end() const;
+
+ iterator begin();
+ iterator end();
+
+ private:
+ Value &resolveReference( const char *key,
+ bool isStatic );
+
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ inline bool isItemAvailable() const
+ {
+ return itemIsUsed_ == 0;
+ }
+
+ inline void setItemUsed( bool isUsed = true )
+ {
+ itemIsUsed_ = isUsed ? 1 : 0;
+ }
+
+ inline bool isMemberNameStatic() const
+ {
+ return memberNameIsStatic_ == 0;
+ }
+
+ inline void setMemberNameIsStatic( bool isStatic )
+ {
+ memberNameIsStatic_ = isStatic ? 1 : 0;
+ }
+# endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP
+
+ private:
+ struct CommentInfo
+ {
+ CommentInfo();
+ ~CommentInfo();
+
+ void setComment( const char *text );
+
+ char *comment_;
+ };
+
+ //struct MemberNamesTransform
+ //{
+ // typedef const char *result_type;
+ // const char *operator()( const CZString &name ) const
+ // {
+ // return name.c_str();
+ // }
+ //};
+
+ union ValueHolder
+ {
+ LargestInt int_;
+ LargestUInt uint_;
+ double real_;
+ bool bool_;
+ char *string_;
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ ValueInternalArray *array_;
+ ValueInternalMap *map_;
+#else
+ ObjectValues *map_;
+# endif
+ } value_;
+ ValueType type_ : 8;
+ int allocated_ : 1; // Notes: if declared as bool, bitfield is useless.
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ unsigned int itemIsUsed_ : 1; // used by the ValueInternalMap container.
+ int memberNameIsStatic_ : 1; // used by the ValueInternalMap container.
+# endif
+ CommentInfo *comments_;
+ };
+
+
+ /** \brief Experimental and untested: represents an element of the "path" to access a node.
+ */
+ class PathArgument
+ {
+ public:
+ friend class Path;
+
+ PathArgument();
+ PathArgument( ArrayIndex index );
+ PathArgument( const char *key );
+ PathArgument( const std::string &key );
+
+ private:
+ enum Kind
+ {
+ kindNone = 0,
+ kindIndex,
+ kindKey
+ };
+ std::string key_;
+ ArrayIndex index_;
+ Kind kind_;
+ };
+
+ /** \brief Experimental and untested: represents a "path" to access a node.
+ *
+ * Syntax:
+ * - "." => root node
+ * - ".[n]" => elements at index 'n' of root node (an array value)
+ * - ".name" => member named 'name' of root node (an object value)
+ * - ".name1.name2.name3"
+ * - ".[0][1][2].name1[3]"
+ * - ".%" => member name is provided as parameter
+ * - ".[%]" => index is provied as parameter
+ */
+ class Path
+ {
+ public:
+ Path( const std::string &path,
+ const PathArgument &a1 = PathArgument(),
+ const PathArgument &a2 = PathArgument(),
+ const PathArgument &a3 = PathArgument(),
+ const PathArgument &a4 = PathArgument(),
+ const PathArgument &a5 = PathArgument() );
+
+ const Value &resolve( const Value &root ) const;
+ Value resolve( const Value &root,
+ const Value &defaultValue ) const;
+ /// Creates the "path" to access the specified node and returns a reference on the node.
+ Value &make( Value &root ) const;
+
+ private:
+ typedef std::vector<const PathArgument *> InArgs;
+ typedef std::vector<PathArgument> Args;
+
+ void makePath( const std::string &path,
+ const InArgs &in );
+ void addPathInArg( const std::string &path,
+ const InArgs &in,
+ InArgs::const_iterator &itInArg,
+ PathArgument::Kind kind );
+ void invalidPath( const std::string &path,
+ int location );
+
+ Args args_;
+ };
+
+
+
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+ /** \brief Allocator to customize Value internal map.
+ * Below is an example of a simple implementation (default implementation actually
+ * use memory pool for speed).
+ * \code
+ class DefaultValueMapAllocator : public ValueMapAllocator
+ {
+ public: // overridden from ValueMapAllocator
+ virtual ValueInternalMap *newMap()
+ {
+ return new ValueInternalMap();
+ }
+
+ virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other )
+ {
+ return new ValueInternalMap( other );
+ }
+
+ virtual void destructMap( ValueInternalMap *map )
+ {
+ delete map;
+ }
+
+ virtual ValueInternalLink *allocateMapBuckets( unsigned int size )
+ {
+ return new ValueInternalLink[size];
+ }
+
+ virtual void releaseMapBuckets( ValueInternalLink *links )
+ {
+ delete [] links;
+ }
+
+ virtual ValueInternalLink *allocateMapLink()
+ {
+ return new ValueInternalLink();
+ }
+
+ virtual void releaseMapLink( ValueInternalLink *link )
+ {
+ delete link;
+ }
+ };
+ * \endcode
+ */
+ class JSON_API ValueMapAllocator
+ {
+ public:
+ virtual ~ValueMapAllocator();
+ virtual ValueInternalMap *newMap() = 0;
+ virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0;
+ virtual void destructMap( ValueInternalMap *map ) = 0;
+ virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0;
+ virtual void releaseMapBuckets( ValueInternalLink *links ) = 0;
+ virtual ValueInternalLink *allocateMapLink() = 0;
+ virtual void releaseMapLink( ValueInternalLink *link ) = 0;
+ };
+
+ /** \brief ValueInternalMap hash-map bucket chain link (for internal use only).
+ * \internal previous_ & next_ allows for bidirectional traversal.
+ */
+ class JSON_API ValueInternalLink
+ {
+ public:
+ enum { itemPerLink = 6 }; // sizeof(ValueInternalLink) = 128 on 32 bits architecture.
+ enum InternalFlags {
+ flagAvailable = 0,
+ flagUsed = 1
+ };
+
+ ValueInternalLink();
+
+ ~ValueInternalLink();
+
+ Value items_[itemPerLink];
+ char *keys_[itemPerLink];
+ ValueInternalLink *previous_;
+ ValueInternalLink *next_;
+ };
+
+
+ /** \brief A linked page based hash-table implementation used internally by Value.
+ * \internal ValueInternalMap is a tradional bucket based hash-table, with a linked
+ * list in each bucket to handle collision. There is an addional twist in that
+ * each node of the collision linked list is a page containing a fixed amount of
+ * value. This provides a better compromise between memory usage and speed.
+ *
+ * Each bucket is made up of a chained list of ValueInternalLink. The last
+ * link of a given bucket can be found in the 'previous_' field of the following bucket.
+ * The last link of the last bucket is stored in tailLink_ as it has no following bucket.
+ * Only the last link of a bucket may contains 'available' item. The last link always
+ * contains at least one element unless is it the bucket one very first link.
+ */
+ class JSON_API ValueInternalMap
+ {
+ friend class ValueIteratorBase;
+ friend class Value;
+ public:
+ typedef unsigned int HashKey;
+ typedef unsigned int BucketIndex;
+
+# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+ struct IteratorState
+ {
+ IteratorState()
+ : map_(0)
+ , link_(0)
+ , itemIndex_(0)
+ , bucketIndex_(0)
+ {
+ }
+ ValueInternalMap *map_;
+ ValueInternalLink *link_;
+ BucketIndex itemIndex_;
+ BucketIndex bucketIndex_;
+ };
+# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+
+ ValueInternalMap();
+ ValueInternalMap( const ValueInternalMap &other );
+ ValueInternalMap &operator =( const ValueInternalMap &other );
+ ~ValueInternalMap();
+
+ void swap( ValueInternalMap &other );
+
+ BucketIndex size() const;
+
+ void clear();
+
+ bool reserveDelta( BucketIndex growth );
+
+ bool reserve( BucketIndex newItemCount );
+
+ const Value *find( const char *key ) const;
+
+ Value *find( const char *key );
+
+ Value &resolveReference( const char *key,
+ bool isStatic );
+
+ void remove( const char *key );
+
+ void doActualRemove( ValueInternalLink *link,
+ BucketIndex index,
+ BucketIndex bucketIndex );
+
+ ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex );
+
+ Value &setNewItem( const char *key,
+ bool isStatic,
+ ValueInternalLink *link,
+ BucketIndex index );
+
+ Value &unsafeAdd( const char *key,
+ bool isStatic,
+ HashKey hashedKey );
+
+ HashKey hash( const char *key ) const;
+
+ int compare( const ValueInternalMap &other ) const;
+
+ private:
+ void makeBeginIterator( IteratorState &it ) const;
+ void makeEndIterator( IteratorState &it ) const;
+ static bool equals( const IteratorState &x, const IteratorState &other );
+ static void increment( IteratorState &iterator );
+ static void incrementBucket( IteratorState &iterator );
+ static void decrement( IteratorState &iterator );
+ static const char *key( const IteratorState &iterator );
+ static const char *key( const IteratorState &iterator, bool &isStatic );
+ static Value &value( const IteratorState &iterator );
+ static int distance( const IteratorState &x, const IteratorState &y );
+
+ private:
+ ValueInternalLink *buckets_;
+ ValueInternalLink *tailLink_;
+ BucketIndex bucketsSize_;
+ BucketIndex itemCount_;
+ };
+
+ /** \brief A simplified deque implementation used internally by Value.
+ * \internal
+ * It is based on a list of fixed "page", each page contains a fixed number of items.
+ * Instead of using a linked-list, a array of pointer is used for fast item look-up.
+ * Look-up for an element is as follow:
+ * - compute page index: pageIndex = itemIndex / itemsPerPage
+ * - look-up item in page: pages_[pageIndex][itemIndex % itemsPerPage]
+ *
+ * Insertion is amortized constant time (only the array containing the index of pointers
+ * need to be reallocated when items are appended).
+ */
+ class JSON_API ValueInternalArray
+ {
+ friend class Value;
+ friend class ValueIteratorBase;
+ public:
+ enum { itemsPerPage = 8 }; // should be a power of 2 for fast divide and modulo.
+ typedef Value::ArrayIndex ArrayIndex;
+ typedef unsigned int PageIndex;
+
+# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+ struct IteratorState // Must be a POD
+ {
+ IteratorState()
+ : array_(0)
+ , currentPageIndex_(0)
+ , currentItemIndex_(0)
+ {
+ }
+ ValueInternalArray *array_;
+ Value **currentPageIndex_;
+ unsigned int currentItemIndex_;
+ };
+# endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+
+ ValueInternalArray();
+ ValueInternalArray( const ValueInternalArray &other );
+ ValueInternalArray &operator =( const ValueInternalArray &other );
+ ~ValueInternalArray();
+ void swap( ValueInternalArray &other );
+
+ void clear();
+ void resize( ArrayIndex newSize );
+
+ Value &resolveReference( ArrayIndex index );
+
+ Value *find( ArrayIndex index ) const;
+
+ ArrayIndex size() const;
+
+ int compare( const ValueInternalArray &other ) const;
+
+ private:
+ static bool equals( const IteratorState &x, const IteratorState &other );
+ static void increment( IteratorState &iterator );
+ static void decrement( IteratorState &iterator );
+ static Value &dereference( const IteratorState &iterator );
+ static Value &unsafeDereference( const IteratorState &iterator );
+ static int distance( const IteratorState &x, const IteratorState &y );
+ static ArrayIndex indexOf( const IteratorState &iterator );
+ void makeBeginIterator( IteratorState &it ) const;
+ void makeEndIterator( IteratorState &it ) const;
+ void makeIterator( IteratorState &it, ArrayIndex index ) const;
+
+ void makeIndexValid( ArrayIndex index );
+
+ Value **pages_;
+ ArrayIndex size_;
+ PageIndex pageCount_;
+ };
+
+ /** \brief Experimental: do not use. Allocator to customize Value internal array.
+ * Below is an example of a simple implementation (actual implementation use
+ * memory pool).
+ \code
+class DefaultValueArrayAllocator : public ValueArrayAllocator
+{
+public: // overridden from ValueArrayAllocator
+ virtual ~DefaultValueArrayAllocator()
+ {
+ }
+
+ virtual ValueInternalArray *newArray()
+ {
+ return new ValueInternalArray();
+ }
+
+ virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other )
+ {
+ return new ValueInternalArray( other );
+ }
+
+ virtual void destruct( ValueInternalArray *array )
+ {
+ delete array;
+ }
+
+ virtual void reallocateArrayPageIndex( Value **&indexes,
+ ValueInternalArray::PageIndex &indexCount,
+ ValueInternalArray::PageIndex minNewIndexCount )
+ {
+ ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1;
+ if ( minNewIndexCount > newIndexCount )
+ newIndexCount = minNewIndexCount;
+ void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount );
+ if ( !newIndexes )
+ throw std::bad_alloc();
+ indexCount = newIndexCount;
+ indexes = static_cast<Value **>( newIndexes );
+ }
+ virtual void releaseArrayPageIndex( Value **indexes,
+ ValueInternalArray::PageIndex indexCount )
+ {
+ if ( indexes )
+ free( indexes );
+ }
+
+ virtual Value *allocateArrayPage()
+ {
+ return static_cast<Value *>( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) );
+ }
+
+ virtual void releaseArrayPage( Value *value )
+ {
+ if ( value )
+ free( value );
+ }
+};
+ \endcode
+ */
+ class JSON_API ValueArrayAllocator
+ {
+ public:
+ virtual ~ValueArrayAllocator();
+ virtual ValueInternalArray *newArray() = 0;
+ virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0;
+ virtual void destructArray( ValueInternalArray *array ) = 0;
+ /** \brief Reallocate array page index.
+ * Reallocates an array of pointer on each page.
+ * \param indexes [input] pointer on the current index. May be \c NULL.
+ * [output] pointer on the new index of at least
+ * \a minNewIndexCount pages.
+ * \param indexCount [input] current number of pages in the index.
+ * [output] number of page the reallocated index can handle.
+ * \b MUST be >= \a minNewIndexCount.
+ * \param minNewIndexCount Minimum number of page the new index must be able to
+ * handle.
+ */
+ virtual void reallocateArrayPageIndex( Value **&indexes,
+ ValueInternalArray::PageIndex &indexCount,
+ ValueInternalArray::PageIndex minNewIndexCount ) = 0;
+ virtual void releaseArrayPageIndex( Value **indexes,
+ ValueInternalArray::PageIndex indexCount ) = 0;
+ virtual Value *allocateArrayPage() = 0;
+ virtual void releaseArrayPage( Value *value ) = 0;
+ };
+#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
+
+
+ /** \brief base class for Value iterators.
+ *
+ */
+ class ValueIteratorBase
+ {
+ public:
+ typedef unsigned int size_t;
+ typedef int difference_type;
+ typedef ValueIteratorBase SelfType;
+
+ ValueIteratorBase();
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ explicit ValueIteratorBase( const Value::ObjectValues::iterator ¤t );
+#else
+ ValueIteratorBase( const ValueInternalArray::IteratorState &state );
+ ValueIteratorBase( const ValueInternalMap::IteratorState &state );
+#endif
+
+ bool operator ==( const SelfType &other ) const
+ {
+ return isEqual( other );
+ }
+
+ bool operator !=( const SelfType &other ) const
+ {
+ return !isEqual( other );
+ }
+
+ difference_type operator -( const SelfType &other ) const
+ {
+ return computeDistance( other );
+ }
+
+ /// Return either the index or the member name of the referenced value as a Value.
+ Value key() const;
+
+ /// Return the index of the referenced Value. -1 if it is not an arrayValue.
+ UInt index() const;
+
+ /// Return the member name of the referenced Value. "" if it is not an objectValue.
+ const char *memberName() const;
+
+ protected:
+ Value &deref() const;
+
+ void increment();
+
+ void decrement();
+
+ difference_type computeDistance( const SelfType &other ) const;
+
+ bool isEqual( const SelfType &other ) const;
+
+ void copy( const SelfType &other );
+
+ private:
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ Value::ObjectValues::iterator current_;
+ // Indicates that iterator is for a null value.
+ bool isNull_;
+#else
+ union
+ {
+ ValueInternalArray::IteratorState array_;
+ ValueInternalMap::IteratorState map_;
+ } iterator_;
+ bool isArray_;
+#endif
+ };
+
+ /** \brief const iterator for object and array value.
+ *
+ */
+ class ValueConstIterator : public ValueIteratorBase
+ {
+ friend class Value;
+ public:
+ typedef unsigned int size_t;
+ typedef int difference_type;
+ typedef const Value &reference;
+ typedef const Value *pointer;
+ typedef ValueConstIterator SelfType;
+
+ ValueConstIterator();
+ private:
+ /*! \internal Use by Value to create an iterator.
+ */
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ explicit ValueConstIterator( const Value::ObjectValues::iterator ¤t );
+#else
+ ValueConstIterator( const ValueInternalArray::IteratorState &state );
+ ValueConstIterator( const ValueInternalMap::IteratorState &state );
+#endif
+ public:
+ SelfType &operator =( const ValueIteratorBase &other );
+
+ SelfType operator++( int )
+ {
+ SelfType temp( *this );
+ ++*this;
+ return temp;
+ }
+
+ SelfType operator--( int )
+ {
+ SelfType temp( *this );
+ --*this;
+ return temp;
+ }
+
+ SelfType &operator--()
+ {
+ decrement();
+ return *this;
+ }
+
+ SelfType &operator++()
+ {
+ increment();
+ return *this;
+ }
+
+ reference operator *() const
+ {
+ return deref();
+ }
+ };
+
+
+ /** \brief Iterator for object and array value.
+ */
+ class ValueIterator : public ValueIteratorBase
+ {
+ friend class Value;
+ public:
+ typedef unsigned int size_t;
+ typedef int difference_type;
+ typedef Value &reference;
+ typedef Value *pointer;
+ typedef ValueIterator SelfType;
+
+ ValueIterator();
+ ValueIterator( const ValueConstIterator &other );
+ ValueIterator( const ValueIterator &other );
+ private:
+ /*! \internal Use by Value to create an iterator.
+ */
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ explicit ValueIterator( const Value::ObjectValues::iterator ¤t );
+#else
+ ValueIterator( const ValueInternalArray::IteratorState &state );
+ ValueIterator( const ValueInternalMap::IteratorState &state );
+#endif
+ public:
+
+ SelfType &operator =( const SelfType &other );
+
+ SelfType operator++( int )
+ {
+ SelfType temp( *this );
+ ++*this;
+ return temp;
+ }
+
+ SelfType operator--( int )
+ {
+ SelfType temp( *this );
+ --*this;
+ return temp;
+ }
+
+ SelfType &operator--()
+ {
+ decrement();
+ return *this;
+ }
+
+ SelfType &operator++()
+ {
+ increment();
+ return *this;
+ }
+
+ reference operator *() const
+ {
+ return deref();
+ }
+ };
+
+
+} // namespace Json
+
+
+#endif // CPPTL_JSON_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: include/json/value.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: include/json/reader.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef CPPTL_JSON_READER_H_INCLUDED
+# define CPPTL_JSON_READER_H_INCLUDED
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include "features.h"
+# include "value.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+# include <deque>
+# include <stack>
+# include <string>
+# include <iostream>
+
+namespace Json {
+
+ /** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a Value.
+ *
+ */
+ class JSON_API Reader
+ {
+ public:
+ typedef char Char;
+ typedef const Char *Location;
+
+ /** \brief Constructs a Reader allowing all features
+ * for parsing.
+ */
+ Reader();
+
+ /** \brief Constructs a Reader allowing the specified feature set
+ * for parsing.
+ */
+ Reader( const Features &features );
+
+ /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document.
+ * \param document UTF-8 encoded string containing the document to read.
+ * \param root [out] Contains the root value of the document if it was
+ * successfully parsed.
+ * \param collectComments \c true to collect comment and allow writing them back during
+ * serialization, \c false to discard comments.
+ * This parameter is ignored if Features::allowComments_
+ * is \c false.
+ * \return \c true if the document was successfully parsed, \c false if an error occurred.
+ */
+ bool parse( const std::string &document,
+ Value &root,
+ bool collectComments = true );
+
+ /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document.
+ * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the document to read.
+ * \param endDoc Pointer on the end of the UTF-8 encoded string of the document to read.
+ \ Must be >= beginDoc.
+ * \param root [out] Contains the root value of the document if it was
+ * successfully parsed.
+ * \param collectComments \c true to collect comment and allow writing them back during
+ * serialization, \c false to discard comments.
+ * This parameter is ignored if Features::allowComments_
+ * is \c false.
+ * \return \c true if the document was successfully parsed, \c false if an error occurred.
+ */
+ bool parse( const char *beginDoc, const char *endDoc,
+ Value &root,
+ bool collectComments = true );
+
+ /// \brief Parse from input stream.
+ /// \see Json::operator>>(std::istream&, Json::Value&).
+ bool parse( std::istream &is,
+ Value &root,
+ bool collectComments = true );
+
+ /** \brief Returns a user friendly string that list errors in the parsed document.
+ * \return Formatted error message with the list of errors with their location in
+ * the parsed document. An empty string is returned if no error occurred
+ * during parsing.
+ * \deprecated Use getFormattedErrorMessages() instead (typo fix).
+ */
+ JSONCPP_DEPRECATED("Use getFormattedErrorMessages instead")
+ std::string getFormatedErrorMessages() const;
+
+ /** \brief Returns a user friendly string that list errors in the parsed document.
+ * \return Formatted error message with the list of errors with their location in
+ * the parsed document. An empty string is returned if no error occurred
+ * during parsing.
+ */
+ std::string getFormattedErrorMessages() const;
+
+ private:
+ enum TokenType
+ {
+ tokenEndOfStream = 0,
+ tokenObjectBegin,
+ tokenObjectEnd,
+ tokenArrayBegin,
+ tokenArrayEnd,
+ tokenString,
+ tokenNumber,
+ tokenTrue,
+ tokenFalse,
+ tokenNull,
+ tokenArraySeparator,
+ tokenMemberSeparator,
+ tokenComment,
+ tokenError
+ };
+
+ class Token
+ {
+ public:
+ TokenType type_;
+ Location start_;
+ Location end_;
+ };
+
+ class ErrorInfo
+ {
+ public:
+ Token token_;
+ std::string message_;
+ Location extra_;
+ };
+
+ typedef std::deque<ErrorInfo> Errors;
+
+ bool expectToken( TokenType type, Token &token, const char *message );
+ bool readToken( Token &token );
+ void skipSpaces();
+ bool match( Location pattern,
+ int patternLength );
+ bool readComment();
+ bool readCStyleComment();
+ bool readCppStyleComment();
+ bool readString();
+ void readNumber();
+ bool readValue();
+ bool readObject( Token &token );
+ bool readArray( Token &token );
+ bool decodeNumber( Token &token );
+ bool decodeString( Token &token );
+ bool decodeString( Token &token, std::string &decoded );
+ bool decodeDouble( Token &token );
+ bool decodeUnicodeCodePoint( Token &token,
+ Location ¤t,
+ Location end,
+ unsigned int &unicode );
+ bool decodeUnicodeEscapeSequence( Token &token,
+ Location ¤t,
+ Location end,
+ unsigned int &unicode );
+ bool addError( const std::string &message,
+ Token &token,
+ Location extra = 0 );
+ bool recoverFromError( TokenType skipUntilToken );
+ bool addErrorAndRecover( const std::string &message,
+ Token &token,
+ TokenType skipUntilToken );
+ void skipUntilSpace();
+ Value ¤tValue();
+ Char getNextChar();
+ void getLocationLineAndColumn( Location location,
+ int &line,
+ int &column ) const;
+ std::string getLocationLineAndColumn( Location location ) const;
+ void addComment( Location begin,
+ Location end,
+ CommentPlacement placement );
+ void skipCommentTokens( Token &token );
+
+ typedef std::stack<Value *> Nodes;
+ Nodes nodes_;
+ Errors errors_;
+ std::string document_;
+ Location begin_;
+ Location end_;
+ Location current_;
+ Location lastValueEnd_;
+ Value *lastValue_;
+ std::string commentsBefore_;
+ Features features_;
+ bool collectComments_;
+ };
+
+ /** \brief Read from 'sin' into 'root'.
+
+ Always keep comments from the input JSON.
+
+ This can be used to read a file into a particular sub-object.
+ For example:
+ \code
+ Json::Value root;
+ cin >> root["dir"]["file"];
+ cout << root;
+ \endcode
+ Result:
+ \verbatim
+ {
+ "dir": {
+ "file": {
+ // The input stream JSON would be nested here.
+ }
+ }
+ }
+ \endverbatim
+ \throw std::exception on parse error.
+ \see Json::operator<<()
+ */
+ std::istream& operator>>( std::istream&, Value& );
+
+} // namespace Json
+
+#endif // CPPTL_JSON_READER_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: include/json/reader.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: include/json/writer.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef JSON_WRITER_H_INCLUDED
+# define JSON_WRITER_H_INCLUDED
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include "value.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+# include <vector>
+# include <string>
+# include <iostream>
+
+namespace Json {
+
+ class Value;
+
+ /** \brief Abstract class for writers.
+ */
+ class JSON_API Writer
+ {
+ public:
+ virtual ~Writer();
+
+ virtual std::string write( const Value &root ) = 0;
+ };
+
+ /** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format without formatting (not human friendly).
+ *
+ * The JSON document is written in a single line. It is not intended for 'human' consumption,
+ * but may be usefull to support feature such as RPC where bandwith is limited.
+ * \sa Reader, Value
+ */
+ class JSON_API FastWriter : public Writer
+ {
+ public:
+ FastWriter();
+ virtual ~FastWriter(){}
+
+ void enableYAMLCompatibility();
+
+ public: // overridden from Writer
+ virtual std::string write( const Value &root );
+
+ private:
+ void writeValue( const Value &value );
+
+ std::string document_;
+ bool yamlCompatiblityEnabled_;
+ };
+
+ /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way.
+ *
+ * The rules for line break and indent are as follow:
+ * - Object value:
+ * - if empty then print {} without indent and line break
+ * - if not empty the print '{', line break & indent, print one value per line
+ * and then unindent and line break and print '}'.
+ * - Array value:
+ * - if empty then print [] without indent and line break
+ * - if the array contains no object value, empty array or some other value types,
+ * and all the values fit on one lines, then print the array on a single line.
+ * - otherwise, it the values do not fit on one line, or the array contains
+ * object or non empty array, then print one value per line.
+ *
+ * If the Value have comments then they are outputed according to their #CommentPlacement.
+ *
+ * \sa Reader, Value, Value::setComment()
+ */
+ class JSON_API StyledWriter: public Writer
+ {
+ public:
+ StyledWriter();
+ virtual ~StyledWriter(){}
+
+ public: // overridden from Writer
+ /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
+ * \param root Value to serialize.
+ * \return String containing the JSON document that represents the root value.
+ */
+ virtual std::string write( const Value &root );
+
+ private:
+ void writeValue( const Value &value );
+ void writeArrayValue( const Value &value );
+ bool isMultineArray( const Value &value );
+ void pushValue( const std::string &value );
+ void writeIndent();
+ void writeWithIndent( const std::string &value );
+ void indent();
+ void unindent();
+ void writeCommentBeforeValue( const Value &root );
+ void writeCommentAfterValueOnSameLine( const Value &root );
+ bool hasCommentForValue( const Value &value );
+ static std::string normalizeEOL( const std::string &text );
+
+ typedef std::vector<std::string> ChildValues;
+
+ ChildValues childValues_;
+ std::string document_;
+ std::string indentString_;
+ int rightMargin_;
+ int indentSize_;
+ bool addChildValues_;
+ };
+
+ /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way,
+ to a stream rather than to a string.
+ *
+ * The rules for line break and indent are as follow:
+ * - Object value:
+ * - if empty then print {} without indent and line break
+ * - if not empty the print '{', line break & indent, print one value per line
+ * and then unindent and line break and print '}'.
+ * - Array value:
+ * - if empty then print [] without indent and line break
+ * - if the array contains no object value, empty array or some other value types,
+ * and all the values fit on one lines, then print the array on a single line.
+ * - otherwise, it the values do not fit on one line, or the array contains
+ * object or non empty array, then print one value per line.
+ *
+ * If the Value have comments then they are outputed according to their #CommentPlacement.
+ *
+ * \param indentation Each level will be indented by this amount extra.
+ * \sa Reader, Value, Value::setComment()
+ */
+ class JSON_API StyledStreamWriter
+ {
+ public:
+ StyledStreamWriter( std::string indentation="\t" );
+ ~StyledStreamWriter(){}
+
+ public:
+ /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
+ * \param out Stream to write to. (Can be ostringstream, e.g.)
+ * \param root Value to serialize.
+ * \note There is no point in deriving from Writer, since write() should not return a value.
+ */
+ void write( std::ostream &out, const Value &root );
+
+ private:
+ void writeValue( const Value &value );
+ void writeArrayValue( const Value &value );
+ bool isMultineArray( const Value &value );
+ void pushValue( const std::string &value );
+ void writeIndent();
+ void writeWithIndent( const std::string &value );
+ void indent();
+ void unindent();
+ void writeCommentBeforeValue( const Value &root );
+ void writeCommentAfterValueOnSameLine( const Value &root );
+ bool hasCommentForValue( const Value &value );
+ static std::string normalizeEOL( const std::string &text );
+
+ typedef std::vector<std::string> ChildValues;
+
+ ChildValues childValues_;
+ std::ostream* document_;
+ std::string indentString_;
+ int rightMargin_;
+ std::string indentation_;
+ bool addChildValues_;
+ };
+
+# if defined(JSON_HAS_INT64)
+ std::string JSON_API valueToString( Int value );
+ std::string JSON_API valueToString( UInt value );
+# endif // if defined(JSON_HAS_INT64)
+ std::string JSON_API valueToString( LargestInt value );
+ std::string JSON_API valueToString( LargestUInt value );
+ std::string JSON_API valueToString( double value );
+ std::string JSON_API valueToString( bool value );
+ std::string JSON_API valueToQuotedString( const char *value );
+
+ /// \brief Output using the StyledStreamWriter.
+ /// \see Json::operator>>()
+ std::ostream& operator<<( std::ostream&, const Value &root );
+
+} // namespace Json
+
+
+
+#endif // JSON_WRITER_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: include/json/writer.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+#endif //ifndef JSON_AMALGATED_H_INCLUDED
diff --git a/include/jellyfish/large_hash_array.hpp b/include/jellyfish/large_hash_array.hpp
new file mode 100644
index 0000000..74f1000
--- /dev/null
+++ b/include/jellyfish/large_hash_array.hpp
@@ -0,0 +1,994 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_LARGE_HASH_ARRAY_HPP__
+#define __JELLYFISH_LARGE_HASH_ARRAY_HPP__
+
+#include <jellyfish/storage.hpp>
+#include <jellyfish/atomic_gcc.hpp>
+#include <jellyfish/allocators_mmap.hpp>
+#include <jellyfish/offsets_key_value.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/err.hpp>
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+#include <jellyfish/simple_circular_buffer.hpp>
+#include <jellyfish/large_hash_iterator.hpp>
+
+namespace jellyfish { namespace large_hash {
+/* Contains an integer, the reprobe limit. It is capped based on the
+ * reprobe strategy to not be bigger than the size of the hash
+ * array. Also, the length to encode reprobe limit must not be larger
+ * than the length to encode _size.
+ */
+class reprobe_limit_t {
+ uint_t limit;
+public:
+ reprobe_limit_t(uint_t _limit, const size_t *_reprobes, size_t _size) :
+ limit(_limit)
+ {
+ while(_reprobes[limit] >= _size && limit >= 1)
+ limit--;
+ }
+ inline uint_t val() const { return limit; }
+};
+
+// Key is any type with the following two methods: get_bits(unsigned
+// int start, unsigned int len); and set_bits(unsigned int start,
+// unsigned int len, uint64_t bits). These methods get and set the
+// bits [start, start + len). Start and len may not be aligned to word
+// boundaries. On the other hand, len is guaranteed to be <
+// sizeof(uint64_t). I.e. never more than 1 word is fetched or set.
+template<typename Key, typename word, typename atomic_t, typename Derived>
+class array_base {
+ static const int wsize = std::numeric_limits<word>::digits; // Word size in bits
+ // Can't be done. Resort to an evil macro!
+ // static const word fmask = std::numeric_limits<word>::max(); // Mask full of ones
+#define fmask (std::numeric_limits<word>::max())
+
+public:
+ define_error_class(ErrorAllocation);
+
+ typedef word data_word;
+ typedef typename Offsets<word>::offset_t offset_t;
+ typedef struct offset_t::key key_offsets;
+ typedef struct offset_t::val val_offsets;
+
+ typedef Key key_type;
+ typedef uint64_t mapped_type;
+ typedef std::pair<Key&, mapped_type> value_type;
+ typedef stl_iterator_base<array_base> iterator;
+ typedef stl_iterator_base<array_base> const_iterator;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+ typedef value_type* pointer;
+ typedef const value_type* const_pointer;
+
+ typedef eager_iterator_base<array_base> eager_iterator;
+ typedef lazy_iterator_base<array_base> lazy_iterator;
+ typedef region_iterator_base<array_base> region_iterator;
+
+ /// Status of a (key,value) pair. LBSET means that the large bit is
+ /// set. Hence, it contains a pointer back to the original key and a
+ /// large value.
+ enum key_status { FILLED, EMPTY, LBSET};
+
+protected:
+ uint16_t lsize_; // log of size
+ size_t size_, size_mask_;
+ reprobe_limit_t reprobe_limit_;
+ uint16_t key_len_; // Length of key in bits
+ uint16_t raw_key_len_; // Length of key stored raw (i.e. complement of implied length)
+ Offsets<word> offsets_; // key len reduced by size of hash array
+ size_t size_bytes_;
+ word * const data_;
+ atomic_t atomic_;
+ const size_t *reprobes_;
+ RectangularBinaryMatrix hash_matrix_;
+ RectangularBinaryMatrix hash_inverse_matrix_;
+
+public:
+ /// Give information about memory usage and array size.
+ struct usage_info {
+ uint16_t key_len_, val_len_, reprobe_limit_;
+ const size_t* reprobes_;
+
+ usage_info(uint16_t key_len, uint16_t val_len, uint16_t reprobe_limit,
+ const size_t* reprobes = jellyfish::quadratic_reprobes) :
+ key_len_(key_len), val_len_(val_len), reprobe_limit_(reprobe_limit), reprobes_(reprobes) { }
+
+ /// Memory usage for a given size.
+ size_t mem(size_t size) {
+ uint16_t lsize(ceilLog2(size));
+ size_t asize((size_t)1 << lsize);
+ reprobe_limit_t areprobe_limit(reprobe_limit_, reprobes_, asize);
+ uint16_t raw_key_len(key_len_ > lsize ? key_len_ - lsize : 0);
+ Offsets<word> offsets(raw_key_len + bitsize(areprobe_limit.val() + 1), val_len_,
+ areprobe_limit.val() + 1);
+ return div_ceil(asize,
+ (size_t)offsets.block_len()) * offsets.block_word_len() * sizeof(word) + sizeof(array_base) + sizeof(Offsets<word>);
+ }
+
+ /// Actual size for a given size.
+ size_t asize(size_t size) { return (size_t)1 << ceilLog2(size); }
+
+ struct fit_in {
+ usage_info* i_;
+ size_t mem_;
+ fit_in(usage_info* i, size_t mem) : i_(i), mem_(mem) { }
+ bool operator()(uint16_t size_bits) const { return i_->mem((size_t)1 << size_bits) < mem_; }
+ };
+
+ /// Maximum size for a given maximum memory.
+ size_t size(size_t mem) { return (size_t)1 << size_bits(mem); }
+
+ /// Log of maximum size for a given maximum memory
+ uint16_t size_bits(size_t mem) {
+ uint16_t res = *binary_search_first_false(pointer_integer<uint16_t>(0), pointer_integer<uint16_t>(64),
+ fit_in(this, mem));
+ return res > 0 ? res - 1 : 0;
+ }
+
+ size_t size_bits_linear(size_t mem) {
+ fit_in predicate(this, mem);
+ uint16_t i = 0;
+ for( ; i < 64; ++i)
+ if(!predicate(i))
+ break;
+
+ return i > 0 ? i - 1 : 0;
+ }
+
+ };
+
+
+ array_base(size_t size, // Size of hash. To be rounded up to a power of 2
+ uint16_t key_len, // Size of key in bits
+ uint16_t val_len, // Size of val in bits
+ uint16_t reprobe_limit, // Maximum reprobe
+ RectangularBinaryMatrix m,
+ const size_t* reprobes = quadratic_reprobes) : // Reprobing policy
+ lsize_(ceilLog2(size)),
+ size_((size_t)1 << lsize_),
+ size_mask_(size_ - 1),
+ reprobe_limit_(reprobe_limit, reprobes, size_),
+ key_len_(key_len),
+ raw_key_len_(key_len_ > lsize_ ? key_len_ - lsize_ : 0),
+ offsets_(raw_key_len_ + bitsize(reprobe_limit_.val() + 1), val_len, reprobe_limit_.val() + 1),
+ size_bytes_(div_ceil(size_, (size_t)offsets_.block_len()) * offsets_.block_word_len() * sizeof(word)),
+ data_(static_cast<Derived*>(this)->alloc_data(size_bytes_)),
+ reprobes_(reprobes),
+ hash_matrix_(m),
+ hash_inverse_matrix_(hash_matrix_.pseudo_inverse())
+ {
+ if(!data_)
+ throw ErrorAllocation(err::msg() << "Failed to allocate "
+ << (div_ceil(size, (size_t)offsets_.block_len()) * offsets_.block_word_len() * sizeof(word))
+ << " bytes of memory");
+ }
+
+ array_base(array_base&& ary) :
+ lsize_(ary.lsize_),
+ size_(ary.size_),
+ size_mask_(size_ - 1),
+ reprobe_limit_(ary.reprobe_limit_),
+ key_len_(ary.key_len_),
+ raw_key_len_(ary.raw_key_len_),
+ offsets_(std::move(ary.offsets_)),
+ size_bytes_(ary.size_bytes_),
+ data_(ary.data_),
+ reprobes_(ary.reprobes_),
+ hash_matrix_(std::move(ary.hash_matrix_)),
+ hash_inverse_matrix_(std::move(ary.hash_inverse_matrix_))
+ { }
+
+ array_base& operator=(const array_base& rhs) = delete;
+ array_base& operator=(array_base&& rhs) = delete;
+
+ size_t size() const { return size_; }
+ size_t lsize() const { return lsize_; }
+ size_t size_mask() const { return size_mask_; }
+ uint_t key_len() const { return key_len_; }
+ uint_t val_len() const { return offsets_.val_len(); }
+
+ const size_t* reprobes() const { return reprobes_; }
+ uint_t max_reprobe() const { return reprobe_limit_.val(); }
+ size_t max_reprobe_offset() const { return reprobes_[reprobe_limit_.val()]; }
+
+ const RectangularBinaryMatrix& matrix() const { return hash_matrix_; }
+ const RectangularBinaryMatrix& inverse_matrix() const { return hash_inverse_matrix_; }
+ void matrix(const RectangularBinaryMatrix& m) {
+ hash_inverse_matrix_ = m.pseudo_inverse();
+ hash_matrix_ = m;
+ }
+
+ /**
+ * Clear hash table. Not thread safe.
+ */
+ void clear() {
+ memset(data_, '\0', size_bytes_);
+ }
+
+ /**
+ * Write the hash table raw to a stream. Not thread safe.
+ */
+ void write(std::ostream& os) const {
+ os.write((const char*)data_, size_bytes_);
+ }
+
+ size_t size_bytes() const { return size_bytes_; }
+
+ /* The storage of the hash is organized in "blocks". A (key,value)
+ * pair always start at bit 0 of the block. The following methods
+ * work with the blocks of the hash.
+ */
+
+ /**
+ * Number of blocks needed to fit at least a given number of
+ * records. Given a number of records, it returns the number of
+ * blocks necessary and the actual number of records these blocks
+ * contain.
+ */
+ std::pair<size_t, size_t> blocks_for_records(size_t nb_records) const {
+ return offsets_.blocks_for_records(nb_records);
+ }
+
+
+ /**
+ * Convert coordinate from (start, blen) given in blocks to
+ * coordinate in char* and length in bytes. It also makes sure that
+ * the pointer and length returned do not go beyond allocated
+ * memory.
+ */
+ void block_to_ptr(const size_t start, const size_t blen,
+ char **start_ptr, size_t *memlen) const {
+ *start_ptr = (char *)(data_ + start * offsets_.block_word_len());
+ char *end_ptr = (char *)data_ + size_bytes_;
+
+ if(*start_ptr >= end_ptr) {
+ *memlen = 0;
+ return;
+ }
+ *memlen = blen * offsets_.block_word_len() * sizeof(word);
+ if(*start_ptr + *memlen > end_ptr)
+ *memlen = end_ptr - *start_ptr;
+ }
+
+ /**
+ * Zero out blocks in [start, start+length), where start and
+ * length are given in number of blocks.
+ **/
+ void zero_blocks(const size_t start, const size_t length) {
+ char *start_ptr;
+ size_t memlen;
+ block_to_ptr(start, length, &start_ptr, &memlen);
+ memset(start_ptr, '\0', memlen);
+ }
+
+
+ /**
+ * Use hash values as counters.
+ *
+ * The matrix multiplication gets only a uint64_t. The lsb of the
+ * matrix product, the hsb are assume to be equal to the key itself
+ * (the matrix has a partial identity on the first rows).
+ *
+ * In case of failure (false is returned), carry_shift contains the
+ * number of bits of the value that were successfully stored in the
+ * hash (low significant bits). If carry_shift == 0, then nothing
+ * was stored and the key is not in the hash at all. In that case,
+ * the value of *is_new and *id are not valid. If carry_shift > 0,
+ * then the key is present but the value stored is not correct
+ * (missing the high significant bits of value), but *is_new and *id
+ * contain the proper information.
+ */
+ inline bool add(const key_type& key, mapped_type val, unsigned int* carry_shift, bool* is_new, size_t* id) {
+ uint64_t hash = hash_matrix_.times(key);
+ *carry_shift = 0;
+ return add_rec(hash & size_mask_, key, val, false, is_new, id, carry_shift);
+ }
+
+ inline bool add(const key_type& key, mapped_type val, unsigned int* carry_shift) {
+ bool is_new = false;
+ size_t id = 0;
+ return add(key, val, carry_shift, &is_new, &id);
+ }
+
+ inline bool add(const key_type& key, mapped_type val) {
+ unsigned int carry_shift = 0;
+ return add(key, val, &carry_shift);
+ }
+
+ inline bool set(const key_type& key) {
+ bool is_new;
+ size_t id;
+ return set(key, &is_new, &id);
+ }
+ bool set(const key_type& key, bool* is_new, size_t* id) {
+ word* w;
+ const offset_t* o;
+
+ *id = hash_matrix_.times(key) & size_mask_;
+ return claim_key(key, is_new, id, &o, &w);
+ }
+
+ /**
+ * Use hash values as counters, if already exists
+ *
+ * Add val to the value associated with key if key is already in the
+ * hash. Returns true if the update was done, false otherwise.
+ */
+ inline bool update_add(const key_type& key, mapped_type val) {
+ key_type tmp_key;
+ unsigned int carry_shift;
+ return update_add(key, val, &carry_shift, tmp_key);
+ }
+
+
+ // Optimization. Use tmp_key as buffer. Avoids allocation if update_add is called repeatedly.
+ bool update_add(const key_type& key, mapped_type val, unsigned int* carry_shift, key_type& tmp_key) {
+ size_t id;
+ word* w;
+ const offset_t* o;
+ *carry_shift = 0;
+
+ if(get_key_id(key, &id, tmp_key, (const word**)&w, &o))
+ return add_rec_at(id, key, val, o, w, carry_shift);
+ return false;
+ }
+
+ // Get the value, stored in *val, associated with key. If the key is
+ // not found, false is returned, otherwise true is returned and *val
+ // is updated. If carry_bit is true, then the first bit of the key
+ // field indicates whether we should reprobe to get the complete
+ // value.
+ inline bool get_val_for_key(const key_type& key, mapped_type* val, bool carry_bit = false) const {
+ key_type tmp_key;
+ size_t id;
+ return get_val_for_key(key, val, tmp_key, &id, carry_bit);
+ }
+
+ // Optimization version. A tmp_key buffer is passed and the id where
+ // the key was found is return in *id. If get_val_for_key is called
+ // many times consecutively, it may be faster to pass the same
+ // tmp_key buffer instead of allocating it every time.
+ bool get_val_for_key(const key_type& key, mapped_type* val, key_type& tmp_key,
+ size_t* id, bool carry_bit = false) const {
+ const word* w;
+ const offset_t* o;
+ if(!get_key_id(key, id, tmp_key, &w, &o))
+ return false;
+ *val = get_val_at_id(*id, w, o, true, carry_bit);
+ return true;
+ }
+
+ // Return true if the key is present in the hash
+ inline bool has_key(const key_type& key) const {
+ size_t id;
+ return get_key_id(key, &id);
+ }
+
+ // Get the id of the key in the hash. Returns true if the key is
+ // found in the hash, false otherwise.
+ inline bool get_key_id(const key_type& key, size_t* id) const {
+ key_type tmp_key;
+ const word* w;
+ const offset_t* o;
+ return get_key_id(key, id, tmp_key, &w, &o);
+ }
+
+ // Optimization version where a tmp_key buffer is provided instead
+ // of being allocated. May be faster if many calls to get_key_id are
+ // made consecutively by passing the same tmp_key each time.
+ inline bool get_key_id(const key_type& key, size_t* id, key_type& tmp_key) const {
+ const word* w;
+ const offset_t* o;
+ return get_key_id(key, id, tmp_key, &w, &o);
+ }
+
+protected:
+ // Information and methods to manage the prefetched data.
+ struct prefetch_info {
+ size_t id;
+ const word* w;
+ const offset_t *o, *lo;
+ };
+ typedef simple_circular_buffer::pre_alloc<prefetch_info, 8> prefetch_buffer;
+
+ void warm_up_cache(prefetch_buffer& buffer, size_t oid) const {
+ buffer.clear();
+ for(int i = 0; i < buffer.capacity(); ++i) {
+ buffer.push_back();
+ prefetch_info& info = buffer.back();
+ info.id = (oid + (i > 0 ? reprobes_[i] : 0)) & size_mask_;
+ info.w = offsets_.word_offset(info.id, &info.o, &info.lo, data_);
+ __builtin_prefetch(info.w + info.o->key.woff, 0, 1);
+ __builtin_prefetch(info.o, 0, 3);
+ }
+ }
+
+ void prefetch_next(prefetch_buffer& buffer, size_t oid, uint_t reprobe) const {
+ buffer.pop_front();
+ // if(reprobe + buffer.capacity() <= reprobe_limit_.val()) {
+ buffer.push_back();
+ prefetch_info& info = buffer.back();
+ info.id = (oid + reprobes_[reprobe + buffer.capacity() - 1]) & size_mask_;
+ info.w = offsets_.word_offset(info.id, &info.o, &info.lo, data_);
+ __builtin_prefetch(info.w + info.o->key.woff, 0, 1);
+ __builtin_prefetch(info.o, 0, 3);
+ // }
+ }
+
+public:
+ // Optimization version again. Also return the word and the offset
+ // information where the key was found. These can be used later one
+ // to fetch the value associated with the key.
+ inline bool get_key_id(const key_type& key, size_t* id, key_type& tmp_key, const word** w, const offset_t** o) const {
+ return get_key_id(key, id, tmp_key, w, o, hash_matrix_.times(key) & size_mask_);
+ }
+
+ // Find the actual id of the key in the hash, starting at oid.
+ bool get_key_id(const key_type& key, size_t* id, key_type& tmp_key, const word** w, const offset_t** o, const size_t oid) const {
+ // This static_assert makes clang++ happy
+ static_assert(std::is_pod<prefetch_info>::value, "prefetch_info must be a POD");
+ prefetch_info info_ary[prefetch_buffer::capacity()];
+ prefetch_buffer buffer(info_ary);
+ warm_up_cache(buffer, oid);
+
+ for(uint_t reprobe = 0; reprobe <= reprobe_limit_.val(); ++reprobe) {
+ prefetch_info& info = buffer.front();
+ key_status st = get_key_at_id(info.id, tmp_key, info.w, info.o);
+
+ switch(st) {
+ case EMPTY:
+ return false;
+ case FILLED:
+ if(oid != tmp_key.get_bits(0, lsize_))
+ break;
+ tmp_key.template set_bits<false>(0, lsize_, key.get_bits(0, lsize_));
+ if(tmp_key != key)
+ break;
+ *id = info.id;
+ *w = info.w;
+ *o = info.o;
+ return true;
+ default:
+ break;
+ }
+
+ prefetch_next(buffer, oid, reprobe + 1);
+ } // for
+
+ return false;
+ }
+
+ //////////////////////////////
+ // Iterator
+ //////////////////////////////
+ const_iterator begin() { return const_iterator(this); }
+ const_iterator begin() const { return const_iterator(this); }
+ const_iterator end() { return const_iterator(); }
+ const_iterator end() const { return const_iterator(); }
+
+/// Get a slice of an array as an iterator
+ template<typename Iterator>
+ Iterator iterator_slice(size_t index, size_t nb_slices) const {
+ std::pair<size_t, size_t> res = slice(index, nb_slices, size());
+ return Iterator(this, res.first, res.second);
+ }
+
+ template<typename Iterator>
+ Iterator iterator_all() const { return iterator_slice<Iterator>(0, 1); }
+
+ // See hash_counter.hpp for why we added this method. It should not
+ // be needed, but I can't get the thing to compile without :(.
+ eager_iterator eager_slice(size_t index, size_t nb_slices) const {
+ return iterator_slice<eager_iterator>(index, nb_slices);
+ }
+ region_iterator region_slice(size_t index, size_t nb_slices) const {
+ return iterator_slice<region_iterator>(index, nb_slices);
+ }
+
+ // Claim a key with the large bit not set. I.e. first entry for a key.
+ //
+ // id is input/output. Equal to hash & size_maks on input. Equal to
+ // actual id where key was set on output. key is already hash
+ // shifted and masked to get higher bits. (>> lsize & key_mask)
+ // is_new is set on output to true if key did not exists in hash
+ // before. *ao points to the actual offsets object and w to the word
+ // holding the value.
+ bool claim_key(const key_type& key, bool* is_new, size_t* id, const offset_t** _ao, word** _w) {
+ uint_t reprobe = 0;
+ const offset_t *o, *lo;
+ word *w, *kw, nkey;
+ bool key_claimed = false;
+ size_t cid = *id;
+
+ // Akey contains first word of what to store in the key
+ // field. I.e. part of the original key (the rest is encoded in
+ // the original position) and the reprobe value to substract from
+ // the actual position to get to the original position.
+ //
+ // MSB LSB
+ // +--------------+-------------+
+ // | MSB of key | reprobe |
+ // + -------------+-------------+
+ // raw_key_len reprobe_len
+ //
+ // Akey is updated at every operation to reflect the current
+ // reprobe value. nkey is the temporary word containing the part
+ // to be stored in the current word kw (+ some offset).
+ word akey = 1; // start reprobe value == 0. Store reprobe value + 1
+ const int to_copy = std::min((uint16_t)(wsize - offsets_.reprobe_len()), raw_key_len_);
+ const int implied_copy = std::min(key_len_, lsize_);
+ akey |= key.get_bits(implied_copy, to_copy) << offsets_.reprobe_len();
+ const int abits_copied = implied_copy + to_copy; // Bits from original key already copied, explicitly or implicitly
+
+ do {
+ int bits_copied = abits_copied;
+
+ w = offsets_.word_offset(cid, &o, &lo, data_);
+ kw = w + o->key.woff;
+
+ if(o->key.sb_mask1) { // key split on multiple words
+ nkey = akey << o->key.boff;
+ nkey |= o->key.sb_mask1;
+ nkey &= o->key.mask1;
+
+ key_claimed = set_key(kw, nkey, o->key.mask1, o->key.mask1, is_new);
+ if(key_claimed) {
+ nkey = akey >> o->key.shift;
+ if(o->key.full_words) {
+ // Copy full words. First one is special
+ nkey |= key.get_bits(bits_copied, o->key.shift - 1) << (wsize - o->key.shift);
+ bits_copied += o->key.shift - 1;
+ nkey |= o->key.sb_mask1; // Set bit is MSB
+ int copied_full_words = 1;
+ key_claimed = set_key(kw + copied_full_words, nkey, fmask, fmask, is_new);
+ // Copy more full words if needed
+ while(bits_copied + wsize - 1 <= key_len_ && key_claimed) {
+ nkey = key.get_bits(bits_copied, wsize - 1);
+ bits_copied += wsize - 1;
+ nkey |= o->key.sb_mask1;
+ copied_full_words += 1;
+ key_claimed = set_key(kw + copied_full_words, nkey, fmask, fmask, is_new);
+ }
+ assert(!key_claimed || (bits_copied < key_len_) == (o->key.sb_mask2 != 0));
+ if(o->key.sb_mask2 && key_claimed) { // Copy last word
+ nkey = key.get_bits(bits_copied, key_len_ - bits_copied);
+ nkey |= o->key.sb_mask2;
+ copied_full_words += 1;
+ key_claimed = set_key(kw + copied_full_words, nkey, o->key.mask2, o->key.mask2, is_new);
+ }
+ } else if(o->key.sb_mask2) { // if bits_copied + wsize - 1 < key_len
+ // Copy last word, no full words copied
+ nkey |= key.get_bits(bits_copied, key_len_ - bits_copied) << (wsize - o->key.shift);
+ nkey |= o->key.sb_mask2;
+ nkey &= o->key.mask2;
+ key_claimed = set_key(kw + 1, nkey, o->key.mask2, o->key.mask2, is_new);
+ }
+ } // if(key_claimed)
+ } else { // key on one word
+ nkey = akey << o->key.boff;
+ nkey &= o->key.mask1;
+ key_claimed = set_key(kw, nkey, o->key.mask1, o->key.mask1, is_new);
+ }
+ if(!key_claimed) { // reprobe
+ if(++reprobe > reprobe_limit_.val())
+ return false;
+ cid = (*id + reprobes_[reprobe]) & size_mask_;
+ akey = (akey & ~offsets_.reprobe_mask()) | (reprobe + 1);
+ }
+ } while(!key_claimed);
+
+ *id = cid;
+ *_w = w;
+ *_ao = o;
+ return true;
+ }
+
+ // Claim large key. Enter an entry for a key when it is not the
+ // first entry. Only encode the number of reprobe hops back to the
+ // first entry of the key in the hash table. It is simpler as can
+ // takes less than one word in length.
+ bool claim_large_key(size_t* id, const offset_t** _ao, word** _w) {
+ uint_t reprobe = 0;
+ size_t cid = *id;
+ const offset_t *o, *lo;
+ word *w, *kw, nkey;
+ bool key_claimed = false;
+
+ do {
+ w = offsets_.word_offset(cid, &o, &lo, data_);
+ kw = w + lo->key.woff;
+
+ if(lo->key.sb_mask1) { // key split on multiple words
+ nkey = (reprobe << lo->key.boff) | lo->key.sb_mask1 | lo->key.lb_mask;
+ nkey &= lo->key.mask1;
+
+ // Use o->key.mask1 and not lo->key.mask1 as the first one is
+ // guaranteed to be bigger. The key needs to be free on its
+ // longer mask to claim it!
+ key_claimed = set_key(kw, nkey, o->key.mask1, lo->key.mask1);
+ if(key_claimed) {
+ nkey = (reprobe >> lo->key.shift) | lo->key.sb_mask2;
+ nkey &= lo->key.mask2;
+ key_claimed = set_key(kw + 1, nkey, o->key.full_words ? fmask : o->key.mask2, lo->key.mask2);
+ }
+ } else { // key on 1 word
+ nkey = (reprobe << lo->key.boff) | lo->key.lb_mask;
+ nkey &= lo->key.mask1;
+ key_claimed = set_key(kw, nkey, o->key.mask1, lo->key.mask1);
+ }
+ if(!key_claimed) { //reprobe
+ if(++reprobe > reprobe_limit_.val())
+ return false;
+ cid = (*id + reprobes_[reprobe]) & size_mask_;
+ }
+ } while(!key_claimed);
+
+ *id = cid;
+ *_w = w;
+ *_ao = lo;
+ return true;
+ }
+
+ // Add val to key. id is the starting place (result of hash
+ // computation). eid is set to the effective place in the
+ // array. large is set to true is setting a large key (upon
+ // recurrence if there is a carry).
+ bool add_rec(size_t id, const key_type& key, word val, bool large, bool* is_new, size_t* eid, unsigned int* carry_shift) {
+ const offset_t *ao = 0;
+ word *w = 0;
+
+ bool claimed = false;
+ if(large)
+ claimed = claim_large_key(&id, &ao, &w);
+ else
+ claimed = claim_key(key, is_new, &id, &ao, &w);
+ if(!claimed)
+ return false;
+ *eid = id;
+ return add_rec_at(id, key, val, ao, w, carry_shift);
+ }
+
+ bool add_rec_at(size_t id, const key_type& key, word val, const offset_t* ao, word* w, unsigned int* carry_shift) {
+ // Increment value
+ word *vw = w + ao->val.woff;
+ word cary = add_val(vw, val, ao->val.boff, ao->val.mask1);
+ cary >>= ao->val.shift;
+ *carry_shift += ao->val.shift;
+ if(cary && ao->val.mask2) { // value split on two words
+ cary = add_val(vw + 1, cary, 0, ao->val.mask2);
+ cary >>= ao->val.cshift;
+ *carry_shift += ao->val.cshift;
+ }
+ if(!cary)
+ return true;
+
+ id = (id + reprobes_[0]) & size_mask_;
+ size_t ignore_eid;
+ bool ignore_is_new;
+ return add_rec(id, key, cary, true, &ignore_is_new, &ignore_eid, carry_shift);
+
+ // // Adding failed, table is full. Need to back-track and
+ // // substract val.
+ // std::cerr << "Failed to add large part of value -> return false\n";
+ // cary = add_val(vw, ((word)1 << offsets_.val_len()) - val,
+ // ao->val.boff, ao->val.mask1);
+ // cary >>= ao->val.shift;
+ // if(cary && ao->val.mask2) {
+ // // Can I ignore the cary here? Table is known to be full, so
+ // // not much of a choice. But does it leave the table in a
+ // // consistent state?
+ // add_val(vw + 1, cary, 0, ao->val.mask2);
+ // }
+ // return false;
+ }
+
+ // Atomic methods to set the key. Attempt to set nkey in word w. All
+ // bits matching free_mask must be unset and the bits matching
+ // equal_mask must be equal for a success in setting the key. Set
+ // is_new to true if the spot was previously empty. Otherwise, if
+ // is_new is false but true is returned, the key was already present
+ // at that spot.
+ inline bool set_key(word *w, word nkey, word free_mask, word equal_mask, bool *is_new) {
+ word ow = *w, nw, okey;
+
+ okey = ow & free_mask;
+ while(okey == 0) { // large bit not set && key is free
+ nw = atomic_.cas(w, ow, ow | nkey);
+ if(nw == ow) {
+ *is_new = true;
+ return true;
+ }
+ ow = nw;
+ okey = ow & free_mask;
+ }
+ *is_new = false;
+ return (ow & equal_mask) == nkey;
+ }
+
+ inline bool set_key(word *w, word nkey, word free_mask, word equal_mask) {
+ bool is_new;
+ return set_key(w, nkey, free_mask, equal_mask, &is_new);
+ }
+
+ // Add val the value in word w, with shift and mask giving the
+ // particular part of the word in which the value is stored. The
+ // return value is the carry.
+ inline word add_val(word *w, word val, uint_t shift, word mask) {
+ word now = *w, ow, nw, nval;
+
+ do {
+ ow = now;
+ nval = ((ow & mask) >> shift) + val;
+ nw = (ow & ~mask) | ((nval << shift) & mask);
+ now = atomic_.cas(w, ow, nw);
+ } while(now != ow);
+
+ return nval & (~(mask >> shift));
+ }
+
+ // Return the key and value at position id. If the slot at id is
+ // empty or has the large bit set, returns false. Otherwise, returns
+ // the key and the value is the sum of all the entries in the hash
+ // table for that key. I.e., the table is search forward for entries
+ // with large bit set pointing back to the key at id, and all those
+ // values are summed up.
+ key_status get_key_val_at_id(size_t id, key_type& key, word& val, const bool carry_bit = false) const {
+ const word* w;
+ const offset_t* o;
+
+ key_status st = get_key_at_id(id, key, &w, &o);
+ if(st != FILLED)
+ return st;
+
+ val = get_val_at_id(id, w, o, true, carry_bit);
+
+ return FILLED;
+ }
+
+ // Get a the key at the given id. It also returns the word and
+ // offset information in w and o. The return value is EMPTY (no key
+ // at id), FILLED (there is a key at id), LBSET (the large bit is
+ // set, hence the key is only a pointer back to the real key).
+ //
+ // The key returned contains the original id in the hash as its
+ // lsize_ lsb bits. To obtain the full key, one needs to compute the
+ // product with the inverse matrix to get the lsb bits.
+ inline key_status get_key_at_id(size_t id, key_type& key, const word** w, const offset_t** o) const {
+ const offset_t *lo;
+ *w = offsets_.word_offset(id, o, &lo, data_);
+ return get_key_at_id(id, key, *w, *o);
+ }
+
+ // Sam as above, but it assume that the word w and o for id have
+ // already be computed (like already prefetched).
+ key_status get_key_at_id(size_t id, key_type&key, const word* w, const offset_t* o) const {
+ const word* kvw = w + o->key.woff;
+ word key_word = *kvw;
+ word kreprobe = 0;
+
+ const key_offsets& key_o = o->key;
+ if(key_word & key_o.lb_mask)
+ return LBSET;
+ const int implied_copy = std::min(lsize_, key_len_);
+ int bits_copied = implied_copy;
+ if(key_o.sb_mask1) {
+ if((key_word & key_o.sb_mask1) == 0)
+ return EMPTY;
+ kreprobe = (key_word & key_o.mask1 & ~key_o.sb_mask1) >> key_o.boff;
+ if(key_o.full_words) {
+ // Copy full words. First one is special
+ key_word = *(kvw + 1);
+ if(offsets_.reprobe_len() < key_o.shift) {
+ key.set_bits(bits_copied, key_o.shift - offsets_.reprobe_len(), kreprobe >> offsets_.reprobe_len());
+ bits_copied += key_o.shift - offsets_.reprobe_len();
+ kreprobe &= offsets_.reprobe_mask();
+ key.set_bits(bits_copied, wsize - 1, key_word & ~key_o.sb_mask1);
+ bits_copied += wsize - 1;
+ } else {
+ int reprobe_left = offsets_.reprobe_len() - key_o.shift;
+ kreprobe |= (key_word & (((word)1 << reprobe_left) - 1)) << key_o.shift;
+ key.set_bits(bits_copied, wsize - 1 - reprobe_left, (key_word & ~key_o.sb_mask1) >> reprobe_left);
+ bits_copied += wsize - 1 - reprobe_left;
+ }
+ int word_copied = 2;
+ while(bits_copied + wsize - 1 <= key_len_) {
+ key.set_bits(bits_copied, wsize - 1, *(kvw + word_copied++) & (fmask >> 1));
+ bits_copied += wsize - 1;
+ }
+ if(key_o.sb_mask2)
+ key.set_bits(bits_copied, key_len_ - bits_copied, *(kvw + word_copied) & key_o.mask2 & ~key_o.sb_mask2);
+ } else if(key_o.sb_mask2) { // if(bits_copied + wsize - 1 < key_len
+ // Two words but no full words
+ key_word = *(kvw + 1) & key_o.mask2 & ~key_o.sb_mask2;
+ if(offsets_.reprobe_len() < key_o.shift) {
+ key.set_bits(bits_copied, key_o.shift - offsets_.reprobe_len(), kreprobe >> offsets_.reprobe_len());
+ bits_copied += key_o.shift - offsets_.reprobe_len();
+ kreprobe &= offsets_.reprobe_mask();
+ key.set_bits(bits_copied, key_len_ - bits_copied, key_word);
+ } else {
+ int reprobe_left = offsets_.reprobe_len() - key_o.shift;
+ kreprobe |= (key_word & (((word)1 << reprobe_left) - 1)) << key_o.shift;
+ key.set_bits(bits_copied, key_len_ - bits_copied, key_word >> reprobe_left);
+ }
+ }
+ } else { // if(key_o.sb_mask1
+ // Everything in 1 word
+ key_word = (key_word & key_o.mask1) >> key_o.boff;
+ if(key_word == 0)
+ return EMPTY;
+ kreprobe = key_word & offsets_.reprobe_mask();
+ key.set_bits(bits_copied, raw_key_len_, key_word >> offsets_.reprobe_len());
+ }
+ // Compute missing oid so that the original key can be computed
+ // back through the inverse matrix. Although the key may have a
+ // length of key_len_, which may be less than lsize_, assume that
+ // it still fit here as lsize_ is less than a word length. Need all lsize_.
+ size_t oid = id; // Original id
+ if(kreprobe > 1)
+ oid -= reprobes_[kreprobe - 1];
+ oid &= size_mask_;
+ // Can use more bits than mer size. That's OK, will fix it later
+ // when computing the actual mers by computing the product with
+ // the inverse matrix.
+ key.template set_bits<0>(0, lsize_, oid);
+
+ return FILLED;
+ }
+
+ word get_val_at_id(const size_t id, const word* w, const offset_t* o, const bool reprobe = true,
+ const bool carry_bit = false) const {
+ word val = 0;
+ if(val_len() == 0)
+ return val;
+
+ // First part of value
+ const word* kvw = w + o->val.woff;
+ val = ((*kvw) & o->val.mask1) >> o->val.boff;
+ if(o->val.mask2)
+ val |= ((*(kvw+1)) & o->val.mask2) << o->val.shift;
+
+ // Do we want to get the large value
+ bool do_reprobe = reprobe;
+ if(carry_bit && do_reprobe) {
+ do_reprobe = do_reprobe && (val & 0x1);
+ val >>= 1;
+ }
+ if(!do_reprobe)
+ return val;
+
+ return resolve_val_rec((id + reprobes_[0]) & size_mask_, val, carry_bit);
+ }
+
+ word resolve_val_rec(const size_t id, word val, const bool carry_bit, const uint_t overflows = 0) const {
+ uint_t reprobe = 0;
+ size_t cid = id;
+
+ while(reprobe <= reprobe_limit_.val()) {
+ const offset_t *o, *lo;
+ const word* w = offsets_.word_offset(cid, &o, &lo, data_);
+ const word* kw = w + o->key.woff;
+ word nkey = *kw;
+ const key_offsets& lkey = lo->key;
+
+ if(nkey & lkey.lb_mask) {
+ // If the large bit is set, the size of the key (reprobe_len)
+ // is guaranteed to have a length of at most 1 word.
+ if(lkey.sb_mask1) {
+ nkey = (nkey & lkey.mask1 & ~lkey.sb_mask1) >> lkey.boff;
+ nkey |= ((*(kw+1)) & lkey.mask2 & ~lkey.sb_mask2) << lkey.shift;
+ } else {
+ nkey = (nkey & lkey.mask1) >> lkey.boff;
+ }
+ if(nkey == reprobe) {
+ const val_offsets& lval = lo->val;
+ const word* vw = w + lval.woff;
+ word nval = ((*vw) & lval.mask1) >> lval.boff;
+ if(lval.mask2)
+ nval |= ((*(vw+1)) & lval.mask2) << lval.shift;
+
+ bool do_reprobe = true;
+ if(carry_bit) {
+ do_reprobe = nval & 0x1;
+ nval >>= 1;
+ }
+
+ nval <<= offsets_.val_len();
+ nval <<= offsets_.lval_len() * overflows;
+ val += nval;
+
+ if(!do_reprobe)
+ return val;
+
+ return resolve_val_rec((cid + reprobes_[0]) & size_mask_, val, carry_bit, overflows + 1);
+ }
+ } else if((nkey & o->key.mask1) == 0) {
+ break;
+ }
+
+ cid = (id + reprobes_[++reprobe]) & size_mask_;
+ }
+
+ return val;
+ }
+
+};
+
+template<typename Key, typename word = uint64_t, typename atomic_t = ::atomic::gcc, typename mem_block_t = ::allocators::mmap>
+class array :
+ protected mem_block_t,
+ public array_base<Key, word, atomic_t, array<Key, word, atomic_t, mem_block_t> >
+{
+ typedef array_base<Key, word, atomic_t, array<Key, word, atomic_t, mem_block_t> > super;
+ friend class array_base<Key, word, atomic_t, array<Key, word, atomic_t, mem_block_t> >;
+
+public:
+ array(size_t size, // Size of hash. To be rounded up to a power of 2
+ uint16_t key_len, // Size of key in bits
+ uint16_t val_len, // Size of val in bits
+ uint16_t reprobe_limit, // Maximum reprobe
+ const size_t* reprobes = quadratic_reprobes) : // Reprobing policy
+ mem_block_t(),
+ super(size, key_len, val_len, reprobe_limit, RectangularBinaryMatrix(ceilLog2(size), key_len).randomize_pseudo_inverse(),
+ reprobes)
+ { }
+
+protected:
+ word* alloc_data(size_t s) {
+ mem_block_t::realloc(s);
+ return (word*)mem_block_t::get_ptr();
+ }
+};
+
+struct ptr_info {
+ void* ptr_;
+ size_t bytes_;
+ ptr_info(void* ptr, size_t bytes) : ptr_(ptr), bytes_(bytes) { }
+};
+template<typename Key, typename word = uint64_t, typename atomic_t = ::atomic::gcc>
+class array_raw :
+ protected ptr_info,
+ public array_base<Key, word, atomic_t, array_raw<Key, word, atomic_t> >
+{
+ typedef array_base<Key, word, atomic_t, array_raw<Key, word, atomic_t> > super;
+ friend class array_base<Key, word, atomic_t, array_raw<Key, word, atomic_t> >;
+
+public:
+ array_raw(void* ptr,
+ size_t bytes, // Memory available at ptr
+ size_t size, // Size of hash in number of entries. To be rounded up to a power of 2
+ uint16_t key_len, // Size of key in bits
+ uint16_t val_len, // Size of val in bits
+ uint16_t reprobe_limit, // Maximum reprobe
+ RectangularBinaryMatrix m,
+ const size_t* reprobes = quadratic_reprobes) : // Reprobing policy
+ ptr_info(ptr, bytes),
+ super(size, key_len, val_len, reprobe_limit, m, reprobes)
+ { }
+
+protected:
+ word* alloc_data(size_t s) {
+ assert(bytes_ == s);
+ return (word*)ptr_;
+ }
+};
+
+} } // namespace jellyfish { namespace large_hash_array
+
+#endif /* __JELLYFISH_LARGE_HASH_ARRAY_HPP__ */
diff --git a/include/jellyfish/large_hash_iterator.hpp b/include/jellyfish/large_hash_iterator.hpp
new file mode 100644
index 0000000..80d9d25
--- /dev/null
+++ b/include/jellyfish/large_hash_iterator.hpp
@@ -0,0 +1,260 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __LARGE_HASH_ITERATOR_HPP__
+#define __LARGE_HASH_ITERATOR_HPP__
+
+#include <iterator>
+#include <utility>
+
+/// Various iterators for the large hash array
+
+namespace jellyfish { namespace large_hash {
+
+/// Eager iterator. It computes the actual key and value when doing next.
+template<typename array>
+class eager_iterator_base {
+public:
+ typedef typename array::key_type key_type;
+ typedef typename array::mapped_type mapped_type;
+ typedef typename array::key_status key_status;
+
+protected:
+ const array* ary_;
+ size_t start_id_, id_, end_id_;
+ key_type key_;
+ mapped_type val_;
+
+public:
+ eager_iterator_base(const array* ary, size_t start, size_t end) :
+ ary_(ary),
+ start_id_(start > ary->size() ? ary->size() : start),
+ id_(start),
+ end_id_(end > ary->size() ? ary->size() : end)
+ {}
+
+ uint64_t start() const { return start_id_; }
+ uint64_t end() const { return end_id_; }
+ const key_type& key() const { return key_; }
+ const mapped_type& val() const { return val_; }
+ size_t id() const { return id_ - 1; }
+ size_t pos() const { return key_.get_bits(0, ary_->lsize()); }
+
+ bool next() {
+ key_status success = array::EMPTY;
+ while(success != array::FILLED && id_ < end_id_)
+ success = ary_->get_key_val_at_id(id_++, key_, val_);
+ if(success == array::FILLED)
+ key_.set_bits(0, ary_->lsize(), ary_->inverse_matrix().times(key_));
+
+ return success == array::FILLED;
+ }
+};
+
+/// Lazy iterator. The actual key and value are actually computed only
+/// when the key() and val() methods are called.
+template<typename array>
+class lazy_iterator_base {
+public:
+ typedef typename array::key_type key_type;
+ typedef typename array::mapped_type mapped_type;
+ typedef typename array::key_status key_status;
+ typedef typename array::data_word word;
+ typedef typename array::offset_t offset_t;
+
+protected:
+ const array* ary_;
+ size_t start_id_, id_, end_id_;
+ const word* w_;
+ const offset_t* o_;
+ bool reversed_key_;
+ key_type key_;
+
+public:
+ lazy_iterator_base(const array *ary, size_t start, size_t end) :
+ ary_(ary),
+ start_id_(ary ? (start > ary->size() ? ary->size() : start) : 0),
+ id_(start),
+ end_id_(ary ? (end > ary->size() ? ary->size() : end) : 0),
+ w_(0), o_(0),
+ reversed_key_(false)
+ {}
+
+ uint64_t start() const { return start_id_; }
+ uint64_t end() const { return end_id_; }
+ const key_type& key() {
+ if(!reversed_key_) {
+ key_.set_bits(0, ary_->lsize(), ary_->inverse_matrix().times(key_));
+ reversed_key_ = true;
+ }
+ return key_;
+ }
+ mapped_type val() const {
+ return ary_->get_val_at_id(id_ - 1, w_, o_, true, false);
+ }
+ size_t id() const { return id_ - 1; }
+ size_t pos() const { return key_.get_bits(0, ary_->lsize()); }
+
+ bool next() {
+ reversed_key_ = false;
+ key_status success = array::EMPTY;
+ while(success != array::FILLED && id_ < end_id_)
+ success = ary_->get_key_at_id(id_++, key_, &w_, &o_);
+
+ return success == array::FILLED;
+ }
+};
+
+/// Region iterator. Iterate over elements whose original position
+/// (and not position after reprobing) falls inside the region
+/// [start_id, end_id)
+template<typename array>
+class region_iterator_base {
+ public:
+ typedef typename array::key_type key_type;
+ typedef typename array::mapped_type mapped_type;
+ typedef typename array::key_status key_status;
+ typedef typename array::data_word word;
+ typedef typename array::offset_t offset_t;
+
+protected:
+ const array* ary_;
+ const uint64_t mask_;
+ const size_t start_id_, end_id_, mid_;
+ size_t oid_, id_;
+ const word* w_;
+ const offset_t* o_;
+ bool reversed_key_;
+ key_type* key_;
+ bool own_key;
+
+public:
+ region_iterator_base(const array *ary, size_t start, size_t end) :
+ ary_(ary), mask_(ary ? ary->size() - 1 : 0),
+ start_id_(ary ? std::min(start, ary->size()) : 0),
+ end_id_(ary ? std::min(end, ary->size()) : 0),
+ mid_(ary ? std::min(end_id_ - start_id_ + ary->max_reprobe_offset(), ary->size()) : 0),
+ oid_(end_id_), id_(0), w_(0), o_(0),
+ reversed_key_(false),
+ key_(new key_type),
+ own_key(true)
+ {}
+
+ region_iterator_base(const array *ary, size_t start, size_t end, key_type& key) :
+ ary_(ary), mask_(ary ? ary->size() - 1 : 0),
+ start_id_(ary ? std::min(start, ary->size()) : 0),
+ end_id_(ary ? std::min(end, ary->size()) : 0),
+ mid_(ary ? std::min(end_id_ - start_id_ + ary->max_reprobe_offset(), ary->size()) : 0),
+ oid_(end_id_), id_(0), w_(0), o_(0),
+ reversed_key_(false),
+ key_(&key),
+ own_key(false)
+ { }
+
+ ~region_iterator_base() {
+ if(own_key)
+ delete key_;
+ }
+
+ const key_type& key() {
+ if(!reversed_key_) {
+ key_->set_bits(0, ary_->lsize(), ary_->inverse_matrix().times(*key_));
+ reversed_key_ = true;
+ }
+ return *key_;
+ }
+ mapped_type val() const {
+ return ary_->get_val_at_id(id(), w_, o_, true, false);
+ }
+ uint64_t pos() const{
+ return oid_;
+ }
+
+ size_t start() { return start_id_; }
+ size_t end() { return end_id_; }
+
+ /// Position where key is stored
+ size_t id() const { return (start_id_ + id_ - 1) & mask_; }
+ /// Original position (before reprobing).
+ size_t oid() const { return oid_; }
+
+ bool next() {
+ reversed_key_ = false;
+ bool found_oid = false;
+ while(!found_oid && id_ < mid_) {
+ if(ary_->get_key_at_id((start_id_ + id_++) & mask_, *key_, &w_, &o_) == array::FILLED) {
+ oid_ = key_->get_bits(0, ary_->lsize());
+ found_oid = start_id_ <= oid_ && oid_ < end_id_;
+ }
+ }
+
+ return found_oid;
+
+ }
+};
+
+/// STL like iterator on a large hash array.
+template<typename array>
+class stl_iterator_base :
+ public std::iterator<std::forward_iterator_tag, typename array::value_type>,
+ public array::lazy_iterator
+{
+public:
+ typedef typename array::key_type key_type;
+ typedef typename array::mapped_type mapped_type;
+ typedef typename array::value_type value_type;
+
+protected:
+ typedef typename array::lazy_iterator lit;
+ typedef std::pair<key_type&, mapped_type> pair;
+ pair val_;
+
+public:
+ explicit stl_iterator_base(const array* ary, size_t start_id = 0) :
+ lit(ary, start_id, ary->size()), val_(lit::key_, (mapped_type)0)
+ { ++*this; }
+ stl_iterator_base(const array* ary, size_t start_id, size_t end_id) :
+ lit(ary, start_id, end_id), val_(lit::key_, (mapped_type)0)
+ { ++*this; }
+ explicit stl_iterator_base() : lit(0, 0, 0), val_(lit::key_, (mapped_type)0) { }
+ stl_iterator_base(const stl_iterator_base& rhs) : lit(rhs), val_(lit::key_, rhs.val_.second) { }
+
+ bool operator==(const stl_iterator_base& rhs) const { return lit::ary_ == rhs.ary_ && lit::id_ == rhs.id_; }
+ bool operator!=(const stl_iterator_base& rhs) const { return !(*this == rhs); }
+
+ const value_type& operator*() {
+ lit::key();
+ val_.second = lit::val();
+ return val_;
+ }
+ const value_type* operator->() { return &this->operator*(); }
+
+ stl_iterator_base& operator++() {
+ if(!lit::next()) {
+ lit::ary_ = 0;
+ lit::id_ = 0;
+ }
+ return *this;
+ }
+
+ stl_iterator_base operator++(int) {
+ stl_iterator_base res(*this);
+ ++*this;
+ return res;
+ }
+};
+} } // namespace jellyfish { namespace large_hash {
+#endif /* __LARGE_HASH_ITERATOR_HPP__ */
diff --git a/include/jellyfish/locks_pthread.hpp b/include/jellyfish/locks_pthread.hpp
new file mode 100644
index 0000000..55496a8
--- /dev/null
+++ b/include/jellyfish/locks_pthread.hpp
@@ -0,0 +1,211 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __JELLYFISH_LOCKS_PTHREAD_HPP__
+#define __JELLYFISH_LOCKS_PTHREAD_HPP__
+
+#include <time.h>
+#include <sys/time.h>
+#include <pthread.h>
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+namespace jellyfish { namespace locks{ namespace pthread {
+class cond
+{
+ pthread_mutex_t _mutex;
+ pthread_cond_t _cond;
+
+public:
+ cond() {
+ pthread_mutex_init(&_mutex, NULL);
+ pthread_cond_init(&_cond, NULL);
+ }
+
+ ~cond() {
+ pthread_cond_destroy(&_cond);
+ pthread_mutex_destroy(&_mutex);
+ }
+
+ inline void lock() { pthread_mutex_lock(&_mutex); }
+ inline void unlock() { pthread_mutex_unlock(&_mutex); }
+ inline void wait() { pthread_cond_wait(&_cond, &_mutex); }
+ inline void signal() { pthread_cond_signal(&_cond); }
+ inline void broadcast() { pthread_cond_broadcast(&_cond); }
+ inline int timedwait(struct timespec *abstime) {
+ return pthread_cond_timedwait(&_cond, &_mutex, abstime);
+ }
+ inline int timedwait(time_t seconds) {
+ struct timespec curtime;
+#ifdef HAVE_CLOCK_GETTIME
+ clock_gettime(CLOCK_REALTIME, &curtime);
+#else
+ struct timeval timeofday;
+ gettimeofday(&timeofday, 0);
+ curtime.tv_sec = timeofday.tv_sec;
+ curtime.tv_nsec = timeofday.tv_usec * 1000;
+#endif
+ curtime.tv_sec += seconds;
+ return timedwait(&curtime);
+ }
+};
+
+class mutex {
+ pthread_mutex_t _mutex;
+
+public:
+ mutex(int type = PTHREAD_MUTEX_DEFAULT) {
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_settype(&attr, type);
+ pthread_mutex_init(&_mutex, &attr);
+ }
+
+ ~mutex() {
+ pthread_mutex_destroy(&_mutex);
+ }
+
+ inline void lock() { pthread_mutex_lock(&_mutex); }
+ inline void unlock() { pthread_mutex_unlock(&_mutex); }
+ inline bool try_lock() { return !pthread_mutex_trylock(&_mutex); }
+};
+
+class mutex_recursive : public mutex {
+public:
+ mutex_recursive() : mutex(PTHREAD_MUTEX_RECURSIVE) { }
+};
+
+class mutex_lock {
+ mutex& m_;
+public:
+ explicit mutex_lock(mutex& m) : m_(m) { m_.lock(); }
+ ~mutex_lock() { m_.unlock(); }
+};
+
+class Semaphore {
+ int _value, _wakeups;
+ cond _cv;
+public:
+ explicit Semaphore(int value) :
+ _value(value),
+ _wakeups(0)
+ {
+ // nothing to do
+ }
+
+ ~Semaphore() {}
+
+ inline void wait() {
+ _cv.lock();
+ _value--;
+ if (_value < 0) {
+ do {
+ _cv.wait();
+ } while(_wakeups < 1);
+ _wakeups--;
+ }
+ _cv.unlock();
+ }
+
+ inline void signal() {
+ _cv.lock();
+ _value++;
+ if(_value <= 0) {
+ _wakeups++;
+ _cv.signal();
+ }
+ _cv.unlock();
+ }
+};
+
+#if defined(_POSIX_BARRIERS) && (_POSIX_BARRIERS - 20012L) >= 0
+class barrier
+{
+ pthread_barrier_t _barrier;
+
+public:
+ explicit barrier(unsigned count) {
+
+ pthread_barrier_init(&_barrier, NULL, count);
+ }
+
+ ~barrier() {
+ pthread_barrier_destroy(&_barrier);
+ }
+
+ /// Return true if serial thread.
+ inline bool wait() {
+ return pthread_barrier_wait(&_barrier) == PTHREAD_BARRIER_SERIAL_THREAD;
+ }
+};
+
+#else
+// # ifndef PTHREAD_BARRIER_SERIAL_THREAD
+// # define PTHREAD_BARRIER_SERIAL_THREAD 1
+// # endif
+
+class barrier
+{
+ int count; // required # of threads
+ int current; // current # of threads that have passed thru
+ mutex barlock; // protect current
+ Semaphore barrier1; // implement the barrier
+ Semaphore barrier2;
+
+public:
+ explicit barrier(unsigned cnt)
+ : count(cnt), current(0), barrier1(0), barrier2(0) {
+ }
+
+ ~barrier() {}
+
+ inline bool wait() {
+ bool ret = false;
+ barlock.lock();
+ current += 1;
+ if(current == count) {
+ ret = true;
+ for(int i=0; i<count;i++) {
+ barrier1.signal();
+ }
+ }
+ barlock.unlock();
+ barrier1.wait(); // wait for n threads to arrive
+
+ barlock.lock();
+ current -= 1;
+ if(current == 0) {
+ for(int i=0;i<count;i++) {
+ barrier2.signal();
+ }
+ }
+ barlock.unlock();
+ barrier2.wait();
+ return ret;
+ }
+};
+
+#endif
+} //namespace pthread {
+
+typedef pthread::cond cond;
+typedef pthread::mutex mutex;
+typedef pthread::barrier barrier;
+} } // namespace jellyfish { namespace { locks
+
+#endif /* __JELLYFISH_LOCKS_PTHREAD_HPP__ */
diff --git a/include/jellyfish/mapped_file.hpp b/include/jellyfish/mapped_file.hpp
new file mode 100644
index 0000000..c2e1443
--- /dev/null
+++ b/include/jellyfish/mapped_file.hpp
@@ -0,0 +1,220 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_MAPPED_FILE_HPP__
+#define __JELLYFISH_MAPPED_FILE_HPP__
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <vector>
+#include <errno.h>
+#include <iostream>
+
+#include <jellyfish/err.hpp>
+
+namespace jellyfish {
+class mapped_file {
+protected:
+ std::string _path;
+ char *_base, *_end;
+ size_t _length;
+
+ void map_(int fd) {
+ struct stat stat;
+ if(fstat(fd, &stat) < 0)
+ throw ErrorMMap(err::msg() << "Can't stat file '" << _path << "'" << err::no);
+
+ _length = stat.st_size;
+ _base = (char*)mmap(NULL, _length, PROT_READ, MAP_SHARED, fd, 0);
+ if(_base == MAP_FAILED) {
+ _base = 0;
+ throw ErrorMMap(err::msg() << "Can't mmap file '" << _path << "'" << err::no);
+ }
+ _end = _base + _length;
+ }
+
+ void map_(const char *filename) {
+ int fd = open(filename, O_RDONLY);
+ if(fd < 0)
+ throw ErrorMMap(err::msg() << "Can't open file '" << filename << "'" << err::no);
+ map_(fd);
+ close(fd);
+ }
+
+
+public:
+ define_error_class(ErrorMMap);
+ mapped_file() : _path(), _base(0), _end(0), _length(0) { }
+ explicit mapped_file(const char *filename)
+ : _path(filename), _base(0), _end(0), _length(0)
+ {
+ map_(filename);
+ }
+ explicit mapped_file(int fd)
+ : _path(), _base(0), _end(0), _length()
+ {
+ map_(fd);
+ }
+ mapped_file(mapped_file&& rhs)
+ : _path(std::move(rhs._path)), _base(rhs._base), _end(rhs._end),
+ _length(rhs._length)
+ {
+ rhs._base = 0;
+ }
+
+ ~mapped_file() {
+ unmap();
+ }
+
+ void map(const char* filename) {
+ unmap();
+ map_(filename);
+ }
+
+ void map(int fd) {
+ unmap();
+ map_(fd);
+ }
+
+ void unmap() {
+ if(!_base)
+ return;
+ munmap(_base, _length);
+ _path.clear();
+ _base = 0;
+ _length = 0;
+ }
+
+ mapped_file& operator=(mapped_file&& rhs) {
+ _path = std::move(rhs._path);
+ _base = rhs._base;
+ rhs._base = 0;
+ _end = rhs._end;
+ _length = rhs._length;
+ return *this;
+ }
+
+ void swap(mapped_file& rhs) {
+ std::swap(_path, rhs._path);
+ std::swap(_base, rhs._base);
+ std::swap(_end, rhs._end);
+ std::swap(_length, rhs._length);
+ }
+
+ char *base() const { return _base; }
+ char *end() const { return _end; }
+ size_t length() const { return _length; }
+ std::string path() const { return _path; }
+
+ // No error checking here. Should I throw something?
+ const mapped_file & will_need() const {
+ madvise(_base, _length, MADV_WILLNEED);
+ return *this;
+ }
+ const mapped_file & sequential() const {
+ madvise(_base, _length, MADV_SEQUENTIAL);
+ return *this;
+ }
+ const mapped_file & random() const {
+ madvise(_base, _length, MADV_RANDOM);
+ return *this;
+ }
+ const mapped_file & lock() const {
+ if(mlock(_base, _length) < 0)
+ throw ErrorMMap(err::msg() << "Can't lock map in memory" << err::no);
+ return *this;
+ }
+
+ char load() const {
+ const long sz = sysconf(_SC_PAGESIZE);
+ // Do not optimize. Side effect is that every page is accessed and
+ // should now be in cache.
+ volatile char unused = 0;
+ for(const char *w = _base; w < _base + _length; w += sz)
+ unused ^= *w;
+ return unused;
+ }
+};
+inline void swap(mapped_file& a, mapped_file& b) { a.swap(b); }
+
+// class mapped_files_t : public std::vector<mapped_file> {
+// public:
+// mapped_files_t(int nb_files, char *argv[]) {
+// for(int j = 0; j < nb_files; j++)
+// push_back(mapped_file(argv[j]));
+// }
+
+// mapped_files_t(int nb_files, char *argv[], bool sequential) {
+// for(int j = 0; j < nb_files; j++) {
+// push_back(mapped_file(argv[j]));
+// if(sequential)
+// end()->sequential();
+// }
+// }
+// };
+
+// // File mapped on demand.
+// class lazy_mapped_file_t : public mapped_file {
+// std::string _path;
+// volatile bool done;
+// volatile long used_counter;
+
+// public:
+// explicit lazy_mapped_file_t(const char *path) :
+// mapped_file((char *)0, (size_t)0),
+// _path(path), done(false), used_counter(0) {}
+
+// void map() {
+// used_counter = 1;
+// done = false;
+// mapped_file::map(_path.c_str());
+// }
+// void unmap() {
+// done = true;
+// dec();
+// }
+
+// void inc() {
+// atomic::gcc::fetch_add(&used_counter, (long)1);
+// }
+// void dec() {
+// long val = atomic::gcc::add_fetch(&used_counter, (long)-1);
+// if(done && val == 0)
+// mapped_file::unmap();
+// }
+// };
+
+// class lazy_mapped_files_t : public std::vector<lazy_mapped_file_t> {
+// public:
+// lazy_mapped_files_t(int nb_files, char *argv[]) {
+// for(int j = 0; j < nb_files; j++)
+// push_back(lazy_mapped_file_t(argv[j]));
+// }
+
+// lazy_mapped_files_t(int nb_files, char *argv[], bool sequential) {
+// for(int j = 0; j < nb_files; j++) {
+// push_back(lazy_mapped_file_t(argv[j]));
+// if(sequential)
+// end()->sequential();
+// }
+// }
+// };
+
+}
+#endif
diff --git a/include/jellyfish/mer_dna.hpp b/include/jellyfish/mer_dna.hpp
new file mode 100644
index 0000000..b2e875f
--- /dev/null
+++ b/include/jellyfish/mer_dna.hpp
@@ -0,0 +1,729 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_MER_DNA_HPP__
+#define __JELLYFISH_MER_DNA_HPP__
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdint.h>
+#include <string.h>
+
+#include <iostream>
+#include <string>
+#include <stdexcept>
+#include <limits>
+#include <iterator>
+
+#include <jellyfish/misc.hpp>
+#ifdef HAVE_INT128
+#include <jellyfish/int128.hpp>
+#endif
+
+namespace jellyfish { namespace mer_dna_ns {
+#define R -1
+#define I -2
+#define O -3
+#define A 0
+#define C 1
+#define G 2
+#define T 3
+static const int codes[256] = {
+ O, O, O, O, O, O, O, O, O, O, I, O, O, O, O, O,
+ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ O, O, O, O, O, O, O, O, O, O, O, O, O, R, O, O,
+ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ O, A, R, C, R, O, O, G, R, O, O, R, O, R, R, O,
+ O, O, R, R, T, O, R, R, R, R, O, O, O, O, O, O,
+ O, A, R, C, R, O, O, G, R, O, O, R, O, R, R, O,
+ O, O, R, R, T, O, R, R, R, R, O, O, O, O, O, O,
+ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O
+};
+#undef R
+#undef I
+#undef O
+#undef A
+#undef C
+#undef G
+#undef T
+static const char rev_codes[4] = { 'A', 'C', 'G', 'T' };
+
+
+extern const char* const error_different_k;
+extern const char* const error_short_string;
+
+
+// Checkered mask. cmask<uint16_t, 1> is every other bit on
+// (0x55). cmask<uint16_t,2> is two bits one, two bits off (0x33). Etc.
+template<typename U, int len, int l = sizeof(U) * 8 / (2 * len)>
+struct cmask {
+ static const U v =
+ (cmask<U, len, l - 1>::v << (2 * len)) | (((U)1 << len) - 1);
+};
+template<typename U, int len>
+struct cmask<U, len, 0> {
+ static const U v = 0;
+};
+
+// Fast reverse complement of one word through bit tweedling.
+inline uint32_t word_reverse_complement(uint32_t w) {
+ typedef uint64_t U;
+ w = ((w >> 2) & cmask<U, 2 >::v) | ((w & cmask<U, 2 >::v) << 2);
+ w = ((w >> 4) & cmask<U, 4 >::v) | ((w & cmask<U, 4 >::v) << 4);
+ w = ((w >> 8) & cmask<U, 8 >::v) | ((w & cmask<U, 8 >::v) << 8);
+ w = ( w >> 16 ) | ( w << 16);
+ return ((U)-1) - w;
+}
+
+inline uint64_t word_reverse_complement(uint64_t w) {
+ typedef uint64_t U;
+ w = ((w >> 2) & cmask<U, 2 >::v) | ((w & cmask<U, 2 >::v) << 2);
+ w = ((w >> 4) & cmask<U, 4 >::v) | ((w & cmask<U, 4 >::v) << 4);
+ w = ((w >> 8) & cmask<U, 8 >::v) | ((w & cmask<U, 8 >::v) << 8);
+ w = ((w >> 16) & cmask<U, 16>::v) | ((w & cmask<U, 16>::v) << 16);
+ w = ( w >> 32 ) | ( w << 32);
+ return ((U)-1) - w;
+}
+
+#ifdef HAVE_INT128
+inline unsigned __int128 word_reverse_complement(unsigned __int128 w) {
+ typedef unsigned __int128 U;
+ w = ((w >> 2) & cmask<U, 2 >::v) | ((w & cmask<U, 2 >::v) << 2);
+ w = ((w >> 4) & cmask<U, 4 >::v) | ((w & cmask<U, 4 >::v) << 4);
+ w = ((w >> 8) & cmask<U, 8 >::v) | ((w & cmask<U, 8 >::v) << 8);
+ w = ((w >> 16) & cmask<U, 16>::v) | ((w & cmask<U, 16>::v) << 16);
+ w = ((w >> 32) & cmask<U, 32>::v) | ((w & cmask<U, 32>::v) << 32);
+ w = ( w >> 64 ) | ( w << 64);
+ return ((U)-1) - w;
+}
+#endif
+
+template<typename T>
+class base_proxy {
+public:
+ typedef T base_type;
+
+ base_proxy(base_type* w, unsigned int i) :
+ word_(w), i_(i) { }
+
+ base_proxy& operator=(char base) { return this->operator=(codes[(int)(unsigned char)base]); }
+ base_proxy& operator=(int code) {
+ base_type mask = (base_type)0x3 << i_;
+ *word_ = (*word_ & ~mask) | ((base_type)code << i_);
+ return *this;
+ }
+ int code() const { return (*word_ >> i_) & (base_type)0x3; }
+ operator char() const { return rev_codes[code()]; }
+
+private:
+ base_type* const word_;
+ unsigned int i_;
+};
+
+// enum { CODE_A, CODE_C, CODE_G, CODE_T,
+// CODE_RESET = -1, CODE_IGNORE = -2, CODE_COMMENT = -3 };
+
+template<typename T>
+struct mer_dna_traits { };
+
+template<typename derived>
+class mer_base {
+public:
+ typedef typename mer_dna_traits<derived>::base_type base_type;
+
+ enum { CODE_A, CODE_C, CODE_G, CODE_T,
+ CODE_RESET = -1, CODE_IGNORE = -2, CODE_COMMENT = -3 };
+
+ explicit mer_base(unsigned int k) :
+ _data(new base_type[derived::nb_words(k)])
+ {
+ memset(_data, '\0', nb_words(k) * sizeof(base_type));
+ }
+
+ mer_base(const mer_base &m) :
+ _data(new base_type[nb_words(static_cast<const derived*>(&m)->k())])
+ {
+ memcpy(_data, m._data, nb_words(static_cast<const derived*>(&m)->k()) * sizeof(base_type));
+ }
+
+ template<typename U>
+ mer_base(const unsigned int k, const U& rhs) :
+ _data(new base_type[nb_words(k)])
+ {
+ for(unsigned int i = 0; i < k; ++i)
+ _data[i] = rhs[i];
+ clean_msw();
+ }
+
+ ~mer_base() {
+ delete [] _data;
+ }
+
+ operator derived() { return *static_cast<derived*>(this); }
+ operator const derived() const { return *static_cast<const derived*>(this); }
+ unsigned int k() const { return static_cast<const derived*>(this)->k(); }
+
+ /// Direct access to data. No bound or consistency check. Use with
+ /// caution!
+ // base_type operator[](unsigned int i) { return _data[i]; }
+ base_type word(unsigned int i) const { return _data[i]; }
+ base_type operator[](unsigned int i) const { return _data[i]; }
+ /// Direct access to the data array.
+ const base_type* data() const { return _data; }
+
+ /// Same as above, but can modify directly content. Use at your own
+ /// risk!
+ base_type& word__(unsigned int i) { return _data[i]; }
+ base_type* data__() { return _data; }
+
+ template<unsigned int alignment>
+ void read(std::istream& is) {
+ const unsigned int k = static_cast<const derived*>(this)->k();
+ const unsigned int l = k / (4 * alignment) + (k % (4 * alignment) != 0);
+ is.read((char*)_data, l);
+ }
+
+ bool operator==(const mer_base& rhs) const {
+ unsigned int i = nb_words() - 1;
+ bool res = (_data[i] & msw()) == (rhs._data[i] & msw());
+ while(res && i > 7) {
+ i -= 8;
+ res = res && (_data[i+7] == rhs._data[i+7]);
+ res = res && (_data[i+6] == rhs._data[i+6]);
+ res = res && (_data[i+5] == rhs._data[i+5]);
+ res = res && (_data[i+4] == rhs._data[i+4]);
+ res = res && (_data[i+3] == rhs._data[i+3]);
+ res = res && (_data[i+2] == rhs._data[i+2]);
+ res = res && (_data[i+1] == rhs._data[i+1]);
+ res = res && (_data[i] == rhs._data[i] );
+ }
+ switch(i) {
+ case 7: res = res && (_data[6] == rhs._data[6]);
+ case 6: res = res && (_data[5] == rhs._data[5]);
+ case 5: res = res && (_data[4] == rhs._data[4]);
+ case 4: res = res && (_data[3] == rhs._data[3]);
+ case 3: res = res && (_data[2] == rhs._data[2]);
+ case 2: res = res && (_data[1] == rhs._data[1]);
+ case 1: res = res && (_data[0] == rhs._data[0]);
+ }
+ return res;
+ }
+
+ bool operator!=(const mer_base& rhs) const { return !this->operator==(rhs); }
+ bool operator<(const mer_base& rhs) const {
+ unsigned int i = nb_words();
+ while(i >= 8) {
+ i -= 8;
+ if(_data[i+7] != rhs._data[i+7]) return _data[i+7] < rhs._data[i+7];
+ if(_data[i+6] != rhs._data[i+6]) return _data[i+6] < rhs._data[i+6];
+ if(_data[i+5] != rhs._data[i+5]) return _data[i+5] < rhs._data[i+5];
+ if(_data[i+4] != rhs._data[i+4]) return _data[i+4] < rhs._data[i+4];
+ if(_data[i+3] != rhs._data[i+3]) return _data[i+3] < rhs._data[i+3];
+ if(_data[i+2] != rhs._data[i+2]) return _data[i+2] < rhs._data[i+2];
+ if(_data[i+1] != rhs._data[i+1]) return _data[i+1] < rhs._data[i+1];
+ if(_data[i] != rhs._data[i]) return _data[i] < rhs._data[i];
+ }
+ switch(i) {
+ case 7: if(_data[6] != rhs._data[6]) return _data[6] < rhs._data[6];
+ case 6: if(_data[5] != rhs._data[5]) return _data[5] < rhs._data[5];
+ case 5: if(_data[4] != rhs._data[4]) return _data[4] < rhs._data[4];
+ case 4: if(_data[3] != rhs._data[3]) return _data[3] < rhs._data[3];
+ case 3: if(_data[2] != rhs._data[2]) return _data[2] < rhs._data[2];
+ case 2: if(_data[1] != rhs._data[1]) return _data[1] < rhs._data[1];
+ case 1: if(_data[0] != rhs._data[0]) return _data[0] < rhs._data[0];
+ }
+ return false;
+ }
+ bool operator<=(const mer_base& rhs) const {
+ return *this < rhs || *this == rhs;
+ }
+ bool operator>(const mer_base& rhs) const {
+ return !(*this <= rhs);
+ }
+ bool operator>=(const mer_base& rhs) const {
+ return !(*this < rhs);
+ }
+
+ base_proxy<base_type> base(unsigned int i) { return base_proxy<base_type>(_data + i / wbases, 2 * (i % wbases)); }
+ const base_proxy<base_type> base(unsigned int i) const { return base_proxy<base_type>(_data + i / wbases, 2 * (i % wbases)); }
+
+ // Make current k-mer all As.
+ void polyA() { memset(_data, 0x00, sizeof(base_type) * nb_words()); clean_msw(); }
+ void polyC() { memset(_data, 0x55, sizeof(base_type) * nb_words()); clean_msw(); }
+ void polyG() { memset(_data, 0xaa, sizeof(base_type) * nb_words()); clean_msw(); }
+ void polyT() { memset(_data, 0xff, sizeof(base_type) * nb_words()); clean_msw(); }
+ void randomize() {
+ for(unsigned int i = 0; i < nb_words(); ++i)
+ _data[i] = random_bits(wbits);
+ clean_msw();
+ }
+
+ bool is_homopolymer() const {
+ const base_type base = _data[0] & c3;
+ const unsigned int barrier = nb_words();
+ unsigned int i = 0;
+
+ for( ; i + 5 < barrier; i += 4) {
+ if(_data[i ] != ((_data[i ] << 2) | base)) return false;
+ if(_data[i + 1] != ((_data[i + 1] << 2) | base)) return false;
+ if(_data[i + 2] != ((_data[i + 2] << 2) | base)) return false;
+ if(_data[i + 3] != ((_data[i + 3] << 2) | base)) return false;
+ }
+
+ switch(nb_words() - i) {
+ case 5: if(_data[i] != ((_data[i] << 2) | base) ) return false; ++i;
+ case 4: if(_data[i] != ((_data[i] << 2) | base) ) return false; ++i;
+ case 3: if(_data[i] != ((_data[i] << 2) | base) ) return false; ++i;
+ case 2: if(_data[i] != ((_data[i] << 2) | base) ) return false; ++i;
+ case 1: if(_data[i] != (((_data[i] << 2) | base) & msw())) return false;
+ }
+
+ return true;
+ }
+
+ derived& operator=(const mer_base& rhs) {
+ memcpy(_data, rhs._data, nb_words() * sizeof(base_type));
+ return *static_cast<derived*>(this);
+ }
+
+ derived& operator=(const char* s) {
+ if(strlen(s) < static_cast<derived*>(this)->k())
+ throw std::length_error(error_short_string);
+ from_chars(s);
+ return *static_cast<derived*>(this);
+ }
+
+ derived& operator=(const std::string& s) {
+ if(s.size() < static_cast<derived*>(this)->k())
+ throw std::length_error(error_short_string);
+ from_chars(s.c_str());
+ return *static_cast<derived*>(this);
+ }
+
+ // Shift the k-mer by 1 base, left or right. The char version take
+ // a base 'A', 'C', 'G', or 'T'. The base_type version takes a code
+ // in [0, 3] (not check of validity of argument, taken modulo
+ // 4). The return value is the base that was pushed off the side
+ // ('N' if the input character is not a valid base).
+ base_type shift_left(int c) {
+ const base_type r = (_data[nb_words()-1] >> lshift()) & c3;
+ const unsigned int barrier = nb_words() & (~c3);
+ base_type c2; // c2 and c1: carries
+ base_type c1 = (base_type)c & c3;
+ unsigned int i = 0;
+
+ for( ; i < barrier; i += 4) {
+ c2 = _data[i] >> wshift; _data[i] = (_data[i] << 2) | c1;
+ c1 = _data[i+1] >> wshift; _data[i+1] = (_data[i+1] << 2) | c2;
+ c2 = _data[i+2] >> wshift; _data[i+2] = (_data[i+2] << 2) | c1;
+ c1 = _data[i+3] >> wshift; _data[i+3] = (_data[i+3] << 2) | c2;
+ }
+ c2 = c1;
+
+ switch(nb_words() - i) {
+ case 3: c2 = _data[i] >> wshift; _data[i] = (_data[i] << 2) | c1; ++i;
+ case 2: c1 = _data[i] >> wshift; _data[i] = (_data[i] << 2) | c2; ++i;
+ case 1: _data[i] = (_data[i] << 2) | c1;
+ }
+ clean_msw();
+
+ return r;
+ }
+
+ base_type shift_right(int c) {
+ const base_type r = _data[0] & c3;
+ if(nb_words() > 1){
+ const unsigned int barrier = (nb_words() - 1) & (~c3);
+ unsigned int i = 0;
+
+ for( ; i < barrier; i += 4) {
+ _data[i] = (_data[i] >> 2) | (_data[i+1] << wshift);
+ _data[i+1] = (_data[i+1] >> 2) | (_data[i+2] << wshift);
+ _data[i+2] = (_data[i+2] >> 2) | (_data[i+3] << wshift);
+ _data[i+3] = (_data[i+3] >> 2) | (_data[i+4] << wshift);
+ }
+ switch(nb_words() - 1 - i) {
+ case 3: _data[i] = (_data[i] >> 2) | (_data[i+1] << wshift); ++i;
+ case 2: _data[i] = (_data[i] >> 2) | (_data[i+1] << wshift); ++i;
+ case 1: _data[i] = (_data[i] >> 2) | (_data[i+1] << wshift);
+ }
+ }
+
+ _data[nb_words() - 1] =
+ ((_data[nb_words() - 1] & msw()) >> 2) | (((base_type)c & c3) << lshift());
+
+ return r;
+ }
+
+ // Non DNA codes are negative
+ inline static bool not_dna(int c) { return c < 0; }
+ inline static int code(char c) { return codes[(int)(unsigned char)c]; }
+ inline static char rev_code(int x) { return rev_codes[x]; }
+ static int complement(int x) { return (base_type)3 - x; }
+ static char complement(char c) {
+ switch(c) {
+ case 'A': case 'a': return 'T';
+ case 'C': case 'c': return 'G';
+ case 'G': case 'g': return 'C';
+ case 'T': case 't': return 'A';
+ }
+ return 'N';
+ }
+
+ char shift_left(char c) {
+ int x = code(c);
+ if(x == -1)
+ return 'N';
+ return rev_code(shift_left(x));
+ }
+
+ char shift_right(char c) {
+ int x = code(c);
+ if(x == -1)
+ return 'N';
+ return rev_code(shift_right(x));
+ }
+
+ void reverse_complement() {
+ base_type *low = _data;
+ base_type *high = _data + nb_words() - 1;
+ for( ; low < high; ++low, --high) {
+ base_type tmp = word_reverse_complement(*low);
+ *low = word_reverse_complement(*high);
+ *high = tmp;
+ }
+ if(low == high)
+ *low = word_reverse_complement(*low);
+ unsigned int rs = wbits - nb_msb();
+ if(rs > 0)
+ large_shift_right(rs);
+ }
+
+ void canonicalize() {
+ derived rc = this->get_reverse_complement();
+ if(rc < *this)
+ *this = rc;
+ }
+
+ derived get_reverse_complement() const {
+ derived res(*this);
+ res.reverse_complement();
+ return res;
+ }
+
+ derived get_canonical() const {
+ derived rc = this->get_reverse_complement();
+ return rc < *this ? rc : *this;
+ }
+
+ // Transfomr the k-mer into a C++ string.
+ std::string to_str() const {
+ std::string res(static_cast<const derived*>(this)->k(), '\0');
+ to_chars(res.begin());
+ return res;
+ }
+
+ // Transform the k-mer into a string. For the char * version,
+ // assume that the buffer is large enough to receive k+1
+ // characters (space for '\0' at end of string).
+ void to_str(char* s) const {
+ s = to_chars(s);
+ *s = '\0';
+ }
+
+ // Copy bases as char to the output iterator it. No '\0' is added
+ // or check made that there is enough space. The iterator pointed
+ // after the last base is returned.
+ template<typename OutputIterator>
+ OutputIterator to_chars(OutputIterator it) const {
+ int shift = lshift(); // Number of bits to shift to get base
+
+ for(int j = nb_words() - 1; j >= 0; --j) {
+ base_type w = _data[j];
+ for( ; shift >= 0; shift -= 2, ++it)
+ *it = rev_code((w >> shift) & c3);
+ shift = wshift;
+ }
+ return it;
+ }
+
+ // Get bits [start, start+len). start must be < 2k, len <=
+ // sizeof(base_type) and start+len < 2k. No checks
+ // performed. start and len are in bits, not bases.
+ base_type get_bits(unsigned int start, unsigned int len) const {
+ unsigned int q = start / wbits;
+ unsigned int r = start % wbits;
+
+ base_type res = _data[q] >> r;
+ if(len > wbits - r)
+ res |= _data[q + 1] << (wbits - r);
+ return len < (unsigned int)wbits ? res & (((base_type)1 << len) - 1) : res;
+ }
+
+ // Set bits [start, start+len). Same restriction as get_bits. In
+ // some rare cases, the value written can be larger than the bits
+ // occupied by the mer itself. The mer is then not valid if some MSB
+ // are set to 1.
+ template<bool zero_msw = true>
+ void set_bits(unsigned int start, unsigned int len, base_type v) {
+ unsigned int q = start / wbits;
+ unsigned int r = start % wbits;
+ unsigned int left = wbits - r;
+ base_type mask;
+ if(len > left) {
+ mask = ((base_type)1 << r) - 1;
+ _data[q] = (_data[q] & mask) | (v << r);
+ mask = ((base_type)1 << (len - left)) - 1;
+ _data[q + 1] = (_data[q + 1] & ~mask) | (v >> (left));
+ } else {
+ mask = (len < (unsigned int)wbits ? (((base_type)1 << len) - 1) : (base_type)-1) << r;
+ _data[q] = (_data[q] & ~mask) | (v << r);
+ }
+ if(zero_msw)
+ clean_msw();
+ }
+
+
+
+ // Internal stuff
+
+ // Number of words in _data
+ inline static unsigned int nb_words(unsigned int k) { return (k / wbases) + (k % wbases != 0); }
+ inline unsigned int nb_words() const { return nb_words(static_cast<const derived*>(this)->k()); }
+
+ // Mask of highest word
+ inline base_type msw() const {
+ const base_type m = std::numeric_limits<base_type>::max();
+ return m >> (wbits - nb_msb());
+ }
+
+ // Nb of bits used in highest word
+ inline unsigned int nb_msb() const {
+ base_type nb = (static_cast<const derived*>(this)->k() % wbases) * 2;
+ return nb ? nb : wbits;
+ }
+ // How much to shift last base in last word of _data
+ inline unsigned int lshift() const { return nb_msb() - 2; }
+
+ // Make sure the highest bits are all zero
+ inline void clean_msw() { _data[nb_words() - 1] &= msw(); }
+
+ template<typename InputIterator>
+ bool from_chars(InputIterator it) {
+ int shift = lshift();
+ clean_msw();
+
+ for(int j = nb_words() - 1; j >= 0; --j) {
+ base_type& w = _data[j];
+ w = 0;
+ for( ; shift >= 0; shift -= 2, ++it) {
+ int c = code(*it);
+ if(not_dna(c))
+ return false;
+ w |= (base_type)c << shift;
+ }
+ shift = wshift;
+ }
+ return true;
+ }
+
+protected:
+ static const base_type c3 = (base_type)0x3;
+ static const int wshift = sizeof(base_type) * 8 - 2; // left shift in 1 word
+ static const int wbases = 4 * sizeof(base_type); // bases in a word
+ static const int wbits = 8 * sizeof(base_type); // bits in a word
+ base_type * _data;
+
+ // Shift to the right by rs bits (Note bits, not bases)
+ void large_shift_right(unsigned int rs) {
+ if(nb_words() > 1) {
+ const unsigned int barrier = (nb_words() - 1) & (~c3);
+ const unsigned int ls = wbits - rs;
+ unsigned int i = 0;
+
+ for( ; i < barrier; i += 4) {
+ _data[i] = (_data[i] >> rs) | (_data[i+1] << ls);
+ _data[i+1] = (_data[i+1] >> rs) | (_data[i+2] << ls);
+ _data[i+2] = (_data[i+2] >> rs) | (_data[i+3] << ls);
+ _data[i+3] = (_data[i+3] >> rs) | (_data[i+4] << ls);
+ }
+ switch(nb_words() - 1 - i) {
+ case 3: _data[i] = (_data[i] >> rs) | (_data[i+1] << ls); ++i;
+ case 2: _data[i] = (_data[i] >> rs) | (_data[i+1] << ls); ++i;
+ case 1: _data[i] = (_data[i] >> rs) | (_data[i+1] << ls);
+ }
+ }
+ _data[nb_words() - 1] >>= rs;
+ clean_msw();
+ }
+};
+
+// Mer type where the length is kept in each mer object: allows to
+// manipulate mers of different size within the same application.
+template<typename T = uint64_t>
+class mer_base_dynamic : public mer_base<mer_base_dynamic<T> > {
+public:
+ typedef T base_type;
+ typedef mer_base<mer_base_dynamic<T> > super;
+
+ explicit mer_base_dynamic(unsigned int k) : super(k), k_(k) { }
+ mer_base_dynamic(const mer_base_dynamic& rhs) : super(rhs), k_(rhs.k()) { }
+ mer_base_dynamic(unsigned int k, const char* s) : super(k), k_(k) {
+ super::from_chars(s);
+ }
+ explicit mer_base_dynamic(const char* s) : super(strlen(s)), k_(strlen(s)) {
+ super::from_chars(s);
+ }
+ explicit mer_base_dynamic(const std::string& s) : super(s.size()), k_(s.size()) {
+ super::from_chars(s.begin());
+ }
+
+ template<typename U>
+ explicit mer_base_dynamic(unsigned int k, const U& rhs) : super(k, rhs), k_(k) { }
+
+ ~mer_base_dynamic() { }
+
+ mer_base_dynamic& operator=(const mer_base_dynamic rhs) {
+ if(k_ != rhs.k_)
+ throw std::length_error(error_different_k);
+ super::operator=(rhs);
+ return *this;
+ }
+
+ unsigned int k() const { return k_; }
+ static unsigned int k(unsigned int k) { return k; }
+
+private:
+ const unsigned int k_;
+};
+
+template<typename T>
+struct mer_dna_traits<mer_base_dynamic<T> > {
+ typedef T base_type;
+};
+
+// Mer type where the length is a static variable: the mer size is
+// fixed for all k-mers in the application.
+//
+// The CI (Class Index) template parameter allows to have more than one such
+// class with different length in the same application. Each class has
+// its own static variable associated with it.
+template<typename T = uint64_t, int CI = 0>
+class mer_base_static : public mer_base<mer_base_static<T, CI> > {
+public:
+ typedef T base_type;
+ typedef mer_base<mer_base_static<T, CI> > super;
+ static const int class_index = CI;
+
+ mer_base_static() : super(k_) { }
+ explicit mer_base_static(unsigned int k) : super(k_) {
+ if(k != k_)
+ throw std::length_error(error_different_k);
+ }
+ mer_base_static(const mer_base_static& rhs) : super(rhs) { }
+
+ mer_base_static(unsigned int k, const char* s) : super(k_) {
+ super::from_chars(s);
+ }
+ explicit mer_base_static(const char* s) : super(k_) {
+ super::from_chars(s);
+ }
+ explicit mer_base_static(const std::string& s) : super(k_) {
+ super::from_chars(s.begin());
+ }
+
+ template<typename U>
+ mer_base_static(unsigned int k, const U& rhs) : super(k_, rhs) {
+ if(k != k_)
+ throw std::length_error(error_different_k);
+ }
+
+ mer_base_static& operator=(const char* s) { return super::operator=(s); }
+ mer_base_static& operator=(const std::string& s) { return super::operator=(s); }
+
+ ~mer_base_static() { }
+
+ static unsigned int k(); // { return k_; }
+ static unsigned int k(unsigned int k) { std::swap(k, k_); return k; }
+
+private:
+ static unsigned int k_;
+};
+template<typename T, int CI>
+unsigned int mer_base_static<T, CI>::k_ = 22;
+template<typename T, int CI>
+unsigned int mer_base_static<T, CI>::k() { return k_; }
+template<typename T, int CI>
+const int mer_base_static<T, CI>::class_index;
+
+template<typename T, int CI>
+struct mer_dna_traits<mer_base_static<T, CI> > {
+ typedef T base_type;
+};
+
+typedef std::ostream_iterator<char> ostream_char_iterator;
+template<typename derived>
+inline std::ostream& operator<<(std::ostream& os, const mer_base<derived>& mer) {
+ // char s[static_cast<const derived>(mer).k() + 1];
+ char s[mer.k() + 1];
+ mer.to_str(s);
+ return os << s;
+}
+
+typedef std::istream_iterator<char> istream_char_iterator;
+template<typename derived>
+inline std::istream& operator>>(std::istream& is, mer_base<derived>& mer) {
+ if(is.flags() & std::ios::skipws) {
+ while(isspace(is.peek())) { is.ignore(1); }
+ }
+
+ char buffer[mer.k() + 1];
+ is.read(buffer, mer.k());
+ if(is.gcount() != mer.k())
+ goto error;
+ buffer[mer.k()] = '\0';
+ if(!mer.from_chars(buffer))
+ goto error;
+ return is;
+
+ error:
+ is.setstate(std::ios::failbit);
+ return is;
+}
+
+} // namespace mer_dna_ns
+
+
+typedef mer_dna_ns::mer_base_static<uint32_t, 0> mer_dna32;
+typedef mer_dna_ns::mer_base_static<uint64_t, 0> mer_dna64;
+#ifdef HAVE_INT128
+typedef mer_dna_ns::mer_base_static<unsigned __int128, 0> mer_dna128;
+#endif
+
+typedef mer_dna64 mer_dna;
+
+} // namespace jellyfish
+
+#endif
diff --git a/include/jellyfish/mer_dna_bloom_counter.hpp b/include/jellyfish/mer_dna_bloom_counter.hpp
new file mode 100644
index 0000000..f640d1f
--- /dev/null
+++ b/include/jellyfish/mer_dna_bloom_counter.hpp
@@ -0,0 +1,50 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_MER_DNA_BLOOM_COUNTER_HPP_
+#define __JELLYFISH_MER_DNA_BLOOM_COUNTER_HPP_
+
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/bloom_counter2.hpp>
+#include <jellyfish/bloom_filter.hpp>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+#include <jellyfish/misc.hpp>
+
+namespace jellyfish {
+template<>
+struct hash_pair<mer_dna> {
+ RectangularBinaryMatrix m1, m2;
+
+ hash_pair() : m1(8 * sizeof(uint64_t), mer_dna::k() * 2), m2(8 * sizeof(uint64_t), mer_dna::k() * 2) {
+ m1.randomize(random_bits);
+ m2.randomize(random_bits);
+ }
+
+ hash_pair(RectangularBinaryMatrix&& m1_, RectangularBinaryMatrix&& m2_) : m1(m1_), m2(m2_) { }
+
+ void operator()(const mer_dna& k, uint64_t* hashes) const {
+ hashes[0] = m1.times(k);
+ hashes[1] = m2.times(k);
+ }
+};
+
+typedef bloom_counter2<mer_dna> mer_dna_bloom_counter;
+typedef bloom_counter2_file<mer_dna> mer_dna_bloom_counter_file;
+typedef bloom_filter<mer_dna> mer_dna_bloom_filter;
+typedef bloom_filter_file<mer_dna> mer_dna_bloom_filter_file;
+}
+
+#endif /* __JELLYFISH_MER_DNA_BLOOM_COUNTER_HPP_ */
diff --git a/include/jellyfish/mer_heap.hpp b/include/jellyfish/mer_heap.hpp
new file mode 100644
index 0000000..29bd228
--- /dev/null
+++ b/include/jellyfish/mer_heap.hpp
@@ -0,0 +1,115 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_HEAP_HPP__
+#define __JELLYFISH_HEAP_HPP__
+
+#include <stdint.h>
+#include <algorithm>
+
+namespace jellyfish { namespace mer_heap {
+template<typename Key, typename Iterator>
+struct heap_item {
+ Key key_;
+ uint64_t val_;
+ uint64_t pos_;
+ Iterator* it_;
+
+ heap_item() : it_(0) { }
+ heap_item(Iterator& iter) : key_(iter.key()), val_(iter.val()), pos_(iter.pos()), it_(&iter) { }
+
+ bool operator>(const heap_item& other) const {
+ if(pos_ == other.pos_)
+ return key_ > other.key_;
+ return pos_ > other.pos_;
+ }
+};
+
+// STL make_heap creates a max heap. We want a min heap, so
+// we use the > operator
+template<typename Key, typename Iterator>
+struct heap_item_comp {
+ bool operator()(const heap_item<Key, Iterator>* i1, const heap_item<Key, Iterator>* i2) {
+ return *i1 > *i2;
+ }
+};
+
+template<typename Key, typename Iterator>
+class heap {
+ heap_item<Key, Iterator>* storage_; // Storage of the elements
+ heap_item<Key, Iterator>** elts_; // Pointers to storage. Create a heap of pointers
+ size_t capacity_; // Actual capacity
+ size_t h_; // Head pointer
+ heap_item_comp<Key, Iterator> comp_;
+
+public:
+ typedef const heap_item<Key, Iterator> *const_item_t;
+
+ heap() : storage_(0), elts_(0), capacity_(0), h_(0) { }
+ explicit heap(size_t capacity) { initialize(capacity); }
+ ~heap() {
+ delete[] storage_;
+ delete[] elts_;
+ }
+
+ void initialize(size_t capacity) {
+ capacity_ = capacity;
+ h_ = 0;
+ storage_ = new heap_item<Key, Iterator>[capacity_];
+ elts_ = new heap_item<Key, Iterator>*[capacity_];
+ for(size_t h1 = 0; h1 < capacity_; ++h1)
+ elts_[h1] = &storage_[h1];
+ }
+
+ void fill(Iterator &it) {
+ for(h_ = 0; h_ < capacity_; ++h_) {
+ if(!it.next())
+ break;
+ storage_[h_] = it;
+ elts_[h_] = &storage_[h_];
+ }
+ std::make_heap(elts_, elts_ + h_, comp_);
+ }
+ // template<typename ForwardIterator>
+ // void fill(ForwardIterator first, ForwardIterator last) {
+ // h_ = 0;
+ // while(h_ < capacity_ && first != last) {
+ // if(!first->next())
+ // break;
+ // storage_[h_].initialize(*first++);
+ // elts_[h_] = &storage_[h_];
+ // h_++;
+ // }
+ // std::make_heap(elts_, elts_ + h_, compare);
+ // }
+
+ bool is_empty() const { return h_ == 0; }
+ bool is_not_empty() const { return h_ > 0; }
+ size_t size() const { return h_; }
+ size_t capacity() const { return capacity_; }
+
+ // The following 3 should only be used after fill has been called
+ const_item_t head() const { return elts_[0]; }
+ void pop() { std::pop_heap(elts_, elts_ + h_--, comp_); }
+ void push(Iterator &item) {
+ *elts_[h_] = item;
+ std::push_heap(elts_, elts_ + ++h_, comp_);
+ }
+};
+
+} } // namespace jellyfish { namespace mer_heap {
+
+#endif // __HEAP_HPP__
diff --git a/include/jellyfish/mer_iterator.hpp b/include/jellyfish/mer_iterator.hpp
new file mode 100644
index 0000000..cb9e6df
--- /dev/null
+++ b/include/jellyfish/mer_iterator.hpp
@@ -0,0 +1,100 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __MER_ITERATOR_HPP__
+#define __MER_ITERATOR_HPP__
+
+#include <iterator>
+#include <jellyfish/mer_dna.hpp>
+
+namespace jellyfish {
+template<typename SequencePool, typename MerType>
+class mer_iterator : public std::iterator<std::input_iterator_tag,MerType> {
+ typename SequencePool::job* job_;
+ const char* cseq_;
+ MerType m_; // mer
+ MerType rcm_; // reverse complement mer
+ unsigned int filled_;
+ const bool canonical_;
+
+public:
+ typedef MerType mer_type;
+ typedef SequencePool sequence_parser_type;
+
+ mer_iterator(SequencePool& seq, bool canonical = false) :
+ job_(new typename SequencePool::job(seq)), cseq_(0), filled_(0), canonical_(canonical)
+ {
+ if(job_->is_empty()) {
+ delete job_;
+ job_ = 0;
+ } else {
+ cseq_ = (*job_)->start;
+ this->operator++();
+ }
+ }
+ mer_iterator() : job_(0), cseq_(0), filled_(0), canonical_(false) { }
+ // mer_iterator(const mer_iterator& rhs) : job_(rhs.job_), cseq_(rhs.cseq_), m_(rhs.m_), filled_(rhs.filled_) { }
+ ~mer_iterator() {
+ delete job_;
+ }
+
+ bool operator==(const mer_iterator& rhs) const { return job_ == rhs.job_; }
+ bool operator!=(const mer_iterator& rhs) const { return job_ != rhs.job_; }
+
+ operator void*() const { return (void*)job_; }
+ const mer_type& operator*() const { return !canonical_ || m_ < rcm_ ? m_ : rcm_; }
+ const mer_type* operator->() const { return &this->operator*(); }
+ mer_iterator& operator++() {
+ while(true) {
+ while(cseq_ == (*job_)->end) {
+ job_->next();
+ if(job_->is_empty()) {
+ delete job_;
+ job_ = 0;
+ cseq_ = 0;
+ return *this;
+ }
+ cseq_ = (*job_)->start;
+ filled_ = 0;
+ }
+
+ do {
+ int code = m_.code(*cseq_++);
+ if(code >= 0) {
+ m_.shift_left(code);
+ if(canonical_)
+ rcm_.shift_right(rcm_.complement(code));
+ filled_ = std::min(filled_ + 1, mer_dna::k());
+ } else
+ filled_ = 0;
+ } while(filled_ < m_.k() && cseq_ < (*job_)->end);
+ if(filled_ >= m_.k())
+ break;
+ }
+ return *this;
+ }
+
+ mer_iterator operator++(int) {
+ mer_iterator res(*this);
+ ++*this;
+ return res;
+ }
+};
+
+} // namespace jellyfish {
+
+#endif /* __MER_ITERATOR_HPP__ */
diff --git a/include/jellyfish/mer_overlap_sequence_parser.hpp b/include/jellyfish/mer_overlap_sequence_parser.hpp
new file mode 100644
index 0000000..7700a60
--- /dev/null
+++ b/include/jellyfish/mer_overlap_sequence_parser.hpp
@@ -0,0 +1,241 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_MER_OVELAP_SEQUENCE_PARSER_H_
+#define __JELLYFISH_MER_OVELAP_SEQUENCE_PARSER_H_
+
+#include <stdint.h>
+
+#include <memory>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/cooperative_pool2.hpp>
+#include <jellyfish/cpp_array.hpp>
+
+namespace jellyfish {
+
+struct sequence_ptr {
+ char* start;
+ char* end;
+};
+
+template<typename StreamIterator>
+class mer_overlap_sequence_parser : public jellyfish::cooperative_pool2<mer_overlap_sequence_parser<StreamIterator>, sequence_ptr> {
+ typedef jellyfish::cooperative_pool2<mer_overlap_sequence_parser<StreamIterator>, sequence_ptr> super;
+ enum file_type { DONE_TYPE, FASTA_TYPE, FASTQ_TYPE };
+ typedef std::unique_ptr<std::istream> stream_type;
+
+ struct stream_status {
+ char* seam;
+ size_t seq_len;
+ bool have_seam;
+ file_type type;
+ stream_type stream;
+
+ stream_status() : seam(0), seq_len(0), have_seam(false), type(DONE_TYPE) { }
+ };
+
+ uint16_t mer_len_;
+ size_t buf_size_;
+ char* buffer;
+ char* seam_buffer;
+ locks::pthread::mutex streams_mutex;
+ char* data;
+ cpp_array<stream_status> streams_;
+ StreamIterator& streams_iterator_;
+
+public:
+ /// Max_producers is the maximum number of concurrent threads than
+ /// can produce data simultaneously. Size is the number of buffer to
+ /// keep around. It should be larger than the number of thread
+ /// expected to read from this class. buf_size is the size of each
+ /// buffer. A StreamIterator is expected to have a next() method,
+ /// which is thread safe, and which returns (move) a
+ /// std::unique<std::istream> object.
+ mer_overlap_sequence_parser(uint16_t mer_len, uint32_t max_producers, uint32_t size, size_t buf_size,
+ StreamIterator& streams) :
+ super(max_producers, size),
+ mer_len_(mer_len),
+ buf_size_(buf_size),
+ buffer(new char[size * buf_size]),
+ seam_buffer(new char[max_producers * (mer_len - 1)]),
+ streams_(max_producers),
+ streams_iterator_(streams)
+ {
+ for(sequence_ptr* it = super::element_begin(); it != super::element_end(); ++it)
+ it->start = it->end = buffer + (it - super::element_begin()) * buf_size;
+ for(uint32_t i = 0; i < max_producers; ++i) {
+ streams_.init(i);
+ streams_[i].seam = seam_buffer + i * (mer_len - 1);
+ open_next_file(streams_[i]);
+ }
+ }
+
+ ~mer_overlap_sequence_parser() {
+ delete [] buffer;
+ delete [] seam_buffer;
+ }
+
+ // file_type get_type() const { return type; }
+
+ inline bool produce(uint32_t i, sequence_ptr& buff) {
+ stream_status& st = streams_[i];
+
+ switch(st.type) {
+ case FASTA_TYPE:
+ read_fasta(st, buff);
+ break;
+ case FASTQ_TYPE:
+ read_fastq(st, buff);
+ break;
+ case DONE_TYPE:
+ return true;
+ }
+
+ if(st.stream->good())
+ return false;
+
+ // Reach the end of file, close current and try to open the next one
+ st.have_seam = false;
+ open_next_file(st);
+ return false;
+ }
+
+protected:
+ bool open_next_file(stream_status& st) {
+ // The stream must be released, with .reset(), before calling
+ // .next() on the streams_iterator_, to ensure that the
+ // streams_iterator_ noticed that we closed that stream before
+ // requesting a new one.
+ st.stream.reset();
+ st.stream = streams_iterator_.next();
+ if(!st.stream) {
+ st.type = DONE_TYPE;
+ return false;
+ }
+
+ switch(st.stream->peek()) {
+ case EOF: return open_next_file(st);
+ case '>':
+ st.type = FASTA_TYPE;
+ ignore_line(*st.stream); // Pass header
+ break;
+ case '@':
+ st.type = FASTQ_TYPE;
+ ignore_line(*st.stream); // Pass header
+ break;
+ default:
+ throw std::runtime_error("Unsupported format"); // Better error management
+ }
+ return true;
+ }
+
+ void read_fasta(stream_status& st, sequence_ptr& buff) {
+ size_t read = 0;
+ if(st.have_seam) {
+ memcpy(buff.start, st.seam, mer_len_ - 1);
+ read = mer_len_ - 1;
+ }
+
+ // Here, the current stream is assumed to always point to some
+ // sequence (or EOF). Never at header.
+ while(st.stream->good() && read < buf_size_ - mer_len_ - 1) {
+ read += read_sequence(*st.stream, read, buff.start, '>');
+ if(st.stream->peek() == '>') {
+ *(buff.start + read++) = 'N'; // Add N between reads
+ ignore_line(*st.stream); // Skip to next sequence (skip headers, quals, ...)
+ }
+ }
+ buff.end = buff.start + read;
+
+ st.have_seam = read >= (size_t)(mer_len_ - 1);
+ if(st.have_seam)
+ memcpy(st.seam, buff.end - mer_len_ + 1, mer_len_ - 1);
+ }
+
+ void read_fastq(stream_status& st, sequence_ptr& buff) {
+ size_t read = 0;
+ if(st.have_seam) {
+ memcpy(buff.start, st.seam, mer_len_ - 1);
+ read = mer_len_ - 1;
+ }
+
+ // Here, the st.stream is assumed to always point to some
+ // sequence (or EOF). Never at header.
+ while(st.stream->good() && read < buf_size_ - mer_len_ - 1) {
+ size_t nread = read_sequence(*st.stream, read, buff.start, '+');
+ read += nread;
+ st.seq_len += nread;
+ if(st.stream->peek() == '+') {
+ skip_quals(*st.stream, st.seq_len);
+ if(st.stream->good()) {
+ *(buff.start + read++) = 'N'; // Add N between reads
+ ignore_line(*st.stream); // Skip sequence header
+ }
+ st.seq_len = 0;
+ }
+ }
+ buff.end = buff.start + read;
+
+ st.have_seam = read >= (size_t)(mer_len_ - 1);
+ if(st.have_seam)
+ memcpy(st.seam, buff.end - mer_len_ + 1, mer_len_ - 1);
+ }
+
+ size_t read_sequence(std::istream& is, const size_t read, char* const start, const char stop) {
+ size_t nread = read;
+ while(is && nread < buf_size_ - 1 && is.peek() != stop) {
+ // Skip new lines -> get below does like them
+ skip_newlines(is);
+ is.get(start + nread, buf_size_ - nread);
+ nread += is.gcount();
+ skip_newlines(is);
+ }
+ return nread - read;
+ }
+
+ inline void ignore_line(std::istream& is) {
+ is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+ }
+
+ inline void skip_newlines(std::istream& is) {
+ while(is.peek() == '\n')
+ is.get();
+ }
+
+ // Skip quals header and qual values (read_len) of them.
+ void skip_quals(std::istream& is, size_t read_len) {
+ ignore_line(is);
+ size_t quals = 0;
+ while(is.good() && quals < read_len) {
+ skip_newlines(is);
+ is.ignore(read_len - quals + 1, '\n');
+ quals += is.gcount();
+ if(is)
+ ++read_len;
+ }
+ skip_newlines(is);
+ if(quals == read_len && (is.peek() == '@' || is.peek() == EOF))
+ return;
+
+ throw std::runtime_error("Invalid fastq sequence");
+ }
+
+ char peek(std::istream& is) { return is.peek(); }
+};
+}
+
+#endif /* __JELLYFISH_MER_OVELAP_SEQUENCE_PARSER_H_ */
diff --git a/include/jellyfish/mer_qual_iterator.hpp b/include/jellyfish/mer_qual_iterator.hpp
new file mode 100644
index 0000000..3d7dbbc
--- /dev/null
+++ b/include/jellyfish/mer_qual_iterator.hpp
@@ -0,0 +1,118 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __MER_QUAL_ITERATOR_HPP__
+#define __MER_QUAL_ITERATOR_HPP__
+
+#include <iterator>
+#include <jellyfish/mer_dna.hpp>
+
+namespace jellyfish {
+template<typename SequencePool, typename MerType>
+class mer_qual_iterator : public std::iterator<std::input_iterator_tag, MerType> {
+ typename SequencePool::job* job_;
+ std::string::const_iterator cseq_, eseq_;
+ std::string::const_iterator cqual_, equal_;
+ MerType m_; // mer
+ MerType rcm_; // reverse complement mer
+ unsigned int filled_;
+ const char min_qual_;
+ const bool canonical_;
+ size_t index_;
+
+public:
+ typedef MerType mer_type;
+ typedef SequencePool sequence_parser_type;
+
+ mer_qual_iterator(SequencePool& seq, char min_qual, bool canonical = false) :
+ job_(new typename SequencePool::job(seq)),
+ filled_(0), min_qual_(min_qual), canonical_(canonical), index_(0)
+ {
+ if(job_->is_empty()) {
+ delete job_;
+ job_ = 0;
+ } else {
+ init_from_job();
+ this->operator++();
+ }
+ }
+ mer_qual_iterator() : job_(0), filled_(0), canonical_(false), index_(0) { }
+ // mer_iterator(const mer_iterator& rhs) : job_(rhs.job_), cseq_(rhs.cseq_), m_(rhs.m_), filled_(rhs.filled_) { }
+ ~mer_qual_iterator() {
+ delete job_;
+ }
+
+ bool operator==(const mer_qual_iterator& rhs) const { return job_ == rhs.job_; }
+ bool operator!=(const mer_qual_iterator& rhs) const { return job_ != rhs.job_; }
+
+ operator void*() const { return (void*)job_; }
+ const mer_type& operator*() const { return !canonical_ || m_ < rcm_ ? m_ : rcm_; }
+ const mer_type* operator->() const { return &this->operator*(); }
+ mer_qual_iterator& operator++() {
+ while(true) {
+ while(cseq_ == eseq_) {
+ ++index_;
+ while(index_ >= (*job_)->nb_filled) {
+ index_ = 0;
+ job_->next();
+ if(job_->is_empty()) {
+ delete job_;
+ job_ = 0;
+ return *this;
+ }
+ }
+ init_from_job();
+ filled_ = 0;
+ }
+
+ do {
+ const int code = m_.code(*cseq_++);
+ const char qual = cqual_ < equal_ ? *cqual_++ : std::numeric_limits<char>::min();
+ if(code >= 0 && qual >= min_qual_) {
+ m_.shift_left(code);
+ if(canonical_)
+ rcm_.shift_right(rcm_.complement(code));
+ filled_ = std::min(filled_ + 1, mer_dna::k());
+ } else
+ filled_ = 0;
+ } while(filled_ < m_.k() && cseq_ < eseq_);
+ if(filled_ >= m_.k())
+ break;
+ }
+ return *this;
+ }
+
+ mer_qual_iterator operator++(int) {
+ mer_qual_iterator res(*this);
+ ++*this;
+ return res;
+ }
+
+private:
+ void init_from_job() {
+ std::string& seq = (*job_)->data[index_].seq;
+ cseq_ = seq.begin();
+ eseq_ = seq.end();
+ std::string& quals = (*job_)->data[index_].qual;
+ cqual_ = quals.begin();
+ equal_ = quals.end();
+ }
+};
+
+} // namespace jellyfish {
+
+#endif /* __MER_QUAL_ITERATOR_HPP__ */
diff --git a/include/jellyfish/misc.hpp b/include/jellyfish/misc.hpp
new file mode 100644
index 0000000..4aa1a90
--- /dev/null
+++ b/include/jellyfish/misc.hpp
@@ -0,0 +1,247 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_MISC_HPP__
+#define __JELLYFISH_MISC_HPP__
+
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <exception>
+#include <stdexcept>
+#include <string>
+#include <new>
+#include <ostream>
+#include <utility>
+#include <iterator>
+#include <algorithm>
+
+namespace jellyfish {
+#define bsizeof(v) (8 * sizeof(v))
+typedef uint_fast64_t uint_t;
+//#define UINT_C(x)
+#define PRIUINTu PRIuFAST64
+#define PRIUINTx PRIxFAST64
+
+inline int leading_zeroes(int x) { return __builtin_clz(x); } // CLK
+inline int leading_zeroes(unsigned int x) { return __builtin_clz(x); }
+inline int leading_zeroes(unsigned long x) { return __builtin_clzl(x); }
+inline int leading_zeroes(unsigned long long x) { return __builtin_clzll(x); }
+
+/// The floor of the log base two of n. Undefined if n == 0
+template <typename T>
+uint16_t floorLog2(T n) {
+ return sizeof(T) * 8 - 1 - leading_zeroes(n);
+}
+
+/// The ceiling of the log base two of n. Undefined if n == 0
+template<typename T>
+uint16_t ceilLog2(T n) {
+ uint16_t r = floorLog2(n);
+ return n > (((T)1) << r) ? r + 1 : r;
+}
+
+/// The ceiling of the quotient of the division of a by b. I.e. if b
+/// divides a, then div_ceil(a, b) == a / b. Otherwise, div_ceil(a, b)
+/// == a / b + 1
+template<typename T>
+T div_ceil(T a, T b) {
+ T q = a / b;
+ return a % b == 0 ? q : q + 1;
+}
+
+/// Number of bits necessary to encode number n. Undefined if n ==
+/// 0. The following should be true: 2^bitsize(n) - 1 >= n >
+/// 2^(bitsize(n) - 1)
+template<typename T>
+uint16_t bitsize(T n) {
+ return floorLog2(n) + 1;
+}
+
+inline uint32_t reverse_bits(uint32_t v) {
+ // swap odd and even bits
+ v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);
+ // swap consecutive pairs
+ v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
+ // swap nibbles ...
+ v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
+ // swap bytes
+ v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
+ // swap 2-byte long pairs
+ v = ( v >> 16 ) | ( v << 16);
+ return v;
+}
+
+inline uint64_t reverse_bits(uint64_t v) {
+ v = ((v >> 1) & 0x5555555555555555UL) | ((v & 0x5555555555555555UL) << 1);
+ v = ((v >> 2) & 0x3333333333333333UL) | ((v & 0x3333333333333333UL) << 2);
+ v = ((v >> 4) & 0x0F0F0F0F0F0F0F0FUL) | ((v & 0x0F0F0F0F0F0F0F0FUL) << 4);
+ v = ((v >> 8) & 0x00FF00FF00FF00FFUL) | ((v & 0x00FF00FF00FF00FFUL) << 8);
+ v = ((v >> 16) & 0x0000FFFF0000FFFFUL) | ((v & 0x0000FFFF0000FFFFUL) << 16);
+ v = ( v >> 32 ) | ( v << 32);
+ return v;
+}
+
+uint64_t bogus_sum(void *data, size_t len);
+
+template <typename T>
+size_t bits_to_bytes(T bits) {
+ return (size_t)((bits / 8) + (bits % 8 != 0));
+}
+
+template <typename T>
+union Tptr {
+ void *v;
+ T *t;
+};
+template <typename T>
+T *calloc_align(size_t nmemb, size_t alignment) {
+ Tptr<T> ptr;
+ if(posix_memalign(&ptr.v, alignment, sizeof(T) * nmemb) < 0)
+ throw std::bad_alloc();
+ return ptr.t;
+}
+
+/* Be pedantic about memory access. Any misaligned access will
+ * generate a BUS error.
+ */
+void disabled_misaligned_mem_access();
+
+/* Raison d'etre of this version of mem_copy: It seems we have slow
+ * down due to misaligned cache accesses. glibc memcpy does unaligned
+ * memory accesses and crashes when they are disabled. This version
+ * does only aligned memory access (see above).
+ */
+template <typename T>
+void mem_copy(char *dest, const char *src, const T &len) {
+ // dumb copying char by char
+ for(T i = (T)0; i < len; ++i)
+ *dest++ = *src++;
+}
+
+/* Slice a large number (total) in almost equal parts. return [start,
+ end) corresponding to the ith part (0 <= i < number_of_slices)
+ */
+template<typename T>
+std::pair<T,T> slice(T i, T number_of_slices, T total) {
+ const T slice_size = total / number_of_slices;
+ const T slice_remain = total % number_of_slices;
+
+ const T start = std::max((T)0,
+ std::min(total, i * slice_size + (i > 0 ? slice_remain : 0)));
+ const T end = std::max((T)0,
+ std::min(total, (i + 1) * slice_size + slice_remain));
+
+ return std::make_pair(start, end);
+}
+
+uint64_t random_bits(int length);
+inline uint64_t random_bits() { return random_bits(64); }
+
+// Quote string that could contain shell special characters
+std::string quote_arg(const std::string& arg);
+
+std::streamoff get_file_size(std::istream& is);
+
+/// Find the first element for which the predicate p is false. The
+/// input range [first, last) is assumed to be sorted according to the
+/// predicate p: p(x) is false and p(y) is true implies x comes after
+/// y in the input range. (I.e., the elements for which p(x) is true
+/// come first followed by the elements for which p(x) is false).
+template <class ForwardIterator, class Predicate>
+ForwardIterator binary_search_first_false(ForwardIterator first, ForwardIterator last, Predicate p)
+{
+ ForwardIterator it;
+ typename std::iterator_traits<ForwardIterator>::difference_type count, step;
+ count = std::distance(first,last);
+ while(count>0) {
+ it = first; step = count / 2; std::advance(it,step);
+ if(p(*it)) {
+ first = ++it;
+ count -= step + 1;
+ } else
+ count=step;
+ }
+ return first;
+}
+
+/// An integer type which behaves like a random pointer to
+/// itself. Meaning, with `it(5)`, then `*it == 5` and `*++it ==
+/// 6`. In other words, it is a pointer to an array `a` initialized
+/// with `a[i] = i`, except the array is not instantiated and does not
+/// have a fixed size.
+template<typename T>
+class pointer_integer : public std::iterator<std::random_access_iterator_tag, T> {
+ T x_;
+ typedef typename std::iterator<std::random_access_iterator_tag, T> super;
+ public:
+ typedef T value_type;
+ typedef typename super::difference_type difference_type;
+ typedef typename super::pointer pointer;
+ typedef typename super::reference reference;
+ typedef typename super::iterator_category iterator_category;
+
+ pointer_integer() : x_(0) { }
+ explicit pointer_integer(T x) : x_(x) { }
+ pointer_integer(const pointer_integer& rhs) : x_(rhs.x_) { }
+ pointer_integer& operator=(const pointer_integer& rhs) {
+ x_ = rhs.x_;
+ return *this;
+ }
+ pointer_integer& operator++() { ++x_; return *this; }
+ pointer_integer operator++(int) {
+ pointer_integer res(*this);
+ ++x_;
+ return res;
+ }
+ pointer_integer& operator--() { --x_; return *this; }
+ pointer_integer operator--(int) {
+ pointer_integer res(*this);
+ --x_;
+ return res;
+ }
+
+ bool operator==(const pointer_integer& rhs) const { return x_ == rhs.x_; }
+ bool operator!=(const pointer_integer& rhs) const { return x_ != rhs.x_; }
+ bool operator<(const pointer_integer& rhs) const { return x_ < rhs.x_; }
+ bool operator>(const pointer_integer& rhs) const { return x_ > rhs.x_; }
+ bool operator<=(const pointer_integer& rhs) const { return x_ <= rhs.x_; }
+ bool operator>=(const pointer_integer& rhs) const { return x_ >= rhs.x_; }
+
+ reference operator*() { return x_; }
+ pointer operator->() { return &x_; } // Probably useless
+
+ difference_type operator-(pointer_integer& rhs) { return x_ - rhs.x_; }
+
+ pointer_integer operator+(T x) const { return pointer_integer(x_ + x); }
+ pointer_integer operator-(T x) const { return pointer_integer(x_ - x); }
+ pointer_integer& operator+=(T x) { x_ += x; return *this; }
+ pointer_integer& operator-=(T x) { x_ -= x; return *this; }
+
+ value_type operator[](T i) const { return x_ + i; }
+};
+
+template<typename T>
+pointer_integer<T> operator+(T x, pointer_integer<T>& p) { return pointer_integer<T>(x + *p); }
+template<typename T>
+pointer_integer<T> operator-(T x, pointer_integer<T>& p) { return pointer_integer<T>(x - *p); }
+} // namespace jellyfish
+
+#endif // __MISC_HPP__
diff --git a/include/jellyfish/offsets_key_value.hpp b/include/jellyfish/offsets_key_value.hpp
new file mode 100644
index 0000000..4580e76
--- /dev/null
+++ b/include/jellyfish/offsets_key_value.hpp
@@ -0,0 +1,277 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_OFFSETS_KEY_VALUE_HPP__
+#define __JELLYFISH_OFFSETS_KEY_VALUE_HPP__
+
+#include <signal.h>
+#include <iostream>
+#include <sstream>
+
+#include <jellyfish/misc.hpp>
+#include <jellyfish/divisor.hpp>
+
+namespace jellyfish {
+
+/* A word is whatever aligned type used for atomic operations
+ * (CAS). Typically, a uint64_t. We store pairs of (key, value), in a
+ * bit packed fashion. The key and value can have abritrary size as
+ * long as they each fit in one word. A block is the largest number of
+ * (key, value) pair such that the first key, and only the first,
+ * starts at an aligned word.
+ *
+ * The key 0x0 is not valid. A key which fits completely within one
+ * word is not protected by a "set" bit. A key which straddle the
+ * boundary between two aligned words has a set bit in each parts.
+ *
+ * A value field can have any value and is initialized to 0x0. It has
+ * no "set" bit ever.
+ *
+ * A key is prefixed with a "large" bit. If this bit is 0, the key
+ * field is length key_len (not counting the possible set bits) and
+ * the value field has length val_len. If the large bit has value 1,
+ * the key field is just long enough to encode the number of
+ * reprobing hops to go backward to find the actual key. The
+ * remainder bits is used for the value field. In this scheme, we
+ * assume the length needed to encode the number of reprobes is much
+ * less than the length needed to encode the key.
+ *
+ * The size of the value field, for the normal and large field, is
+ * capped at 64. If there is more bits available, they are wasted.
+ */
+
+/* Offsets holds all the possible offset for a given combination of
+ * key length, value length and reprobe limit.
+ */
+template<typename word>
+class Offsets {
+public:
+ // woff: offset in words from beginning of block
+ // boff: offset in bits within that word. Paste large bit.
+ // shift: number of bits stored in first word, or shift to get to beginning of second word
+ // cshift: number of bits stored in last word
+ // mask1: includes the large bit and the set bit if any.
+ // mask2: mask in last word. Contains large and set bit if any. 0 if last word is full
+ // sb_mask[12]: mask for set bit in words 1 to last-1 and in last word, if any. set bit is the
+ // last usable bit of the field.
+ // lb_mask: mask for the large bit. It is the first bit of the key field.
+ // full words: need to copy full words
+ typedef struct {
+ struct key {
+ unsigned int woff, boff, shift, cshift;
+ word mask1, mask2, sb_mask1, sb_mask2, lb_mask;
+ bool full_words;
+ };
+ struct key key;
+ struct val {
+ unsigned int woff, boff, shift, cshift;
+ word mask1, mask2;
+ };
+ struct val val;
+ } offset_t;
+ typedef struct {
+ offset_t normal;
+ offset_t large;
+ } offset_pair_t;
+ struct block_info {
+ unsigned int len;
+ unsigned int word_len;
+ };
+ // Offsets() {}
+
+ Offsets(unsigned int _key_len, unsigned int _val_len, unsigned int _reprobe_limit) :
+ key_len_(_key_len),
+ val_len_(_val_len),
+ reprobe_limit_(_reprobe_limit),
+ reprobe_len_(bitsize(reprobe_limit_)),
+ lval_len_(std::min(key_len_ + val_len_ - reprobe_len_, (unsigned int)bsizeof(word))),
+ block(compute_offsets()),
+ bld(block.len)
+ {
+ if(reprobe_len_ > bsizeof(word)) {
+ std::ostringstream err;
+ err << "The reprobe_limit (" << reprobe_limit_ << ", " << reprobe_len_
+ << ") must be encoded in at most one word (" << bsizeof(word) << ")";
+ throw std::length_error(err.str());
+ }
+ if(val_len_ > bsizeof(word))
+ throw std::length_error("Val length must be less than the word size");
+ if(key_len_ < reprobe_len_)
+ throw std::length_error("Key length must be at least as large as to encode the reprobe_limit");
+ }
+
+ ~Offsets() {}
+
+ unsigned int block_len() const { return block.len; }
+ unsigned int block_word_len() const { return block.word_len; }
+ unsigned int reprobe_len() const { return reprobe_len_; }
+ unsigned int reprobe_limit() const { return reprobe_limit_; }
+ word reprobe_mask() const { return mask(reprobe_len_, 0); }
+ unsigned int key_len() const { return key_len_; }
+ unsigned int val_len() const { return val_len_; }
+ unsigned int lval_len() const { return lval_len_; }
+ word get_max_val(bool large) const {
+ return (((uint64_t)1) << (large ? lval_len_ : val_len_)) - 1;
+ }
+
+ /// Number of blocks that fit in a given amount of memory. Given an
+ /// amount of memory mem, it returns the number of blocks that fit
+ /// into mem and the actual memory this many block use.
+ std::pair<size_t, size_t> blocks_for_records(size_t nb_records) const {
+ size_t blocks = nb_records / bld;
+ return std::make_pair(blocks, blocks * block.len);
+ }
+
+ word *word_offset(size_t id, const offset_t **o, const offset_t **lo, word * const base) const {
+ uint64_t q, r;
+ bld.division(id, q, r);
+ word *w = base + (block.word_len * q);
+ *o = &offsets[r].normal;
+ *lo = &offsets[r].large;
+ return w;
+ }
+
+private:
+ const unsigned int key_len_, val_len_;
+ const unsigned int reprobe_limit_, reprobe_len_, lval_len_;
+ const block_info block;
+ const jflib::divisor64 bld; // Fast divisor by block.len
+ offset_pair_t offsets[bsizeof(word)];
+
+ block_info compute_offsets();
+ bool add_key_offsets(unsigned int &cword, unsigned int &cboff, unsigned int add, bool& full_words);
+ bool add_val_offsets(unsigned int &cword, unsigned int &cboff, unsigned int add);
+ void set_key_offsets(Offsets::offset_t& key, unsigned int& cword, unsigned int& cboff, unsigned int len);
+ void set_val_offsets(Offsets::offset_t& val, unsigned int& cword, unsigned int& cboff, unsigned int len);
+ word mask(unsigned int length, unsigned int shift) const;
+};
+
+template<typename word>
+bool Offsets<word>::add_key_offsets(unsigned int &cword, unsigned int &cboff, unsigned int add, bool& full_words)
+{
+ if(cboff + add <= bsizeof(word)) { // Not spilling over next word
+ cboff = (cboff + add) % bsizeof(word);
+ cword += (cboff == 0);
+ return false;
+ }
+
+ // Span multiple words. Take into account the extra set bit, one in each word
+ size_t wcap = bsizeof(word) - 1; // Word capacity withouth set bit
+ add -= wcap - cboff; // Substract bits stored in first partial word including set bit
+ full_words = add >= wcap;
+ cword += 1 + add / wcap; // Add first word plus any extra complete word
+ cboff = add % wcap; // Extra bits in last word
+ cboff += cboff > 0; // Add set bit in last word if use partial word
+ return true;
+}
+
+template<typename word>
+bool Offsets<word>::add_val_offsets(unsigned int &cword, unsigned int &cboff, unsigned int add)
+{
+ unsigned int ocword = cword;
+ cboff += add;
+ cword += cboff / bsizeof(word);
+ cboff = cboff % bsizeof(word);
+ return cword > ocword && cboff > 0;
+}
+
+template<typename word>
+word Offsets<word>::mask(unsigned int length, unsigned int shift) const
+{
+ if(length)
+ return (((word)-1) >> (bsizeof(word) - length)) << shift;
+ return (word)0;
+}
+
+template<typename word>
+void Offsets<word>::set_key_offsets(Offsets::offset_t& offset, unsigned int& cword, unsigned int& cboff, unsigned int len) {
+ unsigned int ocboff;
+ bool full_words;
+
+ offset.key.woff = cword;
+ ocboff = cboff;
+ offset.key.boff = cboff + 1;
+ offset.key.lb_mask = mask(1, cboff);
+ if(add_key_offsets(cword, cboff, len + 1, full_words)) {
+ // Extra bits in last extra word
+ offset.key.mask1 = mask(bsizeof(word) - ocboff, ocboff);
+ offset.key.mask2 = mask(cboff, 0);
+ offset.key.shift = bsizeof(word) - 1 - ocboff - 1; // -1 for large bit, -1 for set bit
+ offset.key.cshift = cboff ? cboff - 1 : 0;
+ offset.key.sb_mask1 = mask(1, bsizeof(word) - 1);
+ offset.key.sb_mask2 = cboff ? mask(1, cboff - 1) : 0;
+ offset.key.full_words = full_words;
+ } else {
+ offset.key.mask1 = mask(len + 1, ocboff);
+ offset.key.mask2 = 0;
+ offset.key.shift = 0;
+ offset.key.cshift = 0;
+ offset.key.sb_mask1 = 0;
+ offset.key.sb_mask2 = 0;
+ offset.key.full_words = false;
+ }
+}
+
+template <typename word>
+void Offsets<word>::set_val_offsets(Offsets::offset_t& offset, unsigned int& cword, unsigned int& cboff, unsigned int len) {
+ unsigned int ocboff;
+
+ offset.val.woff = cword;
+ offset.val.boff = cboff;
+ ocboff = cboff;
+ if(add_val_offsets(cword, cboff, len)) {
+ offset.val.mask1 = mask(bsizeof(uint64_t) - ocboff, ocboff);
+ offset.val.mask2 = mask(cboff, 0);
+ offset.val.shift = len - cboff;
+ offset.val.cshift = cboff;
+ } else {
+ offset.val.mask1 = mask(len, ocboff);
+ offset.val.mask2 = 0;
+ offset.val.shift = len;
+ offset.val.cshift = 0;
+ }
+}
+
+template<typename word>
+typename Offsets<word>::block_info Offsets<word>::compute_offsets()
+{
+ offset_pair_t *offset = offsets;
+ unsigned int cword = 0; // current word in block
+ unsigned int cboff = 0; // current offset in word
+ unsigned int lcword; // idem for large fields
+ unsigned int lcboff;
+
+ memset(offsets, '\0', sizeof(offsets));
+ do {
+ // Save current offsets as starting point for large key
+ lcword = cword;
+ lcboff = cboff;
+
+ set_key_offsets(offset->normal, cword, cboff, key_len_);
+ set_val_offsets(offset->normal, cword, cboff, val_len_);
+
+ set_key_offsets(offset->large, lcword, lcboff, reprobe_len_);
+ set_val_offsets(offset->large, lcword, lcboff, lval_len_);
+
+ offset++;
+ } while(cboff != 0 && cboff < bsizeof(word) - 2);
+
+ block_info res = { static_cast<unsigned int>(offset - offsets), cword + (cboff == 0 ? 0 : 1) };
+ return res;
+}
+} // namespace jellyfish
+
+#endif // __OFFSETS_KEY_VALUE_HPP__
diff --git a/include/jellyfish/rectangular_binary_matrix.hpp b/include/jellyfish/rectangular_binary_matrix.hpp
new file mode 100644
index 0000000..d545b65
--- /dev/null
+++ b/include/jellyfish/rectangular_binary_matrix.hpp
@@ -0,0 +1,379 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_RECTANGULAR_BINARY_MATRIX_HPP__
+#define __JELLYFISH_RECTANGULAR_BINARY_MATRIX_HPP__
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+#include <jellyfish/misc.hpp>
+#include <iostream>
+#include <exception>
+#include <stdexcept>
+#include <vector>
+#include <limits>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+// Column major representation
+//
+// Rectangular matrices on Z/2Z of size _r x _c where 1<=_r<=64 (_c is
+// not limited) and _r <= _c. I.e., the matrix can be stored as an
+// array of 64 bit word, each representing a column (the highest 64-_r
+// bits of each word are set to 0).
+//
+// Multiplication between a matrix and vector of size _c x 1 gives a
+// vector of size _r x 1 stored as one 64 bit word.
+
+namespace jellyfish {
+ class RectangularBinaryMatrix {
+ public:
+ RectangularBinaryMatrix(unsigned int r, unsigned c)
+ : _columns(alloc(r, c)), _r(r), _c(c) { }
+ RectangularBinaryMatrix(const RectangularBinaryMatrix &rhs)
+ : _columns(alloc(rhs._r, rhs._c)), _r(rhs._r), _c(rhs._c) {
+ memcpy(_columns, rhs._columns, sizeof(uint64_t) * _c);
+ }
+ RectangularBinaryMatrix(RectangularBinaryMatrix&& rhs) :
+ _columns(rhs._columns), _r(rhs._r), _c(rhs._c) {
+ rhs._columns = 0;
+ }
+ // Initialize from raw data. raw must contain at least c words.
+ template<typename T>
+ RectangularBinaryMatrix(const T &raw, unsigned int r, unsigned c)
+ : _columns(alloc(r, c)), _r(r), _c(c) {
+ for(unsigned int i = 0; i < _c; ++i)
+ _columns[i] = raw[i] & cmask();
+ }
+ ~RectangularBinaryMatrix() {
+ free(_columns);
+ }
+
+ RectangularBinaryMatrix &operator=(const RectangularBinaryMatrix &rhs) {
+ if(_r != rhs._r || _c != rhs._c)
+ throw std::invalid_argument("RHS matrix dimensions do not match");
+ memcpy(_columns, rhs._columns, sizeof(uint64_t) * _c);
+ return *this;
+ }
+ RectangularBinaryMatrix& operator=(RectangularBinaryMatrix&& rhs) {
+ if(_r != rhs._r || _c != rhs._c)
+ throw std::invalid_argument("RHS matrix dimensions do not match");
+ std::swap(_columns, rhs._columns);
+ return *this;
+ }
+
+ bool operator==(const RectangularBinaryMatrix &rhs) const {
+ if(_r != rhs._r || _c != rhs._c)
+ return false;
+ return !memcmp(_columns, rhs._columns, sizeof(uint64_t) * _c);
+ }
+ bool operator!=(const RectangularBinaryMatrix &rhs) const {
+ return !(*this == rhs);
+ }
+
+ // Get i-th column. No check on range
+ const uint64_t & operator[](unsigned int i) const { return _columns[i]; }
+
+ unsigned int r() const { return _r; }
+ unsigned int c() const { return _c; }
+
+ // True if every column is zero
+ bool is_zero() const {
+ uint64_t *p = _columns;
+ while(*p == 0 && p < _columns + _c)
+ ++p;
+ return (p - _columns) == _c;
+ }
+
+ // Randomize the content of the matrix
+ void randomize(uint64_t (*rng)()) {
+ for(unsigned int i = 0; i < _c; ++i)
+ _columns[i] = rng() & cmask();
+ }
+ //void randomize() { randomize(rng); }
+
+ // Make and check that the matrix the lower right corner of the
+ // identity.
+ void init_low_identity();
+ bool is_low_identity();
+
+ // Left matrix vector multiplication. Type T supports the operator
+ // v[i] to return the i-th 64 bit word of v.
+ template<typename T>
+ uint64_t times_loop(const T &v) const;
+
+
+#ifdef HAVE_SSE
+ // This SSE implementation only works if the number of columns is
+ // even.
+ template<typename T>
+ uint64_t times_sse(const T &v) const;
+#endif
+
+#ifdef HAVE_INT128
+ // Implementation using __int128
+ template<typename T>
+ uint64_t times_128(const T& v) const;
+#endif
+
+ template<typename T>
+ inline uint64_t times(const T& v) const {
+#ifdef HAVE_SSE
+ return times_sse(v);
+#elif HAVE_INT128
+ return times_128(v);
+#else
+ return times_loop(v);
+#endif
+ }
+
+ // Return a matrix which is the "pseudo inverse" of this matrix. It
+ // is assumed that there is above this square matrix an identity
+ // block and a zero so as to make the matrix squared. Raise an
+ // exception std::domain_error if the matrix is singular.
+ RectangularBinaryMatrix pseudo_inverse() const;
+
+ // Return the multiplication of this and rhs. As in pseudo_inverse,
+ // the two matrices are viewed as being squared, padded above by the
+ // identity.
+ RectangularBinaryMatrix pseudo_multiplication(const RectangularBinaryMatrix &rhs) const;
+
+ // Initialize the object with a pseudo-invertible matrix and return its pseudo-inverse
+ RectangularBinaryMatrix randomize_pseudo_inverse(uint64_t (*rng)());
+ RectangularBinaryMatrix randomize_pseudo_inverse() { return randomize_pseudo_inverse(random_bits); }
+
+ // Return the rank of the matrix. The matrix is assumed to be
+ // squared, padded above by the identity.
+ unsigned int pseudo_rank() const;
+
+ // Display matrix
+ void print(std::ostream &os) const;
+ template<typename T>
+ void print_vector(std::ostream &os, const T &v) const;
+
+ // Nb words in vector for multiplication
+ uint64_t nb_words() const { return (_c >> 6) + ((_c & 0x3f) != 0); }
+ // Mask of most significant bit in most significant word of a vector
+ // with _c rows.
+ uint64_t msb() const {
+ int shift = _c & 0x3f;
+ if(shift == 0)
+ shift = sizeof(uint64_t) * 8;
+ return (uint64_t)1 << (shift - 1);
+ }
+
+ private:
+ // Store column by column. A column may use one word. By
+ // convention, the "unused" bits (most significant bits) of each
+ // column are set to 0.
+ uint64_t * _columns;
+ const unsigned int _r, _c;
+
+ static uint64_t *alloc(unsigned int r, unsigned int c) __attribute__((malloc));
+ // Mask for column word (zero msb)
+ uint64_t cmask() const { return std::numeric_limits<uint64_t>::max() >> (std::numeric_limits<uint64_t>::digits - _r); }
+ // Mask of highest word of a vector with _c rows (Most Significant
+ // Word)
+ uint64_t msw() const { return (msb() << 1) - 1; }
+ // Nb of bits used in highest word of vector with _c rows.
+ uint64_t nb_msb() const {
+ uint64_t nb = _c & 0x3f;
+ return nb ? nb : sizeof(uint64_t) * 8;
+ }
+ // Allow to change the matrix vectors. No check on i.
+ uint64_t & get(unsigned int i) { return _columns[i]; }
+ };
+
+ template<typename T>
+ uint64_t RectangularBinaryMatrix::times_loop(const T &v) const {
+ uint64_t *p = _columns + _c - 1;
+ uint64_t res = 0, x = 0, j = 0;
+ const uint64_t one = (uint64_t)1;
+
+ for(unsigned int i = 0; i < nb_words(); ++i) {
+ j = sizeof(uint64_t) * 8;
+ x = v[i];
+ if(i == nb_words() - 1) {
+ x &= msw();
+ j = nb_msb();
+ }
+ for( ; j > 7; j -= 8, p -= 8) {
+ res ^= (-(x & one)) & p[0]; x >>= 1;
+ res ^= (-(x & one)) & p[-1]; x >>= 1;
+ res ^= (-(x & one)) & p[-2]; x >>= 1;
+ res ^= (-(x & one)) & p[-3]; x >>= 1;
+ res ^= (-(x & one)) & p[-4]; x >>= 1;
+ res ^= (-(x & one)) & p[-5]; x >>= 1;
+ res ^= (-(x & one)) & p[-6]; x >>= 1;
+ res ^= (-(x & one)) & p[-7]; x >>= 1;
+ }
+ }
+
+ // Finish the loop
+ switch(j) {
+ case 7: res ^= (-(x & one)) & *p--; x >>= 1;
+ case 6: res ^= (-(x & one)) & *p--; x >>= 1;
+ case 5: res ^= (-(x & one)) & *p--; x >>= 1;
+ case 4: res ^= (-(x & one)) & *p--; x >>= 1;
+ case 3: res ^= (-(x & one)) & *p--; x >>= 1;
+ case 2: res ^= (-(x & one)) & *p--; x >>= 1;
+ case 1: res ^= (-(x & one)) & *p;
+ }
+
+ return res;
+ }
+
+#ifdef HAVE_SSE
+ template<typename T>
+ uint64_t RectangularBinaryMatrix::times_sse(const T &v) const {
+#define FFs ((uint64_t)-1)
+ static const uint64_t smear[8] asm("smear") __attribute__ ((aligned(16),used)) =
+ {0, 0, 0, FFs, FFs, 0, FFs, FFs};
+ typedef uint64_t xmm_t __attribute__((vector_size(16)));
+
+ uint64_t *p = _columns + _c - 8;
+
+ // //#ifdef __ICC
+ // register xmm_t acc;
+ // register xmm_t load;
+ // memset(&acc, '\0', 16);
+ // memset(&load, '\0', 16);
+ // #else
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wuninitialized"
+#endif
+ register xmm_t acc = acc ^ acc; // Set acc to 0
+ register xmm_t load = load ^ load;
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
+ // #endif
+
+// // Zero out acc
+// #pragma GCC diagnostic push
+// #pragma GCC diagnostic ignored "-Wuninitialized"
+// asm("pxor %0,%0\n\t" : "=x"(acc) : "0"(acc));
+// asm("pxor %0,%0\n\t" : "=x"(load) : "0"(load));
+// #pragma GCC diagnostic pop
+
+ // i is the lower 2 bits of x, and an index into the smear array. Compute res ^= smear[i] & p[j].
+#define AND_XOR(off) \
+ asm("movdqa (%[s],%[i]), %[load]\n\t" \
+ "pand " off "(%[p]),%[load]\n\t" \
+ "pxor %[load],%[acc]\n\t" \
+ : [acc]"=&x"(acc) \
+ : "[acc]"(acc), [i]"r"(i), [p]"r"(p), [s]"r"(smear), [load]"x"(load))
+
+
+ uint64_t i, j = 0, x = 0;
+ for(unsigned int w = 0; w < nb_words(); ++w) {
+ x = v[w];
+ j = sizeof(uint64_t) * 8;
+ if(w == nb_words() - 1) {
+ x &= msw();
+ j = nb_msb();
+ }
+ for( ; j > 7; j -= 8, p -= 8) {
+ i = (x & (uint64_t)0x3) << 4;
+ AND_XOR("0x30");
+ x >>= 2;
+ i = (x & (uint64_t)0x3) << 4;
+ AND_XOR("0x20");
+ x >>= 2;
+ i = (x & (uint64_t)0x3) << 4;
+ AND_XOR("0x10");
+ x >>= 2;
+ i = (x & (uint64_t)0x3) << 4;
+ AND_XOR("");
+ x >>= 2;
+ }
+ }
+
+ // Finish loop
+ p = _columns;
+ switch(j) {
+ case 6:
+ i = (x & (uint64_t)0x3) << 4;
+ AND_XOR("0x20");
+ x >>= 2;
+ case 4:
+ i = (x & (uint64_t)0x3) << 4;
+ AND_XOR("0x10");
+ x >>= 2;
+ case 2:
+ i = (x & (uint64_t)0x3) << 4;
+ AND_XOR("");
+ }
+
+ // Get result out
+ uint64_t res1, res2;
+ asm("movd %[acc], %[res1]\n\t"
+ "psrldq $8, %[acc]\n\t"
+ "movd %[acc], %[res2]\n\t"
+ : [res1]"=r"(res1), [res2]"=r"(res2)
+ : [acc]"x"(acc));
+ return res1 ^ res2;
+ }
+#endif // HAVE_SSE
+
+#ifdef HAVE_INT128
+ template<typename T>
+ uint64_t RectangularBinaryMatrix::times_128(const T &v) const {
+ typedef unsigned __int128 u128;
+ static const u128 smear[4] =
+ { (u128)0,
+ (((u128)1 << 64) - 1) << 64,
+ ((u128)1 << 64) - 1,
+ (u128)-1
+ };\
+ u128 res = res ^ res;
+ u128* p = (u128*)(_columns + _c - 2);
+
+ uint64_t j = 0, x = 0;
+ for(unsigned int w = 0; w < nb_words(); ++w) {
+ x = v[w];
+ j = sizeof(uint64_t) * 8;
+ if(w == nb_words() - 1) {
+ x &= msw();
+ j = nb_msb();
+ }
+ for( ; j > 7; j -= 8, p -= 4) {
+ res ^= smear[x & (uint64_t)0x3] & p[ 0]; x >>= 2;
+ res ^= smear[x & (uint64_t)0x3] & p[-1]; x >>= 2;
+ res ^= smear[x & (uint64_t)0x3] & p[-2]; x >>= 2;
+ res ^= smear[x & (uint64_t)0x3] & p[-3]; x >>= 2;
+ }
+ }
+
+ switch(j) {
+ case 6: res ^= smear[x & (uint64_t)0x3] & *p--; x >>=2;
+ case 4: res ^= smear[x & (uint64_t)0x3] & *p--; x >>=2;
+ case 2: res ^= smear[x & (uint64_t)0x3] & *p;
+ }
+
+ return (res ^ (res >> 64)) & smear[2];
+ }
+#endif // HAVE_INT128
+
+}
+
+#endif
diff --git a/jellyfish/simple_circular_buffer.hpp b/include/jellyfish/simple_circular_buffer.hpp
similarity index 98%
rename from jellyfish/simple_circular_buffer.hpp
rename to include/jellyfish/simple_circular_buffer.hpp
index cf1f7d3..08afcc3 100644
--- a/jellyfish/simple_circular_buffer.hpp
+++ b/include/jellyfish/simple_circular_buffer.hpp
@@ -1,6 +1,6 @@
/* Jellyfish
* Copyright (C) 2012 Genome group at University of Maryland.
- *
+ *
* This program is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
@@ -22,7 +22,7 @@
namespace jellyfish {
namespace simple_circular_buffer {
-
+
// T: type of element in container. D: type of derived class for
// CRTP. A: allocator type.
template<typename T, typename D>
@@ -44,7 +44,7 @@ namespace jellyfish {
front_ = back_;
full_ = false;
}
-
+
// Valid only if empty() is false
T& front() {
return data_[front_];
@@ -87,16 +87,16 @@ namespace jellyfish {
int s = back_ - front_;
return s < 0 ? s + static_cast<const D*>(this)->capacity() : s;
}
-
+
protected:
- int next_index(int i) const {
+ int next_index(int i) const {
return (i + 1) % static_cast<const D*>(this)->capacity();
}
int prev_index(int i) const {
return i ? i - 1 : static_cast<const D*>(this)->capacity() - 1;
}
T* data() const { return data_; }
-
+
T* data_;
int front_, back_;
bool full_;
@@ -125,7 +125,7 @@ namespace jellyfish {
// typedef base<T, dyn<T, A>, A> super;
// public:
// explicit dyn(int size, const T v = T()) : super(size, v), capa_(size) { }
-
+
// int capacity() const { return capa_; }
// int capa_;
// };
diff --git a/include/jellyfish/sorted_dumper.hpp b/include/jellyfish/sorted_dumper.hpp
new file mode 100644
index 0000000..c18fb32
--- /dev/null
+++ b/include/jellyfish/sorted_dumper.hpp
@@ -0,0 +1,115 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_SORTED_DUMPER_HPP__
+#define __JELLYFISH_SORTED_DUMPER_HPP__
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+
+#include <jellyfish/dumper.hpp>
+#include <jellyfish/mer_heap.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/token_ring.hpp>
+#include <jellyfish/locks_pthread.hpp>
+#include <jellyfish/file_header.hpp>
+
+namespace jellyfish {
+/// Sorted dumper. Write mers according to the hash order. It
+/// implements the CRTP to effectively write the k-mer/value pair.
+template<typename D, typename storage_t>
+class sorted_dumper : public dumper_t<storage_t>, public thread_exec {
+protected:
+ typedef typename storage_t::key_type key_type;
+ typedef typename storage_t::region_iterator iterator;
+ typedef typename mer_heap::heap<typename storage_t::key_type, iterator> heap_type;
+ typedef typename heap_type::const_item_t heap_item;
+ typedef jellyfish::token_ring<locks::pthread::cond> token_ring;
+ typedef typename token_ring::token token_type;
+
+ int nb_threads_;
+ token_ring ring_;
+ const char* file_prefix_;
+ storage_t* ary_;
+ file_header* header_;
+ bool zero_array_;
+ std::ofstream out_;
+ std::pair<size_t, size_t> block_info; // { nb blocks, nb records }
+
+public:
+ sorted_dumper(int nb_threads, const char* file_prefix, file_header* header = 0) :
+ nb_threads_(nb_threads),
+ ring_(nb_threads),
+ file_prefix_(file_prefix),
+ header_(header),
+ zero_array_(true)
+ { }
+
+ bool zero_array() const { return zero_array_; }
+ void zero_array(bool v) { zero_array_ = v; }
+
+ virtual void _dump(storage_t* ary) {
+ ary_ = ary;
+ block_info = ary_->blocks_for_records(5 * ary_->max_reprobe_offset());
+
+ this->open_next_file(file_prefix_, out_);
+ if(header_)
+ header_->write(out_);
+
+ ring_.reset();
+ exec_join(nb_threads_);
+ out_.close();
+ if(zero_array_)
+ ary_->zero_blocks(0, block_info.first); // zero out last group of blocks
+ }
+
+ virtual void start(const int i) {
+ std::ostringstream buffer;
+ heap_type heap(ary_->max_reprobe_offset());
+ token_type& token = ring_[i];
+ size_t count = 0;
+ typename storage_t::key_type key;
+
+ for(size_t id = i; id * block_info.second < ary_->size(); id += nb_threads_) {
+ // Fill buffer
+ iterator it(ary_, id * block_info.second, (id + 1) * block_info.second, key);
+ heap.fill(it);
+
+ while(heap.is_not_empty()) {
+ heap_item item = heap.head();
+ if(item->val_ >= this->min() && item->val_ <= this->max())
+ static_cast<D*>(this)->write_key_value_pair(buffer, item);
+ ++count;
+ heap.pop();
+ if(it.next())
+ heap.push(it);
+ }
+
+ // Write buffer
+ token.wait();
+ out_.write(buffer.str().data(), buffer.tellp());
+ token.pass();
+
+ buffer.seekp(0);
+ if(id > 0 && zero_array_)
+ ary_->zero_blocks(id * block_info.first, block_info.first);
+ }
+ }
+};
+} // namespace jellyfish {
+
+#endif /* __JELLYFISH_SORTED_DUMPER_HPP__ */
diff --git a/include/jellyfish/stdio_filebuf.hpp b/include/jellyfish/stdio_filebuf.hpp
new file mode 100644
index 0000000..7aa3a9e
--- /dev/null
+++ b/include/jellyfish/stdio_filebuf.hpp
@@ -0,0 +1,170 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_STDIO_FILEBUF_HPP__
+#define __JELLYFISH_STDIO_FILEBUF_HPP__
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <unistd.h>
+
+#include <streambuf>
+#include <vector>
+
+// Attempt to be (mostly) compatible with GCC ext/stdio_filebuf.h
+// class. Contains code from stdio_filbuf.hpp and
+// http://www.mr-edd.co.uk/blog/beginners_guide_streambuf. It is only
+// meant as a quick replacement when stdio_filebuf is not available.
+
+namespace jellyfish {
+template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
+class stdio_filebuf : public std::basic_streambuf<_CharT, _Traits>
+{
+ const int fd_;
+ FILE* const file_;
+ const std::ios_base::openmode mode_;
+ const size_t put_back_;
+ std::vector<_CharT> buffer_;
+
+public:
+ // Types:
+ typedef _CharT char_type;
+ typedef _Traits traits_type;
+ typedef typename traits_type::int_type int_type;
+ typedef typename traits_type::pos_type pos_type;
+ typedef typename traits_type::off_type off_type;
+ // typedef std::size_t size_t;
+
+ /**
+ * @param __fd An open file descriptor.
+ * @param __mode Same meaning as in a standard filebuf.
+ * @param __size Optimal or preferred size of internal buffer,
+ * in chars.
+ *
+ * This constructor associates a file stream buffer with an open
+ * POSIX file descriptor. The file descriptor will be automatically
+ * closed when the stdio_filebuf is closed/destroyed.
+ */
+ stdio_filebuf(int __fd, std::ios_base::openmode __mode,
+ size_t __size = static_cast<size_t>(BUFSIZ),
+ size_t put_back = 1) :
+ fd_(__fd),
+ file_(0),
+ mode_(__mode),
+ put_back_(std::max(put_back, (size_t)1)),
+ buffer_(std::max(__size, put_back_) + put_back_)
+ {
+ _CharT* end = buffer_.data() + buffer_.size();
+ this->setg(end, end, end);
+ }
+
+ /**
+ * @param __f An open @c FILE*.
+ * @param __mode Same meaning as in a standard filebuf.
+ * @param __size Optimal or preferred size of internal buffer,
+ * in chars. Defaults to system's @c BUFSIZ.
+ *
+ * This constructor associates a file stream buffer with an open
+ * C @c FILE*. The @c FILE* will not be automatically closed when the
+ * stdio_filebuf is closed/destroyed.
+ */
+ stdio_filebuf(FILE* __f, std::ios_base::openmode __mode,
+ size_t __size = static_cast<size_t>(BUFSIZ),
+ size_t put_back = 1) :
+ fd_(-1),
+ file_(__f),
+ mode_(__mode),
+ put_back_(std::max(put_back, (size_t)1)),
+ buffer_(std::max(__size, put_back_) + put_back_)
+ {
+ _CharT* end = buffer_.data() + buffer_.size();
+ this->setg(end, end, end);
+ }
+
+ /**
+ * Closes the external data stream if the file descriptor constructor
+ * was used.
+ */
+ virtual ~stdio_filebuf() {
+ if(fd_ != -1)
+ close(fd_);
+ }
+
+ /**
+ * @return The underlying file descriptor.
+ *
+ * Once associated with an external data stream, this function can be
+ * used to access the underlying POSIX file descriptor. Note that
+ * there is no way for the library to track what you do with the
+ * descriptor, so be careful.
+ */
+ int
+ fd() { return fd_ != -1 ? fd_ : fileno(file_); }
+
+ /**
+ * @return The underlying FILE*.
+ *
+ * This function can be used to access the underlying "C" file pointer.
+ * Note that there is no way for the library to track what you do
+ * with the file, so be careful.
+ */
+ FILE*
+ file() {
+ if(file_) return file_;
+ const char* str_mode;
+ if(mode_ & std::ios_base::app) {
+ str_mode = "a+";
+ } else if(mode_ & std::ios_base::ate) {
+ str_mode = "a";
+ } else if(mode_ & std::ios_base::in) {
+ str_mode = (mode_ & std::ios_base::out) ? "r+" : "r";
+ } else if(mode_ & std::ios_base::out) {
+ str_mode = "w";
+ }
+ return fdopen(fd_, str_mode);
+ }
+
+private:
+ int_type underflow() {
+ if(this->gptr() >= this->egptr()) {
+ _CharT *base = buffer_.data();
+ _CharT *start = base;
+
+ if (this->eback() == base) {
+ // Make arrangements for putback characters
+ std::memcpy(base, this->egptr() - put_back_, put_back_ * sizeof(_CharT));
+ start += put_back_;
+ }
+
+ // start is now the start of the buffer, proper.
+ // Read from fptr_ in to the provided buffer
+ const ssize_t n =
+ (fd_ != -1) ?
+ read(fd_, start, (buffer_.size() - (start - base)) * sizeof(_CharT)) :
+ std::fread(start, sizeof(_CharT), buffer_.size() - (start - base), file_);
+ if (n <= 0)
+ return _Traits::eof();
+
+ // Set buffer pointers
+ this->setg(base, start, start + n);
+ }
+ return _Traits::to_int_type(*this->gptr());
+ }
+
+};
+} // namespace jellyfish {
+#endif // __JELLYFISH_STDIO_FILEBUF_HPP__
diff --git a/jellyfish/storage.hpp b/include/jellyfish/storage.hpp
similarity index 95%
rename from jellyfish/storage.hpp
rename to include/jellyfish/storage.hpp
index 692df2d..3df85cf 100644
--- a/jellyfish/storage.hpp
+++ b/include/jellyfish/storage.hpp
@@ -30,8 +30,8 @@ namespace jellyfish {
};
// Entry 0 is used only when switching to a large field
- extern size_t *quadratic_reprobes;
-
+ extern const size_t *quadratic_reprobes;
+
}
#endif // __STORAGE_HPP__
diff --git a/include/jellyfish/stream_iterator.hpp b/include/jellyfish/stream_iterator.hpp
new file mode 100644
index 0000000..6f877c8
--- /dev/null
+++ b/include/jellyfish/stream_iterator.hpp
@@ -0,0 +1,90 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#ifndef __STREAM_ITERATOR_HPP__
+#define __STREAM_ITERATOR_HPP__
+
+#include <assert.h>
+
+#include <iostream>
+#include <fstream>
+#include <iterator>
+#include <stdexcept>
+#include <memory>
+
+#include <jellyfish/err.hpp>
+
+namespace jellyfish {
+/// Transform an iterator of paths (c string: const char*) into an
+/// iterator of std::ifstream. Every file is opened and closed in
+/// turn. The object instantiated with no argument is the end marker.
+template<typename PathIterator>
+class stream_iterator : public std::iterator<std::forward_iterator_tag, std::ifstream> {
+ PathIterator begin_, end_;
+ std::ifstream* stream_;
+public:
+ stream_iterator(PathIterator begin, PathIterator end) :
+ begin_(begin), end_(end), stream_(0)
+ {
+ if(begin_ != end_) {
+ stream_ = new std::ifstream;
+ open_file();
+ }
+ }
+ stream_iterator(const stream_iterator& rhs) :
+ begin_(rhs.begin_), end_(rhs.end_), stream_(rhs.stream_)
+ { }
+ stream_iterator() : begin_(), end_(), stream_() { }
+
+ bool operator==(const stream_iterator& rhs) const {
+ return stream_ == rhs.stream_;
+ }
+ bool operator!=(const stream_iterator& rhs) const {
+ return stream_ != rhs.stream_;
+ }
+
+ std::ifstream& operator*() { return *stream_; }
+ std::ifstream* operator->() { return stream_; }
+
+ stream_iterator& operator++() {
+ stream_->close();
+ if(++begin_ != end_) {
+ open_file();
+ } else {
+ delete stream_;
+ stream_ = 0;
+ }
+
+ return *this;
+ }
+ stream_iterator operator++(int) {
+ stream_iterator res(*this);
+ ++*this;
+ return res;
+ }
+
+protected:
+ void open_file() {
+ stream_->open(*begin_);
+ if(stream_->fail())
+ throw std::runtime_error(err::msg() << "Failed to open file '" << *begin_ << "'");
+ }
+};
+
+}
+
+#endif /* __STREAM_ITERATOR_HPP__ */
diff --git a/include/jellyfish/stream_manager.hpp b/include/jellyfish/stream_manager.hpp
new file mode 100644
index 0000000..5b31708
--- /dev/null
+++ b/include/jellyfish/stream_manager.hpp
@@ -0,0 +1,157 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <iostream>
+#include <fstream>
+#include <stdexcept>
+#include <memory>
+#include <vector>
+#include <list>
+#include <set>
+
+#include <jellyfish/locks_pthread.hpp>
+#include <jellyfish/err.hpp>
+
+namespace jellyfish {
+template<typename PathIterator>
+class stream_manager {
+ /// A wrapper around an ifstream for a standard file. Standard in
+ /// opposition to a pipe_stream below, but the file may be a regular
+ /// file or a pipe. The file is opened once and notifies the manager
+ /// that it is closed upon destruction.
+ class file_stream : public std::ifstream {
+ stream_manager& manager_;
+ public:
+ file_stream(const char* path, stream_manager& manager) :
+ std::ifstream(path),
+ manager_(manager)
+ {
+ manager_.take_file();
+ }
+ virtual ~file_stream() { manager_.release_file(); }
+ };
+ friend class file_stream;
+
+ /// A wrapper around an ifstream for a "multi pipe". The multi pipe
+ /// are connected to generators (external commands generating
+ /// sequence). They are opened repeatedly, until they are unlinked
+ /// from the file system.
+ class pipe_stream : public std::ifstream {
+ const char* path_;
+ stream_manager& manager_;
+ public:
+ pipe_stream(const char* path, stream_manager& manager) :
+ std::ifstream(path),
+ path_(path),
+ manager_(manager)
+ { }
+ virtual ~pipe_stream() { manager_.release_pipe(path_); }
+ };
+ friend class pipe_stream;
+
+ typedef std::unique_ptr<std::istream> stream_type;
+
+ PathIterator paths_cur_, paths_end_;
+ int files_open_;
+ const int concurrent_files_;
+ std::list<const char*> free_pipes_;
+ std::set<const char*> busy_pipes_;
+ locks::pthread::mutex_recursive mutex_;
+
+public:
+ define_error_class(Error);
+
+ stream_manager(PathIterator paths_begin, PathIterator paths_end, int concurrent_files = 1) :
+ paths_cur_(paths_begin), paths_end_(paths_end),
+ files_open_(0),
+ concurrent_files_(concurrent_files)
+ { }
+
+ stream_manager(PathIterator paths_begin, PathIterator paths_end,
+ PathIterator pipe_begin, PathIterator pipe_end,
+ int concurrent_files = 1) :
+ paths_cur_(paths_begin), paths_end_(paths_end),
+ files_open_(0),
+ concurrent_files_(concurrent_files),
+ free_pipes_(pipe_begin, pipe_end)
+ { }
+
+ stream_type next() {
+ locks::pthread::mutex_lock lock(mutex_);
+ stream_type res;
+ open_next_file(res);
+ if(!res)
+ open_next_pipe(res);
+ return res;
+ }
+
+ int concurrent_files() const { return concurrent_files_; }
+ // Number of pipes available. Not thread safe
+ int concurrent_pipes() const { return free_pipes_.size() + busy_pipes_.size(); }
+ // Number of streams available. Not thread safe
+ int nb_streams() const { return concurrent_files() + concurrent_pipes(); }
+
+protected:
+ void open_next_file(stream_type& res) {
+ if(files_open_ >= concurrent_files_)
+ return;
+ while(paths_cur_ != paths_end_) {
+ std::string path = *paths_cur_;
+ ++paths_cur_;
+ res.reset(new file_stream(path.c_str(), *this));
+ if(res->good())
+ return;
+ res.reset();
+ throw std::runtime_error(err::msg() << "Can't open file '" << path << "'");
+ }
+ }
+
+ void open_next_pipe(stream_type& res) {
+ while(!free_pipes_.empty()) {
+ const char* path = free_pipes_.front();
+ free_pipes_.pop_front();
+ res.reset(new pipe_stream(path, *this));
+ if(res->good()) {
+ busy_pipes_.insert(path);
+ return;
+ }
+ // The pipe failed to open, so it is not marked as busy. This
+ // reset will make us forget about this path.
+ res.reset();
+ }
+ }
+
+ void take_file() {
+ locks::pthread::mutex_lock lock(mutex_);
+ ++files_open_;
+ }
+
+ void release_file() {
+ locks::pthread::mutex_lock lock(mutex_);
+ --files_open_;
+ }
+
+ // void take_pipe(const char* path) {
+ // locks::pthread::mutex_lock lock(mutex_);
+ // }
+ void release_pipe(const char* path) {
+ locks::pthread::mutex_lock lock(mutex_);
+ if(busy_pipes_.erase(path) == 0)
+ return; // Nothing erased. We forget about that path
+ free_pipes_.push_back(path);
+ }
+};
+} // namespace jellyfish
diff --git a/include/jellyfish/text_dumper.hpp b/include/jellyfish/text_dumper.hpp
new file mode 100644
index 0000000..334a491
--- /dev/null
+++ b/include/jellyfish/text_dumper.hpp
@@ -0,0 +1,88 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __JELLYFISH_TEXT_DUMPER_HPP__
+#define __JELLYFISH_TEXT_DUMPER_HPP__
+
+#include <jellyfish/sorted_dumper.hpp>
+
+namespace jellyfish {
+template<typename Key, typename Val>
+class text_writer {
+public:
+ void write(std::ostream& out, const Key& key, const Val val) {
+ out << key << " " << val << "\n";
+ }
+};
+
+template<typename storage_t>
+class text_dumper : public sorted_dumper<text_dumper<storage_t>, storage_t> {
+ typedef sorted_dumper<text_dumper<storage_t>, storage_t> super;
+ text_writer<typename super::key_type, uint64_t> writer;
+
+public:
+ static const char* format;
+
+ text_dumper(int nb_threads, const char* file_prefix, file_header* header = 0) :
+ super(nb_threads, file_prefix, header)
+ { }
+
+ virtual void _dump(storage_t* ary) {
+ if(super::header_) {
+ super::header_->update_from_ary(*ary);
+ super::header_->format(format);
+ }
+ super::_dump(ary);
+ }
+
+ void write_key_value_pair(std::ostream& out, typename super::heap_item item) {
+ writer.write(out, item->key_, item->val_);
+ }
+};
+template<typename storage_t>
+const char* jellyfish::text_dumper<storage_t>::format = "text/sorted";
+
+template<typename Key, typename Val>
+class text_reader {
+ std::istream& is_;
+ char* buffer_;
+ Key key_;
+ Val val_;
+ const RectangularBinaryMatrix m_;
+ const size_t size_mask_;
+
+public:
+ text_reader(std::istream& is,
+ file_header* header) :
+ is_(is),
+ buffer_(new char[header->key_len() / 2 + 1]),
+ key_(header->key_len() / 2),
+ m_(header->matrix()),
+ size_mask_(header->size() - 1)
+ { }
+
+ const Key& key() const { return key_; }
+ const Val& val() const { return val_; }
+ size_t pos() const { return m_.times(key()) & size_mask_; }
+
+ bool next() {
+ is_ >> key_ >> val_;
+ return is_.good();
+ }
+};
+}
+
+#endif /* __JELLYFISH_TEXT_DUMPER_HPP__ */
diff --git a/jellyfish/thread_exec.hpp b/include/jellyfish/thread_exec.hpp
similarity index 96%
rename from jellyfish/thread_exec.hpp
rename to include/jellyfish/thread_exec.hpp
index c0dcb2f..0f6813b 100644
--- a/jellyfish/thread_exec.hpp
+++ b/include/jellyfish/thread_exec.hpp
@@ -26,6 +26,7 @@
#include <jellyfish/err.hpp>
#include <jellyfish/misc.hpp>
+namespace jellyfish {
class thread_exec {
struct thread_info {
int id;
@@ -47,5 +48,6 @@ public:
join();
}
};
+} // namespace jellyfish {
#endif // __THREAD_EXEC_HPP__
diff --git a/jellyfish/time.hpp b/include/jellyfish/time.hpp
similarity index 100%
rename from jellyfish/time.hpp
rename to include/jellyfish/time.hpp
diff --git a/jellyfish/token_ring.hpp b/include/jellyfish/token_ring.hpp
similarity index 57%
rename from jellyfish/token_ring.hpp
rename to include/jellyfish/token_ring.hpp
index 69cc7bb..7e78413 100644
--- a/jellyfish/token_ring.hpp
+++ b/include/jellyfish/token_ring.hpp
@@ -17,20 +17,20 @@
#ifndef __JELLYFISH_TOKEN_RING_HPP__
#define __JELLYFISH_TOKEN_RING_HPP__
-template<typename cond_t>
+#include <vector>
+#include <jellyfish/locks_pthread.hpp>
+
+namespace jellyfish {
+template<class cond_t = locks::pthread::cond>
class token_ring {
public:
class token {
- token *next;
- bool val;
- cond_t cond;
-
- token(token *_next, bool _val) :
- next(_next), val(_val) {}
+ bool val;
+ cond_t cond;
+ token* next;
friend class token_ring;
public:
- bool is_active() { return val; }
void wait() {
cond.lock();
while(!val) { cond.wait(); }
@@ -46,52 +46,42 @@ public:
}
};
-private:
- token *first, *last;
- cond_t cond;
-
-public:
- token_ring() :
- first(0), last(0)
- { }
+protected:
+ typedef std::vector<token> token_list;
+ typedef typename token_list::iterator token_iterator;
+ token_list tokens;
- ~token_ring() {
- if(!first)
+ void initialize() {
+ if(tokens.size() == 0)
return;
- while(first != last) {
- token *del = first;
- first = first->next;
- delete del;
+ tokens.front().val = true;
+ tokens.back().next = &tokens.front();
+
+ for(size_t i = 1; i < tokens.size(); ++i) {
+ tokens[i].val = false;
+ tokens[i-1].next = &tokens[i];
}
- delete last;
}
- void reset() {
- if(!first)
- return;
+public:
+ token_ring(int nb_tokens) :
+ tokens(nb_tokens)
+ { initialize(); }
- token *c = first;
- while(c != last) {
- c->val = false;
- c = c->next;
- }
- last->val = false;
- first->val = true;
- }
+ ~token_ring() { }
+ token& operator[](int i) { return tokens[i]; }
- token *new_token() {
- token *nt = new token(first, first == 0);
- if(first) {
- last->next = nt;
- last = nt;
- } else {
- first = last = nt;
- nt->next = nt;
- }
- return nt;
+ void reset() {
+ if(tokens.size() == 0)
+ return;
+
+ token_iterator it = tokens.begin();
+ it->val = true;
+ for(++it; it != tokens.end(); ++it)
+ it->val = false;
}
};
-
+} // namespace jellyfish {
#endif
diff --git a/include/jellyfish/whole_sequence_parser.hpp b/include/jellyfish/whole_sequence_parser.hpp
new file mode 100644
index 0000000..15b8984
--- /dev/null
+++ b/include/jellyfish/whole_sequence_parser.hpp
@@ -0,0 +1,150 @@
+#ifndef __JELLYFISH_WHOLE_SEQUENCE_PARSER_HPP__
+#define __JELLYFISH_WHOLE_SEQUENCE_PARSER_HPP__
+
+#include <string>
+#include <memory>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/cooperative_pool2.hpp>
+#include <jellyfish/cpp_array.hpp>
+
+namespace jellyfish {
+struct header_sequence_qual {
+ std::string header;
+ std::string seq;
+ std::string qual;
+};
+struct sequence_list {
+ size_t nb_filled;
+ std::vector<header_sequence_qual> data;
+};
+
+template<typename StreamIterator>
+class whole_sequence_parser : public jellyfish::cooperative_pool2<whole_sequence_parser<StreamIterator>, sequence_list> {
+ typedef jellyfish::cooperative_pool2<whole_sequence_parser<StreamIterator>, sequence_list> super;
+ typedef std::unique_ptr<std::istream> stream_type;
+ enum file_type { DONE_TYPE, FASTA_TYPE, FASTQ_TYPE };
+
+ struct stream_status {
+ file_type type;
+ std::string buffer;
+ stream_type stream;
+ stream_status() : type(DONE_TYPE) { }
+ };
+ cpp_array<stream_status> streams_;
+ StreamIterator& streams_iterator_;
+
+public:
+ /// Size is the number of buffers to keep around. It should be
+ /// larger than the number of thread expected to read from this
+ /// class. nb_sequences is the number of sequences to read into a
+ /// buffer. 'begin' and 'end' are iterators to a range of istream.
+ whole_sequence_parser(uint32_t size, uint32_t nb_sequences,
+ uint32_t max_producers, StreamIterator& streams) :
+ super(max_producers, size),
+ streams_(max_producers),
+ streams_iterator_(streams)
+ {
+ for(auto it = super::element_begin(); it != super::element_end(); ++it) {
+ it->nb_filled = 0;
+ it->data.resize(nb_sequences);
+ }
+ for(uint32_t i = 0; i < max_producers; ++i) {
+ streams_.init(i);
+ open_next_file(streams_[i]);
+ }
+ }
+
+ inline bool produce(uint32_t i, sequence_list& buff) {
+ stream_status& st = streams_[i];
+
+ switch(st.type) {
+ case FASTA_TYPE:
+ read_fasta(st, buff);
+ break;
+ case FASTQ_TYPE:
+ read_fastq(st, buff);
+ break;
+ case DONE_TYPE:
+ return true;
+ }
+
+ if(st.stream->good())
+ return false;
+
+ // Reach the end of file, close current and try to open the next one
+ open_next_file(st);
+ return false;
+ }
+
+protected:
+ void open_next_file(stream_status& st) {
+ st.stream.reset();
+ st.stream = streams_iterator_.next();
+ if(!st.stream) {
+ st.type = DONE_TYPE;
+ return;
+ }
+
+ // Update the type of the current file and move past first header
+ // to beginning of sequence.
+ switch(st.stream->peek()) {
+ case EOF: return open_next_file(st);
+ case '>':
+ st.type = FASTA_TYPE;
+ break;
+ case '@':
+ st.type = FASTQ_TYPE;
+ break;
+ default:
+ throw std::runtime_error("Unsupported format"); // Better error management
+ }
+ }
+
+ void read_fasta(stream_status& st, sequence_list& buff) {
+ size_t& nb_filled = buff.nb_filled;
+ const size_t data_size = buff.data.size();
+
+ for(nb_filled = 0; nb_filled < data_size && st.stream->peek() != EOF; ++nb_filled) {
+ header_sequence_qual& fill_buff = buff.data[nb_filled];
+ st.stream->get(); // Skip '>'
+ std::getline(*st.stream, fill_buff.header);
+ fill_buff.seq.clear();
+ while(st.stream->peek() != '>' && st.stream->peek() != EOF) {
+ std::getline(*st.stream, st.buffer); // Wish there was an easy way to combine the
+ fill_buff.seq.append(st.buffer); // two lines avoiding copying
+ }
+ }
+ }
+
+ void read_fastq(stream_status& st, sequence_list& buff) {
+ size_t& nb_filled = buff.nb_filled;
+ const size_t data_size = buff.data.size();
+
+ for(nb_filled = 0; nb_filled < data_size && st.stream->peek() != EOF; ++nb_filled) {
+ header_sequence_qual& fill_buff = buff.data[nb_filled];
+ st.stream->get(); // Skip '@'
+ std::getline(*st.stream, fill_buff.header);
+ fill_buff.seq.clear();
+ while(st.stream->peek() != '+' && st.stream->peek() != EOF) {
+ std::getline(*st.stream, st.buffer); // Wish there was an easy way to combine the
+ fill_buff.seq.append(st.buffer); // two lines avoiding copying
+ }
+ if(!st.stream->good())
+ throw std::runtime_error("Truncated fastq file");
+ st.stream->ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+ fill_buff.qual.clear();
+ while(fill_buff.qual.size() < fill_buff.seq.size() && st.stream->good()) {
+ std::getline(*st.stream, st.buffer);
+ fill_buff.qual.append(st.buffer);
+ }
+ if(fill_buff.qual.size() != fill_buff.seq.size())
+ throw std::runtime_error("Invalid fastq file: wrong number of quals");
+ if(st.stream->peek() != EOF && st.stream->peek() != '@')
+ throw std::runtime_error("Invalid fastq file: header missing");
+ }
+ }
+};
+} // namespace jellyfish
+
+#endif /* __JELLYFISH_WHOLE_SEQUENCE_PARSER_HPP__ */
diff --git a/install-sh b/install-sh
deleted file mode 100755
index a9244eb..0000000
--- a/install-sh
+++ /dev/null
@@ -1,527 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2011-01-19.21; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" "" $nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit=${DOITPROG-}
-if test -z "$doit"; then
- doit_exec=exec
-else
- doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_glob='?'
-initialize_posix_glob='
- test "$posix_glob" != "?" || {
- if (set -f) 2>/dev/null; then
- posix_glob=
- else
- posix_glob=:
- fi
- }
-'
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-no_target_directory=
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
- or: $0 [OPTION]... SRCFILES... DIRECTORY
- or: $0 [OPTION]... -t DIRECTORY SRCFILES...
- or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
- --help display this help and exit.
- --version display version info and exit.
-
- -c (ignored)
- -C install only if different (preserve the last data modification time)
- -d create directories instead of installing files.
- -g GROUP $chgrpprog installed files to GROUP.
- -m MODE $chmodprog installed files to MODE.
- -o USER $chownprog installed files to USER.
- -s $stripprog installed files.
- -t DIRECTORY install into DIRECTORY.
- -T report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
- CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
- RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
- case $1 in
- -c) ;;
-
- -C) copy_on_change=true;;
-
- -d) dir_arg=true;;
-
- -g) chgrpcmd="$chgrpprog $2"
- shift;;
-
- --help) echo "$usage"; exit $?;;
-
- -m) mode=$2
- case $mode in
- *' '* | *' '* | *'
-'* | *'*'* | *'?'* | *'['*)
- echo "$0: invalid mode: $mode" >&2
- exit 1;;
- esac
- shift;;
-
- -o) chowncmd="$chownprog $2"
- shift;;
-
- -s) stripcmd=$stripprog;;
-
- -t) dst_arg=$2
- # Protect names problematic for `test' and other utilities.
- case $dst_arg in
- -* | [=\(\)!]) dst_arg=./$dst_arg;;
- esac
- shift;;
-
- -T) no_target_directory=true;;
-
- --version) echo "$0 $scriptversion"; exit $?;;
-
- --) shift
- break;;
-
- -*) echo "$0: invalid option: $1" >&2
- exit 1;;
-
- *) break;;
- esac
- shift
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
- # When -d is used, all remaining arguments are directories to create.
- # When -t is used, the destination is already specified.
- # Otherwise, the last argument is the destination. Remove it from $@.
- for arg
- do
- if test -n "$dst_arg"; then
- # $@ is not empty: it contains at least $arg.
- set fnord "$@" "$dst_arg"
- shift # fnord
- fi
- shift # arg
- dst_arg=$arg
- # Protect names problematic for `test' and other utilities.
- case $dst_arg in
- -* | [=\(\)!]) dst_arg=./$dst_arg;;
- esac
- done
-fi
-
-if test $# -eq 0; then
- if test -z "$dir_arg"; then
- echo "$0: no input file specified." >&2
- exit 1
- fi
- # It's OK to call `install-sh -d' without argument.
- # This can happen when creating conditional directories.
- exit 0
-fi
-
-if test -z "$dir_arg"; then
- do_exit='(exit $ret); exit $ret'
- trap "ret=129; $do_exit" 1
- trap "ret=130; $do_exit" 2
- trap "ret=141; $do_exit" 13
- trap "ret=143; $do_exit" 15
-
- # Set umask so as not to create temps with too-generous modes.
- # However, 'strip' requires both read and write access to temps.
- case $mode in
- # Optimize common cases.
- *644) cp_umask=133;;
- *755) cp_umask=22;;
-
- *[0-7])
- if test -z "$stripcmd"; then
- u_plus_rw=
- else
- u_plus_rw='% 200'
- fi
- cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
- *)
- if test -z "$stripcmd"; then
- u_plus_rw=
- else
- u_plus_rw=,u+rw
- fi
- cp_umask=$mode$u_plus_rw;;
- esac
-fi
-
-for src
-do
- # Protect names problematic for `test' and other utilities.
- case $src in
- -* | [=\(\)!]) src=./$src;;
- esac
-
- if test -n "$dir_arg"; then
- dst=$src
- dstdir=$dst
- test -d "$dstdir"
- dstdir_status=$?
- else
-
- # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
- # might cause directories to be created, which would be especially bad
- # if $src (and thus $dsttmp) contains '*'.
- if test ! -f "$src" && test ! -d "$src"; then
- echo "$0: $src does not exist." >&2
- exit 1
- fi
-
- if test -z "$dst_arg"; then
- echo "$0: no destination specified." >&2
- exit 1
- fi
- dst=$dst_arg
-
- # If destination is a directory, append the input filename; won't work
- # if double slashes aren't ignored.
- if test -d "$dst"; then
- if test -n "$no_target_directory"; then
- echo "$0: $dst_arg: Is a directory" >&2
- exit 1
- fi
- dstdir=$dst
- dst=$dstdir/`basename "$src"`
- dstdir_status=0
- else
- # Prefer dirname, but fall back on a substitute if dirname fails.
- dstdir=`
- (dirname "$dst") 2>/dev/null ||
- expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$dst" : 'X\(//\)[^/]' \| \
- X"$dst" : 'X\(//\)$' \| \
- X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
- echo X"$dst" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'
- `
-
- test -d "$dstdir"
- dstdir_status=$?
- fi
- fi
-
- obsolete_mkdir_used=false
-
- if test $dstdir_status != 0; then
- case $posix_mkdir in
- '')
- # Create intermediate dirs using mode 755 as modified by the umask.
- # This is like FreeBSD 'install' as of 1997-10-28.
- umask=`umask`
- case $stripcmd.$umask in
- # Optimize common cases.
- *[2367][2367]) mkdir_umask=$umask;;
- .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
- *[0-7])
- mkdir_umask=`expr $umask + 22 \
- - $umask % 100 % 40 + $umask % 20 \
- - $umask % 10 % 4 + $umask % 2
- `;;
- *) mkdir_umask=$umask,go-w;;
- esac
-
- # With -d, create the new directory with the user-specified mode.
- # Otherwise, rely on $mkdir_umask.
- if test -n "$dir_arg"; then
- mkdir_mode=-m$mode
- else
- mkdir_mode=
- fi
-
- posix_mkdir=false
- case $umask in
- *[123567][0-7][0-7])
- # POSIX mkdir -p sets u+wx bits regardless of umask, which
- # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
- ;;
- *)
- tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
- trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
- if (umask $mkdir_umask &&
- exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
- then
- if test -z "$dir_arg" || {
- # Check for POSIX incompatibilities with -m.
- # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
- # other-writeable bit of parent directory when it shouldn't.
- # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
- ls_ld_tmpdir=`ls -ld "$tmpdir"`
- case $ls_ld_tmpdir in
- d????-?r-*) different_mode=700;;
- d????-?--*) different_mode=755;;
- *) false;;
- esac &&
- $mkdirprog -m$different_mode -p -- "$tmpdir" && {
- ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
- test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
- }
- }
- then posix_mkdir=:
- fi
- rmdir "$tmpdir/d" "$tmpdir"
- else
- # Remove any dirs left behind by ancient mkdir implementations.
- rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
- fi
- trap '' 0;;
- esac;;
- esac
-
- if
- $posix_mkdir && (
- umask $mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
- )
- then :
- else
-
- # The umask is ridiculous, or mkdir does not conform to POSIX,
- # or it failed possibly due to a race condition. Create the
- # directory the slow way, step by step, checking for races as we go.
-
- case $dstdir in
- /*) prefix='/';;
- [-=\(\)!]*) prefix='./';;
- *) prefix='';;
- esac
-
- eval "$initialize_posix_glob"
-
- oIFS=$IFS
- IFS=/
- $posix_glob set -f
- set fnord $dstdir
- shift
- $posix_glob set +f
- IFS=$oIFS
-
- prefixes=
-
- for d
- do
- test X"$d" = X && continue
-
- prefix=$prefix$d
- if test -d "$prefix"; then
- prefixes=
- else
- if $posix_mkdir; then
- (umask=$mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
- # Don't fail if two instances are running concurrently.
- test -d "$prefix" || exit 1
- else
- case $prefix in
- *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
- *) qprefix=$prefix;;
- esac
- prefixes="$prefixes '$qprefix'"
- fi
- fi
- prefix=$prefix/
- done
-
- if test -n "$prefixes"; then
- # Don't fail if two instances are running concurrently.
- (umask $mkdir_umask &&
- eval "\$doit_exec \$mkdirprog $prefixes") ||
- test -d "$dstdir" || exit 1
- obsolete_mkdir_used=true
- fi
- fi
- fi
-
- if test -n "$dir_arg"; then
- { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
- { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
- test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
- else
-
- # Make a couple of temp file names in the proper directory.
- dsttmp=$dstdir/_inst.$$_
- rmtmp=$dstdir/_rm.$$_
-
- # Trap to clean up those temp files at exit.
- trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
- # Copy the file name to the temp name.
- (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
- # and set any options; do chmod last to preserve setuid bits.
- #
- # If any of these fail, we abort the whole thing. If we want to
- # ignore errors from any of these, just make sure not to ignore
- # errors from the above "$doit $cpprog $src $dsttmp" command.
- #
- { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
- { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
- { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
- # If -C, don't bother to copy if it wouldn't change the file.
- if $copy_on_change &&
- old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
- new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
-
- eval "$initialize_posix_glob" &&
- $posix_glob set -f &&
- set X $old && old=:$2:$4:$5:$6 &&
- set X $new && new=:$2:$4:$5:$6 &&
- $posix_glob set +f &&
-
- test "$old" = "$new" &&
- $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
- then
- rm -f "$dsttmp"
- else
- # Rename the file to the real destination.
- $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
- # The rename failed, perhaps because mv can't rename something else
- # to itself, or perhaps because mv is so ancient that it does not
- # support -f.
- {
- # Now remove or move aside any old file at destination location.
- # We try this two ways since rm can't unlink itself on some
- # systems and the destination file might be busy for other
- # reasons. In this case, the final cleanup might fail but the new
- # file should still install successfully.
- {
- test ! -f "$dst" ||
- $doit $rmcmd -f "$dst" 2>/dev/null ||
- { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
- { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
- } ||
- { echo "$0: cannot unlink or rename $dst" >&2
- (exit 1); exit 1
- }
- } &&
-
- # Now rename the file to the real destination.
- $doit $mvcmd "$dsttmp" "$dst"
- }
- fi || exit 1
-
- trap '' 0
- fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/jellyfish-1.1.pc.in b/jellyfish-2.0.pc.in
similarity index 84%
rename from jellyfish-1.1.pc.in
rename to jellyfish-2.0.pc.in
index 4dd3bd0..8a549ec 100644
--- a/jellyfish-1.1.pc.in
+++ b/jellyfish-2.0.pc.in
@@ -6,5 +6,5 @@ includedir=@includedir@
Name: Jellyfish
Description: A multi-threaded hash based k-mer counter.
Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -ljellyfish-1.1 -lpthread
+Libs: -L${libdir} -ljellyfish-2.0 -lpthread
Cflags: -I${includedir}/jellyfish- at PACKAGE_VERSION@
diff --git a/jellyfish/aligned_values_array.hpp b/jellyfish/aligned_values_array.hpp
deleted file mode 100644
index 0ba9df2..0000000
--- a/jellyfish/aligned_values_array.hpp
+++ /dev/null
@@ -1,141 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_ALIGNED_VALUE_HPP__
-#define __JELLYFISH_ALIGNED_VALUE_HPP__
-
-#include <jellyfish/invertible_hash_array.hpp>
-#include <jellyfish/direct_indexing_array.hpp>
-
-namespace jellyfish {
- namespace aligned_values {
- template<typename _key_t, typename _val_t, typename atomic, typename mem_block_t>
- class array : public storage_t {
- public:
- typedef _key_t key_t;
- typedef _val_t val_t;
-
- private:
- typedef typename ::jellyfish::invertible_hash::array<key_t, atomic, mem_block_t> key_ary_t;
- typedef typename ::jellyfish::direct_indexing::array<size_t, val_t, atomic, mem_block_t> val_ary_t;
-
- key_ary_t keys;
- val_ary_t vals;
-
- public:
- array(size_t _size, uint_t _key_len, uint_t _reprobe_limit,
- size_t *_reprobes) :
- keys(_size, _key_len, 0, _reprobe_limit, _reprobes),
- vals(keys.get_lsize())
- { }
-
- array(char *keys_map, char *vals_map,
- size_t _size, uint_t _key_len, uint_t _reprobe_limit,
- size_t *_reprobes, SquareBinaryMatrix &hash_matrix,
- SquareBinaryMatrix &hash_inv_matrix) :
- keys(keys_map, _size, _key_len, 0, _reprobe_limit, _reprobes,
- hash_matrix, hash_inv_matrix),
- vals(vals_map, keys.get_lsize())
- { }
-
-
- void set_matrix(SquareBinaryMatrix &m) {
- keys.set_matrix(m);
- }
- size_t get_size() const { return keys.get_size(); }
- uint_t get_key_len() const { return keys.get_key_len(); }
- uint_t get_val_len() const { return keys.get_val_len(); }
- uint_t get_max_reprobe() const { return keys.get_max_reprobe(); }
- size_t get_max_reprobe_offset() const {
- return keys.get_max_reprobe_offset();
- }
- uint_t get_block_len() const { return keys.get_block_len(); }
- uint_t get_block_word_len() const {
- return keys.get_block_word_len() + keys.get_block_len() * sizeof(val_t);
- }
-
- size_t floor_block(size_t entries, size_t &blocks) const {
- return keys.floor_block(entries, blocks);
- }
- void zero_keys(const size_t start, const size_t length) {
- keys.zero_blocks(start, length);
- }
- void zero_values(const size_t start, const size_t length) {
- vals.zero(start, length);
- }
- void write_keys_blocks(std::ostream *out, size_t start, size_t length) const {
- keys.write_blocks(out, start, length);
- }
- void write_values(std::ostream *out, size_t start, size_t length) const {
- vals.write(out, start, length);
- }
- void write_matrices(std::ostream *out) {
- keys.write_ary_header(out);
- }
-
- template<typename add_t>
- bool add(key_t key, const add_t &val, val_t *oval = 0) {
- bool is_new;
- size_t id;
-
- if(!keys.set(key, &is_new, &id))
- return false;
-
- vals.add(id, val, oval);
- return true;
- }
-
- bool get_val(key_t key, val_t &val, bool full = true) const {
- key_t v_ignore;
- size_t key_id;
-
- if(!keys.get_val(key, key_id, v_ignore, false))
- return false;
-
- vals.get_val(key_id, val);
- return true;
- }
-
- class iterator {
- typename key_ary_t::iterator key_it;
- const val_ary_t *const vals;
-
- public:
- iterator(typename key_ary_t::iterator _key_it, const val_ary_t *_vals) :
- key_it(_key_it), vals(_vals) {}
-
- uint64_t get_hash() const { return key_it.get_hash(); }
- uint64_t get_pos() const { return key_it.get_pos(); }
- uint64_t get_start() const { return key_it.get_start(); }
- uint64_t get_end() const { return key_it.get_end(); }
- key_t get_key() const { return key_it.get_key(); }
- val_t get_val() const { return (*vals)[get_id()]; }
- size_t get_id() const { return key_it.get_id(); }
- char *get_dna_str() { return key_it.get_dna_str(); }
- bool next() { return key_it.next(); }
- };
- iterator iterator_all() const {
- return iterator(keys.iterator_all(), &vals);
- }
- iterator iterator_slice(size_t slice_number, size_t number_of_slice) const {
- return iterator(keys.iterator_slice(slice_number, number_of_slice),
- &vals);
- }
- };
- }
-}
-
-#endif
diff --git a/jellyfish/allocators_malloc.hpp b/jellyfish/allocators_malloc.hpp
deleted file mode 100644
index e010733..0000000
--- a/jellyfish/allocators_malloc.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/* Allocators return zeroed chunk of memory
- */
-#ifndef __JELLYFISH_ALLOCATORS_MALLOC_HPP__
-#define __JELLYFISH_ALLOCATORS_MALLOC_HPP__
-
-#include <stdlib.h>
-
-namespace allocators
-{
- class malloc
- {
- void *ptr;
- size_t size;
-
- public:
- malloc() : ptr(NULL), size(0) {}
- explicit malloc(size_t _size) : ptr(NULL), size(0) {
- realloc(_size);
- }
- ~malloc() {
- if(ptr)
- ::free(ptr);
- }
-
- void *get_ptr() { return ptr; }
- size_t get_size() const { return size; }
-
- void *realloc(size_t new_size) {
- size_t old_size = size;
- void *new_ptr = ::realloc(ptr, new_size);
- if(!new_ptr)
- return NULL;
- ptr = new_ptr;
- size = new_size;
- if(new_size > old_size)
- ::memset((char *)ptr + old_size, '\0', new_size - old_size);
- return ptr;
- }
-
- // NOOP
- int lock() { return 0; }
- int unlock() { return 0; }
- };
-}
-#endif
diff --git a/jellyfish/allocators_mmap.hpp b/jellyfish/allocators_mmap.hpp
deleted file mode 100644
index 8d975cd..0000000
--- a/jellyfish/allocators_mmap.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_ALLOCATORS_MMAP_HPP__
-#define __JELLYFISH_ALLOCATORS_MMAP_HPP__
-
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <unistd.h>
-
-namespace allocators {
- class mmap {
- void *ptr;
- size_t size;
-
- public:
- mmap() : ptr(MAP_FAILED), size(0) {}
- explicit mmap(size_t _size) : ptr(MAP_FAILED), size(0) {
- realloc(_size);
- fast_zero();
- }
- ~mmap() {
- if(ptr != MAP_FAILED)
- ::munmap(ptr, size);
- }
-
- void *get_ptr() const { return ptr != MAP_FAILED ? ptr : NULL; }
- size_t get_size() const { return size; }
- void *realloc(size_t new_size);
- int lock() { return mlock(ptr, size); }
- int unlock() { return munlock(ptr, size); }
-
- // Return a a number of bytes which is a number of whole pages at
- // least as large as size.
- static size_t round_to_page(size_t _size);
-
- private:
- static const int nb_threads = 4;
- struct tinfo {
- pthread_t thid;
- char *start, *end;
- size_t pgsize;
- };
- void fast_zero();
- static void * _fast_zero(void *_info);
- };
-}
-
-#endif
diff --git a/jellyfish/allocators_shm.hpp b/jellyfish/allocators_shm.hpp
deleted file mode 100644
index 123f49f..0000000
--- a/jellyfish/allocators_shm.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_ALLOCATORS_SHM_HPP__
-#define __JELLYFISH_ALLOCATORS_SHM_HPP__
-
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sstream>
-
-namespace allocators {
- class shm
- {
- int fd;
- void *ptr;
- size_t size;
- std::string name;
- bool unlink;
-
- public:
- shm() : fd(-1), ptr(MAP_FAILED), size(0), name(""),
- unlink(true) {}
- explicit shm(size_t _size) :
- fd(-1), ptr(MAP_FAILED), size(0), name(""), unlink(true) {
- realloc(_size);
- }
- shm(size_t _size, std::string _name) :
- fd(-1), ptr(MAP_FAILED), size(0), name(_name), unlink(false) {
- realloc(_size);
- }
- ~shm() {
- if(ptr != MAP_FAILED)
- ::munmap(ptr, size);
- if(fd != -1) {
- close(fd);
- if(unlink)
- ::shm_unlink(name.c_str());
- }
- }
-
- void *get_ptr() { return ptr != MAP_FAILED ? ptr : NULL; }
- size_t get_size() const { return size; }
-
- void *realloc(size_t new_size) {
- size_t old_size = size;
- if(fd == -1) {
- // Create a temporary file name. Security considerations?
- if(name.empty()) {
- std::ostringstream name_stream("/shm_alloc_");
- name_stream << getpid() << "_" << (void *)this;
- name = name_stream.str();
- }
- fd = ::shm_open(name.c_str(), O_RDWR|O_CREAT|O_EXCL,
- S_IRUSR|S_IWUSR);
- if(fd == -1)
- return NULL;
- } else if(ptr != MAP_FAILED) {
- ::munmap(ptr, old_size);
- ptr = MAP_FAILED;
- }
-
- if(ftruncate(fd, new_size) == -1)
- return NULL;
-
- void *new_ptr = ::mmap(NULL, new_size, PROT_WRITE|PROT_READ,
- MAP_SHARED, fd, 0);
- if(new_ptr == MAP_FAILED)
- return NULL;
- ptr = new_ptr;
- size = new_size;
- return ptr;
- }
-
- // Not yet implemented
- int lock() { return 0; }
- int unlock() { return 0; }
- };
-};
-#endif
diff --git a/jellyfish/capped_integer.hpp b/jellyfish/capped_integer.hpp
deleted file mode 100644
index fa0b994..0000000
--- a/jellyfish/capped_integer.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_CAPPED_INTEGER_HPP__
-#define __JELLYFISH_CAPPED_INTEGER_HPP__
-
-#include <iostream>
-
-namespace jellyfish {
- template<typename T> class capped_integer;
- template<typename T>
- std::ostream &operator<<(std::ostream &os, const capped_integer<T> &i);
-
- template<typename T>
- class capped_integer {
- T x;
-
- public:
- typedef T bits_t;
- static const T cap = (T)-1;
-
- capped_integer() : x(0) {}
- explicit capped_integer(bits_t _x) : x(_x) {}
-
- static const capped_integer zero;
- static const capped_integer one;
-
- const capped_integer operator+(const capped_integer y) const {
- return capped_integer((y.x > ~x) ? cap : y.x + x);
- }
- const capped_integer operator+(const T& y) const {
- return capped_integer((y > ~x) ? cap : y + x);
- }
-
- bits_t bits() const { return x; }
- float to_float() const { return (float)x; }
-
- bool operator==(const capped_integer &o) { return x == o.x; }
- bool operator!() const { return x == 0; }
-
- friend std::ostream &operator<< <> (std::ostream &os,
- const capped_integer<T> &i);
- };
-
- template<typename T>
- std::ostream &operator<<(std::ostream &os, const capped_integer<T> &i) {
- return os << i.x;
- }
-}
-
-#endif
diff --git a/jellyfish/circular_buffer.hpp b/jellyfish/circular_buffer.hpp
deleted file mode 100644
index 860135c..0000000
--- a/jellyfish/circular_buffer.hpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_CIRCULAR_BUFFER_HPP__
-#define __JELLYFISH_CIRCULAR_BUFFER_HPP__
-
-#include <iostream>
-
-namespace jellyfish {
- template<typename T>
- class circular_buffer {
- const int size;
- T *buffer, *end;
- T *start;
-
- public:
- explicit circular_buffer(int _size) : size(_size) {
- buffer = new T[size];
- end = buffer + size;
- start = buffer;
- }
-
- ~circular_buffer() {
- delete [] buffer;
- }
-
- void append(const T v) {
- // std::cerr << "append buffer " << (void *)buffer << " end " << (void *)end << " start " << (void *)start << " val " << v << "\n";
- *start++ = v;
-
- if(start == end)
- start = buffer;
- }
-
- template<typename U>
- T op(U o) const {
- T *c = start;
- T acc = *c++;
- if(c == end)
- c = buffer;
-
- do {
- acc = o(acc, *c++);
- if(c == end)
- c = buffer;
- } while(c != start);
- return acc;
- }
-
- static T T_times(T &x, T &y) { return x * y; }
- T prod() const { return op(T_times); }
- };
-}
-
-#endif
diff --git a/jellyfish/cite_cmdline.hpp b/jellyfish/cite_cmdline.hpp
deleted file mode 100644
index aa478f9..0000000
--- a/jellyfish/cite_cmdline.hpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __CITE_CMDLINE_HPP__
-#define __CITE_CMDLINE_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class cite_cmdline {
-public:
- bool bibtex_flag;
- const char * output_arg;
- bool output_given;
-
- enum {
- USAGE_OPT = 1000
- };
-
- cite_cmdline() :
- bibtex_flag(false),
- output_arg(""), output_given(false)
- { }
-
- cite_cmdline(int argc, char* argv[]) :
- bibtex_flag(false),
- output_arg(""), output_given(false)
- { parse(argc, argv); }
-
- void parse(int argc, char* argv[]) {
- static struct option long_options[] = {
- {"bibtex", 0, 0, 'b'},
- {"output", 1, 0, 'o'},
- {"help", 0, 0, 'h'},
- {"usage", 0, 0, USAGE_OPT},
- {"version", 0, 0, 'V'},
- {0, 0, 0, 0}
- };
- static const char *short_options = "hVbo:";
-
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
- while(true) {
- int index = -1;
- int c = getopt_long(argc, argv, short_options, long_options, &index);
- if(c == -1) break;
- switch(c) {
- case ':':
- std::cerr << "Missing required argument for "
- << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
- << std::endl;
- exit(1);
- case 'h':
- std::cout << usage() << "\n\n" << help() << std::endl;
- exit(0);
- case USAGE_OPT:
- std::cout << usage() << "\nUse --help for more information." << std::endl;
- exit(0);
- case 'V':
- print_version();
- exit(0);
- case '?':
- std::cerr << "Use --usage or --help for some help\n";
- exit(1);
- case 'b':
- bibtex_flag = true;
- break;
- case 'o':
- output_given = true;
- output_arg = optarg;
- break;
- }
- }
-
- // Parse arguments
- if(argc - optind != 0)
- error("Requires exactly 0 argument.");
- }
-
-#define cite_cmdline_USAGE "Usage: jellyfish cite [options]"
- const char * usage() const { return cite_cmdline_USAGE; }
- void error(const char *msg) {
- std::cerr << "Error: " << msg << "\n" << usage()
- << "\nUse --help for more information"
- << std::endl;
- exit(1);
- }
-
-#define cite_cmdline_HELP "How to cite Jellyfish's paper\n\nCitation of paper\n\n" \
- "Options (default value in (), *required):\n" \
- " -b, --bibtex Bibtex format (false)\n" \
- " -o, --output=string Output file\n" \
- " --usage Usage\n" \
- " -h, --help This message\n" \
- " -V, --version Version"
-
- const char * help() const { return cite_cmdline_HELP; }
-#define cite_cmdline_HIDDEN "Hidden options:"
-
- const char * hidden() const { return cite_cmdline_HIDDEN; }
- void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
- os << PACKAGE_VERSION << "\n";
- }
- void dump(std::ostream &os = std::cout) {
- os << "bibtex_flag:" << bibtex_flag << "\n";
- os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
- }
-private:
-};
-
-#endif // __CITE_CMDLINE_HPP__"
diff --git a/jellyfish/compacted_dumper.hpp b/jellyfish/compacted_dumper.hpp
deleted file mode 100644
index 5b3dbe6..0000000
--- a/jellyfish/compacted_dumper.hpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/dumper.hpp>
-
-namespace jellyfish {
- template<typename storage_t, typename atomic_t>
- class compacted_dumper : public dumper_t {
- define_error_class(ErrorWriting);
- typedef typename storage_t::iterator iterator;
- typedef compacted_hash::writer<storage_t> writer_t;
- struct thread_info_t {
- pthread_t thread_id;
- uint_t id;
- locks::pthread::cond cond;
- volatile bool token;
- writer_t writer;
- compacted_dumper *self;
- };
-
- uint_t threads;
- std::string file_prefix;
- size_t buffer_size;
- uint_t klen, vlen;
- uint_t key_len, val_len;
- size_t record_len, nb_records, nb_blocks;
- storage_t *ary;
- uint_t file_index;
- struct thread_info_t *thread_info;
- uint64_t max_count;
- uint64_t volatile unique, distinct, total;
- std::ofstream out;
-
- public:
- // klen: key field length in bits in hash (i.e before rounding up to bytes)
- // vlen: value field length in bits
- compacted_dumper(uint_t _threads, const char *_file_prefix, size_t _buffer_size,
- uint_t _vlen, storage_t *_ary) :
- threads(_threads), file_prefix(_file_prefix), buffer_size(_buffer_size),
- klen(_ary->get_key_len()), vlen(_vlen), ary(_ary), file_index(0)
- {
- std::cerr << "Compacted dumper init" << std::endl;
- key_len = bits_to_bytes(klen);
- val_len = bits_to_bytes(vlen);
- max_count = (((uint64_t)1) << (8*val_len)) - 1;
- record_len = key_len + val_len;
- nb_records = ary->floor_block(_buffer_size / record_len, nb_blocks);
-
- thread_info = new struct thread_info_t[threads];
- for(uint_t i = 0; i < threads; i++) {
- thread_info[i].token = i == 0;
- thread_info[i].writer.initialize(nb_records, ary->get_key_len(), vlen, ary);
- thread_info[i].id = i;
- thread_info[i].self = this;
- }
- unique = distinct = total = 0;
- }
-
- ~compacted_dumper() {
- if(thread_info) {
- delete[] thread_info;
- }
- }
-
- static void *dump_to_file_thread(void *arg) {
- struct thread_info_t *info = (struct thread_info_t *)arg;
- info->self->dump_to_file(info);
- return NULL;
- }
-
- void dump_to_file(struct thread_info_t *my_info);
-
- virtual void dump();
- void update_stats() {
- thread_info[0].writer.update_stats_with(&out, unique, distinct, total);
- }
- };
-
- template<typename storage_t, typename atomic_t>
- void compacted_dumper<storage_t,atomic_t>::dump() {
- static const long file_len = pathconf("/", _PC_PATH_MAX);
- std::cerr << "dump()" << std::endl;
- char file[file_len + 1];
- file[file_len] = '\0';
- int off = snprintf(file, file_len, "%s", file_prefix.c_str());
- if(off < 0)
- eraise(ErrorWriting) << "Error creating output path" << err::no;
- if(off > 0 && off < file_len) {
- int _off = snprintf(file + off, file_len - off, "_%uld", file_index++);
- if(_off < 0)
- eraise(ErrorWriting) << "Error creating output path" << err::no;
- off += _off;
- }
- if(off >= file_len)
- eraise(ErrorWriting) << "File path is too long";
-
-
- // out.exceptions(std::ios::eofbit|std::ios::failbit|std::ios::badbit);
- std::cerr << "Open " << file << std::endl;
- out.open(file);
- if(!out.good())
- eraise(ErrorWriting) << "'" << file << "': "
- << "Can't open file for writing" << err::no;
-
-
- out.write("JFLISTDN", 8);
- unique = distinct = total = 0;
- for(uint_t i = 0; i < threads; i++)
- thread_info[i].token = i == 0;
- for(uint_t i = 0; i < threads; i++) {
- pthread_create(&thread_info[i].thread_id, NULL, dump_to_file_thread,
- &thread_info[i]);
- }
-
- for(uint_t i = 0; i < threads; i++)
- pthread_join(thread_info[i].thread_id, NULL);
- update_stats();
- out.close();
- }
-
- template<typename storage_t, typename atomic_t>
- void compacted_dumper<storage_t,atomic_t>::dump_to_file(struct thread_info_t *my_info) {
- size_t i;
- struct thread_info_t *next_info = &thread_info[(my_info->id + 1) % threads];
- atomic_t atomic;
-
- if(my_info->token)
- my_info->writer.write_header(&out);
-
- for(i = my_info->id; i * nb_records < ary->get_size(); i += threads) {
- // fill up buffer
- iterator it(ary, i * nb_records, (i + 1) * nb_records);
-
- while(it.next()) {
- my_info->writer.append(it.key, it.val);
- }
-
- // wait for token & write buffer
- my_info->cond.lock();
- while(!my_info->token) { my_info->cond.wait(); }
- my_info->cond.unlock();
- my_info->writer.dump(&out);
-
- // pass on token
- my_info->token = false;
- next_info->cond.lock();
- next_info->token = true;
- next_info->cond.signal();
- next_info->cond.unlock();
-
- // zero out memory
- ary->zero_blocks(i * nb_blocks, nb_blocks);
- }
- atomic.add_fetch(&unique, my_info->writer.get_unique());
- atomic.add_fetch(&distinct, my_info->writer.get_distinct());
- atomic.add_fetch(&total, my_info->writer.get_total());
- }
-}
diff --git a/jellyfish/compacted_hash.hpp b/jellyfish/compacted_hash.hpp
deleted file mode 100644
index 75c7bd0..0000000
--- a/jellyfish/compacted_hash.hpp
+++ /dev/null
@@ -1,530 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_COMPACTED_HASH__
-#define __JELLYFISH_COMPACTED_HASH__
-
-#include <iostream>
-#include <fstream>
-#include <string.h>
-#include <pthread.h>
-#include <jellyfish/err.hpp>
-#include <jellyfish/mapped_file.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/parse_dna.hpp>
-#include <jellyfish/misc.hpp>
-
-namespace jellyfish {
- namespace compacted_hash {
- define_error_class(ErrorReading);
-
- static const char *file_type = "JFLISTDN";
- struct header {
- char type[8]; // type of file. Expect file_type
- uint64_t key_len;
- uint64_t val_len; // In bytes
- uint64_t size; // In bytes
- uint64_t max_reprobe;
- uint64_t unique;
- uint64_t distinct;
- uint64_t total;
- uint64_t max_count;
-
- header() { }
- explicit header(char *ptr) {
- if(memcmp(ptr, file_type, sizeof(type)))
- eraise(ErrorReading) << "Bad file type '" << err::substr(ptr, sizeof(type))
- << "', expected '" << err::substr(file_type, sizeof(type)) << "'";
- memcpy((void *)this, ptr, sizeof(struct header));
- }
- };
-
- template<typename storage_t>
- class writer {
- uint64_t unique, distinct, total, max_count;
- size_t nb_records;
- uint_t klen, vlen;
- uint_t key_len, val_len;
- storage_t *ary;
- char *buffer, *end, *ptr;
-
- public:
- writer() : unique(0), distinct(0), total(0), max_count(0)
- { buffer = ptr = end = NULL; }
-
- writer(size_t _nb_records, uint_t _klen, uint_t _vlen, storage_t *_ary)
- {
- initialize(_nb_records, _klen, _vlen, _ary);
- }
-
- void initialize(size_t _nb_records, uint_t _klen, uint_t _vlen, storage_t *_ary) {
- unique = distinct = total = max_count = 0;
- nb_records = _nb_records;
- klen = _klen;
- vlen = _vlen;
- key_len = bits_to_bytes(klen);
- val_len = bits_to_bytes(vlen);
- ary = _ary;
- buffer = new char[nb_records * (key_len + val_len)];
- end = buffer + (nb_records * (key_len + val_len));
- ptr = buffer;
- }
-
- ~writer() {
- if(buffer)
- delete buffer;
- }
-
- bool append(uint64_t key, uint64_t val) {
- if(ptr >= end)
- return false;
- memcpy(ptr, &key, key_len);
- ptr += key_len;
- memcpy(ptr, &val, val_len);
- ptr += val_len;
- unique += val == 1;
- distinct++;
- total += val;
- if(val > max_count)
- max_count = val;
- return true;
- }
-
- void dump(std::ostream *out) {
- out->write(buffer, ptr - buffer);
- ptr = buffer;
- }
-
- void write_header(std::ostream *out) const {
- struct header head;
- memset(&head, '\0', sizeof(head));
- memcpy(&head.type, file_type, sizeof(head.type));
- head.key_len = klen;
- head.val_len = val_len;
- head.size = ary->get_size();
- head.max_reprobe = ary->get_max_reprobe_offset();
- out->write((char *)&head, sizeof(head));
- ary->write_ary_header(out);
- }
-
- void update_stats(std::ostream *out) const {
- update_stats_with(out, unique, distinct, total, max_count);
- }
-
- void update_stats_with(std::ostream *out, uint64_t _unique, uint64_t _distinct,
- uint64_t _total, uint64_t _max_count) const {
- if(!out->good())
- return;
- out->seekp(0);
- if(!out->good()) {
- out->clear();
- return;
- }
-
- struct header head;
- memcpy(&head.type, file_type, sizeof(head.type));
- head.key_len = klen;
- head.val_len = val_len;
- head.size = ary->get_size();
- head.max_reprobe = ary->get_max_reprobe_offset();
- head.unique = _unique;
- head.distinct = _distinct;
- head.total = _total;
- head.max_count = _max_count;
- out->write((char *)&head, sizeof(head));
- }
-
- uint64_t get_unique() const { return unique; }
- uint64_t get_distinct() const { return distinct; }
- uint64_t get_total() const { return total; }
- uint64_t get_max_count() const { return max_count; }
- uint_t get_key_len_bytes() const { return key_len; }
- uint_t get_val_len_bytes() const { return val_len; }
-
- void reset_counters() {
- unique = distinct = total = max_count = 0;
- }
- };
-
- template<typename key_t, typename val_t>
- class reader {
- struct header header;
- std::ifstream *io;
- uint_t key_len;
- SquareBinaryMatrix hash_matrix, hash_inverse_matrix;
- size_t record_len, buffer_len;
- size_t size_mask;
- char *buffer, *end_buffer, *ptr;
- char dna_str[33];
-
- public:
- key_t key;
- val_t val;
-
- reader() { io = 0; buffer = 0; memset(dna_str, '\0', sizeof(dna_str)); }
- explicit reader(std::string filename, size_t _buff_len = 10000000UL) {
- initialize(filename, _buff_len);
- }
-
- void initialize(std::string filename, size_t _buff_len) {
- memset(dna_str, '\0', sizeof(dna_str));
- io = new std::ifstream(filename.c_str());
- io->read((char *)&header, sizeof(header));
- if(!io->good())
- eraise(ErrorReading) << "'" << filename << "': "
- << "File truncated";
- if(memcmp(header.type, file_type, sizeof(header.type)))
- eraise(ErrorReading) << "'" << filename << "': "
- << "Bad file type '"
- << err::substr(header.type, sizeof(header.type)) << "', expected '"
- << err::substr(file_type, sizeof(header.type)) << "'";
-
- if(header.key_len > 64 || header.key_len == 0)
- eraise(ErrorReading) << "'" << filename << "': "
- << "Invalid key length '"
- << header.key_len << "'";
- if(header.size != (1UL << floorLog2(header.size)))
- eraise(ErrorReading) << "'" << filename << "': "
- << "Size '" << header.size
- << "' is not a power of 2";
- key_len = (header.key_len / 8) + (header.key_len % 8 != 0);
- record_len = key_len + header.val_len;
- buffer_len = record_len * (_buff_len / record_len);
- buffer = new char[buffer_len];
- ptr = buffer;
- end_buffer = NULL;
-
- hash_matrix.load(io);
- hash_inverse_matrix.load(io);
-
- if(header.distinct != 0) {
- std::streamoff list_size = get_file_size(*io);
- if(list_size != (std::streamoff)-1 &&
- list_size - (header.distinct * record_len) != 0) {
- eraise(ErrorReading) << "'" << filename << "': "
- << "Bad hash size '" << list_size
- << "', expected '"
- << (header.distinct * record_len) << "' bytes";
- }
- }
- key = val = 0;
- size_mask = header.size - 1;
- }
-
- ~reader() {
- if(io)
- delete io;
- if(buffer)
- delete[] buffer;
- }
-
- uint_t get_key_len() const { return header.key_len; }
- uint_t get_mer_len() const { return header.key_len / 2; }
- uint_t get_val_len() const { return header.val_len; }
- size_t get_size() const { return header.size; }
- uint64_t get_max_reprobe() const { return header.max_reprobe; }
- uint64_t get_max_reprobe_offset() const { return header.max_reprobe; }
- uint64_t get_unique() const { return header.unique; }
- uint64_t get_distinct() const { return header.distinct; }
- uint64_t get_total() const { return header.total; }
- uint64_t get_max_count() const { return header.max_count; }
- SquareBinaryMatrix get_hash_matrix() const { return hash_matrix; }
- SquareBinaryMatrix get_hash_inverse_matrix() const { return hash_inverse_matrix; }
- void write_ary_header(std::ostream *out) const {
- hash_matrix.dump(out);
- hash_inverse_matrix.dump(out);
- }
-
- key_t get_key() const { return key; }
- val_t get_val() const { return val; }
-
-
- void get_string(char *out) const {
- parse_dna::mer_binary_to_string(key, get_mer_len(), out);
- }
- char* get_dna_str() {
- parse_dna::mer_binary_to_string(key, get_mer_len(), dna_str);
- return dna_str;
- }
- uint64_t get_hash() const { return hash_matrix.times(key); }
- uint64_t get_pos() const { return hash_matrix.times(key) & size_mask; }
-
- bool next() {
- while(true) {
- if(ptr <= end_buffer) {
- memcpy(&key, ptr, key_len);
- ptr += key_len;
- memcpy(&val, ptr, header.val_len);
- ptr += header.val_len;
- return true;
- }
-
- if(io->fail())
- return false;
- io->read(buffer, buffer_len);
- // if(record_len * (io->gcount() / record_len) != io->gcount())
- // return false;
- ptr = buffer;
- end_buffer = NULL;
- if((size_t)io->gcount() >= record_len)
- end_buffer = ptr + (io->gcount() - record_len);
- }
- }
- };
-
- template<typename key_t, typename val_t>
- class query {
- mapped_file file;
- struct header header;
- uint_t key_len;
- uint_t val_len;
- uint_t record_len;
- SquareBinaryMatrix hash_matrix;
- SquareBinaryMatrix hash_inverse_matrix;
- char *base;
- uint64_t size;
- uint64_t size_mask;
- uint64_t last_id;
- key_t first_key, last_key;
- uint64_t first_pos, last_pos;
- bool canonical;
-
- public:
- /* Can't wait for C++0x to be finalized and call constructor
- from constructor!
- */
- explicit query(mapped_file &map) :
- file(map),
- header(file.base()),
- key_len((header.key_len / 8) + (header.key_len % 8 != 0)),
- val_len(header.val_len),
- record_len(key_len + header.val_len),
- hash_matrix(file.base() + sizeof(header)),
- hash_inverse_matrix(file.base() + sizeof(header) + hash_matrix.dump_size()),
- base(file.base() + sizeof(header) + hash_matrix.dump_size() + hash_inverse_matrix.dump_size()),
- size(header.size),
- size_mask(header.size - 1),
- last_id((file.end() - base) / record_len),
- canonical(false)
- {
- if(header.distinct != 0 && file.end() - base - header.distinct * record_len != 0)
- eraise(ErrorReading) << "'" << file.path() << "': "
- << "Bad hash size '" << (file.end() - base)
- << "', expected '" << header.distinct * record_len << "' bytes";
-
- get_key(0, &first_key);
- first_pos = get_pos(first_key);
- get_key(last_id - 1, &last_key);
- last_pos = get_pos(last_key);
- }
- explicit query(std::string filename) :
- file(filename.c_str()),
- header(file.base()),
- key_len((header.key_len / 8) + (header.key_len % 8 != 0)),
- val_len(header.val_len),
- record_len(key_len + header.val_len),
- hash_matrix(file.base() + sizeof(header)),
- hash_inverse_matrix(file.base() + sizeof(header) + hash_matrix.dump_size()),
- base(file.base() + sizeof(header) + hash_matrix.dump_size() + hash_inverse_matrix.dump_size()),
- size(header.size),
- size_mask(header.size - 1),
- last_id((file.end() - base) / record_len),
- canonical(false)
- {
- if(header.distinct != 0 && file.end() - base - header.distinct * record_len != 0)
- eraise(ErrorReading) << "'" << file.path() << "': "
- << "Bad hash size '" << (file.end() - base)
- << "', expected '" << header.distinct * record_len << "' bytes";
-
- get_key(0, &first_key);
- first_pos = get_pos(first_key);
- get_key(last_id - 1, &last_key);
- last_pos = get_pos(last_key);
- }
-
- uint_t get_key_len() const { return header.key_len; }
- uint_t get_mer_len() const { return header.key_len / 2; }
- uint_t get_val_len() const { return header.val_len; }
- size_t get_size() const { return header.size; }
- size_t get_nb_mers() const { return last_id; }
- uint64_t get_max_reprobe() const { return header.max_reprobe; }
- uint64_t get_max_reprobe_offset() const { return header.max_reprobe; }
- uint64_t get_unique() const { return header.unique; }
- uint64_t get_distinct() const { return header.distinct; }
- uint64_t get_total() const { return header.total; }
- uint64_t get_max_count() const { return header.max_count; }
- SquareBinaryMatrix get_hash_matrix() const { return hash_matrix; }
- SquareBinaryMatrix get_hash_inverse_matrix() const { return hash_inverse_matrix; }
- bool get_canonical() const { return canonical; }
- void set_canonical(bool v) { canonical = v; }
-
- /* No check is made on the validity of the string passed. Should only contained [acgtACGT] to get a valid answer.
- */
- val_t operator[] (const char *key_s) const {
- return get_key_val(parse_dna::mer_string_to_binary(key_s, get_mer_len()));
- }
- val_t operator[] (const key_t key) const { return get_key_val(key); }
-
- void get_key(size_t id, key_t *k) const {
- *k = 0;
- memcpy(k, base + id * record_len, key_len);
- }
- void get_val(size_t id, val_t *v) const {
- *v = 0;
- memcpy(v, base + id * record_len + key_len, val_len);
- }
- uint64_t get_pos(key_t k) const {
- return hash_matrix.times(k) & size_mask;
- }
-
- val_t get_key_val(const key_t key) const {
- uint64_t id;
- val_t res;
- if(get_key_val_id(key, &res, &id))
- return res;
- else
- return 0;
- }
-
- bool get_key_val_id(const key_t _key, val_t *res,
- uint64_t *id) const {
- key_t key;
- if(canonical) {
- key = parse_dna::reverse_complement(_key, get_mer_len());
- if(key > _key)
- key = _key;
- } else {
- key = _key;
- }
- if(key == first_key) {
- get_val(0, res);
- *id = 0;
- return true;
- }
- if(key == last_key) {
- get_val(last_id - 1, res);
- *id = last_id;
- return true;
- }
- uint64_t pos = get_pos(key);
- if(pos < first_pos || pos > last_pos)
- return false;
- uint64_t first = 0, last = last_id;
- while(first < last - 1) {
- uint64_t middle = (first + last) / 2;
- key_t mid_key;
- get_key(middle, &mid_key);
- // printf("%ld %ld %ld %ld %ld %ld %ld\n", key, pos, first, middle, last, mid_key, get_pos(mid_key));
- if(key == mid_key) {
- get_val(middle, res);
- *id = middle;
- return true;
- }
- uint64_t mid_pos = get_pos(mid_key);
- if(mid_pos > pos || (mid_pos == pos && mid_key > key))
- last = middle;
- else
- first = middle;
- }
- return false;
- }
-
- class iterator {
- char *base, *ptr;
- uint64_t last_id;
- uint_t key_len;
- uint_t val_len;
- uint_t record_len;
- uint_t mer_len;
- uint64_t id;
- key_t key;
- val_t val;
- char dna_str[33];
-
- public:
- iterator(char *_base, uint64_t _last_id, uint_t _key_len, uint_t _val_len, uint_t _mer_len) :
- base(_base), ptr(_base), last_id(_last_id), key_len(_key_len), val_len(_val_len),
- record_len(key_len + val_len), mer_len(_mer_len), id(0), key(0), val(0)
- {
- memset(dna_str, '\0', sizeof(dna_str));
- }
-
- key_t get_key() const { return key; }
- val_t get_val() const { return val; }
- uint64_t get_id() const { return id; }
-
- bool next() {
- if(id >= last_id)
- return false;
- ++id;
- memcpy(&key, ptr, key_len);
- ptr += key_len;
- memcpy(&val, ptr, val_len);
- ptr += val_len;
- return true;
- }
-
- bool next(uint64_t *_id, key_t *_key, val_t *_val) {
- if(id >= last_id)
- return false;
- *_id = atomic::gcc::add_fetch(&id, (uint64_t)1) - 1;
- if(*_id >= last_id)
- return false;
- char *ptr = base + (*_id) * record_len;
- *_key = 0;
- memcpy(_key, ptr, key_len);
- ptr += key_len;
- *_val = 0;
- memcpy(_val, ptr, val_len);
- return true;
- }
-
- inline bool next(key_t *_key, val_t *_val) {
- uint64_t _id;
- return next(&_id, _key, _val);
- }
-
- char *get_dna_str() {
- parse_dna::mer_binary_to_string(key, mer_len, dna_str);
- return dna_str;
- }
-
- void get_dna_str(char *out) {
- parse_dna::mer_binary_to_string(key, mer_len, out);
- }
- };
-
- iterator get_iterator() const { return iterator_all(); }
- iterator iterator_all() const { return iterator(base, last_id, key_len, val_len, get_mer_len()); }
- iterator iterator_slice(uint64_t slice_number, uint64_t number_of_slice) const {
- std::pair<uint64_t, uint64_t> res =
- slice(slice_number, number_of_slice, last_id);
- char *it_base = base + res.first * record_len;
- uint64_t it_last_id = res.second - res.first;
-
- if(it_base >= file.end()) {
- it_base = base;
- it_last_id = 0;
- } else if(it_base + it_last_id * record_len > file.end())
- it_last_id = (file.end() - it_base) / record_len;
-
- return iterator(it_base, it_last_id, key_len, val_len, get_mer_len());
- }
- };
- }
-}
-#endif /* __COMPACTED_HASH__ */
diff --git a/jellyfish/concurrent_queues.hpp b/jellyfish/concurrent_queues.hpp
deleted file mode 100644
index 4068849..0000000
--- a/jellyfish/concurrent_queues.hpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_CONCURRENT_QUEUES_HPP__
-#define __JELLYFISH_CONCURRENT_QUEUES_HPP__
-
-#include <sys/time.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <new>
-#include <stdio.h>
-#include <assert.h>
-
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/divisor.hpp>
-
-/***
- * Circular buffer of fixed size with thread safe enqueue and dequeue
- * operation to make it behave like a FIFO. Elements are enqueued at
- * the head and dequeued at the tail. Never more than n elements
- * should be enqueued if the size is n+1. There is no check for this.
- *
- * It is possible for the tail pointer to go past an element (i.e. it
- * has been "dequeued"), but the thread is slow to zero the pointer
- * (i.e. to claim the element). It is then possible for the head
- * pointer to point to this not yet claimed element. The enqueue()
- * method blindly skip over such an element. Hence, it is possible
- * that the same element will be dequeued again before it is
- * claimed. Or, it will be claimed after being skipped and another
- * thread will dequeue what looks like an empty element. The outer
- * loop of dequeue() handles this situation.
- */
-
-namespace jellyfish {
- template<class Val>
- class concurrent_queue {
- Val **queue;
- const uint64_t size;
- uint64_t volatile head;
- uint64_t volatile tail;
- bool volatile closed;
- divisor64 size_div;
-
- public:
- explicit concurrent_queue(uint64_t _size) :
- size(20 *_size), head(0), tail(0), closed(false), size_div(size)
- {
- queue = new Val *[size];
- memset(queue, 0, sizeof(Val *) * size);
- }
- ~concurrent_queue() { delete [] queue; }
-
- void enqueue(Val *v);
- Val *dequeue();
- bool is_closed() { return closed; }
- void close() { closed = true; __sync_synchronize(); }
- bool has_space() { return head != tail; }
- bool is_low() {
- uint64_t ctail = tail;
- __sync_synchronize();
- uint64_t chead = head;
- int64_t len = chead - ctail;
- if(len < 0)
- len += size;
- return (uint64_t)(4*len) <= size;
- }
- uint64_t usage() {
- uint64_t ctail = tail;
- __sync_synchronize();
- uint64_t chead = head;
- int64_t len = chead - ctail;
- if(len < 0)
- len += size;
- return len;
- }
- };
-
- template<class Val>
- void concurrent_queue<Val>::enqueue(Val *v) {
- int done = 0;
- uint64_t chead;
-
- chead = head;
- do {
- // uint64_t q, nhead;
- uint64_t nhead = (chead + 1) % size_div;
- // size_div.division(chead + 1, q, nhead);
- // uint64_t nhead = (chead + 1) % size;
-
- done = (atomic::gcc::cas(&queue[chead], (Val*)0, v) == (Val*)0);
- chead = atomic::gcc::cas(&head, chead, nhead);
- } while(!done);
-
- assert(head < size);
- assert(tail < size);
- }
-
- template<class Val>
- Val *concurrent_queue<Val>::dequeue() {
- bool done = false;
- Val *res;
- uint64_t ctail, ntail;
-
- ctail = tail;
- // __sync_synchronize();
- do {
- bool dequeued = false;
- do {
- // if(ctail == head)
- // return NULL;
-
- // Complicated way to do ctail == head. Is it necessary? Or is
- // the memory barrier above sufficient? Or even necessary?
- if(atomic::gcc::cas(&head, ctail, ctail) == ctail) {
- assert(head < size);
- assert(tail < size);
- return NULL;
- }
- // ntail = (ctail + 1) % size;
- // uint64_t q;
- // size_div.division(ctail + 1, q, ntail);
- ntail = (ctail + 1) % size_div;
- ntail = atomic::gcc::cas(&tail, ctail, ntail);
- dequeued = ntail == ctail;
- ctail = ntail;
- } while(!dequeued);
-
- // Claim dequeued slot. We may have dequeued an element which is
- // empty or that another thread also has dequeued but not yet
- // claimed. This can happen if a thread is slow to claim (set
- // pointer to 0) and the enqueue method has queued elements past
- // this one.
- res = queue[ctail];
- if(res)
- done = atomic::gcc::cas(&queue[ctail], res, (Val*)0) == res;
- } while(!done);
-
- assert(head < size);
- assert(tail < size);
-
- return res;
- }
-}
-
-#endif
diff --git a/jellyfish/count_main_cmdline.hpp b/jellyfish/count_main_cmdline.hpp
deleted file mode 100644
index 3e6ce7b..0000000
--- a/jellyfish/count_main_cmdline.hpp
+++ /dev/null
@@ -1,684 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __COUNT_ARGS_HPP__
-#define __COUNT_ARGS_HPP__
-
-#include <stdint.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <getopt.h>
-#include <errno.h>
-#include <string.h>
-#include <stdexcept>
-#include <string>
-#include <limits>
-#include <vector>
-#include <iostream>
-#include <sstream>
-
-class count_args {
- // Boiler plate stuff. Conversion from string to other formats
- static bool adjust_double_si_suffix(double &res, const char *suffix) {
- if(*suffix == '\0')
- return true;
- if(*(suffix + 1) != '\0')
- return false;
-
- switch(*suffix) {
- case 'a': res *= 1e-18; break;
- case 'f': res *= 1e-15; break;
- case 'p': res *= 1e-12; break;
- case 'n': res *= 1e-9; break;
- case 'u': res *= 1e-6; break;
- case 'm': res *= 1e-3; break;
- case 'k': res *= 1e3; break;
- case 'M': res *= 1e6; break;
- case 'G': res *= 1e9; break;
- case 'T': res *= 1e12; break;
- case 'P': res *= 1e15; break;
- case 'E': res *= 1e18; break;
- default: return false;
- }
- return true;
- }
-
- static double conv_double(const char *str, ::std::string &err, bool si_suffix) {
- char *endptr = 0;
- errno = 0;
- double res = strtod(str, &endptr);
- if(errno) {
- err.assign(strerror(errno));
- return (double)0.0;
- }
- bool invalid =
- si_suffix ? !adjust_double_si_suffix(res, endptr) : *endptr != '\0';
- if(invalid) {
- err.assign("Invalid character");
- return (double)0.0;
- }
- return res;
- }
-
- static int conv_enum(const char* str, ::std::string& err, const char* const strs[]) {
- int res = 0;
- for(const char* const* cstr = strs; *cstr; ++cstr, ++res)
- if(!strcmp(*cstr, str))
- return res;
- err += "Invalid constant '";
- err += str;
- err += "'. Expected one of { ";
- for(const char* const* cstr = strs; *cstr; ++cstr) {
- if(cstr != strs)
- err += ", ";
- err += *cstr;
- }
- err += " }";
- return -1;
- }
-
- template<typename T>
- static bool adjust_int_si_suffix(T &res, const char *suffix) {
- if(*suffix == '\0')
- return true;
- if(*(suffix + 1) != '\0')
- return false;
-
- switch(*suffix) {
- case 'k': res *= (T)1000; break;
- case 'M': res *= (T)1000000; break;
- case 'G': res *= (T)1000000000; break;
- case 'T': res *= (T)1000000000000; break;
- case 'P': res *= (T)1000000000000000; break;
- case 'E': res *= (T)1000000000000000000; break;
- default: return false;
- }
- return true;
- }
-
- template<typename T>
- static T conv_int(const char *str, ::std::string &err, bool si_suffix) {
- char *endptr = 0;
- errno = 0;
- long long int res = strtoll(str, &endptr, 0);
- if(errno) {
- err.assign(strerror(errno));
- return (T)0;
- }
- bool invalid =
- si_suffix ? !adjust_int_si_suffix(res, endptr) : *endptr != '\0';
- if(invalid) {
- err.assign("Invalid character");
- return (T)0;
- }
- if(res > ::std::numeric_limits<T>::max() ||
- res < ::std::numeric_limits<T>::min()) {
- err.assign("Value out of range");
- return (T)0;
- }
- return (T)res;
- }
-
- template<typename T>
- static T conv_uint(const char *str, ::std::string &err, bool si_suffix) {
- char *endptr = 0;
- errno = 0;
- while(isspace(*str)) { ++str; }
- if(*str == '-') {
- err.assign("Negative value");
- return (T)0;
- }
- unsigned long long int res = strtoull(str, &endptr, 0);
- if(errno) {
- err.assign(strerror(errno));
- return (T)0;
- }
- bool invalid =
- si_suffix ? !adjust_int_si_suffix(res, endptr) : *endptr != '\0';
- if(invalid) {
- err.assign("Invalid character");
- return (T)0;
- }
- if(res > ::std::numeric_limits<T>::max() ||
- res < ::std::numeric_limits<T>::min()) {
- err.assign("Value out of range");
- return (T)0;
- }
- return (T)res;
- }
-
- template<typename T>
- static ::std::string vec_str(const std::vector<T> &vec) {
- ::std::ostringstream os;
- for(typename ::std::vector<T>::const_iterator it = vec.begin();
- it != vec.end(); ++it) {
- if(it != vec.begin())
- os << ",";
- os << *it;
- }
- return os.str();
- }
-
- class string : public ::std::string {
- public:
- string() : ::std::string() {}
- explicit string(const ::std::string &s) : std::string(s) {}
- explicit string(const char *s) : ::std::string(s) {}
- int as_enum(const char* const strs[]) {
- ::std::string err;
- int res = conv_enum((const char*)this->c_str(), err, strs);
- if(!err.empty())
- throw ::std::runtime_error(err);
- return res;
- }
-
-
- uint32_t as_uint32_suffix() const { return as_uint32(true); }
- uint32_t as_uint32(bool si_suffix = false) const {
- ::std::string err;
- uint32_t res = conv_uint<uint32_t>((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- ::std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to uint32_t: ";
- msg += err;
- throw ::std::runtime_error(msg);
- }
- return res;
- }
- uint64_t as_uint64_suffix() const { return as_uint64(true); }
- uint64_t as_uint64(bool si_suffix = false) const {
- ::std::string err;
- uint64_t res = conv_uint<uint64_t>((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- ::std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to uint64_t: ";
- msg += err;
- throw ::std::runtime_error(msg);
- }
- return res;
- }
- int32_t as_int32_suffix() const { return as_int32(true); }
- int32_t as_int32(bool si_suffix = false) const {
- ::std::string err;
- int32_t res = conv_int<int32_t>((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- ::std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to int32_t: ";
- msg += err;
- throw ::std::runtime_error(msg);
- }
- return res;
- }
- int64_t as_int64_suffix() const { return as_int64(true); }
- int64_t as_int64(bool si_suffix = false) const {
- ::std::string err;
- int64_t res = conv_int<int64_t>((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- ::std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to int64_t: ";
- msg += err;
- throw ::std::runtime_error(msg);
- }
- return res;
- }
- int as_int_suffix() const { return as_int(true); }
- int as_int(bool si_suffix = false) const {
- ::std::string err;
- int res = conv_int<int>((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- ::std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to int_t: ";
- msg += err;
- throw ::std::runtime_error(msg);
- }
- return res;
- }
- long as_long_suffix() const { return as_long(true); }
- long as_long(bool si_suffix = false) const {
- ::std::string err;
- long res = conv_int<long>((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- ::std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to long_t: ";
- msg += err;
- throw ::std::runtime_error(msg);
- }
- return res;
- }
- double as_double_suffix() const { return as_double(true); }
- double as_double(bool si_suffix = false) const {
- ::std::string err;
- double res = conv_double((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- ::std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to double_t: ";
- msg += err;
- throw ::std::runtime_error(msg);
- }
- return res;
- }
- };
-
-public:
- struct invalid_char {
- enum { warn, ignore, error };
- static const char* const strs[4];
- };
-
- uint32_t mer_len_arg;
- bool mer_len_given;
- uint64_t size_arg;
- bool size_given;
- uint32_t threads_arg;
- bool threads_given;
- string output_arg;
- bool output_given;
- bool O_flag;
- uint32_t counter_len_arg;
- bool counter_len_given;
- uint32_t out_counter_len_arg;
- bool out_counter_len_given;
- bool both_strands_flag;
- uint32_t reprobes_arg;
- bool reprobes_given;
- bool raw_flag;
- bool both_flag;
- bool quake_flag;
- uint32_t quality_start_arg;
- bool quality_start_given;
- uint32_t min_quality_arg;
- bool min_quality_given;
- uint64_t lower_count_arg;
- bool lower_count_given;
- uint64_t upper_count_arg;
- bool upper_count_given;
- int invalid_char_arg;
- bool invalid_char_given;
- string matrix_arg;
- bool matrix_given;
- const char * timing_arg;
- bool timing_given;
- const char * stats_arg;
- bool stats_given;
- bool no_write_flag;
- bool measure_flag;
- uint64_t buffers_arg;
- bool buffers_given;
- uint64_t buffer_size_arg;
- bool buffer_size_given;
- uint64_t out_buffer_size_arg;
- bool out_buffer_size_given;
- bool lock_flag;
- bool stream_flag;
- ::std::vector<const char *> file_arg;
- typedef ::std::vector<const char *>::iterator file_arg_it;
- typedef ::std::vector<const char *>::const_iterator file_arg_const_it;
-
- enum {
- START_OPT = 1000,
- FULL_HELP_OPT,
- USAGE_OPT,
- OUT_COUNTER_LEN_OPT,
- BOTH_OPT,
- QUALITY_START_OPT,
- MIN_QUALITY_OPT,
- INVALID_CHAR_OPT,
- MATRIX_OPT,
- TIMING_OPT,
- STATS_OPT,
- BUFFERS_OPT,
- BUFFER_SIZE_OPT,
- OUT_BUFFER_SIZE_OPT,
- LOCK_OPT,
- STREAM_OPT
- };
-
- count_args() :
- mer_len_arg(), mer_len_given(false),
- size_arg(), size_given(false),
- threads_arg(1), threads_given(false),
- output_arg("mer_counts"), output_given(false),
- O_flag(false),
- counter_len_arg(7), counter_len_given(false),
- out_counter_len_arg(4), out_counter_len_given(false),
- both_strands_flag(false),
- reprobes_arg(62), reprobes_given(false),
- raw_flag(false),
- both_flag(false),
- quake_flag(false),
- quality_start_arg(64), quality_start_given(false),
- min_quality_arg(0), min_quality_given(false),
- lower_count_arg(), lower_count_given(false),
- upper_count_arg(), upper_count_given(false),
- invalid_char_arg(), invalid_char_given(false),
- matrix_arg(""), matrix_given(false),
- timing_arg(""), timing_given(false),
- stats_arg(""), stats_given(false),
- no_write_flag(false),
- measure_flag(false),
- buffers_arg(), buffers_given(false),
- buffer_size_arg(8192), buffer_size_given(false),
- out_buffer_size_arg(20000000), out_buffer_size_given(false),
- lock_flag(false),
- stream_flag(false),
- file_arg()
- { }
-
- count_args(int argc, char* argv[]) :
- mer_len_arg(), mer_len_given(false),
- size_arg(), size_given(false),
- threads_arg(1), threads_given(false),
- output_arg("mer_counts"), output_given(false),
- O_flag(false),
- counter_len_arg(7), counter_len_given(false),
- out_counter_len_arg(4), out_counter_len_given(false),
- both_strands_flag(false),
- reprobes_arg(62), reprobes_given(false),
- raw_flag(false),
- both_flag(false),
- quake_flag(false),
- quality_start_arg(64), quality_start_given(false),
- min_quality_arg(0), min_quality_given(false),
- lower_count_arg(), lower_count_given(false),
- upper_count_arg(), upper_count_given(false),
- invalid_char_arg(), invalid_char_given(false),
- matrix_arg(""), matrix_given(false),
- timing_arg(""), timing_given(false),
- stats_arg(""), stats_given(false),
- no_write_flag(false),
- measure_flag(false),
- buffers_arg(), buffers_given(false),
- buffer_size_arg(8192), buffer_size_given(false),
- out_buffer_size_arg(20000000), out_buffer_size_given(false),
- lock_flag(false),
- stream_flag(false),
- file_arg()
- { parse(argc, argv); }
-
- void parse(int argc, char* argv[]) {
- static struct option long_options[] = {
- {"mer-len", 1, 0, 'm'},
- {"size", 1, 0, 's'},
- {"threads", 1, 0, 't'},
- {"output", 1, 0, 'o'},
- {"", 0, 0, 'O'},
- {"counter-len", 1, 0, 'c'},
- {"out-counter-len", 1, 0, OUT_COUNTER_LEN_OPT},
- {"both-strands", 0, 0, 'C'},
- {"reprobes", 1, 0, 'p'},
- {"raw", 0, 0, 'r'},
- {"both", 0, 0, BOTH_OPT},
- {"quake", 0, 0, 'q'},
- {"quality-start", 1, 0, QUALITY_START_OPT},
- {"min-quality", 1, 0, MIN_QUALITY_OPT},
- {"lower-count", 1, 0, 'L'},
- {"upper-count", 1, 0, 'U'},
- {"invalid-char", 1, 0, INVALID_CHAR_OPT},
- {"matrix", 1, 0, MATRIX_OPT},
- {"timing", 1, 0, TIMING_OPT},
- {"stats", 1, 0, STATS_OPT},
- {"no-write", 0, 0, 'w'},
- {"measure", 0, 0, 'u'},
- {"buffers", 1, 0, BUFFERS_OPT},
- {"buffer-size", 1, 0, BUFFER_SIZE_OPT},
- {"out-buffer-size", 1, 0, OUT_BUFFER_SIZE_OPT},
- {"lock", 0, 0, LOCK_OPT},
- {"stream", 0, 0, STREAM_OPT},
- {"help", 0, 0, 'h'},
- {"full-help", 0, 0, FULL_HELP_OPT},
- {"usage", 0, 0, USAGE_OPT},
- {"version", 0, 0, 'V'},
- {0, 0, 0, 0}
- };
- static const char *short_options = "hVm:s:t:o:Oc:Cp:rqL:U:wu";
-
- ::std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { ::std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
- while(true) {
- int index = -1;
- int c = getopt_long(argc, argv, short_options, long_options, &index);
- if(c == -1) break;
- switch(c) {
- case ':':
- ::std::cerr << "Missing required argument for "
- << (index == -1 ? ::std::string(1, (char)optopt) : std::string(long_options[index].name))
- << ::std::endl;
- exit(1);
- case 'h':
- ::std::cout << usage() << "\n\n" << help() << std::endl;
- exit(0);
- case USAGE_OPT:
- ::std::cout << usage() << "\nUse --help for more information." << std::endl;
- exit(0);
- case 'V':
- print_version();
- exit(0);
- case '?':
- ::std::cerr << "Use --usage or --help for some help\n";
- exit(1);
- case FULL_HELP_OPT:
- ::std::cout << usage() << "\n\n" << help() << "\n\n" << hidden() << std::endl;
- exit(0);
- case 'm':
- mer_len_given = true;
- mer_len_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
- CHECK_ERR(uint32_t, optarg, "-m, --mer-len=uint32")
- break;
- case 's':
- size_given = true;
- size_arg = conv_uint<uint64_t>((const char*)optarg, err, true);
- CHECK_ERR(uint64_t, optarg, "-s, --size=uint64")
- break;
- case 't':
- threads_given = true;
- threads_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
- CHECK_ERR(uint32_t, optarg, "-t, --threads=uint32")
- break;
- case 'o':
- output_given = true;
- output_arg.assign(optarg);
- break;
- case 'O':
- O_flag = true;
- break;
- case 'c':
- counter_len_given = true;
- counter_len_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
- CHECK_ERR(uint32_t, optarg, "-c, --counter-len=Length in bits")
- break;
- case OUT_COUNTER_LEN_OPT:
- out_counter_len_given = true;
- out_counter_len_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
- CHECK_ERR(uint32_t, optarg, " --out-counter-len=Length in bytes")
- break;
- case 'C':
- both_strands_flag = true;
- break;
- case 'p':
- reprobes_given = true;
- reprobes_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
- CHECK_ERR(uint32_t, optarg, "-p, --reprobes=uint32")
- break;
- case 'r':
- raw_flag = true;
- break;
- case BOTH_OPT:
- both_flag = true;
- break;
- case 'q':
- quake_flag = true;
- break;
- case QUALITY_START_OPT:
- quality_start_given = true;
- quality_start_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
- CHECK_ERR(uint32_t, optarg, " --quality-start=uint32")
- break;
- case MIN_QUALITY_OPT:
- min_quality_given = true;
- min_quality_arg = conv_uint<uint32_t>((const char*)optarg, err, false);
- CHECK_ERR(uint32_t, optarg, " --min-quality=uint32")
- break;
- case 'L':
- lower_count_given = true;
- lower_count_arg = conv_uint<uint64_t>((const char*)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, "-L, --lower-count=uint64")
- break;
- case 'U':
- upper_count_given = true;
- upper_count_arg = conv_uint<uint64_t>((const char*)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, "-U, --upper-count=uint64")
- break;
- case INVALID_CHAR_OPT:
- invalid_char_given = true;
- invalid_char_arg = conv_enum((const char*)optarg, err, invalid_char::strs);
- CHECK_ERR(enum, optarg, " --invalid-char=warn|ignore|error")
- break;
- case MATRIX_OPT:
- matrix_given = true;
- matrix_arg.assign(optarg);
- break;
- case TIMING_OPT:
- timing_given = true;
- timing_arg = optarg;
- break;
- case STATS_OPT:
- stats_given = true;
- stats_arg = optarg;
- break;
- case 'w':
- no_write_flag = true;
- break;
- case 'u':
- measure_flag = true;
- break;
- case BUFFERS_OPT:
- buffers_given = true;
- buffers_arg = conv_uint<uint64_t>((const char*)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, " --buffers=uint64")
- break;
- case BUFFER_SIZE_OPT:
- buffer_size_given = true;
- buffer_size_arg = conv_uint<uint64_t>((const char*)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, " --buffer-size=uint64")
- break;
- case OUT_BUFFER_SIZE_OPT:
- out_buffer_size_given = true;
- out_buffer_size_arg = conv_uint<uint64_t>((const char*)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, " --out-buffer-size=uint64")
- break;
- case LOCK_OPT:
- lock_flag = true;
- break;
- case STREAM_OPT:
- stream_flag = true;
- break;
- }
- }
-
- // Check that required switches are present
- if(!mer_len_given)
- error("[-m, --mer-len=uint32] required switch");
- if(!size_given)
- error("[-s, --size=uint64] required switch");
-
- // Parse arguments
- if(argc - optind < 1)
- error("Requires at least 1 argument.");
- for( ; optind < argc; ++optind) {
- file_arg.push_back(argv[optind]);
- }
- }
-
-#define count_args_USAGE "Usage: jellyfish count [options] file:path+"
-
- const char * usage() const { return count_args_USAGE; }
- void error(const char *msg) {
- ::std::cerr << "Error: " << msg << "\n" << usage()
- << "\nUse --help for more information"
- << ::std::endl;
- exit(1);
- }
-
-#define count_args_HELP "Count k-mers or qmers in fasta or fastq files\n\n" \
- "Options (default value in (), *required):\n" \
- " -m, --mer-len=uint32 *Length of mer\n" \
- " -s, --size=uint64 *Hash size\n" \
- " -t, --threads=uint32 Number of threads (1)\n" \
- " -o, --output=string Output prefix (mer_counts)\n" \
- " -c, --counter-len=Length in bits Length of counting field (7)\n" \
- " --out-counter-len=Length in bytes Length of counter field in output (4)\n" \
- " -C, --both-strands Count both strand, canonical representation (false)\n" \
- " -p, --reprobes=uint32 Maximum number of reprobes (62)\n" \
- " -r, --raw Write raw database (false)\n" \
- " -q, --quake Quake compatibility mode (false)\n" \
- " --quality-start=uint32 Starting ASCII for quality values (64)\n" \
- " --min-quality=uint32 Minimum quality. A base with lesser quality becomes an N (0)\n" \
- " -L, --lower-count=uint64 Don't output k-mer with count < lower-count\n" \
- " -U, --upper-count=uint64 Don't output k-mer with count > upper-count\n" \
- " --invalid-char=warn|ignore|error How to treat invalid characters. The char is changed to a N. (warn)\n" \
- " --matrix=Matrix file Hash function binary matrix\n" \
- " --timing=Timing file Print timing information\n" \
- " --stats=Stats file Print stats\n" \
- " --usage Usage\n" \
- " -h, --help This message\n" \
- " --full-help Detailed help\n" \
- " -V, --version Version"
- const char * help() const { return count_args_HELP; }
-
-#define count_args_HIDDEN "Hidden options:\n" \
- " -O Output is the file name (not a prefix) (false)\n" \
- " --both Write list and raw database (false)\n" \
- " -w, --no-write Don't write database (false)\n" \
- " -u, --measure Write usage statistics (false)\n" \
- " --buffers=uint64 Number of buffers per thread\n" \
- " --buffer-size=uint64 Size of buffers (8192)\n" \
- " --out-buffer-size=uint64 Size of output buffer per thread (20000000)\n" \
- " --lock Lock hash in memory (no swapping) (false)\n" \
- " --stream Read from stream, not memory map (false)"
-
- const char * hidden() const { return count_args_HIDDEN; }
- void print_version(::std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
- os << PACKAGE_VERSION << "\n";
- }
- void dump(::std::ostream &os = std::cout) {
- os << "mer_len_given:" << mer_len_given << " mer_len_arg:" << mer_len_arg << "\n";
- os << "size_given:" << size_given << " size_arg:" << size_arg << "\n";
- os << "threads_given:" << threads_given << " threads_arg:" << threads_arg << "\n";
- os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
- os << "O_flag:" << O_flag << "\n";
- os << "counter_len_given:" << counter_len_given << " counter_len_arg:" << counter_len_arg << "\n";
- os << "out_counter_len_given:" << out_counter_len_given << " out_counter_len_arg:" << out_counter_len_arg << "\n";
- os << "both_strands_flag:" << both_strands_flag << "\n";
- os << "reprobes_given:" << reprobes_given << " reprobes_arg:" << reprobes_arg << "\n";
- os << "raw_flag:" << raw_flag << "\n";
- os << "both_flag:" << both_flag << "\n";
- os << "quake_flag:" << quake_flag << "\n";
- os << "quality_start_given:" << quality_start_given << " quality_start_arg:" << quality_start_arg << "\n";
- os << "min_quality_given:" << min_quality_given << " min_quality_arg:" << min_quality_arg << "\n";
- os << "lower_count_given:" << lower_count_given << " lower_count_arg:" << lower_count_arg << "\n";
- os << "upper_count_given:" << upper_count_given << " upper_count_arg:" << upper_count_arg << "\n";
- os << "invalid_char_given:" << invalid_char_given << " invalid_char_arg:" << invalid_char_arg << "|" << invalid_char::strs[invalid_char_arg] << "\n";
- os << "matrix_given:" << matrix_given << " matrix_arg:" << matrix_arg << "\n";
- os << "timing_given:" << timing_given << " timing_arg:" << timing_arg << "\n";
- os << "stats_given:" << stats_given << " stats_arg:" << stats_arg << "\n";
- os << "no_write_flag:" << no_write_flag << "\n";
- os << "measure_flag:" << measure_flag << "\n";
- os << "buffers_given:" << buffers_given << " buffers_arg:" << buffers_arg << "\n";
- os << "buffer_size_given:" << buffer_size_given << " buffer_size_arg:" << buffer_size_arg << "\n";
- os << "out_buffer_size_given:" << out_buffer_size_given << " out_buffer_size_arg:" << out_buffer_size_arg << "\n";
- os << "lock_flag:" << lock_flag << "\n";
- os << "stream_flag:" << stream_flag << "\n";
- os << "file_arg:" << vec_str(file_arg) << "\n";
- }
-};
-const char* const count_args::invalid_char::strs[4] = { "warn", "ignore", "error", (const char*)0 };
-#endif // __COUNT_ARGS_HPP__"
diff --git a/jellyfish/counter.hpp b/jellyfish/counter.hpp
deleted file mode 100644
index 83f0c56..0000000
--- a/jellyfish/counter.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/atomic_gcc.hpp>
-
-class counter_t {
- volatile uint64_t count;
-
-public:
- counter_t() : count(0) {}
-
- inline uint64_t operator++(int) {
- return atomic::gcc::fetch_add(&count, (uint64_t)1);
- }
- inline uint64_t inc(uint64_t x) {
- return atomic::gcc::fetch_add(&count, x);
- }
- inline uint64_t get() const { return count; }
-
- class block {
- counter_t *c;
- uint64_t bs;
- uint64_t base, i;
-
- // friend counter_t;
- public:
- block(counter_t *_c, uint64_t _bs) : c(_c), bs(_bs), base(0), i(bs) {}
-
- public:
- inline uint64_t operator++(int) {
- if(i >= bs) {
- i = 0;
- base = c->inc(bs);
- }
- return base + i++;
- }
- };
- block get_block(uint64_t bs = 100) { return block(this, bs); }
-};
diff --git a/jellyfish/dbg.cc b/jellyfish/dbg.cc
index 4652939..b953224 100644
--- a/jellyfish/dbg.cc
+++ b/jellyfish/dbg.cc
@@ -16,14 +16,7 @@
#include <jellyfish/dbg.hpp>
#include <jellyfish/time.hpp>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_SYS_SYSCALL_H
#include <sys/syscall.h>
-#endif
namespace dbg {
pthread_mutex_t print_t::_lock = PTHREAD_MUTEX_INITIALIZER;
diff --git a/jellyfish/direct_indexing_array.hpp b/jellyfish/direct_indexing_array.hpp
deleted file mode 100644
index d6b4e9c..0000000
--- a/jellyfish/direct_indexing_array.hpp
+++ /dev/null
@@ -1,151 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_DIRECT_INDEXING_ARRAY_HPP__
-#define __JELLYFISH_DIRECT_INDEXING_ARRAY_HPP__
-
-namespace jellyfish {
- namespace direct_indexing {
- template<typename key_t, typename val_t, typename atomic_t, typename mem_block_t>
- class array {
- public:
- typedef typename val_t::bits_t bits_t;
-
- uint_t key_len;
- size_t size;
- mem_block_t mem_block;
- bits_t *data;
- atomic_t atomic;
-
-
- public:
- explicit array(uint_t _key_len) :
- key_len(_key_len), size(((size_t)1) << key_len),
- mem_block(size * sizeof(bits_t)),
- data((bits_t *)mem_block.get_ptr())
- { }
-
- array(char *map, uint_t _key_len) :
- key_len(_key_len), size(((size_t)1) << key_len),
- data((bits_t *)map)
- { }
-
- size_t get_size() const { return size; }
- uint_t get_key_len() const { return key_len; }
- uint_t get_val_len() const { return sizeof(bits_t); }
- size_t get_max_reprobe_offset() const { return 1; }
-
- void write_ary_header(std::ostream *out) const {
- SquareBinaryMatrix id(key_len);
- id.init_identity();
- id.dump(out);
- id.dump(out);
- }
- void write_raw(std::ostream *out) const {}
-
- template<typename add_t>
- bool add(key_t key, const add_t &val, val_t *_oval = 0) {
- bits_t oval = data[key];
- val_t nval = val_t(oval) + val;
-
- while(true) {
- bits_t noval = atomic.cas(&data[key], oval, nval.bits());
- if(noval == oval) {
- if(_oval)
- *_oval = val_t(oval);
- return true;
- }
- oval = noval;
- nval = val_t(oval) + val;
- }
- return true;
- }
-
- bool get_val(key_t key, val_t &val, bool full = true) const {
- val = data[key];
- return true;
- }
-
- class iterator {
- const array *ary;
- size_t start_id;
- size_t nid;
- size_t end_id;
- key_t key;
- bits_t val;
- size_t id;
-
- public:
- iterator(const array *_ary, size_t start, size_t end) :
- ary(_ary), start_id(start), nid(start),
- end_id(end > ary->get_size() ? ary->get_size() : end)
- {}
-
- void get_string(char *out) const {
- parse_dna::mer_binary_to_string(key, ary->get_key_len() / 2, out);
- }
- uint64_t get_hash() const { return key; }
- uint64_t get_pos() const { return key; }
- uint64_t get_start() const { return start_id; }
- uint64_t get_end() const { return end_id; }
- key_t get_key() const { return key; }
- val_t get_val() const { return val_t(val); }
- size_t get_id() const { return id; }
-
- bool next() {
- while((id = nid) < end_id) {
- nid++;
- val = ary->data[id];
- if(val) {
- key = id;
- return true;
- }
- }
- return false;
- }
- };
- friend class iterator;
- iterator iterator_all() const { return iterator(this, 0, get_size()); }
- iterator iterator_slice(size_t slice_number, size_t number_of_slice) const {
- std::pair<size_t, size_t> res = slice(slice_number, number_of_slice, get_size());
- return iterator(this, res.first, res.second);
- }
-
- /**
- * Zero out entries in [start, start+length).
- */
- void zero(size_t start, size_t length) {
- if(start >= size)
- return;
- if(start + length > size)
- length = size - start;
- memset(data + start, '\0', length * sizeof(*data));
- }
-
- void write(std::ostream *out, const size_t start, size_t length) const {
- if(start >= size)
- return;
- if(start + length > size)
- length = size - start;
- out->write((char *)(data + start), length * sizeof(*data));
- }
-
- val_t operator[](key_t key) const { return val_t(data[key]); }
- };
- }
-}
-
-#endif
diff --git a/jellyfish/direct_sorted_dumper.hpp b/jellyfish/direct_sorted_dumper.hpp
deleted file mode 100644
index 163bd7f..0000000
--- a/jellyfish/direct_sorted_dumper.hpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <limits>
-#include <jellyfish/dumper.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/token_ring.hpp>
-
-namespace jellyfish {
- template<typename storage_t, typename atomic_t>
- class direct_sorted_dumper : public dumper_t, public thread_exec {
- typedef typename storage_t::iterator iterator;
- typedef typename compacted_hash::writer<storage_t> writer_t;
- typedef token_ring<locks::pthread::cond> token_ring_t;
-
- struct thread_info_t {
- writer_t writer;
- token_ring_t::token *token;
- };
-
- uint_t threads;
- const char *file_prefix;
- size_t buffer_size;
- uint_t klen, vlen;
- uint_t key_len, val_len;
- size_t record_len, nb_records;
- storage_t *ary;
- int file_index;
- token_ring_t tr;
- uint64_t lower_count, upper_count;
- struct thread_info_t *thread_info;
- uint64_t volatile unique, distinct, total, max_count;
- std::ofstream *out;
- bool one_file;
-
- public:
- direct_sorted_dumper(uint_t _threads, const char *_file_prefix,
- size_t _buffer_size, uint_t _vlen, storage_t *_ary) :
- threads(_threads), file_prefix(_file_prefix), buffer_size(_buffer_size),
- klen(_ary->get_key_len()), vlen(_vlen), ary(_ary),
- tr() , lower_count(0), upper_count(std::numeric_limits<uint64_t>::max()),
- one_file(false)
- {
- key_len = bits_to_bytes(klen);
- val_len = bits_to_bytes(vlen);
- record_len = key_len + val_len;
- nb_records = _buffer_size / record_len;
- thread_info = new struct thread_info_t[threads];
- for(uint_t i = 0; i < threads; i++) {
- thread_info[i].writer.initialize(nb_records, klen, vlen, ary);
- thread_info[i].token = tr.new_token();
- }
- unique = distinct = total = max_count = 0;
- }
-
- ~direct_sorted_dumper() {
- if(thread_info)
- delete[] thread_info;
- }
-
- bool get_one_file() const { return one_file; }
- void set_one_file(bool nv) { one_file = nv; }
-
- void set_lower_count(uint64_t l) { lower_count = l; }
- void set_upper_count(uint64_t u) { upper_count = u; }
-
- virtual void start(int i) { dump_to_file(i); }
- void dump_to_file(int i);
-
- virtual void _dump();
- void update_stats() {
- thread_info[0].writer.update_stats_with(out, unique, distinct, total,
- max_count);
- }
- };
-
- template<typename storage_t, typename atomic_t>
- void direct_sorted_dumper<storage_t,atomic_t>::_dump() {
- std::ofstream _out;
- if(one_file) {
- _out.open(file_prefix);
- } else {
- open_next_file(file_prefix, &file_index, _out);
- }
- out = &_out;
- unique = distinct = total = max_count = 0;
- tr.reset();
- thread_info[0].writer.write_header(out);
- exec_join(threads);
- update_stats();
- _out.close();
- }
-
- template<typename storage_t, typename atomic_t>
- void direct_sorted_dumper<storage_t,atomic_t>::dump_to_file(int id) {
- size_t i;
- struct thread_info_t *my_info = &thread_info[id];
- atomic_t atomic;
-
- my_info->writer.reset_counters();
-
- for(i = id; i * nb_records < ary->get_size(); i += threads) {
- iterator it(ary, i * nb_records, (i + 1) * nb_records);
- while(it.next())
- if(it.get_val().bits() >= lower_count && it.get_val().bits() <= upper_count)
- my_info->writer.append(it.get_key(), it.get_val().bits());
-
- my_info->token->wait();
- my_info->writer.dump(out);
- my_info->token->pass();
- ary->zero(i * nb_records, nb_records);
- }
- atomic.add_fetch(&unique, my_info->writer.get_unique());
- atomic.add_fetch(&distinct, my_info->writer.get_distinct());
- atomic.add_fetch(&total, my_info->writer.get_total());
- atomic.set_to_max(&max_count, my_info->writer.get_max_count());
- }
-}
diff --git a/jellyfish/divisor.hpp b/jellyfish/divisor.hpp
deleted file mode 100644
index 9ef45cb..0000000
--- a/jellyfish/divisor.hpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_DIVISOR_HPP__
-#define __JELLYFISH_DIVISOR_HPP__
-
-#include <stdint.h>
-#include <jellyfish/misc.hpp>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-namespace jellyfish {
- class divisor64 {
- const uint64_t d_;
-#ifdef HAVE_INT128
- const uint16_t p_;
- const unsigned __int128 m_;
-#endif
-
- public:
- explicit divisor64(uint64_t d) :
- d_(d)
-#ifdef HAVE_INT128
- , p_(ceilLog2(d_)),
- m_((div_ceil((unsigned __int128)1 << (64 + p_), (unsigned __int128)d_)) & (uint64_t)-1)
-#endif
- { }
-
- divisor64() :
- d_(0)
-#ifdef HAVE_INT128
- , p_(0), m_(0)
-#endif
- { }
-
- explicit divisor64(const divisor64& rhs) :
- d_(rhs.d_)
-#ifdef HAVE_INT128
- , p_(rhs.p_),
- m_(rhs.m_)
-#endif
- { }
-
- inline uint64_t divide(const uint64_t n) const {
-#ifdef HAVE_INT128
- switch(m_) {
- case 0:
- return n >> p_;
- default:
- const unsigned __int128 n_ = (unsigned __int128)n;
- return (n_ + ((n_ * m_) >> 64)) >> p_;
- }
-#else
- return n / d_;
-#endif
- }
-
- inline uint64_t remainder(uint64_t n) const {
-#ifdef HAVE_INT128
- switch(m_) {
- case 0:
- return n & (((uint64_t)1 << p_) - 1);
- default:
- return n - divide(n) * d_;
- }
-#else
- return n % d_;
-#endif
- }
-
- // Euclidian division: d.division(n, q, r) sets q <- n / d and r
- // <- n % d. This is faster than doing each independently.
- inline void division(uint64_t n, uint64_t &q, uint64_t &r) const {
-#ifdef HAVE_INT128
- switch(m_) {
- case 0:
- q = n >> p_;
- r = n & (((uint64_t)1 << p_) - 1);
- break;
- default:
- q = divide(n);
- r = n - q * d_;
- break;
- }
-#else
- q = n / d_;
- r = n % d_;
-#endif
- }
-
- uint64_t d() const { return d_; }
- uint64_t p() const {
-#ifdef HAVE_INT128
- return p_;
-#else
- return 0;
-#endif
- }
- uint64_t m() const {
-#ifdef HAVE_INT128
- return m_;
-#else
- return 0;
-#endif
- }
- };
-
- inline uint64_t operator/(uint64_t n, const divisor64& d) {
- return d.divide(n);
- }
- inline uint64_t operator%(uint64_t n, const divisor64& d) {
- return d.remainder(n);
- }
-}
-
-inline std::ostream& operator<<(std::ostream& os, const jellyfish::divisor64& d) {
- return os << "d:" << d.d() << ",p:" << d.p() << ",m:" << d.m();
-}
-
-#endif /* __JELLYFISH_DIVISOR_HPP__ */
-
diff --git a/jellyfish/dna_codes.cc b/jellyfish/dna_codes.cc
deleted file mode 100644
index 85f1f09..0000000
--- a/jellyfish/dna_codes.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <jellyfish/dna_codes.hpp>
-
-#define R -1
-#define I -2
-#define O -3
-#define A 0
-#define C 1
-#define G 2
-#define T 3
-const char jellyfish::dna_codes[256] = {
- O, O, O, O, O, O, O, O, O, O, I, O, O, O, O, O,
- O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- O, O, O, O, O, O, O, O, O, O, O, O, O, R, O, O,
- O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- O, A, R, C, R, O, O, G, R, O, O, R, O, R, R, O,
- O, O, R, R, T, O, R, R, R, R, O, O, O, O, O, O,
- O, A, R, C, R, O, O, G, R, O, O, R, O, R, R, O,
- O, O, R, R, T, O, R, R, R, R, O, O, O, O, O, O,
- O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O
-};
-
diff --git a/jellyfish/dna_codes.hpp b/jellyfish/dna_codes.hpp
deleted file mode 100644
index 80e92cd..0000000
--- a/jellyfish/dna_codes.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __DNA_CODE_HPP__
-#define __DNA_CODE_HPP__
-
-#include <limits>
-#include <jellyfish/misc.hpp>
-
-namespace jellyfish {
-static const uint_t CODE_A = 0;
-static const uint_t CODE_C = 0;
-static const uint_t CODE_G = 0;
-static const uint_t CODE_T = 0;
-// Non DNA codes have the MSB on
-static const uint_t CODE_RESET = (uint_t)-1;
-static const uint_t CODE_IGNORE = (uint_t)-2;
-static const uint_t CODE_COMMENT = (uint_t)-3;
-static const uint_t CODE_NOT_DNA = ((uint_t)1) << (bsizeof(uint_t) - 1);
-extern const char dna_codes[256];
-};
-
-#endif /* __DNA_CODE_HPP__ */
diff --git a/jellyfish/double_fifo_input.hpp b/jellyfish/double_fifo_input.hpp
deleted file mode 100644
index 19fa2b8..0000000
--- a/jellyfish/double_fifo_input.hpp
+++ /dev/null
@@ -1,192 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_DOUBLE_FIFO_INPUT__
-#define __JELLYFISH_DOUBLE_FIFO_INPUT__
-
-#include <jellyfish/concurrent_queues.hpp>
-#include <jellyfish/locks_pthread.hpp>
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/err.hpp>
-#include <jellyfish/time.hpp>
-
-#include <iostream>
-#include <fstream>
-#include <pthread.h>
-#include <assert.h>
-
-namespace jellyfish {
- /* Double lock free fifo containing elements of type T.
- *
- * The input thread, created by this class, runs the virtual
- * function 'fill' to fill up tockens from the wq (to be Written
- * tocken Queue) and append then into the rq (to be Read tocken
- * Queue).
- *
- * next() returns a pointer to a filled tocken. If the queue is
- * empty, it will sleep some (start with 1/100th +/- 50%, and
- * exponential back off) to give time for the queue to fill up.
- */
- template<typename T>
- class double_fifo_input {
- define_error_class(Error);
- typedef concurrent_queue<T> queue;
-
- // The only transitions are:
- // WORKING -> SLEEPING -> WAKENING -> WORKING
- enum state_t { WORKING, SLEEPING, WAKENING };
-
- queue rq, wq;
- T * buckets;
- const unsigned long nb_buckets;
- state_t volatile state;
- pthread_t input_id;
- locks::pthread::cond full_queue;
-
- static void *static_input_routine(void *arg);
- void input_routine();
-
- public:
- typedef T bucket_t;
- explicit double_fifo_input(unsigned long _nb_buckets);
- virtual ~double_fifo_input();
-
- virtual void fill() = 0;
- T *next();
- void release(T *bucket);
- bool is_closed() { return rq.is_closed(); }
-
- typedef T *bucket_iterator;
- bucket_iterator bucket_begin() const { return buckets; }
- bucket_iterator bucket_end() const { return buckets + nb_buckets; }
-
- protected:
- // Get bucket to fill and release.
- T *write_next();
- void write_release(T *bucket);
- void close() { rq.close(); }
-
- private:
- // Wake up input thread if it was sleeping. Returns previous
- // state.
- state_t input_wake();
- };
-
- /****/
-
- template<typename T>
- double_fifo_input<T>::double_fifo_input(unsigned long _nb_buckets) :
- rq(_nb_buckets), wq(_nb_buckets), nb_buckets(_nb_buckets), state(WORKING),
- input_id(0)
- {
- buckets = new T[nb_buckets];
-
- for(unsigned long i = 0; i < nb_buckets; ++i)
- wq.enqueue(&buckets[i]);
-
- if(pthread_create(&input_id, 0, static_input_routine, (void *)this) != 0)
- eraise(Error) << "Failed creating input thread" << err::no;
- }
-
- template<typename T>
- double_fifo_input<T>::~double_fifo_input() {
- if(input_id)
- if(pthread_cancel(input_id)) {
- void *input_return;
- pthread_join(input_id, &input_return);
- }
- delete [] buckets;
- }
-
- template<typename T>
- void *double_fifo_input<T>::static_input_routine(void *arg) {
- double_fifo_input *o = (double_fifo_input *)arg;
- o->input_routine();
- return 0;
- }
-
- template<typename T>
- void double_fifo_input<T>::input_routine() {
- state_t prev_state;
-
- while(!rq.is_closed()) {
- // The write queue is full or this is the first iteration, sleep
- // until it become less than some threshold
- full_queue.lock();
- prev_state = atomic::gcc::cas(&state, WORKING, SLEEPING);
- assert(prev_state == WORKING);
- do {
- full_queue.wait();
- } while(state != WAKENING);
- prev_state = atomic::gcc::cas(&state, WAKENING, WORKING);
- assert(prev_state == WAKENING);
- full_queue.unlock();
-
- fill();
- }
- }
-
- template<typename T>
- typename double_fifo_input<T>::state_t double_fifo_input<T>::input_wake() {
- state_t prev_state = atomic::gcc::cas(&state, SLEEPING, WAKENING);
- assert(prev_state >= WORKING && prev_state <= WAKENING);
- if(prev_state == SLEEPING) {
- full_queue.lock();
- full_queue.signal();
- full_queue.unlock();
- }
- return prev_state;
- }
-
- template<typename T>
- T *double_fifo_input<T>::next() {
- if(rq.is_low()) // && !rq.is_closed())
- input_wake();
-
- T *res = 0;
- while(!(res = rq.dequeue())) {
- if(rq.is_closed())
- return 0;
- input_wake();
- // TODO Should we wait on a lock instead when the input thread is
- // already in working state (i.e. it is most likely blocked on
- // some I/O).
- static struct timespec time_sleep = { 0, 10000000 };
- nanosleep(&time_sleep, NULL);
- }
-
- return res;
- }
-
- template<typename T>
- void double_fifo_input<T>::release(T *bucket) {
- assert(bucket - buckets >= 0 && (unsigned long)(bucket - buckets) < nb_buckets);
- wq.enqueue(bucket);
- }
-
- template<typename T>
- T *double_fifo_input<T>::write_next() {
- return wq.dequeue();
- }
-
- template<typename T>
- void double_fifo_input<T>::write_release(T *bucket) {
- assert(bucket - buckets >= 0 && (unsigned long)(bucket - buckets) < nb_buckets);
- rq.enqueue(bucket);
- }
-}
-
-#endif
diff --git a/jellyfish/dump_fastq_main.cc b/jellyfish/dump_fastq_main.cc
deleted file mode 100644
index c8b31ed..0000000
--- a/jellyfish/dump_fastq_main.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <float.h>
-#include <iostream>
-#include <fstream>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/fastq_dumper.hpp>
-#include <jellyfish/dump_fastq_main_cmdline.hpp>
-#include <jellyfish/fstream_default.hpp>
-
-int dump_fastq_main(int argc, char *argv[])
-{
- dump_fastq_main_args args(argc, argv);
-
- ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
- if(!out.good())
- die << "Error opening output file '" << args.output_arg << "'" << err::no;
-
- fastq_storage_t *hash =
- raw_fastq_dumper_t::read(args.db_arg);
- if(args.verbose_flag)
- std::cerr <<
- "k-mer length (bases): " << (hash->get_key_len() / 2) << "\n"
- "entries : " << hash->get_size() << "\n";
-
- float lower_count = args.lower_count_given ? args.lower_count_arg : 0;
- float upper_count = args.upper_count_given ? args.upper_count_arg : FLT_MAX;
-
- fastq_storage_t::iterator it = hash->iterator_all();
- out << std::scientific;
- if(args.column_flag) {
- char spacer = args.tab_flag ? '\t' : ' ';
- while(it.next()) {
- float val = it.get_val().to_float();
- if(val < lower_count || val > upper_count)
- continue;
- out << it.get_dna_str() << spacer << val << "\n";
- }
- } else {
- while(it.next()) {
- float val = it.get_val().to_float();
- if(val < lower_count || val > upper_count)
- continue;
- out << ">" << val << "\n" << it.get_dna_str() << "\n";
- }
- }
- out.close();
-
- return 0;
-}
diff --git a/jellyfish/dump_fastq_main_cmdline.hpp b/jellyfish/dump_fastq_main_cmdline.hpp
deleted file mode 100644
index 6dd8d71..0000000
--- a/jellyfish/dump_fastq_main_cmdline.hpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __DUMP_FASTQ_MAIN_ARGS_HPP__
-#define __DUMP_FASTQ_MAIN_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class dump_fastq_main_args {
-public:
- bool column_flag;
- bool tab_flag;
- double lower_count_arg;
- bool lower_count_given;
- double upper_count_arg;
- bool upper_count_given;
- bool verbose_flag;
- const char * output_arg;
- bool output_given;
- yaggo::string db_arg;
-
- enum {
- USAGE_OPT = 1000
- };
-
- dump_fastq_main_args() :
- column_flag(false),
- tab_flag(false),
- lower_count_arg(), lower_count_given(false),
- upper_count_arg(), upper_count_given(false),
- verbose_flag(false),
- output_arg(""), output_given(false)
- { }
-
- dump_fastq_main_args(int argc, char* argv[]) :
- column_flag(false),
- tab_flag(false),
- lower_count_arg(), lower_count_given(false),
- upper_count_arg(), upper_count_given(false),
- verbose_flag(false),
- output_arg(""), output_given(false)
- { parse(argc, argv); }
-
- void parse(int argc, char* argv[]) {
- static struct option long_options[] = {
- {"column", 0, 0, 'c'},
- {"tab", 0, 0, 't'},
- {"lower-count", 1, 0, 'L'},
- {"upper-count", 1, 0, 'U'},
- {"verbose", 0, 0, 'v'},
- {"output", 1, 0, 'o'},
- {"help", 0, 0, 'h'},
- {"usage", 0, 0, USAGE_OPT},
- {"version", 0, 0, 'V'},
- {0, 0, 0, 0}
- };
- static const char *short_options = "hVctL:U:vo:";
-
- std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
- while(true) {
- int index = -1;
- int c = getopt_long(argc, argv, short_options, long_options, &index);
- if(c == -1) break;
- switch(c) {
- case ':':
- std::cerr << "Missing required argument for "
- << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
- << std::endl;
- exit(1);
- case 'h':
- std::cout << usage() << "\n\n" << help() << std::endl;
- exit(0);
- case USAGE_OPT:
- std::cout << usage() << "\nUse --help for more information." << std::endl;
- exit(0);
- case 'V':
- print_version();
- exit(0);
- case '?':
- std::cerr << "Use --usage or --help for some help\n";
- exit(1);
- case 'c':
- column_flag = true;
- break;
- case 't':
- tab_flag = true;
- break;
- case 'L':
- lower_count_given = true;
- lower_count_arg = yaggo::conv_double((const char *)optarg, err, false);
- CHECK_ERR(double_t, optarg, "-L, --lower-count=double")
- break;
- case 'U':
- upper_count_given = true;
- upper_count_arg = yaggo::conv_double((const char *)optarg, err, false);
- CHECK_ERR(double_t, optarg, "-U, --upper-count=double")
- break;
- case 'v':
- verbose_flag = true;
- break;
- case 'o':
- output_given = true;
- output_arg = optarg;
- break;
- }
- }
-
- // Parse arguments
- if(argc - optind != 1)
- error("Requires exactly 1 argument.");
- db_arg = yaggo::string(argv[optind]);
- ++optind;
- }
-
-#define dump_fastq_main_args_USAGE "Usage: jellyfish qdump [options] db:path"
- const char * usage() const { return dump_fastq_main_args_USAGE; }
- void error(const char *msg) {
- std::cerr << "Error: " << msg << "\n" << usage()
- << "\nUse --help for more information"
- << std::endl;
- exit(1);
- }
-
-#define dump_fastq_main_args_HELP "Dump k-mer from a qmer database\n\nBy default, dump in a fasta format where the header is the count and\n" \
- "the sequence is the sequence of the k-mer. The column format is a 2\n" \
- "column output: k-mer count.\n\n" \
- "Options (default value in (), *required):\n" \
- " -c, --column Column format (false)\n" \
- " -t, --tab Tab separator (false)\n" \
- " -L, --lower-count=double Don't output k-mer with count < lower-count\n" \
- " -U, --upper-count=double Don't output k-mer with count > upper-count\n" \
- " -v, --verbose Be verbose (false)\n" \
- " -o, --output=string Output file\n" \
- " --usage Usage\n" \
- " -h, --help This message\n" \
- " -V, --version Version"
-
- const char * help() const { return dump_fastq_main_args_HELP; }
-#define dump_fastq_main_args_HIDDEN "Hidden options:"
-
- const char * hidden() const { return dump_fastq_main_args_HIDDEN; }
- void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
- os << PACKAGE_VERSION << "\n";
- }
- void dump(std::ostream &os = std::cout) {
- os << "column_flag:" << column_flag << "\n";
- os << "tab_flag:" << tab_flag << "\n";
- os << "lower_count_given:" << lower_count_given << " lower_count_arg:" << lower_count_arg << "\n";
- os << "upper_count_given:" << upper_count_given << " upper_count_arg:" << upper_count_arg << "\n";
- os << "verbose_flag:" << verbose_flag << "\n";
- os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
- os << "db_arg:" << db_arg << "\n";
- }
-private:
-};
-
-#endif // __DUMP_FASTQ_MAIN_ARGS_HPP__"
diff --git a/jellyfish/dump_main.cc b/jellyfish/dump_main.cc
deleted file mode 100644
index 187d29d..0000000
--- a/jellyfish/dump_main.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <iostream>
-#include <fstream>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/compacted_hash.hpp>
-#include <jellyfish/dump_main_cmdline.hpp>
-#include <jellyfish/fstream_default.hpp>
-
-dump_args args; // Command line switches and arguments
-
-template<typename iterator>
-void dump(iterator& it, std::ostream &out,
- const dump_args &args, uint64_t lower_count, uint64_t upper_count) {
- if(args.column_flag) {
- char spacer = args.tab_flag ? '\t' : ' ';
- while(it.next()) {
- if(it.get_val() < lower_count || it.get_val() > upper_count)
- continue;
- out << it.get_dna_str() << spacer << it.get_val() << "\n";
- }
- } else {
- while(it.next()) {
- if(it.get_val() < lower_count || it.get_val() > upper_count)
- continue;
- out << ">" << it.get_val() << "\n" << it.get_dna_str() << "\n";
- }
- }
-}
-
-void dump_mapped_file(mapped_file& dbf, std::ostream& out) {
- dbf.sequential().will_need();
- char type[8];
- memcpy(type, dbf.base(), sizeof(type));
-
- uint64_t lower_count = args.lower_count_given ? args.lower_count_arg : 0;
- uint64_t upper_count = args.upper_count_given ? args.upper_count_arg : (uint64_t)-1;
-
- if(!strncmp(type, jellyfish::compacted_hash::file_type, sizeof(type))) {
- hash_query_t hash(dbf);
- hash_query_t::iterator it = hash.iterator_all();
- dump(it, out, args, lower_count, upper_count);
- } else if(!strncmp(type, jellyfish::raw_hash::file_type, sizeof(type))) {
- raw_inv_hash_query_t hash(dbf);
- raw_inv_hash_query_t::iterator it = hash.iterator_all();
- dump(it, out, args, lower_count, upper_count);
- } else {
- die << "Invalid file type '" << err::substr(type, sizeof(type)) << "'.";
- }
-}
-
-int dump_main(int argc, char *argv[])
-{
- args.parse(argc, argv);
-
- ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
- if(!out.good())
- die << "Error opening output file '" << args.output_arg << "'";
-
- bool dumped = false;
- try {
- mapped_file dbf(args.db_arg.c_str());
- dump_mapped_file(dbf, out);
- dumped = true;
- } catch(mapped_file::ErrorMMap) {
- dumped = false;
- }
-
- if(!dumped) { // Memory map failed. Try streaming
- hash_reader_t hash(args.db_arg.c_str());
- uint64_t lower_count = args.lower_count_given ? args.lower_count_arg : 0;
- uint64_t upper_count = args.upper_count_given ? args.upper_count_arg : (uint64_t)-1;
- dump(hash, out, args, lower_count, upper_count);
- }
-
- out.close();
-
- return 0;
-}
diff --git a/jellyfish/dump_main_cmdline.hpp b/jellyfish/dump_main_cmdline.hpp
deleted file mode 100644
index 8da8b68..0000000
--- a/jellyfish/dump_main_cmdline.hpp
+++ /dev/null
@@ -1,151 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __DUMP_ARGS_HPP__
-#define __DUMP_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class dump_args {
-public:
- bool column_flag;
- bool tab_flag;
- uint64_t lower_count_arg;
- bool lower_count_given;
- uint64_t upper_count_arg;
- bool upper_count_given;
- const char * output_arg;
- bool output_given;
- yaggo::string db_arg;
-
- enum {
- USAGE_OPT = 1000
- };
-
- dump_args() :
- column_flag(false),
- tab_flag(false),
- lower_count_arg(), lower_count_given(false),
- upper_count_arg(), upper_count_given(false),
- output_arg(""), output_given(false)
- { }
-
- dump_args(int argc, char* argv[]) :
- column_flag(false),
- tab_flag(false),
- lower_count_arg(), lower_count_given(false),
- upper_count_arg(), upper_count_given(false),
- output_arg(""), output_given(false)
- { parse(argc, argv); }
-
- void parse(int argc, char* argv[]) {
- static struct option long_options[] = {
- {"column", 0, 0, 'c'},
- {"tab", 0, 0, 't'},
- {"lower-count", 1, 0, 'L'},
- {"upper-count", 1, 0, 'U'},
- {"output", 1, 0, 'o'},
- {"help", 0, 0, 'h'},
- {"usage", 0, 0, USAGE_OPT},
- {"version", 0, 0, 'V'},
- {0, 0, 0, 0}
- };
- static const char *short_options = "hVctL:U:o:";
-
- std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
- while(true) {
- int index = -1;
- int c = getopt_long(argc, argv, short_options, long_options, &index);
- if(c == -1) break;
- switch(c) {
- case ':':
- std::cerr << "Missing required argument for "
- << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
- << std::endl;
- exit(1);
- case 'h':
- std::cout << usage() << "\n\n" << help() << std::endl;
- exit(0);
- case USAGE_OPT:
- std::cout << usage() << "\nUse --help for more information." << std::endl;
- exit(0);
- case 'V':
- print_version();
- exit(0);
- case '?':
- std::cerr << "Use --usage or --help for some help\n";
- exit(1);
- case 'c':
- column_flag = true;
- break;
- case 't':
- tab_flag = true;
- break;
- case 'L':
- lower_count_given = true;
- lower_count_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, "-L, --lower-count=uint64")
- break;
- case 'U':
- upper_count_given = true;
- upper_count_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, "-U, --upper-count=uint64")
- break;
- case 'o':
- output_given = true;
- output_arg = optarg;
- break;
- }
- }
-
- // Parse arguments
- if(argc - optind != 1)
- error("Requires exactly 1 argument.");
- db_arg = yaggo::string(argv[optind]);
- ++optind;
- }
-
-#define dump_args_USAGE "Usage: jellyfish dump [options] db:path"
- const char * usage() const { return dump_args_USAGE; }
- void error(const char *msg) {
- std::cerr << "Error: " << msg << "\n" << usage()
- << "\nUse --help for more information"
- << std::endl;
- exit(1);
- }
-
-#define dump_args_HELP "Dump k-mer counts\n\nBy default, dump in a fasta format where the header is the count and\n" \
- "the sequence is the sequence of the k-mer. The column format is a 2\n" \
- "column output: k-mer count.\n\n" \
- "Options (default value in (), *required):\n" \
- " -c, --column Column format (false)\n" \
- " -t, --tab Tab separator (false)\n" \
- " -L, --lower-count=uint64 Don't output k-mer with count < lower-count\n" \
- " -U, --upper-count=uint64 Don't output k-mer with count > upper-count\n" \
- " -o, --output=string Output file\n" \
- " --usage Usage\n" \
- " -h, --help This message\n" \
- " -V, --version Version"
-
- const char * help() const { return dump_args_HELP; }
-#define dump_args_HIDDEN "Hidden options:"
-
- const char * hidden() const { return dump_args_HIDDEN; }
- void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
- os << PACKAGE_VERSION << "\n";
- }
- void dump(std::ostream &os = std::cout) {
- os << "column_flag:" << column_flag << "\n";
- os << "tab_flag:" << tab_flag << "\n";
- os << "lower_count_given:" << lower_count_given << " lower_count_arg:" << lower_count_arg << "\n";
- os << "upper_count_given:" << upper_count_given << " upper_count_arg:" << upper_count_arg << "\n";
- os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
- os << "db_arg:" << db_arg << "\n";
- }
-private:
-};
-
-#endif // __DUMP_ARGS_HPP__"
diff --git a/jellyfish/dumper.hpp b/jellyfish/dumper.hpp
deleted file mode 100644
index 7d2138b..0000000
--- a/jellyfish/dumper.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_DUMPER_HPP__
-#define __JELLYFISH_DUMPER_HPP__
-
-#include <iostream>
-#include <fstream>
-#include <sstream>
-#include <jellyfish/err.hpp>
-#include <jellyfish/time.hpp>
-
-/**
- * A dumper is responsible to dump the hash array to permanent storage
- * and zero out the array.
- **/
-namespace jellyfish {
- class dumper_t {
- Time writing_time;
- public:
- define_error_class(ErrorWriting);
-
- protected:
- void open_next_file(const char *prefix, int *index, std::ofstream &out) {
- int eindex = atomic::gcc::fetch_add(index, (int)1);
- std::ostringstream file_path;
- file_path << prefix << "_" << eindex;
-
- out.open(file_path.str().c_str());
- if(out.fail())
- eraise(ErrorWriting) << "'" << file_path.str() << "': "
- << "Can't open file for writing" << err::no;
- }
-
- public:
- dumper_t() : writing_time(::Time::zero) {}
- void dump() {
- Time start;
- _dump();
- Time end;
- writing_time += end - start;
- }
- virtual void _dump() = 0;
- Time get_writing_time() const { return writing_time; }
- virtual ~dumper_t() {};
- };
-}
-#endif // __DUMPER_HPP__
diff --git a/jellyfish/eLut.h b/jellyfish/eLut.h
deleted file mode 100644
index f028cdb..0000000
--- a/jellyfish/eLut.h
+++ /dev/null
@@ -1,71 +0,0 @@
-//
-// This is an automatically generated file.
-// Do not edit.
-//
-
-{
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1024, 2048, 3072, 4096, 5120, 6144, 7168,
- 8192, 9216, 10240, 11264, 12288, 13312, 14336, 15360,
- 16384, 17408, 18432, 19456, 20480, 21504, 22528, 23552,
- 24576, 25600, 26624, 27648, 28672, 29696, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 33792, 34816, 35840, 36864, 37888, 38912, 39936,
- 40960, 41984, 43008, 44032, 45056, 46080, 47104, 48128,
- 49152, 50176, 51200, 52224, 53248, 54272, 55296, 56320,
- 57344, 58368, 59392, 60416, 61440, 62464, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
diff --git a/jellyfish/err.hpp b/jellyfish/err.hpp
deleted file mode 100644
index e960aa3..0000000
--- a/jellyfish/err.hpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __ERR_HPP__
-#define __ERR_HPP__
-
-#include <iostream>
-#include <iomanip>
-#include <sstream>
-#include <exception>
-#include <stdexcept>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#if HAVE_DECL_STRERROR_R == 0
-#ifdef STRERROR_R_CHAR_P
-extern char* strerror_r(int, char*, size_t);
-#else
-extern int strerror_r(int, char*, size_t);
-#endif
-#endif
-
-namespace err {
- class code {
- int _code;
- public:
- explicit code(int c) : _code(c) {}
- int get_code() const { return _code; }
- };
-
- class no_t {
- public:
- no_t() {}
- static void write(std::ostream &os, int e) {
- char err_str[1024];
- char* str;
-
-#ifdef STRERROR_R_CHAR_P
- str = strerror_r(e, err_str, sizeof(err_str));
- if(!str) { // Should never happen
- strcpy(err_str, "error");
- str = err_str;
- }
-#else
- int err = strerror_r(e, err_str, sizeof(err_str));
- if(err)
- strcpy(err_str, "error");
- str = err_str;
-#endif
- os << ": " << str;
- }
- };
- static const no_t no;
- std::ostream &operator<<(std::ostream &os, const err::no_t &x);
-
- class substr {
- const char *_s;
- const size_t _l;
- public:
- substr(const char *s, size_t len) : _s(s), _l(len) {}
- friend std::ostream &operator<<(std::ostream &os, const substr &ss);
- };
-
- class die_t {
- int _code;
- int _errno;
- public:
- die_t() : _code(1), _errno(errno) {}
- explicit die_t(int c) : _code(c), _errno(errno) {}
- ~die_t() {
- std::cerr << std::endl;
- exit(_code);
- }
-
- die_t & operator<<(const code &x) {
- _code = x.get_code();
- return *this;
- }
- die_t & operator<<(const no_t &x) {
- x.write(std::cerr, _errno);
- return *this;
- }
- die_t & operator<<(const char *a[]) {
- for(int i = 0; a[i]; i++)
- std::cerr << (i ? "\n" : "") << a[i];
- return *this;
- }
- die_t & operator<<(const std::exception &e) {
- std::cerr << e.what();
- return *this;
- }
- template<typename T>
- die_t & operator<<(const T &x) {
- std::cerr << x;
- return *this;
- }
- };
-
- template<typename err_t>
- class raise_t {
- int _errno;
- std::ostringstream oss;
- public:
- raise_t() : _errno(errno) {}
- ~raise_t() { throw err_t(oss.str()); }
-
- raise_t & operator<<(const no_t &x) {
- x.write(oss, _errno);
- return *this;
- }
- template<typename T>
- raise_t & operator<<(const T &x) {
- oss << x;
- return *this;
- }
- };
-}
-
-
-#define die if(1) err::die_t()
-#define eraise(e) if(1) err::raise_t<e>()
-#define define_error_class(name) \
- class name : public std::runtime_error { \
- public: explicit name(const std::string &txt) : std::runtime_error(txt) {} \
- }
-
-#endif
diff --git a/jellyfish/fastq_dumper.hpp b/jellyfish/fastq_dumper.hpp
deleted file mode 100644
index 1613f17..0000000
--- a/jellyfish/fastq_dumper.hpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __FASTQ_DUMPER_HPP__
-#define __FASTQ_DUMPER_HPP__
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/dumper.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/mapped_file.hpp>
-
-namespace jellyfish {
- namespace fastq_hash {
- define_error_class(ErrorReading);
- static const char *file_type = "JFFSTQDN";
- struct header {
- char type[8];
- uint64_t key_len;
- uint64_t size;
- uint64_t max_reprobes;
- uint64_t values_pos;
-
- header(uint64_t _key_len, uint64_t _size, uint64_t _max_reprobes,
- uint64_t _values_pos) :
- key_len(_key_len), size(_size), max_reprobes(_max_reprobes),
- values_pos(_values_pos)
- {
- memcpy(&type, file_type, sizeof(type));
- }
-
- explicit header(const char *ptr) {
- if(memcmp(ptr, file_type, sizeof(type)))
- eraise(ErrorReading) << "Bad file type '" << err::substr(ptr, sizeof(type))
- << "', expected '" << err::substr(file_type, sizeof(type)) << "'";
- memcpy((void *)this, ptr, sizeof(struct header));
- }
- };
-
- template<typename storage_t>
- class raw_dumper : public dumper_t {
- const uint_t threads;
- const std::string file_prefix;
- storage_t *const ary;
- int file_index;
-
- public:
- raw_dumper(uint_t _threads, const char *_file_prefix, size_t chunk_size,
- storage_t *_ary) :
- threads(_threads), file_prefix(_file_prefix),
- ary(_ary), file_index(0) {}
-
- virtual void _dump();
-
- static storage_t * read(const mapped_file &file);
- static storage_t * read(const std::string &file);
- static storage_t * read(const char *file);
- };
-
- template<typename storage_t>
- void raw_dumper<storage_t>::_dump() {
- std::ofstream _out;
- open_next_file(file_prefix.c_str(), &file_index, _out);
-
- // TODO: the zeroing out of the hash is not parallelized.
-
- // Skip header
- _out.seekp(sizeof(struct header));
- // Write matrices
- ary->write_matrices(&_out);
- // Write key set
- ary->write_keys_blocks(&_out, 0, ary->get_size());
- std::streampos pos = _out.tellp();
- ary->zero_keys(0, ary->get_size());
- // Write values array
- ary->write_values(&_out, 0, ary->get_size());
- ary->zero_values(0, ary->get_size());
- // Update header
- _out.seekp(0);
- struct header header(ary->get_key_len(), ary->get_size(),
- ary->get_max_reprobe(), pos);
- _out.write((char *)&header, sizeof(header));
- _out.close();
- }
-
- template<typename storage_t>
- storage_t * raw_dumper<storage_t>::read(const std::string &file) {
- mapped_file mf(file.c_str());
- return read(mf);
- }
-
- template<typename storage_t>
- storage_t * raw_dumper<storage_t>::read(const char *file) {
- mapped_file mf(file);
- return read(mf);
- }
-
- template<typename storage_t>
- storage_t * raw_dumper<storage_t>::read(const mapped_file &mf) {
- if(mf.length() < sizeof(struct header))
- eraise(ErrorReading) << "File '" << mf.path()
- << "' too short. Should be at least '"
- << sizeof(struct header) << "' bytes";
-
- struct header header(mf.base());
- size_t off = sizeof(header);
- SquareBinaryMatrix hash_matrix, hash_inv_matrix;
- off += hash_matrix.read(mf.base() + off);
- off += hash_inv_matrix.read(mf.base() + off);
- return new storage_t(mf.base() + off,
- mf.base() + header.values_pos,
- header.size, header.key_len, header.max_reprobes,
- jellyfish::quadratic_reprobes, hash_matrix,
- hash_inv_matrix);
- }
- }
-}
-
-#endif
diff --git a/jellyfish/file_parser.cc b/jellyfish/file_parser.cc
deleted file mode 100644
index e374220..0000000
--- a/jellyfish/file_parser.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/file_parser.hpp>
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/time.hpp>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <assert.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-
-int jellyfish::file_parser::file_peek(const char *path, char *peek) {
- int fd = open(path, O_RDONLY);
- if(fd == -1)
- eraise(FileParserError) << "Error opening file '"
- << path << "'" << err::no;
-
- if(read(fd, peek, 1) <= 0)
- eraise(FileParserError) << "Empty input file '" << path << "'" << err::no;
-
- return fd;
-}
-
-jellyfish::file_parser::file_parser(int fd, const char *path,
- const char *str, size_t len, char pbase) :
- _fd(fd), _base(pbase), _pbase(pbase) {
-
- struct stat stat_buf;
- if(fstat(fd, &stat_buf) == -1)
- eraise(FileParserError) << "Can't fstat '" << path << "'" << err::no;
- _size = stat_buf.st_size;
- if(_do_mmap) {
- _buffer = (char *)mmap(0, _size , PROT_READ, MAP_PRIVATE, fd, 0);
- _is_mmapped = _buffer != MAP_FAILED;
- } else {
- _is_mmapped = false;
- }
- if(_is_mmapped) {
- _end_buffer = _buffer + _size;
- _data = _buffer;
- _end_data = _end_buffer;
- close(_fd);
- } else {
- if(_force_mmap)
- eraise(FileParserError) << "Cannot mmap file '" << path
- << "' as required";
- _buffer = new char[_buff_size];
- _end_buffer = _buffer + _buff_size;
- _data = _end_data = _buffer;
- // What if len > _buff_size!!!
- if(str && len) {
- memcpy(_buffer, str, len);
- _end_data = _buffer + len;
- }
- }
-}
-
-jellyfish::file_parser::~file_parser() {
- if(_is_mmapped) {
- munmap(_buffer, _size);
- } else {
- delete[] _buffer;
- close(_fd);
- }
-}
-
-bool jellyfish::file_parser::read_next_buffer() {
- if(_is_mmapped)
- return false;
- ssize_t gcount = read(_fd, _buffer, _buff_size);
- if(gcount <= 0)
- return false;
- _data = _buffer;
- _end_data = _buffer + gcount;
-
- return true;
-}
-
-bool jellyfish::file_parser::_do_mmap = true;
-bool jellyfish::file_parser::_force_mmap = false;
-
diff --git a/jellyfish/file_parser.hpp b/jellyfish/file_parser.hpp
deleted file mode 100644
index a6cdd37..0000000
--- a/jellyfish/file_parser.hpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_FILE_PARSER_HPP__
-#define __JELLYFISH_FILE_PARSER_HPP__
-
-#include <iostream>
-#include <fstream>
-#include <unistd.h>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/time.hpp>
-
-namespace jellyfish {
- class file_parser {
- int _fd;
- int _base, _pbase;
- char *_buffer;
- const char *_end_buffer;
- const char *_data;
- const char *_end_data;
- size_t _size;
- bool _is_mmapped;
-
- static bool _do_mmap;
- static bool _force_mmap;
-
- protected:
- define_error_class(FileParserError);
- // Get next character in "stream"
- inline int sbumpc() {
- _pbase = _base;
- if(_data >= _end_data)
- if(!read_next_buffer())
- return _base = _eof;
- return (_base = *_data++);
- }
- int speekc() {
- if(_data >= _end_data)
- if(!read_next_buffer())
- return _eof;
- return *_data;
- }
-
-
- public:
- static const size_t _buff_size = 1024 * 1024;
- static const int _eof = -1;
-
- // [str, str+len) is content on initial buffer
- file_parser(int fd, const char *path, const char *str, size_t len,
- char pbase = '\n');
- ~file_parser();
-
- static bool do_mmap() { return _do_mmap; };
- static bool do_mmap(bool new_value) { bool oval = _do_mmap; _do_mmap = new_value; return oval; }
- // throw an error if mmap fails
- static bool force_mmap();
- static bool force_mmap(bool new_value);
- static int file_peek(const char *path, char *peek);
-
- // current base and previous base
- int base() const { return _base; }
- int pbase() const { return _pbase; }
- bool eof() const { return _base == _eof; }
-
- // ptr to base. Valid only for mmaped files
- const char *ptr() const { return _data; }
- const char *base_ptr() const { return _data - 1; }
- const char *pbase_ptr() const { return _data; }
-
- private:
- // Buffers next chunk of data. Returns _eof if at end of file or next character
- bool read_next_buffer();
- };
-}
-
-#endif
diff --git a/jellyfish/floats.cc b/jellyfish/floats.cc
deleted file mode 100644
index 2c1b5cd..0000000
--- a/jellyfish/floats.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/floats.hpp>
-
-namespace jellyfish {
- std::ostream &operator<<(std::ostream &os, const Float &f) {
- return os << f.v.fv;
- }
-}
diff --git a/jellyfish/floats.hpp b/jellyfish/floats.hpp
deleted file mode 100644
index 06042c2..0000000
--- a/jellyfish/floats.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_FLOATS_HPP__
-#define __JELLYFISH_FLOATS_HPP__
-
-#include <stdint.h>
-#include <iostream>
-#ifdef HALF_FLOATS
-#include <jellyfish/half.h>
-#endif
-
-namespace jellyfish {
- class Float {
- public:
-#ifdef HALF_FLOATS
- typedef uint16_t bits_t;
- typedef half float_t;
-#else
- typedef uint32_t bits_t;
- typedef float float_t;
-#endif
-
- private:
- union float_int {
- float_t fv;
- bits_t iv;
- explicit float_int(float_t v) : fv(v) {}
- explicit float_int(bits_t v) : iv(v) {}
- };
- float_int v;
-
- public:
- Float() : v(0.0f) {}
- explicit Float(int _v) : v((bits_t)_v) {}
- explicit Float(float_t _v) : v(_v) {}
- explicit Float(bits_t _v) : v(_v) {}
-
- // static const Float zero;
- // static const Float one;
-
- const Float operator+(const Float &y) const {
- return Float(v.fv + y.v.fv);
- }
- const Float operator+(const float& y) const {
- return Float(v.fv + y);
- }
-
- bits_t bits() const { return v.iv; };
- float_t to_float() const { return v.fv; };
-
- // Should we use the floating point ==?
- bool operator==(Float o) { return v.iv == o.v.iv; }
- friend std::ostream &operator<<(std::ostream &os, const Float &f);
- };
-}
-
-#endif
diff --git a/jellyfish/generate_sequence.cc b/jellyfish/generate_sequence.cc
index 47630c9..c1f4eb9 100644
--- a/jellyfish/generate_sequence.cc
+++ b/jellyfish/generate_sequence.cc
@@ -21,13 +21,14 @@
#include <jellyfish/err.hpp>
#include <jellyfish/misc.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
#include <jellyfish/randomc.h>
#include <jellyfish/generate_sequence_cmdline.hpp>
+namespace err = jellyfish::err;
+
class rDNAg_t {
public:
- explicit rDNAg_t(CRandomMersenne *_rng) : rng(_rng), i(15), buff(0) {}
+ rDNAg_t(CRandomMersenne *_rng) : rng(_rng), i(15), buff(0) {}
char letter() {
i = (i+1) % 16;
if(i == 0)
@@ -47,6 +48,43 @@ private:
};
const char rDNAg_t::letters[4] = { 'A', 'C', 'G', 'T' };
+// Output matrix
+ // Generate matrices
+ // uint64_t lines[64];
+ // for(unsigned int j = 0; j < args.mer_arg.size(); j++) {
+ // if(args.mer_arg[j] <= 0 || args.mer_arg[j] > 31)
+ // die << "Mer size (" << args.mer_arg[j] << ") must be between 1 and 31.";
+ // int matrix_size = args.mer_arg[j] << 1;
+ // SquareBinaryMatrix mat(matrix_size), inv(matrix_size);
+ // while(true) {
+ // for(int i = 0; i < matrix_size; i++)
+ // lines[i] = (uint64_t)rng.BRandom() | ((uint64_t)rng.BRandom() << 32);
+ // mat = SquareBinaryMatrix(lines, matrix_size);
+ // try {
+ // inv = mat.inverse();
+ // break;
+ // } catch(SquareBinaryMatrix::SingularMatrix &e) {}
+ // }
+
+ // char path[4096];
+ // int len = snprintf(path, sizeof(path), "%s_matrix_%d", args.output_arg,
+ // args.mer_arg[j]);
+ // if(len < 0)
+ // die << "Error creating the matrix file '" << path << "'" << err::no;
+ // if((unsigned int)len >= sizeof(path))
+ // die << "Output prefix too long '" << args.output_arg << "'";
+ // std::ofstream fd(path);
+ // if(!fd.good())
+ // die << "Can't open matrix file '" << path << "'" << err::no;
+ // if(args.verbose_flag)
+ // std::cout << "Creating matrix file '" << path << "'\n";
+ // mat.dump(&fd);
+ // if(!fd.good())
+ // die << "Error while writing matrix '" << path << "'" << err::no;
+ // fd.close();
+ // }
+
+
void create_path(char *path, unsigned int path_size, const char *ext, bool many, int i, const char *output_arg) {
int len;
if(many)
@@ -54,112 +92,89 @@ void create_path(char *path, unsigned int path_size, const char *ext, bool many,
else
len = snprintf(path, path_size, "%s.%s", output_arg, ext);
if(len < 0)
- die << "Error creating the fasta file '" << path << "'" << err::no;
+ die(err::msg() << "Error creating the fasta file '" << path << "': " << err::no);
if((unsigned int)len >= path_size)
- die << "Output prefix too long '" << output_arg << "'";
+ die(err::msg() << "Output prefix too long '" << output_arg << "'");
+}
+
+generate_sequence_args args;
+
+void output_fastq(size_t length, const char* path, CRandomMersenne& rng) {
+ rDNAg_t rDNAg(&rng);
+ std::ofstream fd(path);
+ if(!fd.good())
+ die(err::msg() << "Can't open fasta file '" << path << "': " << jellyfish::err::no);
+ if(args.verbose_flag)
+ std::cout << "Creating fastq file '" << path << "'\n";
+
+ size_t total_len = 0;
+ unsigned long read_id = 0;
+ while(total_len < length) {
+ fd << "@read_" << (read_id++) << "\n";
+ int base;
+ for(base = 0; base < 70 && total_len < length; base++, total_len++)
+ fd << rDNAg.letter();
+ fd << "\n+\n";
+ for(int j = 0; j < base; j++)
+ fd << rDNAg.qual_Illumina();
+ fd << "\n";
+ }
+ if(!fd.good())
+ die(err::msg() << "Error while writing fasta file '" << path << "': " << jellyfish::err::no);
+ fd.close();
+}
+
+void output_fasta(size_t length, const char* path, CRandomMersenne& rng) {
+ rDNAg_t rDNAg(&rng);
+ std::ofstream fd(path);
+ if(!fd.good())
+ die(err::msg() << "Can't open fasta file '" << path << "': " << jellyfish::err::no);
+ if(args.verbose_flag)
+ std::cout << "Creating fasta file '" << path << "'\n";
+
+ size_t read_length = args.read_length_given ? args.read_length_arg : length;
+ size_t total_len = 0;
+ size_t read = 0;
+ long rid = 0;
+ fd << ">read" << ++rid << "\n";
+ while(total_len < length) {
+ for(int base = 0; base < 70 && total_len < length && read < read_length;
+ base++) {
+ fd << rDNAg.letter();
+ total_len++;
+ read++;
+ }
+ fd << "\n";
+ if(read >= read_length) {
+ fd << ">read" << ++rid << "\n";
+ read = 0;
+ }
+ }
+ if(!fd.good())
+ die(err::msg() << "Error while writing fasta file '" << path << "': " << jellyfish::err::no);
+ fd.close();
}
int main(int argc, char *argv[])
{
- generate_sequence_args args(argc, argv);
-
+ args.parse(argc, argv);
+
if(args.verbose_flag)
std::cout << "Seed: " << args.seed_arg << "\n";
CRandomMersenne rng(args.seed_arg);
-
- // Generate matrices
- uint64_t lines[64];
- for(unsigned int j = 0; j < args.mer_arg.size(); j++) {
- if(args.mer_arg[j] <= 0 || args.mer_arg[j] > 31)
- die << "Mer size (" << args.mer_arg[j] << ") must be between 1 and 31.";
- int matrix_size = args.mer_arg[j] << 1;
- SquareBinaryMatrix mat(matrix_size), inv(matrix_size);
- while(true) {
- for(int i = 0; i < matrix_size; i++)
- lines[i] = (uint64_t)rng.BRandom() | ((uint64_t)rng.BRandom() << 32);
- mat = SquareBinaryMatrix(lines, matrix_size);
- try {
- inv = mat.inverse();
- break;
- } catch(SquareBinaryMatrix::SingularMatrix &e) {}
- }
- char path[4096];
- int len = snprintf(path, sizeof(path), "%s_matrix_%d", args.output_arg,
- args.mer_arg[j]);
- if(len < 0)
- die << "Error creating the matrix file '" << path << "'" << err::no;
- if((unsigned int)len >= sizeof(path))
- die << "Output prefix too long '" << args.output_arg << "'";
- std::ofstream fd(path);
- if(!fd.good())
- die << "Can't open matrix file '" << path << "'" << err::no;
- if(args.verbose_flag)
- std::cout << "Creating matrix file '" << path << "'\n";
- mat.dump(&fd);
- if(!fd.good())
- die << "Error while writing matrix '" << path << "'" << err::no;
- fd.close();
- }
-
+
+
// Output sequence
- rDNAg_t rDNAg(&rng);
char path[4096];
bool many = args.length_arg.size() > 1;
-
+
for(unsigned int i = 0; i < args.length_arg.size(); ++i) {
- size_t length = args.length_arg[i];
-
if(args.fastq_flag) {
create_path(path, sizeof(path), "fq", many, i, args.output_arg);
- std::ofstream fd(path);
- if(!fd.good())
- die << "Can't open fasta file '" << path << err::no;
- if(args.verbose_flag)
- std::cout << "Creating fastq file '" << path << "'\n";
- size_t total_len = 0;
- unsigned long read_id = 0;
- while(total_len < length) {
- fd << "@read_" << (read_id++) << "\n";
- int base;
- for(base = 0; base < 70 && total_len < length; base++, total_len++)
- fd << rDNAg.letter();
- fd << "\n+\n";
- for(int j = 0; j < base; j++)
- fd << rDNAg.qual_Illumina();
- fd << "\n";
- }
- if(!fd.good())
- die << "Error while writing fasta file '" << path << err::no;
- fd.close();
+ output_fastq(args.length_arg[i], path, rng);
} else {
create_path(path, sizeof(path), "fa", many, i, args.output_arg);
- std::ofstream fd(path);
- if(!fd.good())
- die << "Can't open fasta file '" << path << err::no;
- if(args.verbose_flag)
- std::cout << "Creating fasta file '" << path << "'\n";
-
- size_t read_length = args.read_length_given ? args.read_length_arg : length;
- size_t total_len = 0;
- size_t read = 0;
- long rid = 0;
- fd << ">read" << ++rid << "\n";
- while(total_len < length) {
- for(int base = 0; base < 70 && total_len < length && read < read_length;
- base++) {
- fd << rDNAg.letter();
- total_len++;
- read++;
- }
- fd << "\n";
- if(read >= read_length) {
- fd << ">read" << ++rid << "\n";
- read = 0;
- }
- }
- if(!fd.good())
- die << "Error while writing fasta file '" << path << err::no;
- fd.close();
+ output_fasta(args.length_arg[i], path, rng);
}
}
diff --git a/jellyfish/generate_sequence_cmdline.hpp b/jellyfish/generate_sequence_cmdline.hpp
deleted file mode 100644
index 3fd4345..0000000
--- a/jellyfish/generate_sequence_cmdline.hpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __GENERATE_SEQUENCE_ARGS_HPP__
-#define __GENERATE_SEQUENCE_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class generate_sequence_args {
-public:
- long seed_arg;
- bool seed_given;
- std::vector<uint32_t> mer_arg;
- typedef std::vector<uint32_t>::iterator mer_arg_it;
- typedef std::vector<uint32_t>::const_iterator mer_arg_const_it;
- bool mer_given;
- const char * output_arg;
- bool output_given;
- bool fastq_flag;
- uint32_t read_length_arg;
- bool read_length_given;
- bool verbose_flag;
- std::vector<uint64_t> length_arg;
- typedef std::vector<uint64_t>::iterator length_arg_it;
- typedef std::vector<uint64_t>::const_iterator length_arg_const_it;
-
- enum {
- USAGE_OPT = 1000
- };
-
- generate_sequence_args() :
- seed_arg(), seed_given(false),
- mer_arg(), mer_given(false),
- output_arg("output"), output_given(false),
- fastq_flag(false),
- read_length_arg(), read_length_given(false),
- verbose_flag(false)
- { }
-
- generate_sequence_args(int argc, char* argv[]) :
- seed_arg(), seed_given(false),
- mer_arg(), mer_given(false),
- output_arg("output"), output_given(false),
- fastq_flag(false),
- read_length_arg(), read_length_given(false),
- verbose_flag(false)
- { parse(argc, argv); }
-
- void parse(int argc, char* argv[]) {
- static struct option long_options[] = {
- {"seed", 1, 0, 's'},
- {"mer", 1, 0, 'm'},
- {"output", 1, 0, 'o'},
- {"fastq", 0, 0, 'q'},
- {"read-length", 1, 0, 'r'},
- {"verbose", 0, 0, 'v'},
- {"help", 0, 0, 'h'},
- {"usage", 0, 0, USAGE_OPT},
- {"version", 0, 0, 'V'},
- {0, 0, 0, 0}
- };
- static const char *short_options = "hVs:m:o:qr:v";
-
- std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
- while(true) {
- int index = -1;
- int c = getopt_long(argc, argv, short_options, long_options, &index);
- if(c == -1) break;
- switch(c) {
- case ':':
- std::cerr << "Missing required argument for "
- << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
- << std::endl;
- exit(1);
- case 'h':
- std::cout << usage() << "\n\n" << help() << std::endl;
- exit(0);
- case USAGE_OPT:
- std::cout << usage() << "\nUse --help for more information." << std::endl;
- exit(0);
- case 'V':
- print_version();
- exit(0);
- case '?':
- std::cerr << "Use --usage or --help for some help\n";
- exit(1);
- case 's':
- seed_given = true;
- seed_arg = yaggo::conv_int<long>((const char *)optarg, err, false);
- CHECK_ERR(long_t, optarg, "-s, --seed=long")
- break;
- case 'm':
- mer_given = true;
- mer_arg.push_back(yaggo::conv_uint<uint32_t>((const char *)optarg, err, false));
- CHECK_ERR(uint32_t, optarg, "-m, --mer=uint32")
- break;
- case 'o':
- output_given = true;
- output_arg = optarg;
- break;
- case 'q':
- fastq_flag = true;
- break;
- case 'r':
- read_length_given = true;
- read_length_arg = yaggo::conv_uint<uint32_t>((const char *)optarg, err, false);
- CHECK_ERR(uint32_t, optarg, "-r, --read-length=uint32")
- break;
- case 'v':
- verbose_flag = true;
- break;
- }
- }
-
- // Check that required switches are present
- if(!seed_given)
- error("[-s, --seed=long] required switch");
-
- // Parse arguments
- if(argc - optind < 1)
- error("Requires at least 1 argument.");
- for( ; optind < argc; ++optind) {
- length_arg.push_back(yaggo::conv_uint<uint64_t>((const char *)argv[optind], err, false));
- CHECK_ERR(uint64_t, argv[optind], "length")
- }
- }
-
-#define generate_sequence_args_USAGE "Usage: generate_sequence [options] length:uint64+"
- const char * usage() const { return generate_sequence_args_USAGE; }
- void error(const char *msg) {
- std::cerr << "Error: " << msg << "\n" << usage()
- << "\nUse --help for more information"
- << std::endl;
- exit(1);
- }
-
-#define generate_sequence_args_HELP "Generate randome sequence of given lengths.\n\n" \
- "Options (default value in (), *required):\n" \
- " -s, --seed=long *Seed\n" \
- " -m, --mer=uint32 Mer length. Generate matrix of size 2*length\n" \
- " -o, --output=string Output prefix (output)\n" \
- " -q, --fastq Generate fastq file (false)\n" \
- " -r, --read-length=uint32 Read length for fasta format (default=size of sequence)\n" \
- " -v, --verbose Be verbose (false)\n" \
- " --usage Usage\n" \
- " -h, --help This message\n" \
- " -V, --version Version"
-
- const char * help() const { return generate_sequence_args_HELP; }
-#define generate_sequence_args_HIDDEN "Hidden options:"
-
- const char * hidden() const { return generate_sequence_args_HIDDEN; }
- void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
- os << PACKAGE_VERSION << "\n";
- }
- void dump(std::ostream &os = std::cout) {
- os << "seed_given:" << seed_given << " seed_arg:" << seed_arg << "\n";
- os << "mer_given:" << mer_given << " mer_arg:" << yaggo::vec_str(mer_arg) << "\n";
- os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
- os << "fastq_flag:" << fastq_flag << "\n";
- os << "read_length_given:" << read_length_given << " read_length_arg:" << read_length_arg << "\n";
- os << "verbose_flag:" << verbose_flag << "\n";
- os << "length_arg:" << yaggo::vec_str(length_arg) << "\n";
- }
-private:
-};
-
-#endif // __GENERATE_SEQUENCE_ARGS_HPP__"
diff --git a/jellyfish/generate_sequence_cmdline.yaggo b/jellyfish/generate_sequence_cmdline.yaggo
new file mode 100644
index 0000000..94525c7
--- /dev/null
+++ b/jellyfish/generate_sequence_cmdline.yaggo
@@ -0,0 +1,27 @@
+purpose "Generate randome sequence of given lengths."
+package "generate_sequence"
+
+output "generate_sequence_cmdline.hpp"
+name "generate_sequence_args"
+
+option("seed", "s") {
+ description "Seed"
+ long; required }
+option("mer", "m") {
+ description "Mer length. Generate matrix of size 2*length"
+ uint32; multiple }
+option("output", "o") {
+ description "Output prefix"
+ c_string; default "output" }
+option("fastq", "q") {
+ description "Generate fastq file"
+ flag; off }
+option("read-length", "r") {
+ description "Read length for fasta format (default=size of sequence)"
+ uint32 }
+option("verbose", "v") {
+ description "Be verbose"
+ flag; off }
+arg("length") {
+ description "Length of sequence to generate"
+ uint64; multiple; at_least 1 }
diff --git a/jellyfish/half.cpp b/jellyfish/half.cpp
deleted file mode 100644
index 0d566bb..0000000
--- a/jellyfish/half.cpp
+++ /dev/null
@@ -1,311 +0,0 @@
-///////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
-// Digital Ltd. LLC
-//
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Industrial Light & Magic nor the names of
-// its contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-///////////////////////////////////////////////////////////////////////////
-
-// Primary authors:
-// Florian Kainz <kainz at ilm.com>
-// Rod Bogart <rgb at ilm.com>
-
-
-//---------------------------------------------------------------------------
-//
-// class half --
-// implementation of non-inline members
-//
-//---------------------------------------------------------------------------
-
-#include <assert.h>
-#include <jellyfish/half.h>
-
-// using namespace std;
-
-//-------------------------------------------------------------
-// Lookup tables for half-to-float and float-to-half conversion
-//-------------------------------------------------------------
-
-HALF_EXPORT_CONST half::uif half::_toFloat[1 << 16] =
-#include <jellyfish/toFloat.h>
-HALF_EXPORT_CONST unsigned short half::_eLut[1 << 9] =
-#include <jellyfish/eLut.h>
-
-
-//-----------------------------------------------
-// Overflow handler for float-to-half conversion;
-// generates a hardware floating-point overflow,
-// which may be trapped by the operating system.
-//-----------------------------------------------
-
-float
-half::overflow ()
-{
- volatile float f = 1e10;
-
- for (int i = 0; i < 10; i++)
- f *= f; // this will overflow before
- // the for�loop terminates
- return f;
-}
-
-
-//-----------------------------------------------------
-// Float-to-half conversion -- general case, including
-// zeroes, denormalized numbers and exponent overflows.
-//-----------------------------------------------------
-
-short
-half::convert (int i)
-{
- //
- // Our floating point number, f, is represented by the bit
- // pattern in integer i. Disassemble that bit pattern into
- // the sign, s, the exponent, e, and the significand, m.
- // Shift s into the position where it will go in in the
- // resulting half number.
- // Adjust e, accounting for the different exponent bias
- // of float and half (127 versus 15).
- //
-
- register int s = (i >> 16) & 0x00008000;
- register int e = ((i >> 23) & 0x000000ff) - (127 - 15);
- register int m = i & 0x007fffff;
-
- //
- // Now reassemble s, e and m into a half:
- //
-
- if (e <= 0)
- {
- if (e < -10)
- {
- //
- // E is less than -10. The absolute value of f is
- // less than HALF_MIN (f may be a small normalized
- // float, a denormalized float or a zero).
- //
- // We convert f to a half zero with the same sign as f.
- //
-
- return s;
- }
-
- //
- // E is between -10 and 0. F is a normalized float
- // whose magnitude is less than HALF_NRM_MIN.
- //
- // We convert f to a denormalized half.
- //
-
- //
- // Add an explicit leading 1 to the significand.
- //
-
- m = m | 0x00800000;
-
- //
- // Round to m to the nearest (10+e)-bit value (with e between
- // -10 and 0); in case of a tie, round to the nearest even value.
- //
- // Rounding may cause the significand to overflow and make
- // our number normalized. Because of the way a half's bits
- // are laid out, we don't have to treat this case separately;
- // the code below will handle it correctly.
- //
-
- int t = 14 - e;
- int a = (1 << (t - 1)) - 1;
- int b = (m >> t) & 1;
-
- m = (m + a + b) >> t;
-
- //
- // Assemble the half from s, e (zero) and m.
- //
-
- return s | m;
- }
- else if (e == 0xff - (127 - 15))
- {
- if (m == 0)
- {
- //
- // F is an infinity; convert f to a half
- // infinity with the same sign as f.
- //
-
- return s | 0x7c00;
- }
- else
- {
- //
- // F is a NAN; we produce a half NAN that preserves
- // the sign bit and the 10 leftmost bits of the
- // significand of f, with one exception: If the 10
- // leftmost bits are all zero, the NAN would turn
- // into an infinity, so we have to set at least one
- // bit in the significand.
- //
-
- m >>= 13;
- return s | 0x7c00 | m | (m == 0);
- }
- }
- else
- {
- //
- // E is greater than zero. F is a normalized float.
- // We try to convert f to a normalized half.
- //
-
- //
- // Round to m to the nearest 10-bit value. In case of
- // a tie, round to the nearest even value.
- //
-
- m = m + 0x00000fff + ((m >> 13) & 1);
-
- if (m & 0x00800000)
- {
- m = 0; // overflow in significand,
- e += 1; // adjust exponent
- }
-
- //
- // Handle exponent overflow
- //
-
- if (e > 30)
- {
- overflow (); // Cause a hardware floating point overflow;
- return s | 0x7c00; // if this returns, the half becomes an
- } // infinity with the same sign as f.
-
- //
- // Assemble the half from s, e and m.
- //
-
- return s | (e << 10) | (m >> 13);
- }
-}
-
-
-//---------------------
-// Stream I/O operators
-//---------------------
-
-std::ostream &
-operator << (std::ostream &os, half h)
-{
- os << float (h);
- return os;
-}
-
-
-std::istream &
-operator >> (std::istream &is, half &h)
-{
- float f;
- is >> f;
- h = half (f);
- return is;
-}
-
-
-//---------------------------------------
-// Functions to print the bit-layout of
-// floats and halfs, mostly for debugging
-//---------------------------------------
-
-void
-printBits (std::ostream &os, half h)
-{
- unsigned short b = h.bits();
-
- for (int i = 15; i >= 0; i--)
- {
- os << (((b >> i) & 1)? '1': '0');
-
- if (i == 15 || i == 10)
- os << ' ';
- }
-}
-
-
-void
-printBits (std::ostream &os, float f)
-{
- half::uif x;
- x.f = f;
-
- for (int i = 31; i >= 0; i--)
- {
- os << (((x.i >> i) & 1)? '1': '0');
-
- if (i == 31 || i == 23)
- os << ' ';
- }
-}
-
-
-void
-printBits (char c[19], half h)
-{
- unsigned short b = h.bits();
-
- for (int i = 15, j = 0; i >= 0; i--, j++)
- {
- c[j] = (((b >> i) & 1)? '1': '0');
-
- if (i == 15 || i == 10)
- c[++j] = ' ';
- }
-
- c[18] = 0;
-}
-
-
-void
-printBits (char c[35], float f)
-{
- half::uif x;
- x.f = f;
-
- for (int i = 31, j = 0; i >= 0; i--, j++)
- {
- c[j] = (((x.i >> i) & 1)? '1': '0');
-
- if (i == 31 || i == 23)
- c[++j] = ' ';
- }
-
- c[34] = 0;
-}
diff --git a/jellyfish/half.h b/jellyfish/half.h
deleted file mode 100644
index 2d89200..0000000
--- a/jellyfish/half.h
+++ /dev/null
@@ -1,766 +0,0 @@
-///////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
-// Digital Ltd. LLC
-//
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Industrial Light & Magic nor the names of
-// its contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-///////////////////////////////////////////////////////////////////////////
-
-// Primary authors:
-// Florian Kainz <kainz at ilm.com>
-// Rod Bogart <rgb at ilm.com>
-
-//---------------------------------------------------------------------------
-//
-// half -- a 16-bit floating point number class:
-//
-// Type half can represent positive and negative numbers whose
-// magnitude is between roughly 6.1e-5 and 6.5e+4 with a relative
-// error of 9.8e-4; numbers smaller than 6.1e-5 can be represented
-// with an absolute error of 6.0e-8. All integers from -2048 to
-// +2048 can be represented exactly.
-//
-// Type half behaves (almost) like the built-in C++ floating point
-// types. In arithmetic expressions, half, float and double can be
-// mixed freely. Here are a few examples:
-//
-// half a (3.5);
-// float b (a + sqrt (a));
-// a += b;
-// b += a;
-// b = a + 7;
-//
-// Conversions from half to float are lossless; all half numbers
-// are exactly representable as floats.
-//
-// Conversions from float to half may not preserve a float's value
-// exactly. If a float is not representable as a half, then the
-// float value is rounded to the nearest representable half. If a
-// float value is exactly in the middle between the two closest
-// representable half values, then the float value is rounded to
-// the closest half whose least significant bit is zero.
-//
-// Overflows during float-to-half conversions cause arithmetic
-// exceptions. An overflow occurs when the float value to be
-// converted is too large to be represented as a half, or if the
-// float value is an infinity or a NAN.
-//
-// The implementation of type half makes the following assumptions
-// about the implementation of the built-in C++ types:
-//
-// float is an IEEE 754 single-precision number
-// sizeof (float) == 4
-// sizeof (unsigned int) == sizeof (float)
-// alignof (unsigned int) == alignof (float)
-// sizeof (unsigned short) == 2
-//
-//---------------------------------------------------------------------------
-
-#ifndef _HALF_H_
-#define _HALF_H_
-
-#include <iostream>
-
-#if defined(OPENEXR_DLL)
- #if defined(HALF_EXPORTS)
- #define HALF_EXPORT __declspec(dllexport)
- #else
- #define HALF_EXPORT __declspec(dllimport)
- #endif
- #define HALF_EXPORT_CONST
-#else
- #define HALF_EXPORT
- #define HALF_EXPORT_CONST const
-#endif
-
-class HALF_EXPORT half
-{
- public:
-
- //-------------
- // Constructors
- //-------------
-
- half (); // no initialization
- explicit half (float f);
-
-
- //--------------------
- // Conversion to float
- //--------------------
-
- operator float () const;
-
-
- //------------
- // Unary minus
- //------------
-
- half operator - () const;
-
-
- //-----------
- // Assignment
- //-----------
-
- half & operator = (half h);
- half & operator = (float f);
-
- half & operator += (half h);
- half & operator += (float f);
-
- half & operator -= (half h);
- half & operator -= (float f);
-
- half & operator *= (half h);
- half & operator *= (float f);
-
- half & operator /= (half h);
- half & operator /= (float f);
-
-
- //---------------------------------------------------------
- // Round to n-bit precision (n should be between 0 and 10).
- // After rounding, the significand's 10-n least significant
- // bits will be zero.
- //---------------------------------------------------------
-
- half round (unsigned int n) const;
-
-
- //--------------------------------------------------------------------
- // Classification:
- //
- // h.isFinite() returns true if h is a normalized number,
- // a denormalized number or zero
- //
- // h.isNormalized() returns true if h is a normalized number
- //
- // h.isDenormalized() returns true if h is a denormalized number
- //
- // h.isZero() returns true if h is zero
- //
- // h.isNan() returns true if h is a NAN
- //
- // h.isInfinity() returns true if h is a positive
- // or a negative infinity
- //
- // h.isNegative() returns true if the sign bit of h
- // is set (negative)
- //--------------------------------------------------------------------
-
- bool isFinite () const;
- bool isNormalized () const;
- bool isDenormalized () const;
- bool isZero () const;
- bool isNan () const;
- bool isInfinity () const;
- bool isNegative () const;
-
-
- //--------------------------------------------
- // Special values
- //
- // posInf() returns +infinity
- //
- // negInf() returns -infinity
- //
- // qNan() returns a NAN with the bit
- // pattern 0111111111111111
- //
- // sNan() returns a NAN with the bit
- // pattern 0111110111111111
- //--------------------------------------------
-
- static half posInf ();
- static half negInf ();
- static half qNan ();
- static half sNan ();
-
-
- //--------------------------------------
- // Access to the internal representation
- //--------------------------------------
-
- unsigned short bits () const;
- void setBits (unsigned short bits);
-
-
- public:
-
- union uif
- {
- unsigned int i;
- float f;
- };
-
- private:
-
- static short convert (int i);
- static float overflow ();
-
- unsigned short _h;
-
- static HALF_EXPORT_CONST uif _toFloat[1 << 16];
- static HALF_EXPORT_CONST unsigned short _eLut[1 << 9];
-};
-
-//-----------
-// Stream I/O
-//-----------
-
-HALF_EXPORT std::ostream & operator << (std::ostream &os, half h);
-HALF_EXPORT std::istream & operator >> (std::istream &is, half &h);
-
-
-//----------
-// Debugging
-//----------
-
-HALF_EXPORT void printBits (std::ostream &os, half h);
-HALF_EXPORT void printBits (std::ostream &os, float f);
-HALF_EXPORT void printBits (char c[19], half h);
-HALF_EXPORT void printBits (char c[35], float f);
-
-
-//-------------------------------------------------------------------------
-// Limits
-//
-// Visual C++ will complain if HALF_MIN, HALF_NRM_MIN etc. are not float
-// constants, but at least one other compiler (gcc 2.96) produces incorrect
-// results if they are.
-//-------------------------------------------------------------------------
-
-#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER
-
- #define HALF_MIN 5.96046448e-08f // Smallest positive half
-
- #define HALF_NRM_MIN 6.10351562e-05f // Smallest positive normalized half
-
- #define HALF_MAX 65504.0f // Largest positive half
-
- #define HALF_EPSILON 0.00097656f // Smallest positive e for which
- // half (1.0 + e) != half (1.0)
-#else
-
- #define HALF_MIN 5.96046448e-08 // Smallest positive half
-
- #define HALF_NRM_MIN 6.10351562e-05 // Smallest positive normalized half
-
- #define HALF_MAX 65504.0 // Largest positive half
-
- #define HALF_EPSILON 0.00097656 // Smallest positive e for which
- // half (1.0 + e) != half (1.0)
-#endif
-
-
-#define HALF_MANT_DIG 11 // Number of digits in mantissa
- // (significand + hidden leading 1)
-
-#define HALF_DIG 2 // Number of base 10 digits that
- // can be represented without change
-
-#define HALF_RADIX 2 // Base of the exponent
-
-#define HALF_MIN_EXP -13 // Minimum negative integer such that
- // HALF_RADIX raised to the power of
- // one less than that integer is a
- // normalized half
-
-#define HALF_MAX_EXP 16 // Maximum positive integer such that
- // HALF_RADIX raised to the power of
- // one less than that integer is a
- // normalized half
-
-#define HALF_MIN_10_EXP -4 // Minimum positive integer such
- // that 10 raised to that power is
- // a normalized half
-
-#define HALF_MAX_10_EXP 4 // Maximum positive integer such
- // that 10 raised to that power is
- // a normalized half
-
-
-//---------------------------------------------------------------------------
-//
-// Implementation --
-//
-// Representation of a float:
-//
-// We assume that a float, f, is an IEEE 754 single-precision
-// floating point number, whose bits are arranged as follows:
-//
-// 31 (msb)
-// |
-// | 30 23
-// | | |
-// | | | 22 0 (lsb)
-// | | | | |
-// X XXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX
-//
-// s e m
-//
-// S is the sign-bit, e is the exponent and m is the significand.
-//
-// If e is between 1 and 254, f is a normalized number:
-//
-// s e-127
-// f = (-1) * 2 * 1.m
-//
-// If e is 0, and m is not zero, f is a denormalized number:
-//
-// s -126
-// f = (-1) * 2 * 0.m
-//
-// If e and m are both zero, f is zero:
-//
-// f = 0.0
-//
-// If e is 255, f is an "infinity" or "not a number" (NAN),
-// depending on whether m is zero or not.
-//
-// Examples:
-//
-// 0 00000000 00000000000000000000000 = 0.0
-// 0 01111110 00000000000000000000000 = 0.5
-// 0 01111111 00000000000000000000000 = 1.0
-// 0 10000000 00000000000000000000000 = 2.0
-// 0 10000000 10000000000000000000000 = 3.0
-// 1 10000101 11110000010000000000000 = -124.0625
-// 0 11111111 00000000000000000000000 = +infinity
-// 1 11111111 00000000000000000000000 = -infinity
-// 0 11111111 10000000000000000000000 = NAN
-// 1 11111111 11111111111111111111111 = NAN
-//
-// Representation of a half:
-//
-// Here is the bit-layout for a half number, h:
-//
-// 15 (msb)
-// |
-// | 14 10
-// | | |
-// | | | 9 0 (lsb)
-// | | | | |
-// X XXXXX XXXXXXXXXX
-//
-// s e m
-//
-// S is the sign-bit, e is the exponent and m is the significand.
-//
-// If e is between 1 and 30, h is a normalized number:
-//
-// s e-15
-// h = (-1) * 2 * 1.m
-//
-// If e is 0, and m is not zero, h is a denormalized number:
-//
-// S -14
-// h = (-1) * 2 * 0.m
-//
-// If e and m are both zero, h is zero:
-//
-// h = 0.0
-//
-// If e is 31, h is an "infinity" or "not a number" (NAN),
-// depending on whether m is zero or not.
-//
-// Examples:
-//
-// 0 00000 0000000000 = 0.0
-// 0 01110 0000000000 = 0.5
-// 0 01111 0000000000 = 1.0
-// 0 10000 0000000000 = 2.0
-// 0 10000 1000000000 = 3.0
-// 1 10101 1111000001 = -124.0625
-// 0 11111 0000000000 = +infinity
-// 1 11111 0000000000 = -infinity
-// 0 11111 1000000000 = NAN
-// 1 11111 1111111111 = NAN
-//
-// Conversion:
-//
-// Converting from a float to a half requires some non-trivial bit
-// manipulations. In some cases, this makes conversion relatively
-// slow, but the most common case is accelerated via table lookups.
-//
-// Converting back from a half to a float is easier because we don't
-// have to do any rounding. In addition, there are only 65536
-// different half numbers; we can convert each of those numbers once
-// and store the results in a table. Later, all conversions can be
-// done using only simple table lookups.
-//
-//---------------------------------------------------------------------------
-
-
-//--------------------
-// Simple constructors
-//--------------------
-
-inline
-half::half () : _h(0)
-{
- // no initialization
-}
-
-
-//----------------------------
-// Half-from-float constructor
-//----------------------------
-
-inline
-half::half (float f)
-{
- uif x;
-
- x.f = f;
-
- if (f == 0)
- {
- //
- // Common special case - zero.
- // Preserve the zero's sign bit.
- //
-
- _h = (x.i >> 16);
- }
- else
- {
- //
- // We extract the combined sign and exponent, e, from our
- // floating-point number, f. Then we convert e to the sign
- // and exponent of the half number via a table lookup.
- //
- // For the most common case, where a normalized half is produced,
- // the table lookup returns a non-zero value; in this case, all
- // we have to do is round f's significand to 10 bits and combine
- // the result with e.
- //
- // For all other cases (overflow, zeroes, denormalized numbers
- // resulting from underflow, infinities and NANs), the table
- // lookup returns zero, and we call a longer, non-inline function
- // to do the float-to-half conversion.
- //
-
- register int e = (x.i >> 23) & 0x000001ff;
-
- e = _eLut[e];
-
- if (e)
- {
- //
- // Simple case - round the significand, m, to 10
- // bits and combine it with the sign and exponent.
- //
-
- register int m = x.i & 0x007fffff;
- _h = e + ((m + 0x00000fff + ((m >> 13) & 1)) >> 13);
- }
- else
- {
- //
- // Difficult case - call a function.
- //
-
- _h = convert (x.i);
- }
- }
-}
-
-
-//------------------------------------------
-// Half-to-float conversion via table lookup
-//------------------------------------------
-
-inline
-half::operator float () const
-{
- return _toFloat[_h].f;
-}
-
-
-//-------------------------
-// Round to n-bit precision
-//-------------------------
-
-inline half
-half::round (unsigned int n) const
-{
- //
- // Parameter check.
- //
-
- if (n >= 10)
- return *this;
-
- //
- // Disassemble h into the sign, s,
- // and the combined exponent and significand, e.
- //
-
- unsigned short s = _h & 0x8000;
- unsigned short e = _h & 0x7fff;
-
- //
- // Round the exponent and significand to the nearest value
- // where ones occur only in the (10-n) most significant bits.
- // Note that the exponent adjusts automatically if rounding
- // up causes the significand to overflow.
- //
-
- e >>= 9 - n;
- e += e & 1;
- e <<= 9 - n;
-
- //
- // Check for exponent overflow.
- //
-
- if (e >= 0x7c00)
- {
- //
- // Overflow occurred -- truncate instead of rounding.
- //
-
- e = _h;
- e >>= 10 - n;
- e <<= 10 - n;
- }
-
- //
- // Put the original sign bit back.
- //
-
- half h;
- h._h = s | e;
-
- return h;
-}
-
-
-//-----------------------
-// Other inline functions
-//-----------------------
-
-inline half
-half::operator - () const
-{
- half h;
- h._h = _h ^ 0x8000;
- return h;
-}
-
-
-inline half &
-half::operator = (half h)
-{
- _h = h._h;
- return *this;
-}
-
-
-inline half &
-half::operator = (float f)
-{
- *this = half (f);
- return *this;
-}
-
-
-inline half &
-half::operator += (half h)
-{
- *this = half (float (*this) + float (h));
- return *this;
-}
-
-
-inline half &
-half::operator += (float f)
-{
- *this = half (float (*this) + f);
- return *this;
-}
-
-
-inline half &
-half::operator -= (half h)
-{
- *this = half (float (*this) - float (h));
- return *this;
-}
-
-
-inline half &
-half::operator -= (float f)
-{
- *this = half (float (*this) - f);
- return *this;
-}
-
-
-inline half &
-half::operator *= (half h)
-{
- *this = half (float (*this) * float (h));
- return *this;
-}
-
-
-inline half &
-half::operator *= (float f)
-{
- *this = half (float (*this) * f);
- return *this;
-}
-
-
-inline half &
-half::operator /= (half h)
-{
- *this = half (float (*this) / float (h));
- return *this;
-}
-
-
-inline half &
-half::operator /= (float f)
-{
- *this = half (float (*this) / f);
- return *this;
-}
-
-
-inline bool
-half::isFinite () const
-{
- unsigned short e = (_h >> 10) & 0x001f;
- return e < 31;
-}
-
-
-inline bool
-half::isNormalized () const
-{
- unsigned short e = (_h >> 10) & 0x001f;
- return e > 0 && e < 31;
-}
-
-
-inline bool
-half::isDenormalized () const
-{
- unsigned short e = (_h >> 10) & 0x001f;
- unsigned short m = _h & 0x3ff;
- return e == 0 && m != 0;
-}
-
-
-inline bool
-half::isZero () const
-{
- return (_h & 0x7fff) == 0;
-}
-
-
-inline bool
-half::isNan () const
-{
- unsigned short e = (_h >> 10) & 0x001f;
- unsigned short m = _h & 0x3ff;
- return e == 31 && m != 0;
-}
-
-
-inline bool
-half::isInfinity () const
-{
- unsigned short e = (_h >> 10) & 0x001f;
- unsigned short m = _h & 0x3ff;
- return e == 31 && m == 0;
-}
-
-
-inline bool
-half::isNegative () const
-{
- return (_h & 0x8000) != 0;
-}
-
-
-inline half
-half::posInf ()
-{
- half h;
- h._h = 0x7c00;
- return h;
-}
-
-
-inline half
-half::negInf ()
-{
- half h;
- h._h = 0xfc00;
- return h;
-}
-
-
-inline half
-half::qNan ()
-{
- half h;
- h._h = 0x7fff;
- return h;
-}
-
-
-inline half
-half::sNan ()
-{
- half h;
- h._h = 0x7dff;
- return h;
-}
-
-
-inline unsigned short
-half::bits () const
-{
- return _h;
-}
-
-
-inline void
-half::setBits (unsigned short bits)
-{
- _h = bits;
-}
-
-#endif
diff --git a/jellyfish/hash.hpp b/jellyfish/hash.hpp
deleted file mode 100644
index 6daeb7a..0000000
--- a/jellyfish/hash.hpp
+++ /dev/null
@@ -1,253 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_HASH_HPP__
-#define __JELLYFISH_HASH_HPP__
-
-#include <iostream>
-#include <fstream>
-#include <list>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <jellyfish/mapped_file.hpp>
-#include <jellyfish/locks_pthread.hpp>
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
-#include <jellyfish/dumper.hpp>
-#include <jellyfish/time.hpp>
-
-namespace jellyfish {
- /* Wrapper around a "storage". The hash class manages threads. In
- particular, it synchronizes the threads for the size-doubling
- operation and manages dumping the hash to disk. The storage class
- is reponsible for the details of storing the key,value pairs,
- memory management, reprobing, etc.
- */
-
- class hash_t {
- public:
- virtual ~hash_t() {}
- };
-
- template<typename key_t, typename val_t, typename ary_t, typename atomic>
- class hash : public hash_t {
- public:
- define_error_class(TableFull);
- // typedef typename std::pair<key_t,val_t> kv_t;
- typedef ary_t storage_t;
- typedef typename ary_t::iterator iterator;
-
- hash() : ary(NULL), dumper(NULL), dumping_initiated(false) {}
- explicit hash(ary_t *_ary) : ary(_ary), dumper(NULL), dumping_initiated(false) {}
-
- virtual ~hash() {}
-
- size_t get_size() const { return ary->get_size(); }
- uint_t get_key_len() const { return ary->get_key_len(); }
- uint_t get_val_len() const { return ary->get_val_len(); }
- uint_t get_max_reprobe() const { return ary->get_max_reprobe(); }
- size_t get_max_reprobe_offset() const { return ary->get_max_reprobe_offset(); }
-
- void set_dumper(dumper_t *new_dumper) { dumper = new_dumper; }
- Time get_writing_time() const {
- if(!dumper)
- return Time::zero;
- return dumper->get_writing_time();
- }
-
- void write_raw(std::ostream &out) { ary->write_raw(out); }
-
- iterator iterator_all() const { return ary->iterator_all(); }
- iterator iterator_slice(size_t slice_number, size_t number_of_slice) const {
- return ary->iterator_slice(slice_number, number_of_slice);
- }
-
- /*
- * Thread handle to the hash.
- */
- enum status_t { FREE, INUSE, BLOCKED };
- class thread {
- ary_t *ary;
- size_t hsize_mask;
- status_t status;
- status_t ostatus;
- hash *my_hash;
-
- public:
- typedef val_t val_type;
- thread(ary_t *_ary, hash *_my_hash) :
- ary(_ary), hsize_mask(ary->get_size() - 1), status(FREE), my_hash(_my_hash)
- { }
-
- // Add val to the value associated with key. Returns the old
- // value in *oval if oval is not NULL
- template<typename add_t>
- inline void add(key_t key, const add_t &val, val_t *oval = 0) {
- while(true) {
- while(atomic::cas(&status, FREE, INUSE) != FREE)
- my_hash->wait_event_is_done();
-
- if(ary->add(key, val, oval))
- break;
-
- // Improve this. Undefined behavior if dump_to_file throws an error.
- if(my_hash->get_event_locks()) {
- my_hash->dump();
- my_hash->release_event_locks();
- }
- }
-
- if(atomic::cas(&status, INUSE, FREE) != INUSE)
- my_hash->signal_not_in_use();
- }
-
- // void inc(key_t key, val_t *oval = 0) { return this->add(key, (add_t)1, oval); }
- // inline void operator()(key_t key) { return this->add(key, (val_t)1); }
-
- friend class hash;
- };
- friend class thread;
- typedef std::list<thread> thread_list_t;
- class thread_ptr_t : public thread_list_t::iterator {
- public:
- explicit thread_ptr_t(const typename thread_list_t::iterator &thl) : thread_list_t::iterator(thl) {}
- typedef val_t val_type;
- };
- // typedef typename thread_list_t::iterator thread_ptr_t;
-
- thread_ptr_t new_thread() {
- user_thread_lock.lock();
- thread_ptr_t res(user_thread_list.insert(user_thread_list.begin(), thread(ary, this)));
- user_thread_lock.unlock();
- return res;
- }
-
- void release_thread(thread_ptr_t &th) {
- user_thread_lock.lock();
- user_thread_list.erase(th);
- user_thread_lock.unlock();
- }
-
- void dump() {
- if(dumper)
- dumper->dump();
- else
- eraise(TableFull) << "No dumper defined";
- }
-
- private:
- /**
- * The following methods are called by threads to manage
- * administrative events: size doubling or dumping the hash to
- * disk.
- **/
-
- /**
- * Called by a thread if it failed to switch its states from INUSE
- * to FREE. It lets the thread triggering the event that the hash
- * is free. This method returns after the signaling and does not
- * wait for the handling of the event to be over.
- **/
- void signal_not_in_use(bool take_inuse_lock = true) {
- if(take_inuse_lock)
- inuse_thread_cond.lock();
- if(--inuse_thread_count == 0)
- inuse_thread_cond.signal();
- inuse_thread_cond.unlock();
- }
-
- /**
- * Called by a thread if it failed to switch its states from FREE
- * to INUSE. An event management has been initiated. This call
- * waits for the event handling to be over.
- **/
- void wait_event_is_done(bool take_event_lock = true) {
- if(take_event_lock)
- event_cond.lock();
- while(dumping_initiated)
- event_cond.wait();
- event_cond.unlock();
- }
-
- /**
- * Get the locks before handling an event and returns true if
- * success. It guarantees than no thread is doing an operation on
- * the hash. If another thread is already handling an event,
- * degrade to wait_event_is_done and returns false.
- **/
- bool get_event_locks() {
- inuse_thread_cond.lock();
- event_cond.lock();
- if(dumping_initiated) {
- // Another thread is doing the dumping
- signal_not_in_use(false);
- wait_event_is_done(false);
- return false;
- }
-
- // I am the thread doing the dumping
- user_thread_lock.lock();
- dumping_initiated = true;
- event_cond.unlock();
-
- inuse_thread_count = 0;
-
- // Block access to hash and wait for threads with INUSE state
- for(thread_ptr_t it(user_thread_list.begin());
- it != user_thread_list.end();
- it++) {
- it->ostatus = atomic::set(&it->status, BLOCKED);
- if(it->ostatus == INUSE)
- inuse_thread_count++;
- }
- inuse_thread_count--; // Remove 1 for myself!
- while(inuse_thread_count > 0) {
- inuse_thread_cond.wait();
- }
- inuse_thread_cond.unlock();
-
- return true;
- }
-
- void release_event_locks() {
- event_cond.lock();
- for(thread_ptr_t it(user_thread_list.begin());
- it != user_thread_list.end();
- it++) {
- atomic::set(&it->status, FREE);
- }
- user_thread_lock.unlock();
- dumping_initiated = false;
- event_cond.broadcast();
- event_cond.unlock();
- }
-
- private:
- ary_t *ary;
- dumper_t *dumper;
- volatile bool dumping_initiated;
- thread_list_t user_thread_list;
- locks::pthread::mutex user_thread_lock;
- locks::pthread::cond event_cond;
- locks::pthread::cond inuse_thread_cond;
- volatile uint_t inuse_thread_count;
- };
-}
-
-#endif // __HASH_HPP__
diff --git a/jellyfish/hash_fastq_merge.cc b/jellyfish/hash_fastq_merge.cc
deleted file mode 100644
index b018ff7..0000000
--- a/jellyfish/hash_fastq_merge.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/fastq_dumper.hpp>
-#include <jellyfish/hash_fastq_merge_cmdline.hpp>
-
-int hash_fastq_merge_main(int argc, char *argv[])
-{
- hash_fastq_merge_args args(argc, argv);
-
- fastq_hash_t::storage_t ary(args.size_arg, 2*args.mer_len_arg,
- args.reprobes_arg, jellyfish::quadratic_reprobes);
- fastq_hash_t hash(&ary);
- fastq_hash_t::thread_ptr_t counter(hash.new_thread());
-
- int num_hashes = args.db_arg.size();
- for(int i = 0; i < num_hashes; ++i) {
- fastq_storage_t *ihash = raw_fastq_dumper_t::read(args.db_arg[i]);
- if(ihash->get_key_len() != hash.get_key_len())
- die << "Invalid mer length '" << (ihash->get_key_len() / 2)
- << "' for database '" << args.db_arg[i]
- << "'. Should be '" << (hash.get_key_len() / 2) << "'";
- fastq_storage_t::iterator iit = ihash->iterator_all();
- while(iit.next()) {
- counter->add(iit.get_key(), iit.get_val().to_float());
- }
- delete ihash;
- }
-
- raw_fastq_dumper_t dumper(4, args.output_arg,
- args.out_buffer_size_arg, &ary);
- hash.set_dumper(&dumper);
- hash.dump();
-
- return 0;
-}
diff --git a/jellyfish/hash_fastq_merge_cmdline.hpp b/jellyfish/hash_fastq_merge_cmdline.hpp
deleted file mode 100644
index 98f4002..0000000
--- a/jellyfish/hash_fastq_merge_cmdline.hpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __HASH_FASTQ_MERGE_ARGS_HPP__
-#define __HASH_FASTQ_MERGE_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class hash_fastq_merge_args {
-public:
- uint64_t size_arg;
- bool size_given;
- uint32_t mer_len_arg;
- bool mer_len_given;
- const char * output_arg;
- bool output_given;
- uint32_t reprobes_arg;
- bool reprobes_given;
- uint64_t out_buffer_size_arg;
- bool out_buffer_size_given;
- std::vector<const char *> db_arg;
- typedef std::vector<const char *>::iterator db_arg_it;
- typedef std::vector<const char *>::const_iterator db_arg_const_it;
-
- enum {
- USAGE_OPT = 1000,
- FULL_HELP_OPT,
- OUT_BUFFER_SIZE_OPT
- };
-
- hash_fastq_merge_args() :
- size_arg(), size_given(false),
- mer_len_arg(), mer_len_given(false),
- output_arg("merged.jf"), output_given(false),
- reprobes_arg(62), reprobes_given(false),
- out_buffer_size_arg(20000000), out_buffer_size_given(false)
- { }
-
- hash_fastq_merge_args(int argc, char* argv[]) :
- size_arg(), size_given(false),
- mer_len_arg(), mer_len_given(false),
- output_arg("merged.jf"), output_given(false),
- reprobes_arg(62), reprobes_given(false),
- out_buffer_size_arg(20000000), out_buffer_size_given(false)
- { parse(argc, argv); }
-
- void parse(int argc, char* argv[]) {
- static struct option long_options[] = {
- {"size", 1, 0, 's'},
- {"mer-len", 1, 0, 'm'},
- {"output", 1, 0, 'o'},
- {"reprobes", 1, 0, 'p'},
- {"out-buffer-size", 1, 0, OUT_BUFFER_SIZE_OPT},
- {"help", 0, 0, 'h'},
- {"full-help", 0, 0, FULL_HELP_OPT},
- {"usage", 0, 0, USAGE_OPT},
- {"version", 0, 0, 'V'},
- {0, 0, 0, 0}
- };
- static const char *short_options = "hVs:m:o:p:";
-
- std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
- while(true) {
- int index = -1;
- int c = getopt_long(argc, argv, short_options, long_options, &index);
- if(c == -1) break;
- switch(c) {
- case ':':
- std::cerr << "Missing required argument for "
- << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
- << std::endl;
- exit(1);
- case 'h':
- std::cout << usage() << "\n\n" << help() << std::endl;
- exit(0);
- case USAGE_OPT:
- std::cout << usage() << "\nUse --help for more information." << std::endl;
- exit(0);
- case 'V':
- print_version();
- exit(0);
- case '?':
- std::cerr << "Use --usage or --help for some help\n";
- exit(1);
- case FULL_HELP_OPT:
- std::cout << usage() << "\n\n" << help() << "\n\n" << hidden() << std::endl;
- exit(0);
- case 's':
- size_given = true;
- size_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, "-s, --size=uint64")
- break;
- case 'm':
- mer_len_given = true;
- mer_len_arg = yaggo::conv_uint<uint32_t>((const char *)optarg, err, false);
- CHECK_ERR(uint32_t, optarg, "-m, --mer-len=uint32")
- break;
- case 'o':
- output_given = true;
- output_arg = optarg;
- break;
- case 'p':
- reprobes_given = true;
- reprobes_arg = yaggo::conv_uint<uint32_t>((const char *)optarg, err, false);
- CHECK_ERR(uint32_t, optarg, "-p, --reprobes=uint32")
- break;
- case OUT_BUFFER_SIZE_OPT:
- out_buffer_size_given = true;
- out_buffer_size_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, " --out-buffer-size=uint64")
- break;
- }
- }
-
- // Check that required switches are present
- if(!size_given)
- error("[-s, --size=uint64] required switch");
- if(!mer_len_given)
- error("[-m, --mer-len=uint32] required switch");
-
- // Parse arguments
- if(argc - optind < 2)
- error("Requires at least 2 arguments.");
- for( ; optind < argc; ++optind) {
- db_arg.push_back(argv[optind]);
- }
- }
-
-#define hash_fastq_merge_args_USAGE "Usage: jellyfish merge [options] db:string+"
- const char * usage() const { return hash_fastq_merge_args_USAGE; }
- void error(const char *msg) {
- std::cerr << "Error: " << msg << "\n" << usage()
- << "\nUse --help for more information"
- << std::endl;
- exit(1);
- }
-
-#define hash_fastq_merge_args_HELP "Merge quake databases\n\n" \
- "Options (default value in (), *required):\n" \
- " -s, --size=uint64 *Merged hash table size\n" \
- " -m, --mer-len=uint32 *Mer length\n" \
- " -o, --output=string Output file (merged.jf)\n" \
- " -p, --reprobes=uint32 Maximum number of reprobes (62)\n" \
- " --usage Usage\n" \
- " -h, --help This message\n" \
- " --full-help Detailed help\n" \
- " -V, --version Version"
-
- const char * help() const { return hash_fastq_merge_args_HELP; }
-#define hash_fastq_merge_args_HIDDEN "Hidden options:\n" \
- " --out-buffer-size=uint64 Size of output buffer per thread (20000000)"
-
- const char * hidden() const { return hash_fastq_merge_args_HIDDEN; }
- void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
- os << PACKAGE_VERSION << "\n";
- }
- void dump(std::ostream &os = std::cout) {
- os << "size_given:" << size_given << " size_arg:" << size_arg << "\n";
- os << "mer_len_given:" << mer_len_given << " mer_len_arg:" << mer_len_arg << "\n";
- os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
- os << "reprobes_given:" << reprobes_given << " reprobes_arg:" << reprobes_arg << "\n";
- os << "out_buffer_size_given:" << out_buffer_size_given << " out_buffer_size_arg:" << out_buffer_size_arg << "\n";
- os << "db_arg:" << yaggo::vec_str(db_arg) << "\n";
- }
-private:
-};
-
-#endif // __HASH_FASTQ_MERGE_ARGS_HPP__"
diff --git a/jellyfish/hash_merge.cc b/jellyfish/hash_merge.cc
deleted file mode 100644
index 5ee4b90..0000000
--- a/jellyfish/hash_merge.cc
+++ /dev/null
@@ -1,242 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <iostream>
-#include <fstream>
-#include <vector>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdint.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/mman.h>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/compacted_hash.hpp>
-#include <jellyfish/heap.hpp>
-#include <jellyfish/hash_merge_cmdline.hpp>
-
-#define MAX_KMER_SIZE 32
-
-class ErrorWriting : public std::exception {
- std::string msg;
-public:
- explicit ErrorWriting(const std::string &_msg) : msg(_msg) {}
- virtual ~ErrorWriting() throw() {}
- virtual const char* what() const throw() {
- return msg.c_str();
- }
-};
-
-struct writer_buffer {
- volatile bool full;
- hash_writer_t writer;
-};
-struct writer_info {
- locks::pthread::cond cond;
- volatile bool done;
- uint_t nb_buffers;
- std::ostream *out;
- writer_buffer *buffers;
-};
-
-void *writer_function(void *_info) {
- writer_info *info = (writer_info *)_info;
- uint_t buf_id = 0;
- uint64_t waiting = 0;
-
- while(true) {
- info->cond.lock();
- while(!info->buffers[buf_id].full) {
- if(info->done) {
- info->cond.unlock();
- return new uint64_t(waiting);
- }
- waiting++;
- info->cond.wait();
- }
- info->cond.unlock();
-
- info->buffers[buf_id].writer.dump(info->out);
-
- info->cond.lock();
- info->buffers[buf_id].full = false;
- info->cond.signal();
- info->cond.unlock();
-
- buf_id = (buf_id + 1) % info->nb_buffers;
- }
-}
-
-int merge_main(int argc, char *argv[])
-{
- merge_args args(argc, argv);
-
- int i;
- unsigned int rklen = 0;
- size_t max_reprobe = 0;
- size_t hash_size = 0;
- SquareBinaryMatrix hash_matrix;
- SquareBinaryMatrix hash_inverse_matrix;
-
- // compute the number of hashes we're going to read
- int num_hashes = args.input_arg.size();
-
- // this is our row of iterators
- std::vector<hash_reader_t> iters(num_hashes);
-
- // create an iterator for each hash file
- for(i = 0; i < num_hashes; i++) {
- // open the hash database
- const char *db_file = args.input_arg[i];
-
- try {
- iters[i].initialize(db_file, args.out_buffer_size_arg);
- } catch(std::exception *e) {
- die << "Can't open k-mer database: " << e;
- }
-
- unsigned int len = iters[i].get_key_len();
- if(rklen != 0 && len != rklen)
- die << "Can't merge hashes of different key lengths";
- rklen = len;
-
- uint64_t rep = iters[i].get_max_reprobe();
- if(max_reprobe != 0 && rep != max_reprobe)
- die << "Can't merge hashes with different reprobing stratgies";
- max_reprobe = rep;
-
- size_t size = iters[i].get_size();
- if(hash_size != 0 && size != hash_size)
- die << "Can't merge hash with different size";
- hash_size = size;
-
- if(hash_matrix.get_size() == 0) {
- hash_matrix = iters[i].get_hash_matrix();
- hash_inverse_matrix = iters[i].get_hash_inverse_matrix();
- } else {
- SquareBinaryMatrix new_hash_matrix = iters[i].get_hash_matrix();
- SquareBinaryMatrix new_hash_inverse_matrix =
- iters[i].get_hash_inverse_matrix();
- if(new_hash_matrix != hash_matrix ||
- new_hash_inverse_matrix != hash_inverse_matrix)
- die << "Can't merge hash with different hash function";
- }
- }
-
- if(rklen == 0)
- die << "No valid hash tables found";
-
- typedef jellyfish::heap_t<hash_reader_t> hheap_t;
- hheap_t heap(num_hashes);
-
- if(args.verbose_flag)
- std::cerr << "mer length = " << (rklen / 2) << "\n"
- << "hash size = " << hash_size << "\n"
- << "num hashes = " << num_hashes << "\n"
- << "max reprobe = " << max_reprobe << "\n"
- << "heap capa = " << heap.capacity() << "\n"
- << "matrix = " << hash_matrix.xor_sum() << "\n"
- << "inv_matrix = " << hash_inverse_matrix.xor_sum() << "\n";
-
- // populate the initial heap
- for(int h = 0; h < num_hashes; ++h) {
- if(iters[h].next())
- heap.push(iters[h]);
- }
- assert(heap.size() == heap.capacity());
-
- if(heap.is_empty())
- die << "Hashes contain no items.";
-
- // open the output file
- std::ofstream out(args.output_arg.c_str());
- size_t nb_records = args.out_buffer_size_arg /
- (bits_to_bytes(rklen) + bits_to_bytes(8 * args.out_counter_len_arg));
- if(args.verbose_flag)
- std::cerr << "buffer size " << args.out_buffer_size_arg
- << " nb_records " << nb_records << "\n";
- writer_info info;
- info.nb_buffers = 4;
- info.out = &out;
- info.done = false;
- info.buffers = new writer_buffer[info.nb_buffers];
- for(uint_t j = 0; j < info.nb_buffers; j++) {
- info.buffers[j].full = false;
- info.buffers[j].writer.initialize(nb_records, rklen,
- 8 * args.out_counter_len_arg, &iters[0]);
- }
- info.buffers[0].writer.write_header(&out);
-
- pthread_t writer_thread;
- pthread_create(&writer_thread, NULL, writer_function, &info);
-
- if(args.verbose_flag)
- std::cerr << "out kmer len = " << info.buffers[0].writer.get_key_len_bytes() << " bytes\n"
- << "out val len = " << info.buffers[0].writer.get_val_len_bytes() << " bytes\n";
-
- uint_t buf_id = 0;
- uint64_t waiting = 0;
- hheap_t::const_item_t head = heap.head();
- while(heap.is_not_empty()) {
- uint64_t key = head->key;
- uint64_t sum = 0;
- do {
- sum += head->val;
- heap.pop();
- if(head->it->next())
- heap.push(*head->it);
- head = heap.head();
- } while(heap.is_not_empty() && head->key == key);
-
- while(!info.buffers[buf_id].writer.append(key, sum)) {
- info.cond.lock();
- info.buffers[buf_id].full = true;
- buf_id = (buf_id + 1) % info.nb_buffers;
- while(info.buffers[buf_id].full) { waiting++; info.cond.wait(); }
- info.cond.signal();
- info.cond.unlock();
- }
- }
- info.cond.lock();
- // while(info.buffers[buf_id].full) { waiting++; info.cond.wait(); }
- info.buffers[buf_id].full = true;
- info.done = true;
- info.cond.signal();
- info.cond.unlock();
-
- //uint64_t *writer_waiting;
- pthread_join(writer_thread, NULL);
-
- uint64_t unique = 0, distinct = 0, total = 0, max_count = 0;
- for(uint_t j = 0; j < info.nb_buffers; j++) {
- unique += info.buffers[j].writer.get_unique();
- distinct += info.buffers[j].writer.get_distinct();
- total += info.buffers[j].writer.get_total();
- if(info.buffers[j].writer.get_max_count() > max_count)
- max_count = info.buffers[j].writer.get_max_count();
- }
- info.buffers[0].writer.update_stats_with(&out, unique, distinct, total, max_count);
- out.close();
- return 0;
-}
diff --git a/jellyfish/hash_merge_cmdline.hpp b/jellyfish/hash_merge_cmdline.hpp
deleted file mode 100644
index 04b6c70..0000000
--- a/jellyfish/hash_merge_cmdline.hpp
+++ /dev/null
@@ -1,157 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __MERGE_ARGS_HPP__
-#define __MERGE_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class merge_args {
-public:
- uint64_t buffer_size_arg;
- bool buffer_size_given;
- yaggo::string output_arg;
- bool output_given;
- uint32_t out_counter_len_arg;
- bool out_counter_len_given;
- uint64_t out_buffer_size_arg;
- bool out_buffer_size_given;
- bool verbose_flag;
- std::vector<const char *> input_arg;
- typedef std::vector<const char *>::iterator input_arg_it;
- typedef std::vector<const char *>::const_iterator input_arg_const_it;
-
- enum {
- USAGE_OPT = 1000,
- OUT_COUNTER_LEN_OPT,
- OUT_BUFFER_SIZE_OPT
- };
-
- merge_args() :
- buffer_size_arg(10000000), buffer_size_given(false),
- output_arg("mer_counts_merged.jf"), output_given(false),
- out_counter_len_arg(4), out_counter_len_given(false),
- out_buffer_size_arg(10000000), out_buffer_size_given(false),
- verbose_flag(false)
- { }
-
- merge_args(int argc, char* argv[]) :
- buffer_size_arg(10000000), buffer_size_given(false),
- output_arg("mer_counts_merged.jf"), output_given(false),
- out_counter_len_arg(4), out_counter_len_given(false),
- out_buffer_size_arg(10000000), out_buffer_size_given(false),
- verbose_flag(false)
- { parse(argc, argv); }
-
- void parse(int argc, char* argv[]) {
- static struct option long_options[] = {
- {"buffer-size", 1, 0, 's'},
- {"output", 1, 0, 'o'},
- {"out-counter-len", 1, 0, OUT_COUNTER_LEN_OPT},
- {"out-buffer-size", 1, 0, OUT_BUFFER_SIZE_OPT},
- {"verbose", 0, 0, 'v'},
- {"help", 0, 0, 'h'},
- {"usage", 0, 0, USAGE_OPT},
- {"version", 0, 0, 'V'},
- {0, 0, 0, 0}
- };
- static const char *short_options = "hVs:o:v";
-
- std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
- while(true) {
- int index = -1;
- int c = getopt_long(argc, argv, short_options, long_options, &index);
- if(c == -1) break;
- switch(c) {
- case ':':
- std::cerr << "Missing required argument for "
- << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
- << std::endl;
- exit(1);
- case 'h':
- std::cout << usage() << "\n\n" << help() << std::endl;
- exit(0);
- case USAGE_OPT:
- std::cout << usage() << "\nUse --help for more information." << std::endl;
- exit(0);
- case 'V':
- print_version();
- exit(0);
- case '?':
- std::cerr << "Use --usage or --help for some help\n";
- exit(1);
- case 's':
- buffer_size_given = true;
- buffer_size_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, "-s, --buffer-size=Buffer length")
- break;
- case 'o':
- output_given = true;
- output_arg.assign(optarg);
- break;
- case OUT_COUNTER_LEN_OPT:
- out_counter_len_given = true;
- out_counter_len_arg = yaggo::conv_uint<uint32_t>((const char *)optarg, err, false);
- CHECK_ERR(uint32_t, optarg, " --out-counter-len=uint32")
- break;
- case OUT_BUFFER_SIZE_OPT:
- out_buffer_size_given = true;
- out_buffer_size_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, " --out-buffer-size=uint64")
- break;
- case 'v':
- verbose_flag = true;
- break;
- }
- }
-
- // Parse arguments
- if(argc - optind < 2)
- error("Requires at least 2 arguments.");
- for( ; optind < argc; ++optind) {
- input_arg.push_back(argv[optind]);
- }
- }
-
-#define merge_args_USAGE "Usage: jellyfish merge [options] input:string+"
- const char * usage() const { return merge_args_USAGE; }
- void error(const char *msg) {
- std::cerr << "Error: " << msg << "\n" << usage()
- << "\nUse --help for more information"
- << std::endl;
- exit(1);
- }
-
-#define merge_args_HELP "Merge jellyfish databases\n\n" \
- "Options (default value in (), *required):\n" \
- " -s, --buffer-size=Buffer length Length in bytes of input buffer (10000000)\n" \
- " -o, --output=string Output file (mer_counts_merged.jf)\n" \
- " --out-counter-len=uint32 Length (in bytes) of counting field in output (4)\n" \
- " --out-buffer-size=uint64 Size of output buffer per thread (10000000)\n" \
- " -v, --verbose Be verbose (false)\n" \
- " --usage Usage\n" \
- " -h, --help This message\n" \
- " -V, --version Version"
-
- const char * help() const { return merge_args_HELP; }
-#define merge_args_HIDDEN "Hidden options:"
-
- const char * hidden() const { return merge_args_HIDDEN; }
- void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
- os << PACKAGE_VERSION << "\n";
- }
- void dump(std::ostream &os = std::cout) {
- os << "buffer_size_given:" << buffer_size_given << " buffer_size_arg:" << buffer_size_arg << "\n";
- os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
- os << "out_counter_len_given:" << out_counter_len_given << " out_counter_len_arg:" << out_counter_len_arg << "\n";
- os << "out_buffer_size_given:" << out_buffer_size_given << " out_buffer_size_arg:" << out_buffer_size_arg << "\n";
- os << "verbose_flag:" << verbose_flag << "\n";
- os << "input_arg:" << yaggo::vec_str(input_arg) << "\n";
- }
-private:
-};
-
-#endif // __MERGE_ARGS_HPP__"
diff --git a/jellyfish/heap.hpp b/jellyfish/heap.hpp
deleted file mode 100644
index cae37f1..0000000
--- a/jellyfish/heap.hpp
+++ /dev/null
@@ -1,125 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_HEAP_HPP__
-#define __JELLYFISH_HEAP_HPP__
-
-#include <algorithm>
-
-namespace jellyfish {
- template<typename iterator>
- struct heap_item_t {
- uint64_t key;
- uint64_t val;
- uint64_t pos;
- iterator *it;
-
- heap_item_t() : key(0), val(0), pos(0) { }
-
- explicit heap_item_t(iterator &iter) {
- initialize(iter);
- }
-
- void initialize(iterator &iter) {
- key = iter.key;
- val = iter.val;
- pos = iter.get_pos();
- it = &iter;
- }
-
- // STL make_heap creates a max heap. We want a min heap, so
- // reverse comparator!
- bool operator<(const heap_item_t & other) {
- if(pos == other.pos)
- return key > other.key;
- return pos > other.pos;
- }
- };
-
- template<typename iterator>
- class heap_item_compare {
- public:
- inline bool operator() (heap_item_t<iterator> *i1, heap_item_t<iterator> *i2) {
- return *i1 < *i2;
- }
- };
-
- template<typename iterator>
- class heap_t {
- heap_item_t<iterator> *storage;
- heap_item_t<iterator> **elts;
- size_t capacity_;
- size_t h;
- heap_item_compare<iterator> compare;
- public:
- typedef const heap_item_t<iterator> *const_item_t;
-
- heap_t() : storage(0), elts(0), capacity_(0), h(0) { }
- explicit heap_t(size_t _capacity) { initialize(_capacity); }
- ~heap_t() {
- delete[] storage;
- delete[] elts;
- }
-
- void initialize(size_t _capacity) {
- capacity_ = _capacity;
- h = 0;
- storage = new heap_item_t<iterator>[capacity_];
- elts = new heap_item_t<iterator>*[capacity_];
- for(size_t h1 = 0; h1 < capacity_; ++h1)
- elts[h1] = &storage[h1];
- }
-
- void fill(iterator &it) {
- h = 0;
- while(h < capacity_) {
- if(!it.next())
- break;
- storage[h].initialize(it);
- elts[h] = &storage[h];
- h++;
- }
- std::make_heap(elts, elts + h, compare);
- }
- template<typename ForwardIterator>
- void fill(ForwardIterator first, ForwardIterator last) {
- h = 0;
- while(h < capacity_ && first != last) {
- if(!first->next())
- break;
- storage[h].initialize(*first++);
- elts[h] = &storage[h];
- h++;
- }
- std::make_heap(elts, elts + h, compare);
- }
-
- bool is_empty() const { return h == 0; }
- bool is_not_empty() const { return h > 0; }
- size_t size() const { return h; }
- size_t capacity() const { return capacity_; }
-
- // The following 3 should only be used after fill has been called
- const_item_t head() const { return elts[0]; }
- void pop() { std::pop_heap(elts, elts + h--, compare); }
- void push(iterator &item) {
- elts[h]->initialize(item);
- std::push_heap(elts, elts + ++h, compare);
- }
- };
-}
-
-#endif // __HEAP_HPP__
diff --git a/jellyfish/histo_fastq_main.cc b/jellyfish/histo_fastq_main.cc
deleted file mode 100644
index d26b97f..0000000
--- a/jellyfish/histo_fastq_main.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <math.h>
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/fastq_dumper.hpp>
-#include <jellyfish/histo_fastq_main_cmdline.hpp>
-
-int histo_fastq_main(int argc, char *argv[])
-{
- histo_fastq_main_args args(argc, argv);
-
- if(args.low_arg < 0.0)
- args.error("Low count (option --low,-l) must be >= 0.0");
-
- fastq_storage_t *hash = raw_fastq_dumper_t::read(args.db_arg);
- fastq_storage_t::iterator it = hash->iterator_all();
- float low_arg = args.low_arg;
- float increment_arg = args.increment_arg;
- float high_arg = args.high_arg;
- const float base =
- low_arg > 0.0 ? (increment_arg >= low_arg ? 0.0 : low_arg - increment_arg) : 0.0;
- const float ceil = high_arg + increment_arg;
- const int nb_buckets = (int)ceilf((ceil + increment_arg - base) / increment_arg);
- const int last_bucket = nb_buckets - 1;
- std::vector<uint64_t> histogram(nb_buckets, 0UL);
-
- while(it.next()) {
- int i = (int)roundf((it.get_val().to_float() - base) / increment_arg);
- if(i < 0) {
- histogram[0]++;
- } else if(i >= last_bucket) {
- histogram[last_bucket]++;
- } else {
- histogram[i]++;
- }
- }
-
- for(int i = 0; i < nb_buckets; i++)
- if(histogram[i] > 0.0 || args.full_flag)
- std::cout << (base + (float)i * increment_arg)
- << " " << histogram[i] << "\n";
-
- std::cout << std::flush;
-
- return 0;
-}
diff --git a/jellyfish/histo_fastq_main_cmdline.hpp b/jellyfish/histo_fastq_main_cmdline.hpp
deleted file mode 100644
index 69a89e6..0000000
--- a/jellyfish/histo_fastq_main_cmdline.hpp
+++ /dev/null
@@ -1,142 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __HISTO_FASTQ_MAIN_ARGS_HPP__
-#define __HISTO_FASTQ_MAIN_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class histo_fastq_main_args {
-public:
- double low_arg;
- bool low_given;
- double high_arg;
- bool high_given;
- double increment_arg;
- bool increment_given;
- bool full_flag;
- const char * db_arg;
-
- enum {
- USAGE_OPT = 1000,
- HELP_OPT
- };
-
- histo_fastq_main_args() :
- low_arg(0.0), low_given(false),
- high_arg(10000.0), high_given(false),
- increment_arg(1.0), increment_given(false),
- full_flag(false)
- { }
-
- histo_fastq_main_args(int argc, char* argv[]) :
- low_arg(0.0), low_given(false),
- high_arg(10000.0), high_given(false),
- increment_arg(1.0), increment_given(false),
- full_flag(false)
- { parse(argc, argv); }
-
- void parse(int argc, char* argv[]) {
- static struct option long_options[] = {
- {"low", 1, 0, 'l'},
- {"high", 1, 0, 'h'},
- {"increment", 1, 0, 'i'},
- {"full", 0, 0, 'f'},
- {"help", 0, 0, HELP_OPT},
- {"usage", 0, 0, USAGE_OPT},
- {"version", 0, 0, 'V'},
- {0, 0, 0, 0}
- };
- static const char *short_options = "Vl:h:i:f";
-
- std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
- while(true) {
- int index = -1;
- int c = getopt_long(argc, argv, short_options, long_options, &index);
- if(c == -1) break;
- switch(c) {
- case ':':
- std::cerr << "Missing required argument for "
- << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
- << std::endl;
- exit(1);
- case HELP_OPT:
- std::cout << usage() << "\n\n" << help() << std::endl;
- exit(0);
- case USAGE_OPT:
- std::cout << usage() << "\nUse --help for more information." << std::endl;
- exit(0);
- case 'V':
- print_version();
- exit(0);
- case '?':
- std::cerr << "Use --usage or --help for some help\n";
- exit(1);
- case 'l':
- low_given = true;
- low_arg = yaggo::conv_double((const char *)optarg, err, false);
- CHECK_ERR(double_t, optarg, "-l, --low=double")
- break;
- case 'h':
- high_given = true;
- high_arg = yaggo::conv_double((const char *)optarg, err, false);
- CHECK_ERR(double_t, optarg, "-h, --high=double")
- break;
- case 'i':
- increment_given = true;
- increment_arg = yaggo::conv_double((const char *)optarg, err, false);
- CHECK_ERR(double_t, optarg, "-i, --increment=double")
- break;
- case 'f':
- full_flag = true;
- break;
- }
- }
-
- // Parse arguments
- if(argc - optind != 1)
- error("Requires exactly 1 argument.");
- db_arg = argv[optind];
- ++optind;
- }
-
-#define histo_fastq_main_args_USAGE "Usage: jellyfish qhisto [options] db:string"
- const char * usage() const { return histo_fastq_main_args_USAGE; }
- void error(const char *msg) {
- std::cerr << "Error: " << msg << "\n" << usage()
- << "\nUse --help for more information"
- << std::endl;
- exit(1);
- }
-
-#define histo_fastq_main_args_HELP "Create an histogram of k-mer occurences\n\n" \
- "Options (default value in (), *required):\n" \
- " -l, --low=double Low count value of histogram (0.0)\n" \
- " -h, --high=double High count value of histogram (10000.0)\n" \
- " -i, --increment=double Increment value for buckets (1.0)\n" \
- " -f, --full Full histo. Don't skip count 0. (false)\n" \
- " --usage Usage\n" \
- " --help This message\n" \
- " -V, --version Version"
-
- const char * help() const { return histo_fastq_main_args_HELP; }
-#define histo_fastq_main_args_HIDDEN "Hidden options:"
-
- const char * hidden() const { return histo_fastq_main_args_HIDDEN; }
- void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
- os << PACKAGE_VERSION << "\n";
- }
- void dump(std::ostream &os = std::cout) {
- os << "low_given:" << low_given << " low_arg:" << low_arg << "\n";
- os << "high_given:" << high_given << " high_arg:" << high_arg << "\n";
- os << "increment_given:" << increment_given << " increment_arg:" << increment_arg << "\n";
- os << "full_flag:" << full_flag << "\n";
- os << "db_arg:" << db_arg << "\n";
- }
-private:
-};
-
-#endif // __HISTO_FASTQ_MAIN_ARGS_HPP__"
diff --git a/jellyfish/histo_main.cc b/jellyfish/histo_main.cc
deleted file mode 100644
index 77d7478..0000000
--- a/jellyfish/histo_main.cc
+++ /dev/null
@@ -1,132 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <iostream>
-#include <fstream>
-#include <vector>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/compacted_hash.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/counter.hpp>
-#include <jellyfish/histo_main_cmdline.hpp>
-#include <jellyfish/fstream_default.hpp>
-
-template<typename hash_t>
-class histogram : public thread_exec {
- const hash_t *hash;
- const uint_t threads;
- const uint64_t base, ceil, inc, nb_buckets, nb_slices;
- uint64_t *data;
- counter_t slice_id;
-
-public:
- histogram(const hash_t *_hash, uint_t _threads, uint64_t _base,
- uint64_t _ceil, uint64_t _inc) :
- hash(_hash), threads(_threads), base(_base), ceil(_ceil), inc(_inc),
- nb_buckets((ceil + inc - base) / inc), nb_slices(threads * 100)
- {
- data = new uint64_t[threads * nb_buckets];
- memset(data, '\0', threads * nb_buckets * sizeof(uint64_t));
- }
-
- ~histogram() {
- if(data)
- delete [] data;
- }
-
- void do_it() {
- exec_join(threads);
- }
-
- void start(int th_id) {
- uint64_t *hist = &data[th_id * nb_buckets];
-
- for(size_t i = slice_id++; i < nb_slices; i = slice_id++) {
- typename hash_t::iterator it = hash->iterator_slice(i, nb_slices);
- while(it.next()) {
- if(it.get_val() < base)
- ++hist[0];
- else if(it.get_val() > ceil)
- ++hist[nb_buckets - 1];
- else
- ++hist[(it.get_val() - base) / inc];
- }
- }
- }
-
- void print(std::ostream &out, bool full) {
- uint64_t col = base;
- for(uint64_t i = 0; i < nb_buckets; i++, col += inc) {
- uint64_t count = 0;
- for(uint_t j = 0; j < threads; j++)
- count += data[j * nb_buckets + i];
- if(count > 0 || full)
- out << col << " " << count << "\n";
- }
- }
-};
-
-int histo_main(int argc, char *argv[])
-{
- histo_args args(argc, argv);
-
- if(args.low_arg < 1)
- args.error("Low count value must be >= 1");
- if(args.high_arg < args.low_arg)
- args.error("High count value must be >= to low count value");
- ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
- if(!out.good())
- die << "Error opening output file '" << args.output_arg << "'" << err::no;
-
- const uint64_t base =
- args.low_arg > 1 ? (args.increment_arg >= args.low_arg ? 1 : args.low_arg - args.increment_arg) : 1;
- const uint64_t ceil = args.high_arg + args.increment_arg;
-
- mapped_file dbf(args.db_arg.c_str());
- dbf.sequential().will_need();
- char type[8];
- memcpy(type, dbf.base(), sizeof(type));
- if(!strncmp(type, jellyfish::raw_hash::file_type, sizeof(type))) {
- raw_inv_hash_query_t hash(dbf);
- histogram<raw_inv_hash_query_t> histo(&hash, args.threads_arg, base, ceil, args.increment_arg);
- histo.do_it();
- histo.print(out, args.full_flag);
- } else if(!strncmp(type, jellyfish::compacted_hash::file_type, sizeof(type))) {
- hash_query_t hash(dbf);
- if(args.verbose_flag)
- std::cerr << "mer length = " << hash.get_mer_len() << "\n"
- << "hash size = " << hash.get_size() << "\n"
- << "max reprobe = " << hash.get_max_reprobe() << "\n"
- << "matrix = " << hash.get_hash_matrix().xor_sum() << "\n"
- << "inv_matrix = " << hash.get_hash_inverse_matrix().xor_sum() << "\n";
- histogram<hash_query_t> histo(&hash, args.threads_arg, base, ceil, args.increment_arg);
- histo.do_it();
- histo.print(out, args.full_flag);
- } else {
- die << "Invalid file type '" << err::substr(type, sizeof(type)) << "'.";
- }
- out.close();
-
- return 0;
-}
diff --git a/jellyfish/histo_main_cmdline.hpp b/jellyfish/histo_main_cmdline.hpp
deleted file mode 100644
index 7539294..0000000
--- a/jellyfish/histo_main_cmdline.hpp
+++ /dev/null
@@ -1,199 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __HISTO_ARGS_HPP__
-#define __HISTO_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class histo_args {
-public:
- uint64_t low_arg;
- bool low_given;
- uint64_t high_arg;
- bool high_given;
- uint64_t increment_arg;
- bool increment_given;
- uint32_t threads_arg;
- bool threads_given;
- bool full_flag;
- const char * output_arg;
- bool output_given;
- uint64_t buffer_size_arg;
- bool buffer_size_given;
- bool verbose_flag;
- yaggo::string db_arg;
-
- enum {
- USAGE_OPT = 1000,
- FULL_HELP_OPT,
- HELP_OPT
- };
-
- histo_args() :
- low_arg(1), low_given(false),
- high_arg(10000), high_given(false),
- increment_arg(1), increment_given(false),
- threads_arg(1), threads_given(false),
- full_flag(false),
- output_arg(""), output_given(false),
- buffer_size_arg(10000000), buffer_size_given(false),
- verbose_flag(false)
- { }
-
- histo_args(int argc, char* argv[]) :
- low_arg(1), low_given(false),
- high_arg(10000), high_given(false),
- increment_arg(1), increment_given(false),
- threads_arg(1), threads_given(false),
- full_flag(false),
- output_arg(""), output_given(false),
- buffer_size_arg(10000000), buffer_size_given(false),
- verbose_flag(false)
- { parse(argc, argv); }
-
- void parse(int argc, char* argv[]) {
- static struct option long_options[] = {
- {"low", 1, 0, 'l'},
- {"high", 1, 0, 'h'},
- {"increment", 1, 0, 'i'},
- {"threads", 1, 0, 't'},
- {"full", 0, 0, 'f'},
- {"output", 1, 0, 'o'},
- {"buffer-size", 1, 0, 's'},
- {"verbose", 0, 0, 'v'},
- {"help", 0, 0, HELP_OPT},
- {"full-help", 0, 0, FULL_HELP_OPT},
- {"usage", 0, 0, USAGE_OPT},
- {"version", 0, 0, 'V'},
- {0, 0, 0, 0}
- };
- static const char *short_options = "Vl:h:i:t:fo:s:v";
-
- std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
- while(true) {
- int index = -1;
- int c = getopt_long(argc, argv, short_options, long_options, &index);
- if(c == -1) break;
- switch(c) {
- case ':':
- std::cerr << "Missing required argument for "
- << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
- << std::endl;
- exit(1);
- case HELP_OPT:
- std::cout << usage() << "\n\n" << help() << std::endl;
- exit(0);
- case USAGE_OPT:
- std::cout << usage() << "\nUse --help for more information." << std::endl;
- exit(0);
- case 'V':
- print_version();
- exit(0);
- case '?':
- std::cerr << "Use --usage or --help for some help\n";
- exit(1);
- case FULL_HELP_OPT:
- std::cout << usage() << "\n\n" << help() << "\n\n" << hidden() << std::endl;
- exit(0);
- case 'l':
- low_given = true;
- low_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, "-l, --low=uint64")
- break;
- case 'h':
- high_given = true;
- high_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, "-h, --high=uint64")
- break;
- case 'i':
- increment_given = true;
- increment_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, "-i, --increment=uint64")
- break;
- case 't':
- threads_given = true;
- threads_arg = yaggo::conv_uint<uint32_t>((const char *)optarg, err, false);
- CHECK_ERR(uint32_t, optarg, "-t, --threads=uint32")
- break;
- case 'f':
- full_flag = true;
- break;
- case 'o':
- output_given = true;
- output_arg = optarg;
- break;
- case 's':
- buffer_size_given = true;
- buffer_size_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, true);
- CHECK_ERR(uint64_t, optarg, "-s, --buffer-size=Buffer length")
- break;
- case 'v':
- verbose_flag = true;
- break;
- }
- }
-
- // Parse arguments
- if(argc - optind != 1)
- error("Requires exactly 1 argument.");
- db_arg = yaggo::string(argv[optind]);
- ++optind;
- }
-
-#define histo_args_USAGE "Usage: jellyfish histo [options] db:path"
- const char * usage() const { return histo_args_USAGE; }
- void error(const char *msg) {
- std::cerr << "Error: " << msg << "\n" << usage()
- << "\nUse --help for more information"
- << std::endl;
- exit(1);
- }
-
-#define histo_args_HELP "Create an histogram of k-mer occurrences\n\nCreate an histogram with the number of k-mers having a given\n" \
- "count. In bucket 'i' are tallied the k-mers which have a count 'c'\n" \
- "satisfying 'low+i*inc <= c < low+(i+1)*inc'. Buckets in the output are\n" \
- "labeled by the low end point (low+i*inc).\n" \
- "\n" \
- "The last bucket in the output behaves as a catchall: it tallies all\n" \
- "k-mers with a count greater or equal to the low end point of this\n" \
- "bucket.\n\n" \
- "Options (default value in (), *required):\n" \
- " -l, --low=uint64 Low count value of histogram (1)\n" \
- " -h, --high=uint64 High count value of histogram (10000)\n" \
- " -i, --increment=uint64 Increment value for buckets (1)\n" \
- " -t, --threads=uint32 Number of threads (1)\n" \
- " -f, --full Full histo. Don't skip count 0. (false)\n" \
- " -o, --output=string Output file\n" \
- " -v, --verbose Output information (false)\n" \
- " --usage Usage\n" \
- " --help This message\n" \
- " --full-help Detailed help\n" \
- " -V, --version Version"
-
- const char * help() const { return histo_args_HELP; }
-#define histo_args_HIDDEN "Hidden options:\n" \
- " -s, --buffer-size=Buffer length Length in bytes of input buffer (10000000)"
-
- const char * hidden() const { return histo_args_HIDDEN; }
- void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
- os << PACKAGE_VERSION << "\n";
- }
- void dump(std::ostream &os = std::cout) {
- os << "low_given:" << low_given << " low_arg:" << low_arg << "\n";
- os << "high_given:" << high_given << " high_arg:" << high_arg << "\n";
- os << "increment_given:" << increment_given << " increment_arg:" << increment_arg << "\n";
- os << "threads_given:" << threads_given << " threads_arg:" << threads_arg << "\n";
- os << "full_flag:" << full_flag << "\n";
- os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
- os << "buffer_size_given:" << buffer_size_given << " buffer_size_arg:" << buffer_size_arg << "\n";
- os << "verbose_flag:" << verbose_flag << "\n";
- os << "db_arg:" << db_arg << "\n";
- }
-private:
-};
-
-#endif // __HISTO_ARGS_HPP__"
diff --git a/jellyfish/invertible_hash_array.hpp b/jellyfish/invertible_hash_array.hpp
deleted file mode 100644
index f86f3f4..0000000
--- a/jellyfish/invertible_hash_array.hpp
+++ /dev/null
@@ -1,1015 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_REVERSIBLE_HASH__
-#define __JELLYFISH_REVERSIBLE_HASH__
-
-#include <stdlib.h>
-#include <string.h>
-#include <inttypes.h>
-#include <stdint.h>
-#include <iostream>
-#include <utility>
-#include <exception>
-#include <assert.h>
-#include <jellyfish/storage.hpp>
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
-#include <jellyfish/storage.hpp>
-#include <jellyfish/offsets_key_value.hpp>
-#include <jellyfish/parse_dna.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/simple_circular_buffer.hpp>
-
-namespace jellyfish {
- namespace invertible_hash {
- define_error_class(InvalidMap);
- define_error_class(ErrorAllocation);
- define_error_class(InvalidMatrix);
-
- /* Contains an integer, the reprobe limit. It is capped based on
- * the reprobe strategy to not be bigger than the size of the hash
- * array.
- */
- class reprobe_limit_t {
- uint_t limit;
- public:
- reprobe_limit_t(uint_t _limit, size_t *_reprobes, size_t _size) :
- limit(_limit)
- {
- while(_reprobes[limit] >= _size && limit >= 1)
- limit--;
- }
- inline uint_t val() const { return limit; }
- };
-
- /* (key,value) pair bit-packed array. It implements the logic of the
- * packed hash except for size doubling. Setting or incrementing a key
- * will return false if the hash is full. No memory management is done
- * in this class either.
- *
- * The hash function is assumed to be invertible. The key is not
- * directly stored in the hash. Let h = hash(key), size_table =
- * 2**k and key_len = h+k. In the key field is written
- *
- * h high bits of h, reprobe value + 1
- *
- * The +1 for the reprobe value is so that the field is guaranteed
- * not to be zero.
- */
- template <typename word, typename atomic_t, typename mem_block_t>
- class array : public storage_t {
- typedef typename Offsets<word>::offset_t offset_t;
- uint_t lsize; // log of size
- size_t size, size_mask;
- reprobe_limit_t reprobe_limit;
- uint_t key_len; // original key len
- word key_mask; // mask for high bits of hash(key)
- uint_t key_off; // offset in key field for reprobe value
- Offsets<word> offsets; // key len reduced by size of hash array
- mem_block_t mem_block;
- word *data;
- atomic_t atomic;
- size_t *reprobes;
- SquareBinaryMatrix hash_matrix;
- SquareBinaryMatrix hash_inverse_matrix;
- struct header {
- uint64_t klen;
- uint64_t clen;
- uint64_t size;
- uint64_t reprobe_limit;
- };
-
- public:
- typedef word key_t;
- typedef word val_t;
-
- array(size_t _size, uint_t _key_len, uint_t _val_len,
- uint_t _reprobe_limit, size_t *_reprobes) :
- lsize(ceilLog2(_size)), size(((size_t)1) << lsize),
- size_mask(size - 1),
- reprobe_limit(_reprobe_limit, _reprobes, size), key_len(_key_len),
- key_mask(key_len <= lsize ? 0 : (((word)1) << (key_len - lsize)) - 1),
- key_off(key_len <= lsize ? 0 : key_len - lsize),
- offsets(key_off + bitsize(reprobe_limit.val() + 1), _val_len,
- reprobe_limit.val() + 1),
- mem_block(div_ceil(size, (size_t)offsets.get_block_len()) * offsets.get_block_word_len() * sizeof(word)),
- data((word *)mem_block.get_ptr()), reprobes(_reprobes),
- hash_matrix(key_len),
- hash_inverse_matrix(hash_matrix.init_random_inverse())
- {
- if(!data)
- eraise(ErrorAllocation) << "Failed to allocate "
- << (div_ceil(size, (size_t)offsets.get_block_len()) * offsets.get_block_word_len() * sizeof(word))
- << " bytes of memory";
- }
-
- // TODO: This parsing should be done in another class and use
- // the following constructor.
- // array(char *map, size_t length) :
- // hash_matrix(0), hash_inverse_matrix(0) {
- // if(length < sizeof(struct header))
- // eraise(InvalidMap) << "File truncated";
- // struct header *header = (struct header *)map;
- // size = header->size;
- // if(size != (1UL << floorLog2(size)))
- // eraise(InvalidMap) << "Size '" << size << "' is not a power of 2";
- // lsize = ceilLog2(size);
- // size_mask = size - 1;
- // reprobe_limit = header->reprobe_limit;
- // key_len = header->klen;
- // if(key_len > 64 || key_len == 0)
- // eraise(InvalidMap) << "Invalid key length '" << key_len << "'";
- // offsets.init(key_len + bitsize(reprobe_limit + 1) - lsize, header->clen,
- // reprobe_limit);
- // key_mask = (((word)1) << (key_len - lsize)) - 1;
- // key_off = key_len - lsize;
- // map += sizeof(struct header);
- // // reprobes = new size_t[header->reprobe_limit + 1];
- // // TODO: should that be in the database file?
- // reprobes = jellyfish::quadratic_reprobes;
- // // memcpy(reprobes, map, sizeof(size_t) * (header->reprobe_limit + 1));
- // // map += sizeof(size_t) * (header->reprobe_limit + 1);
- // map += hash_matrix.read(map);
- // if((uint_t)hash_matrix.get_size() != key_len)
- // eraise(InvalidMatrix) << "Size of hash matrix '" << hash_matrix.get_size()
- // << "' not equal to key length '" << key_len << "'";
- // map += hash_inverse_matrix.read(map);
- // if((uint_t)hash_inverse_matrix.get_size() != key_len)
- // eraise(InvalidMatrix) << "Size of inverse hash matrix '" << hash_inverse_matrix.get_size()
- // << "' not equal to key length '" << key_len << "'";
- // if((size_t)map & 0x7)
- // map += 0x8 - ((size_t)map & 0x7); // Make sure aligned for 64bits word. TODO: use alignof?
- // data = (word *)map;
- // }
-
- // Assume _size is already a power of 2
- // map must point to a memory area written by "write_blocks". No header
- array(char *map, size_t _size, uint_t _key_len, uint_t _val_len,
- uint_t _reprobe_limit, size_t *_reprobes,
- SquareBinaryMatrix &_hash_matrix,
- SquareBinaryMatrix &_hash_inverse_matrix) :
- lsize(ceilLog2(_size)), size(_size), size_mask(size-1),
- reprobe_limit(_reprobe_limit, _reprobes, size), key_len(_key_len),
- key_mask(key_len <= lsize ? 0 : (((word)1) << (key_len - lsize)) - 1),
- key_off(key_len <= lsize ? 0 : key_len - lsize),
- offsets(key_off + bitsize(reprobe_limit.val() + 1), _val_len,
- reprobe_limit.val() + 1),
- data((word *)map), reprobes(_reprobes),
- hash_matrix(_hash_matrix), hash_inverse_matrix(_hash_inverse_matrix)
- { }
-
- ~array() { }
-
- // Lock in memory
- int lock() {
- return mem_block.lock();
- }
-
- void set_matrix(SquareBinaryMatrix &m) {
- if((uint_t)m.get_size() != key_len)
- eraise(InvalidMatrix) << "Size of matrix '" << m.get_size()
- << "' not equal to key length '" << key_len << "'";
- hash_matrix = m;
- hash_inverse_matrix = m.inverse();
- }
-
- size_t get_size() const { return size; }
- size_t get_lsize() const { return lsize; }
- uint_t get_key_len() const { return key_len; }
- uint_t get_val_len() const { return offsets.get_val_len(); }
-
- uint_t get_max_reprobe() const { return reprobe_limit.val(); }
- size_t get_max_reprobe_offset() const {
- return reprobes[reprobe_limit.val()];
- }
-
-
- uint_t get_block_len() const { return offsets.get_block_len(); }
- uint_t get_block_word_len() const { return offsets.get_block_word_len(); }
- size_t floor_block(size_t entries, size_t &blocks) const {
- return offsets.floor_block(entries, blocks);
- }
-
- private:
- void block_to_ptr(const size_t start, const size_t blen,
- char **start_ptr, size_t *memlen) const {
- *start_ptr = (char *)(data + start * offsets.get_block_word_len());
- char *end_ptr = (char *)mem_block.get_ptr() + mem_block.get_size();
-
- if(*start_ptr >= end_ptr) {
- *memlen = 0;
- return;
- }
- *memlen = blen * offsets.get_block_word_len() * sizeof(word);
- if(*start_ptr + *memlen > end_ptr)
- *memlen = end_ptr - *start_ptr;
- }
-
- public:
- /**
- * Zero out blocks in [start, start+length), where start and
- * length are given in number of blocks.
- **/
- void zero_blocks(const size_t start, const size_t length) {
- char *start_ptr;
- size_t memlen;
- block_to_ptr(start, length, &start_ptr, &memlen);
- memset(start_ptr, '\0', memlen);
- }
-
- /**
- * Write to out blocks [start, start+length).
- */
- void write_blocks(std::ostream *out, const size_t start, const size_t length) const {
- char *start_ptr;
- size_t memlen;
- block_to_ptr(start, length, &start_ptr, &memlen);
- out->write(start_ptr, memlen);
- }
-
- // Iterator
- class iterator {
- protected:
- const array *ary;
- size_t start_id, nid, end_id;
- uint64_t mask;
- char dna_str[33];
- public:
- word key;
- word val;
- size_t id;
- uint64_t hash;
-
- iterator(const array *_ary, size_t start, size_t end) :
- ary(_ary),
- start_id(start > ary->get_size() ? ary->get_size() : start),
- nid(start),
- end_id(end > ary->get_size() ? ary->get_size() : end),
- mask(ary->get_size() - 1)
- {}
-
- void get_string(char *out) const {
- parse_dna::mer_binary_to_string(key, ary->get_key_len() / 2, out);
- }
- uint64_t get_hash() const { return hash; }
- uint64_t get_pos() const { return hash & mask; }
- uint64_t get_start() const { return start_id; }
- uint64_t get_end() const { return end_id; }
- word get_key() const { return key; }
- word get_val() const { return val; }
- size_t get_id() const { return id; }
- char *get_dna_str() {
- parse_dna::mer_binary_to_string(key, ary->get_key_len() / 2, dna_str);
- return dna_str;
- }
-
- bool next() {
- bool success;
- while((id = nid) < end_id) {
- nid++;
- success = ary->get_key_val_full(id, key, val);
- if(success) {
- hash = (key & ary->key_mask) << ary->lsize;
- uint_t reprobep = (key >> ary->key_off) - 1;
- hash |= (id - (reprobep > 0 ? ary->reprobes[reprobep] : 0)) & ary->size_mask;
- key = ary->hash_inverse_matrix.times(hash);
- return true;
- }
- }
- return false;
- }
- };
- friend class iterator;
- iterator iterator_all() const { return iterator(this, 0, get_size()); }
- iterator iterator_slice(size_t slice_number, size_t number_of_slice) const {
- std::pair<size_t, size_t> res = slice(slice_number, number_of_slice, get_size());
- return iterator(this, res.first, res.second);
- }
-
- /* Why on earth doesn't inheritance with : public iterator work
- here? Resort to copying code. Arrrgggg....
- */
- class overlap_iterator {
- protected:
- const array *ary;
- uint64_t mask;
- size_t start_id, end_id, start_oid;
- size_t moid, oid;
- public:
- word key;
- word val;
- size_t id;
- uint64_t hash;
-
- overlap_iterator(const array *_ary, size_t start, size_t end) :
- ary(_ary),
- mask(ary->get_size() - 1),
- start_id(start),
- end_id(end > ary->get_size() ? ary->get_size() : end),
- start_oid(start),
- moid(end_id - start_id + ary->get_max_reprobe_offset()),
- oid(0)
- {
- // Adjust for very small arrays and it overlaps with itself
- if(moid > ary->get_size() - start_id) {
- size_t last_id = (start_id + moid) % mask;
- if(last_id > start_id)
- moid -= last_id - start_id - 1;
- }
- }
-
- void get_string(char *out) const {
- parse_dna::mer_binary_to_string(key, ary->get_key_len() / 2, out);
- }
- uint64_t get_hash() const { return hash; }
- uint64_t get_pos() const { return hash & mask; }
- uint64_t get_start() const { return start_id; }
- uint64_t get_end() const { return end_id; }
-
- bool next() {
- bool success;
- while(oid < moid) {
- id = (start_oid + oid++) & mask;
- success = ary->get_key_val_full(id, key, val);
- if(success) {
- hash = (key & ary->key_mask) << ary->lsize;
- uint_t reprobep = (key >> ary->key_off) - 1;
- hash |= (id - (reprobep > 0 ? ary->reprobes[reprobep] : 0)) & ary->size_mask;
- if(get_pos() < start_id || get_pos() >= end_id)
- continue;
- key = ary->hash_inverse_matrix.times(hash);
- return true;
- }
- }
- return false;
- }
- };
- friend class overlap_iterator;
-
- /* Return whether the entry is empty and if not, it returns the
- * key and if it has the large bit set.
- */
- void get_entry_stats(size_t id, bool &empty, word &key, bool &large) const {
- word *w, *kvw = NULL;
- const offset_t *o, *lo = NULL;
-
- w = offsets.get_word_offset(id, &o, &lo, data);
- kvw = w + o->key.woff;
- key = *kvw;
- large = key & o->key.lb_mask;
- if(large)
- o = lo;
- if(o->key.mask2) {
- key = (key & o->key.mask1 & ~o->key.sb_mask1) >> o->key.boff;
- key |= ((*(kvw+1)) & o->key.mask2 & ~o->key.sb_mask2) << o->key.shift;
- } else {
- key = (key & o->key.mask1) >> o->key.boff;
- }
- empty = key == 0;
- }
-
- /*
- * Return the key and value at position id. If the slot at id is
- * empty, returns false. If the slot at position id has the large
- * bit set, the key is resolved by looking backward in the
- * table. The value returned on the other hand is the value at
- * position id. No summation of the other entries for the key is
- * done.
- */
- bool get_key_val(size_t id, word &key, word &val) const {
- word *w, *kvw, *fw = NULL;
- const offset_t *o, *lo, *fo = NULL;
- bool large;
- uint_t overflows;
-
- overflows = 0;
- while(true) {
- w = offsets.get_word_offset(id, &o, &lo, data);
- kvw = w + o->key.woff;
- key = *kvw;
- large = key & o->key.lb_mask;
- if(large)
- o = lo;
- if(o->key.mask2) {
- key = (key & o->key.mask1 & ~o->key.sb_mask1) >> o->key.boff;
- key |= ((*(kvw+1)) & o->key.mask2 & ~o->key.sb_mask2) << o->key.shift;
- } else {
- key = (key & o->key.mask1) >> o->key.boff;
- }
-
- // Save offset and word for value retrieval
- if(!fo) {
- fo = o;
- fw = w;
- }
-
- if(large) {
- if(key)
- id -= reprobes[key];
- id = (id - reprobes[0]) & size_mask;
- overflows++;
- } else {
- break;
- }
- }
- if(!key)
- return false;
-
- kvw = fw + fo->val.woff;
- val = ((*kvw) & fo->val.mask1) >> fo->val.boff;
- if(fo->val.mask2) {
- val |= ((*(kvw+1)) & fo->val.mask2) << fo->val.shift;
- }
- if(overflows > 0) {
- val <<= offsets.get_val_len();
- if(--overflows > 0)
- val <<= offsets.get_lval_len() * overflows;
- }
- return true;
- }
-
- /*
- * Return the key and value at position id. If the slot at id is
- * empty or has the large bit set, returns false. Otherwise,
- * returns the key and the value is the sum of all the entries
- * in the hash table for that key. I.e., the table is search
- * forward for entries with large bit set pointing back to the
- * key at id, and all those values are summed up.
- */
- bool get_key_val_full(size_t id, word &key, word &val,
- bool carry_bit = false) const {
- const offset_t *o, *lo;
- word *w, *kvw, nkey, nval;
- uint_t reprobe = 0, overflows = 0;
- size_t cid;
-
- w = offsets.get_word_offset(id, &o, &lo, data);
- kvw = w + o->key.woff;
- key = *kvw;
- if(key & o->key.lb_mask)
- return false;
- if(o->key.mask2) {
- if((key & o->key.sb_mask1) == 0)
- return false;
- key = (key & o->key.mask1 & ~o->key.sb_mask1) >> o->key.boff;
- key |= ((*(kvw+1)) & o->key.mask2 & ~o->key.sb_mask2) << o->key.shift;
- } else {
- key = (key & o->key.mask1) >> o->key.boff;
- if(key == 0)
- return false;
- }
-
- kvw = w + o->val.woff;
- val = ((*kvw) & o->val.mask1) >> o->val.boff;
- if(o->val.mask2)
- val |= ((*(kvw+1)) & o->val.mask2) << o->val.shift;
-
- if(carry_bit) {
- bool do_reprobe = val & 0x1;
- val >>= 1;
- if(!do_reprobe)
- return true;
- }
-
- // Resolve value
- reprobe = 0;
- cid = id = (id + reprobes[0]) & size_mask;
- while(reprobe <= reprobe_limit.val()) {
- if(reprobe)
- cid = (id + reprobes[reprobe]) & size_mask;
-
- w = offsets.get_word_offset(cid, &o, &lo, data);
- kvw = w + o->key.woff;
- nkey = *kvw;
- if(nkey & o->key.lb_mask) {
- if(lo->key.mask2) {
- nkey = (nkey & lo->key.mask1 & ~lo->key.sb_mask1) >> lo->key.boff;
- nkey |= ((*(kvw+1)) & lo->key.mask2 & ~lo->key.sb_mask2) << lo->key.shift;
- } else {
- nkey = (nkey & lo->key.mask1) >> lo->key.boff;
- }
- if(nkey == reprobe) {
- kvw = w + lo->val.woff;
- nval = ((*kvw) & lo->val.mask1) >> lo->val.boff;
- if(lo->val.mask2)
- nval |= ((*(kvw+1)) & lo->val.mask2) << lo->val.shift;
- bool do_reprobe = true;
- if(carry_bit) {
- do_reprobe = nval & 0x1;
- nval >>= 1;
- }
-
- nval <<= offsets.get_val_len();
- nval <<= offsets.get_lval_len() * overflows;
- val += nval;
-
- if(!do_reprobe)
- return true;
-
- overflows++;
- reprobe = 0;
- cid = id = (cid + reprobes[0]) & size_mask;
- continue;
- }
- } else {
- if(o->key.mask2) {
- if((nkey & o->key.sb_mask1) == 0)
- return true;
- } else {
- if((nkey & o->key.mask1) == 0)
- return true;
- }
- }
-
- reprobe++;
- }
-
- return true;
- }
-
- inline bool get_val(const word key, word &val, bool full = false,
- bool carry_bit = false) const {
- uint64_t hash = hash_matrix.times(key);
- size_t key_id;
- return _get_val(hash & size_mask, key_id, (hash >> lsize) & key_mask, val,
- full, carry_bit);
- }
-
- inline bool get_val(const word key, size_t &key_id, word &val,
- bool full = false, bool carry_bit = false) const {
- uint64_t hash = hash_matrix.times(key);
- return _get_val(hash & size_mask, key_id, (hash >> lsize) & key_mask, val,
- full, carry_bit);
- }
-
- // /* InputIterator points to keys (words). OutputIterator points
- // to struct containing at least the fields { bool found; size_t
- // key_id; word val; }.
- // */
- // template<typename InputIterator, typename OutputIterator>
- // void get_multi_val(InputIterator key, const InputIterator& key_end,
- // OutputIterator val, bool full, bool carry_bit) const {
- // uint64_t phash, chash;
- // const offset_t *po, *plo, *co, *clo;
- // const word *pw, *cw;
-
- // if(key == key_end)
- // return;
-
- // // Call __get_val with a delay. Let prefetch work while we
- // // compute the hash/get the previous key.
- // phash = hash_matrix.times(*key);
- // pw = offsets.get_word_offset(phash & size_mask, &po, &plo, data);
- // //__builtin_prefetch(pw + po->key.woff, 0, 3);
-
- // for(++key; key != key_end; ++key, ++val) {
- // chash = hash_matrix.times(*key);
- // cw = offsets.get_word_offset(chash & size_mask, &co, &clo, data);
- // //__builtin_prefetch(cw + co->key.woff, 0, 3);
-
- // val->found = __get_val(phash & size_mask, val->key_id,
- // (phash >> lsize) & key_mask, val->val,
- // full, carry_bit, pw, po, plo);
-
-
- // pw = cw;
- // po = co;
- // plo = clo;
- // phash = chash;
- // }
- // // Last one
- // val->found = __get_val(phash & size_mask, val->key_id,
- // (phash >> lsize) & key_mask, val->val,
- // full, carry_bit, pw, po, plo);
- // }
-
- struct prefetch_info {
- const word* w;
- const offset_t *o, *lo;
- };
- typedef simple_circular_buffer::pre_alloc<prefetch_info, 8> prefetch_buffer;
-
- void warm_up_cache(prefetch_buffer& buffer, size_t id, bool load_lo) const {
- buffer.clear();
- for(int i = 0; i < buffer.capacity(); ++i) {
- buffer.push_back();
- prefetch_info& info = buffer.back();
- size_t cid = (id + (i > 0 ? reprobes[i] : 0)) & size_mask;
- info.w = offsets.get_word_offset(cid, &info.o, &info.lo, data);
- __builtin_prefetch(info.w + info.o->key.woff, 0, 1);
- __builtin_prefetch(info.o, 0, 3);
- if(load_lo)
- __builtin_prefetch(info.lo, 0, 3);
- }
- }
-
- void prefetch_next(prefetch_buffer& buffer, size_t id, uint_t reprobe, bool load_lo) const {
- buffer.pop_front();
- if(reprobe + buffer.capacity() <= reprobe_limit.val()) {
- buffer.push_back();
- prefetch_info& info = buffer.back();
- size_t fid = (id + reprobes[reprobe + buffer.capacity() - 1]) & size_mask;
- info.w = offsets.get_word_offset(fid, &info.o, &info.lo, data);
- __builtin_prefetch(info.w + info.o->key.woff, 0, 1);
- __builtin_prefetch(info.o, 0, 3);
- if(load_lo)
- __builtin_prefetch(info.lo, 0, 3);
- }
-
- }
-
- bool _get_val(const size_t id, size_t &key_id, const word key, word &val,
- bool full = false, bool carry_bit = false) const {
- // Buffer for pre-cached information
- prefetch_info info_ary[prefetch_buffer::capacity()];
- prefetch_buffer buffer(info_ary);
- warm_up_cache(buffer, id, false);
-
- return __get_val(id, key_id, key, val, full, carry_bit, buffer);
- }
-
- bool __get_val(const size_t id, size_t &key_id, const word key, word &val,
- const bool full, bool carry_bit,
- prefetch_buffer& buffer) const {
- const word *kvw;
- word nkey, nval;
- size_t cid = id;
- uint_t reprobe = 0;
- word akey = key | ((word)1 << key_off);
-
- // Find key
- const offset_t *o, *lo;
- const word* w;
- while(true) {
- prefetch_info& info = buffer.front();
- w = info.w;
- o = info.o;
- kvw = w + o->key.woff;
- nkey = *kvw;
-
- if(!(nkey & o->key.lb_mask)) {
- if(o->key.mask2) {
- nkey = (nkey & o->key.mask1 & ~o->key.sb_mask1) >> o->key.boff;
- nkey |= ((*(kvw+1)) & o->key.mask2 & ~o->key.sb_mask2) << o->key.shift;
- } else {
- nkey = (nkey & o->key.mask1) >> o->key.boff;
- }
- if(nkey == akey)
- break;
- }
- if(++reprobe > reprobe_limit.val())
- return false;
- // Do reprobe
- cid = (id + reprobes[reprobe]) & size_mask;
- akey = key | ((reprobe + 1) << key_off);
-
- prefetch_next(buffer, id, reprobe, false);
- }
-
- // Get value
- kvw = w + o->val.woff;
- val = ((*kvw) & o->val.mask1) >> o->val.boff;
- if(o->val.mask2) {
- val |= ((*(kvw+1)) & o->val.mask2) << o->val.shift;
- }
- bool do_reprobe = true;
- if(carry_bit) {
- do_reprobe = val & 0x1;
- val >>= 1;
- }
- key_id = cid;
-
- // Eventually get large values... TODO: this seems buggy. It
- // only looks for large values once, not as many times as
- // needed.
- if(full && do_reprobe) {
- const size_t bid = (cid + reprobes[0]) & size_mask;
- cid = bid;
-
- warm_up_cache(buffer, bid, true);
-
- reprobe = 0;
- do {
- prefetch_info& info = buffer.front();
- const word* w = info.w;
- o = info.o;
- lo = info.lo;
- kvw = w + o->key.woff;
- nkey = *kvw;
- if(nkey & o->key.lb_mask) {
- if(lo->key.mask2) {
- nkey = (nkey & lo->key.mask1 & ~lo->key.sb_mask1) >> lo->key.boff;
- nkey |= ((*(kvw+1)) & lo->key.mask2 & ~lo->key.sb_mask2) << lo->key.shift;
- } else {
- nkey = (nkey & lo->key.mask1) >> lo->key.boff;
- }
- if(nkey == reprobe) {
- kvw = w + lo->val.woff;
- nval = ((*kvw) & lo->val.mask1) >> lo->val.boff;
- if(lo->val.mask2)
- nval |= ((*(kvw+1)) & lo->val.mask2) << lo->val.shift;
- if(carry_bit) {
- nval >>= 1;
- val |= nval << (offsets.get_val_len() - 1);
- } else
- val |= nval << offsets.get_val_len();
- break; // Should break only if carry_bit of nval is
- // not set. Otherwise, we should reset the
- // reprobe to 0 and try again.
- }
- }
-
- cid = (bid + reprobes[++reprobe]) & size_mask;
-
- prefetch_next(buffer, bid, reprobe, true);
- } while(reprobe <= reprobe_limit.val());
- }
-
- return true;
- }
-
- /**
- * Use hash values as counters
- */
- inline bool add(word key, word val, word *oval = 0) {
- uint64_t hash = hash_matrix.times(key);
- return add_rec(hash & size_mask, (hash >> lsize) & key_mask,
- val, false, oval);
- }
-
-
-
- /**
- * Use hash as a set.
- */
- inline bool add(word _key, bool *is_new) __attribute__((deprecated)) {
- size_t id;
- return set(_key, is_new, &id);
- }
- inline bool set(word _key, bool *is_new) {
- size_t id;
- return set(_key, is_new, &id);
- }
- bool add(word _key, bool *is_new, size_t *id) __attribute__((deprecated)) {
- return set(_key, is_new, id);
- }
- bool set(word _key, bool *is_new, size_t *id) {
- const offset_t *ao;
- uint64_t hash = hash_matrix.times(_key);
- word *w;
- *id = hash & size_mask;
- return claim_key((hash >> lsize) & key_mask, is_new, id, false,
- &ao, &w);
- }
-
- /**
- * Use hash as a map. This sets a value with the key. It is only
- * partially thread safe. I.e., multiple different key can be
- * added concurrently. On the other hand, the same key can not
- * be added at the same time by different thread: the value set
- * may not be correct.
- */
- inline bool map(word _key, word val) {
- bool is_new;
- return map(_key, val, &is_new);
- }
-
- bool map(word _key, word val, bool* is_new) {
- uint64_t hash = hash_matrix.times(_key);
- return map_rec(hash & size_mask, (hash >> lsize) & key_mask, val, false,
- is_new);
- }
-
- void write_ary_header(std::ostream *out) const {
- hash_matrix.dump(out);
- hash_inverse_matrix.dump(out);
- }
-
- void write_raw(std::ostream *out) const {
- if(out->tellp() & 0x7) { // Make sure aligned
- std::string padding(0x8 - (out->tellp() & 0x7), '\0');
- out->write(padding.c_str(), padding.size());
- }
- out->write((char *)mem_block.get_ptr(), mem_block.get_size());
- }
-
- private:
- /* id is input/output. Equal to hash & size_maks on input. Equal
- * to actual id where key was set on output. key is already hash
- * shifted and masked to get higher bits. (>> lsize & key_mask)
- *
- * is_new is set on output to true if key did not exists in hash
- * before. *ao points to the actual offsets object.
- */
- bool claim_key(const word &key, bool *is_new, size_t *id, bool large,
- const offset_t **_ao, word **_w) {
- uint_t reprobe = 0;
- const offset_t *o, *lo, *ao;
- word *w, *kw, nkey;
- bool key_claimed = false;
- size_t cid = *id;
- word akey = large ? 0 :(key | ((word)1 << key_off));
-
- do {
- *_w = w = offsets.get_word_offset(cid, &o, &lo, data);
- *_ao = ao = large ? lo : o;
-
- kw = w + ao->key.woff;
-
- if(ao->key.mask2) { // key split on two words
- nkey = akey << ao->key.boff;
- nkey |= ao->key.sb_mask1;
- if(large)
- nkey |= ao->key.lb_mask;
- nkey &= ao->key.mask1;
-
- // Use o->key.mask1 and not ao->key.mask1 as the first one is
- // guaranteed to be bigger. The key needs to be free on its
- // longer mask to claim it!
- key_claimed = set_key(kw, nkey, o->key.mask1, ao->key.mask1);
- if(key_claimed) {
- nkey = ((akey >> ao->key.shift) | ao->key.sb_mask2) & ao->key.mask2;
- key_claimed = key_claimed && set_key(kw + 1, nkey, o->key.mask2, ao->key.mask2, is_new);
- }
- } else { // key on one word
- nkey = akey << ao->key.boff;
- if(large)
- nkey |= ao->key.lb_mask;
- nkey &= ao->key.mask1;
- key_claimed = set_key(kw, nkey, o->key.mask1, ao->key.mask1, is_new);
- }
- if(!key_claimed) { // reprobe
- if(++reprobe > reprobe_limit.val())
- return false;
- cid = (*id + reprobes[reprobe]) & size_mask;
-
- if(large)
- akey = reprobe;
- else
- akey = key | ((reprobe + 1) << key_off);
- }
- } while(!key_claimed);
-
- *id = cid;
- return true;
- }
-
- bool add_rec(size_t id, word key, word val, bool large, word *oval) {
- const offset_t *ao;
- word *w;
-
- bool is_new = false;
- if(!claim_key(key, &is_new, &id, large, &ao, &w))
- return false;
- if(oval)
- *oval = !is_new;
-
- // Increment value
- word *vw = w + ao->val.woff;
- word cary = add_val(vw, val, ao->val.boff, ao->val.mask1);
- cary >>= ao->val.shift;
- if(cary && ao->val.mask2) { // value split on two words
- cary = add_val(vw + 1, cary, 0, ao->val.mask2);
- cary >>= ao->val.cshift;
- }
- if(cary) {
- id = (id + reprobes[0]) & size_mask;
- if(add_rec(id, key, cary, true, 0))
- return true;
-
- // Adding failed, table is full. Need to back-track and
- // substract val.
- cary = add_val(vw, ((word)1 << offsets.get_val_len()) - val,
- ao->val.boff, ao->val.mask1);
- cary >>= ao->val.shift;
- if(cary && ao->val.mask2) {
- // Can I ignore the cary here? Table is known to be full, so
- // not much of a choice. But does it leave the table in a
- // consistent state?
- add_val(vw + 1, cary, 0, ao->val.mask2);
- }
- return false;
- }
- return true;
- }
-
- // Store val in the hash at position id. Reprobe and recurse if
- // val does not fit in counter field. A bit is added at the
- // beginning of the counting field indicating whether there is
- // another entry for the same key further in the hash.
- bool map_rec(size_t id, word key, word val, bool large, bool* is_new) {
- const offset_t* ao;
- word* w;
- bool is_new_entry = false;
- if(!claim_key(key, &is_new_entry, &id, large, &ao, &w))
- return false;
- if(is_new)
- *is_new = is_new_entry;
-
- // Determine if there will be a carry
- val <<= 1;
- val |= (val > offsets.get_max_val(large));
-
- // Set value
- word *vw = w + ao->val.woff;
- word oval = 0;
- word cary = set_val(vw, val, ao->val.boff, ao->val.mask1, oval);
- cary >>= ao->val.shift;
- bool cary_bit = oval & 0x1;
- if(ao->val.mask2) { // value split on two words. Write even if
- // cary is 0 as there maybe some value in
- // there already
- cary = set_val(vw + 1, cary, 0, ao->val.mask2, oval);
- cary >>= ao->val.cshift;
- }
- // Done if there is no carry and previous value did not have
- // the carry_bit set
- if(!cary && !cary_bit)
- return true;
- id = (id + reprobes[0]) & size_mask;
- return map_rec(id, key, cary, true, 0);
- }
-
- inline bool set_key(word *w, word nkey, word free_mask,
- word equal_mask) {
- word ow = *w, nw, okey;
-
- okey = ow & free_mask;
- while(okey == 0) { // large bit not set && key is free
- nw = atomic.cas(w, ow, ow | nkey);
- if(nw == ow)
- return true;
- ow = nw;
- okey = ow & free_mask;
- }
- return (ow & equal_mask) == nkey;
- }
-
- inline bool set_key(word *w, word nkey, word free_mask,
- word equal_mask, bool *is_new) {
- word ow = *w, nw, okey;
-
- okey = ow & free_mask;
- while(okey == 0) { // large bit not set && key is free
- nw = atomic.cas(w, ow, ow | nkey);
- if(nw == ow) {
- *is_new = true;
- return true;
- }
- ow = nw;
- okey = ow & free_mask;
- }
- *is_new = false;
- return (ow & equal_mask) == nkey;
- }
-
-
- inline word add_val(word *w, word val, uint_t shift, word mask) {
- word now = *w, ow, nw, nval;
-
- do {
- ow = now;
- nval = ((ow & mask) >> shift) + val;
- nw = (ow & ~mask) | ((nval << shift) & mask);
- now = atomic.cas(w, ow, nw);
- } while(now != ow);
-
- return nval & (~(mask >> shift));
- }
-
- inline word set_val(word *w, word val, uint_t shift, word mask,
- word& oval) {
- word now = *w, ow, nw;
- word sval = (val << shift) & mask;
-
- do {
- ow = now;
- nw = (ow & ~mask) | sval;
- now = atomic.cas(w, ow, nw);
- } while(now != ow);
-
- oval = (ow & mask) >> shift;
- return val & (~(mask >> shift));
- }
- };
-
- /*****/
- }
-}
-
-#endif // __REVERSIBLE_HASH__
diff --git a/jellyfish/locking_hash_counters.hpp b/jellyfish/locking_hash_counters.hpp
deleted file mode 100644
index d26ec5e..0000000
--- a/jellyfish/locking_hash_counters.hpp
+++ /dev/null
@@ -1,372 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_LOCKING_HASH_COUNTERS__
-#define __JELLYFISH_LOCKING_HASH_COUNTERS__
-
-#include <new>
-#include <cstring>
-#include <iostream>
-#include <pthread.h>
-#include <stdint.h>
-using namespace std;
-
-struct stats {
- unsigned int key_conflicts;
- unsigned int val_conflicts;
- unsigned int destroyed_key;
- unsigned int destroyed_val;
- unsigned int maxed_out_val;
- unsigned int maxed_reprobe;
- unsigned int resized_arys;
-};
-#ifdef LOCKING_HASH_STATS
-#define LOCKING_HASH_STAT_INC(var) __sync_fetch_and_add(&stats->var, 1);
-#else
-#define LOCKING_HASH_STAT_INC(var)
-#endif
-
-template <class Key, class Val, class A>
-class arys_iterator {
- A *ary;
- unsigned long pos;
-
-public:
- Key key;
- Val val;
-
- explicit arys_iterator(A *_ary) : ary(_ary), pos(0) {
- }
-
- ~arys_iterator() { }
-
- void rewind() { pos = 0; }
-
- bool next() {
- Key *ckey;
- Val *cval;
-
- while(pos < ary->size) {
- ary->get(pos++, &ckey, &cval);
- key = *ckey;
- if(key & 0x1) {
- val = *cval;
- key >>= 1;
- return true;
- }
- }
- return false;
- }
-};
-
-class bad_size_exception: public exception
-{
- virtual const char* what() const throw() {
- return "Size must be a power of 2";
- }
-};
-
-
-template <class Key, class Val, unsigned int nb, unsigned int shift, unsigned int mask>
-class arys_t {
-public:
- typedef Key key_t;
- typedef Val val_t;
- /* Keys. Lower order bits are used internally.
- * 0: is key set?
- * 1: is key destroyed?
- */
- /* Values. Lower order bit is used internally.
- * 0: is value destroyed?
- */
- typedef struct elt {
- Key keys[nb];
- Val vals[nb];
- } elt;
- elt *key_vals;
-
- unsigned long size;
- unsigned long esize;
- unsigned long mod_mask;
- bool allocated;
-
- /* arys are in a linked list. They are freed in reverse order of
- * creation. The link from previous arys counts as 1 reference, to
- * ensure proper order of deletion.
- * The constructor is not thread safe (protect by mutex)
- */
- explicit arys_t(unsigned long _size) :
- allocated(true) {
- size = 1;
- while(_size > size) { size <<= 1; }
- esize = size >> shift;
- mod_mask = size - 1;
- key_vals = new elt[esize];
- memset(key_vals, '\0', sizeof(elt) * esize);
- }
-
- arys_t(unsigned long _size, char *map) :
- allocated(false) {
- size = 1;
- while(_size > size) { size <<= 1; }
- if(_size != size)
- throw new bad_size_exception;
- mod_mask = size - 1;
- key_vals = (elt *)map;
- }
-
- ~arys_t() {
- if(allocated)
- delete[] key_vals;
- }
-
- inline void get(unsigned long idx, Key **k, Val **v) {
- elt *e = &key_vals[idx >> shift];
- *k = &e->keys[idx & mask];
- *v = &e->vals[idx & mask];
- }
-
- typedef arys_iterator<Key,Val,arys_t> iterator;
- arys_iterator<Key,Val,arys_t> * new_iterator() {
- return new arys_iterator<Key,Val,arys_t>(this);
- }
-};
-
-template <class Key, class Val, class arys_t>
-class thread_hash_counter {
- arys_t * volatile *key_val_arys_ptr;
- arys_t *key_val_arys;
- unsigned int max_reprobe;
- pthread_mutex_t *hash_lock;
- struct stats *stats;
-
- void resize(arys_t *cary);
- void no_lock_add(Key k, Val v);
-
-public:
- thread_hash_counter(arys_t * volatile * _arys,
- unsigned int _max_reprobe,
- pthread_mutex_t *_hash_lock, struct stats *_stats) :
- key_val_arys_ptr(_arys), max_reprobe(_max_reprobe),
- hash_lock(_hash_lock), stats(_stats) {
- key_val_arys = *key_val_arys_ptr;
- }
-
- ~thread_hash_counter() { }
-
- inline void add(Key k, Val v);
- inline void inc(Key k) { add(k, 1); }
-};
-
-template <class Key, class Val, class arys_t>
-class locking_hash_counter {
- arys_t * volatile key_val_arys;
- struct stats stats;
- unsigned int max_reprobe;
- pthread_mutex_t hash_lock;
-
-public:
- locking_hash_counter(unsigned long _size, unsigned int _max_reprobe);
- ~locking_hash_counter();
-
- typedef thread_hash_counter<Key, Val, arys_t> thread;
-
- thread *new_hash_counter() {
- return new thread_hash_counter<Key,Val,arys_t>(&key_val_arys,
- max_reprobe, &hash_lock,
- &stats);
- }
-
- unsigned long size() { return key_val_arys->size; }
-
- // Not thread safe
- void print(ostream &out);
- void print_debug(ostream &out);
- void write_keys_vals(ostream &out);
-
- int has_stats() {
-#ifdef LOCKING_HASH_STATS
- return 1;
-#else
- return 0;
-#endif
- };
- void print_stats(ostream &out);
-};
-
-/*
- * Usefull sizes
- */
-typedef arys_t<uint64_t,uint32_t,2,1,0x1> arys_64_32_t;
-typedef locking_hash_counter<uint64_t,uint32_t,arys_64_32_t> chc_64_32_t;
-
-/*
- * locking_hash_counter
- */
-template <class Key, class Val, class arys_t>
-locking_hash_counter<Key,Val,arys_t>::locking_hash_counter(unsigned long _size,
- unsigned int _max_reprobe) :
- max_reprobe(_max_reprobe) {
- key_val_arys = new arys_t(_size);
- pthread_mutex_init(&hash_lock, NULL);
- memset(&stats, 0, sizeof(stats));
-}
-
-template<class Key, class Val, class arys_t>
-locking_hash_counter<Key,Val,arys_t>::~locking_hash_counter() {
- pthread_mutex_destroy(&hash_lock);
- delete key_val_arys;
-}
-
-template<class Key, class Val, class arys_t>
-void locking_hash_counter<Key,Val,arys_t>::print_debug(ostream &out) {
-// unsigned long i;
-// arys_t *carys = key_val_arys;
-// Key key;
-
-// for(i = 0; i < carys->size; i++) {
-// key = carys->keys[i];
-// if(key & 0x1)
-// out << i << " " << (key >> 2) << " " << (key & 0x3) << " " <<
-// (carys->vals[i] >> 1) << endl;
-// else
-// out << i << " Empty" << endl;
-// }
-}
-
-template<class Key, class Val, class arys_t>
-void locking_hash_counter<Key,Val,arys_t>::print(ostream &out) {
- unsigned long i;
- arys_t *carys = key_val_arys;
- Key *ckey, key;
- Val *cval;
-
- for(i = 0; i < carys->size; i++) {
- carys->get(i, &ckey, &cval);
- key = *ckey;
- if(key & 0x1)
- out << (key >> 2) << " " << (*cval >> 1) << endl;
- }
-}
-
-template<class Key, class Val, class arys_t>
-void locking_hash_counter<Key,Val,arys_t>::write_keys_vals(ostream &out) {
- arys_t *carys = key_val_arys;
-
- out.write((char *)carys->key_vals, sizeof(typename arys_t::elt) * carys->esize);
-}
-
-template<class Key, class Val, class arys_t>
-void locking_hash_counter<Key,Val,arys_t>::print_stats(ostream &out) {
-#ifdef STATS
-#define PRINT_STAT(var) { out << #var ": " << stats.var << endl; }
-#else
-#define PRINT_STAT(var) { out << #var ": -" << endl; }
-#endif
-
- PRINT_STAT(key_conflicts);
- PRINT_STAT(val_conflicts);
- PRINT_STAT(destroyed_key);
- PRINT_STAT(destroyed_val);
- PRINT_STAT(maxed_out_val);
- PRINT_STAT(maxed_reprobe);
- PRINT_STAT(resized_arys);
-}
-
-/*
- * thread_hash_counter
- */
-template <class Key, class Val, class arys_t>
-inline void thread_hash_counter<Key,Val,arys_t>::add(Key k, Val v) {
- pthread_mutex_lock(hash_lock);
- no_lock_add(k, v);
- pthread_mutex_unlock(hash_lock);
-}
-
-template <class Key, class Val, class arys_t>
-void thread_hash_counter<Key,Val,arys_t>::no_lock_add(Key k, Val v) {
- unsigned long idx;
- Key key, inkey;
- Val val, sval, cval;
- arys_t *carys;
- Key *ckeys;
- Val *cvals;
- unsigned int reprobe = 0;
-
- inkey = (k << 1) | 0x1;
- carys = *key_val_arys_ptr;
- idx = k & carys->mod_mask;
- while(1) {
- carys->get(idx, &ckeys, &cvals);
- key = *ckeys;
- if(!(key & 0x1)) { // Key is free
- *ckeys = inkey;
- break;
- }
- if(inkey == key) { // Key already in
- break;
- }
-
- // Reprobe, or resize and try again.
- if(++reprobe > max_reprobe) {
- LOCKING_HASH_STAT_INC(maxed_reprobe);
- resize(carys);
- carys = *key_val_arys_ptr;
- idx = k & carys->mod_mask;
- } else {
- idx = (idx + 1) & carys->mod_mask; // reprobe
- }
- }
-
- val = *cvals;
- cval = ~val;
- if(cval == (Val)0x0) { // If key at its max, do not increment
- LOCKING_HASH_STAT_INC(maxed_out_val);
- } else {
- if(cval < v) { // Key reaches its max, truncate
- sval = (Val)~0x0;
- LOCKING_HASH_STAT_INC(maxed_out_val);
- } else {
- sval = val + v;
- }
- *cvals = sval;
- }
-}
-
-template<class Key, class Val, class arys_t>
-void thread_hash_counter<Key,Val,arys_t>::resize(arys_t *carys) {
- unsigned long i;
- Key *ckey;
- Val *cval;
- arys_t *narys;
-
- narys = new arys_t(carys->size << 1);
- *key_val_arys_ptr = narys;
-
- // Copy over and free old data
- Key key;
- for(i = 0; i < carys->size; i++) {
- carys->get(i, &ckey, &cval);
- key = *ckey;
- if(key & 0x1) { // Copy value
- no_lock_add(key >> 1, *cval);
- }
- }
- delete carys;
- LOCKING_HASH_STAT_INC(resized_arys);
-}
-
-#endif /* __LOCKING_HASH_COUNTERS__ */
diff --git a/jellyfish/locks_pthread.hpp b/jellyfish/locks_pthread.hpp
deleted file mode 100644
index 63d2422..0000000
--- a/jellyfish/locks_pthread.hpp
+++ /dev/null
@@ -1,172 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_LOCKS_PTHREAD_HPP__
-#define __JELLYFISH_LOCKS_PTHREAD_HPP__
-
-#include <pthread.h>
-
-namespace locks {
- namespace pthread {
- class cond
- {
- pthread_mutex_t _mutex;
- pthread_cond_t _cond;
-
- public:
- cond() {
- pthread_mutex_init(&_mutex, NULL);
- pthread_cond_init(&_cond, NULL);
- }
-
- ~cond() {
- pthread_cond_destroy(&_cond);
- pthread_mutex_destroy(&_mutex);
- }
-
- inline void lock() { pthread_mutex_lock(&_mutex); }
- inline void unlock() { pthread_mutex_unlock(&_mutex); }
- inline void wait() { pthread_cond_wait(&_cond, &_mutex); }
- inline void signal() { pthread_cond_signal(&_cond); }
- inline void broadcast() { pthread_cond_broadcast(&_cond); }
- };
-
- class mutex
- {
- pthread_mutex_t _mutex;
-
- public:
- mutex() {
- pthread_mutex_init(&_mutex, NULL);
- }
-
- ~mutex() {
- pthread_mutex_destroy(&_mutex);
- }
-
- inline void lock() { pthread_mutex_lock(&_mutex); }
- inline void unlock() { pthread_mutex_unlock(&_mutex); }
- inline bool try_lock() { return !pthread_mutex_trylock(&_mutex); }
- };
-
- class Semaphore
- {
- int _value, _wakeups;
- cond _cv;
- public:
- explicit Semaphore(int value) :
- _value(value),
- _wakeups(0)
- {
- // nothing to do
- }
-
- ~Semaphore() {}
-
- inline void wait() {
- _cv.lock();
- _value--;
- if (_value < 0) {
- do {
- _cv.wait();
- } while(_wakeups < 1);
- _wakeups--;
- }
- _cv.unlock();
- }
-
- inline void signal() {
- _cv.lock();
- _value++;
- if(_value <= 0) {
- _wakeups++;
- _cv.signal();
- }
- _cv.unlock();
- }
- };
-
-#if defined(_POSIX_BARRIERS) && (_POSIX_BARRIERS - 20012L) >= 0
- class barrier
- {
- pthread_barrier_t _barrier;
-
- public:
- explicit barrier(unsigned count) {
-
- pthread_barrier_init(&_barrier, NULL, count);
- }
-
- ~barrier() {
- pthread_barrier_destroy(&_barrier);
- }
-
- inline int wait() {
- return pthread_barrier_wait(&_barrier);
- }
- };
-
-#else
-# ifndef PTHREAD_BARRIER_SERIAL_THREAD
-# define PTHREAD_BARRIER_SERIAL_THREAD 1
-# endif
-
- class barrier
- {
- int count; // required # of threads
- int current; // current # of threads that have passed thru
- mutex barlock; // protect current
- Semaphore barrier1; // implement the barrier
- Semaphore barrier2;
-
- public:
- explicit barrier(unsigned cnt)
- : count(cnt), current(0), barrier1(0), barrier2(0) {
- }
-
- ~barrier() {}
-
- inline int wait() {
- int ret = 0;
- barlock.lock();
- current += 1;
- if(current == count) {
- ret = PTHREAD_BARRIER_SERIAL_THREAD;
- for(int i=0; i<count;i++) {
- barrier1.signal();
- }
- }
- barlock.unlock();
- barrier1.wait(); // wait for n threads to arrive
-
- barlock.lock();
- current -= 1;
- if(current == 0) {
- for(int i=0;i<count;i++) {
- barrier2.signal();
- }
- }
- barlock.unlock();
- barrier2.wait();
- return ret;
- }
- };
-
-#endif
- }
-}
-#endif
-
diff --git a/jellyfish/mapped_file.cc b/jellyfish/mapped_file.cc
deleted file mode 100644
index e1fbfb5..0000000
--- a/jellyfish/mapped_file.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/mapped_file.hpp>
-
-char mapped_file::load() const {
- long sz = sysconf(_SC_PAGESIZE);
- char unused = 0;
- for(char *w = _base; w < _base + _length; w += sz)
- unused ^= *w;
- return unused;
-}
diff --git a/jellyfish/mapped_file.hpp b/jellyfish/mapped_file.hpp
deleted file mode 100644
index 9c94d6c..0000000
--- a/jellyfish/mapped_file.hpp
+++ /dev/null
@@ -1,181 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_MAPPED_FILE_HPP__
-#define __JELLYFISH_MAPPED_FILE_HPP__
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <vector>
-#include <errno.h>
-#include <iostream>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/dbg.hpp>
-
-class mapped_file {
-protected:
- std::string _path;
- bool _unmap;
- char *_base, *_end;
- size_t _length;
-
- void map(const char *filename) {
- int fd = open(filename, O_RDONLY);
- struct stat stat;
-
- if(fd < 0)
- eraise(ErrorMMap) << "Can't open file '" << filename << "'" << err::no;
-
- if(fstat(fd, &stat) < 0)
- eraise(ErrorMMap) << "Can't stat file '" << filename << "'" << err::no;
-
- _length = stat.st_size;
- _base = (char *)mmap(NULL, _length, PROT_READ, MAP_PRIVATE, fd, 0);
- if(_base == MAP_FAILED)
- eraise(ErrorMMap) << "Can't mmap file '" << filename << "'" << err::no;
- close(fd);
- _end = _base + _length;
- }
-
-public:
- define_error_class(ErrorMMap);
- mapped_file(char *__base, size_t __length) :
- _unmap(false), _base(__base), _end(__base + __length), _length(__length) {}
-
- explicit mapped_file(const char *filename) : _path(filename), _unmap(false) {
- map(filename);
- }
- mapped_file(const mapped_file &mf) :
- _path(mf.path()), _unmap(false), _base(mf._base), _end(mf._end),
- _length(mf._length) {}
-
- ~mapped_file() {
- if(_unmap)
- unmap();
- }
-
- void unmap() {
- if(!_base)
- return;
- munmap(_base, _length);
- _base = 0;
- _length = 0;
- }
-
- char *base() const { return _base; }
- char *end() const { return _end; }
- size_t length() const { return _length; }
- std::string path() const { return _path; }
-
- bool will_unmap(bool value = true) {
- bool ovalue = _unmap;
- _unmap = value;
- return ovalue;
- }
- // No error checking here. Should I throw something?
- const mapped_file & will_need() const {
- madvise(_base, _length, MADV_WILLNEED);
- return *this;
- }
- const mapped_file & sequential() const {
- madvise(_base, _length, MADV_SEQUENTIAL);
- return *this;
- }
- const mapped_file & random() const {
- madvise(_base, _length, MADV_RANDOM);
- return *this;
- }
- const mapped_file & lock() const {
- if(mlock(_base, _length) < 0)
- eraise(ErrorMMap) << "Can't lock map in memory" << err::no;
- return *this;
- }
-
- // Do not optimize. Side effect is that every page is accessed and should now be in cache.
- // The flagg __attribute__((optimize(0))) does not compile, so return a useless char argument
- char load() const;
-};
-
-class mapped_files_t : public std::vector<mapped_file> {
-public:
- mapped_files_t(int nb_files, char *argv[]) {
- for(int j = 0; j < nb_files; j++)
- push_back(mapped_file(argv[j]));
- }
-
- mapped_files_t(int nb_files, char *argv[], bool sequential) {
- for(int j = 0; j < nb_files; j++) {
- push_back(mapped_file(argv[j]));
- if(sequential)
- end()->sequential();
- }
- }
-};
-
-// File mapped on demand.
-class lazy_mapped_file_t : public mapped_file {
- std::string _path;
- volatile bool done;
- volatile long used_counter;
-
-public:
- explicit lazy_mapped_file_t(const char *path) :
- mapped_file((char *)0, (size_t)0),
- _path(path), done(false), used_counter(0) {}
-
- void map() {
- used_counter = 1;
- done = false;
- mapped_file::map(_path.c_str());
- }
- void unmap() {
- done = true;
- dec();
- }
-
- void inc() {
- atomic::gcc::fetch_add(&used_counter, (long)1);
- }
- void dec() {
- long val = atomic::gcc::add_fetch(&used_counter, (long)-1);
- if(done && val == 0)
- mapped_file::unmap();
- }
-};
-
-class lazy_mapped_files_t : public std::vector<lazy_mapped_file_t> {
-public:
- lazy_mapped_files_t(int nb_files, char *argv[]) {
- for(int j = 0; j < nb_files; j++)
- push_back(lazy_mapped_file_t(argv[j]));
- }
-
- lazy_mapped_files_t(int nb_files, char *argv[], bool sequential) {
- for(int j = 0; j < nb_files; j++) {
- push_back(lazy_mapped_file_t(argv[j]));
- if(sequential)
- end()->sequential();
- }
- }
-};
-
-#endif
diff --git a/jellyfish/mer_counter.cc b/jellyfish/mer_counter.cc
deleted file mode 100644
index 0a4502f..0000000
--- a/jellyfish/mer_counter.cc
+++ /dev/null
@@ -1,379 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <pthread.h>
-#include <fstream>
-#include <exception>
-#include <memory>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <stdint.h>
-#include <inttypes.h>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/backtrace.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/time.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/locks_pthread.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
-#include <jellyfish/count_main_cmdline.hpp>
-#include <jellyfish/noop_dumper.hpp>
-
-// Temporary
-//#include <jellyfish/measure_dumper.hpp>
-
-void die_on_error(std::string& err) {
- std::cerr << "Error: " << err << std::endl;
- exit(1);
-}
-
-void warn_on_error(std::string& err) {
- std::cerr << "Warn: " << err << std::endl;
-}
-
-
-// TODO: This mer_counting_base stuff has become wild. Lots of code
-// duplication and slightly different behavior for each (e.g. setup of
-// the hashing matrix). Refactor!
-class mer_counting_base {
-public:
- virtual ~mer_counting_base() {}
- virtual void count() = 0;
- virtual Time get_writing_time() const = 0;
- virtual uint64_t get_distinct() const = 0;
- virtual uint64_t get_total() const = 0;
-};
-
-template <typename parser_t, typename hash_t>
-class mer_counting : public mer_counting_base, public thread_exec {
-protected:
- count_args *args;
- locks::pthread::barrier sync_barrier;
- parser_t *parser;
- typename hash_t::storage_t *ary;
- hash_t *hash;
- jellyfish::dumper_t *dumper;
- uint64_t distinct, total;
-
-public:
- explicit mer_counting(count_args &_args) :
- args(&_args), sync_barrier(args->threads_arg),
- distinct(0), total(0) {}
-
- ~mer_counting() {
- if(dumper)
- delete dumper;
- if(hash)
- delete hash;
- if(ary)
- delete ary;
- if(parser)
- delete parser;
- }
-
- void start(int id) {
- sync_barrier.wait();
-
- typename parser_t::thread mer_stream(parser->new_thread());
- typename hash_t::thread_ptr_t counter(hash->new_thread());
-
- if(args->invalid_char_arg != count_args::invalid_char::ignore) {
- if(args->invalid_char_arg == count_args::invalid_char::warn)
- mer_stream.set_error_reporter(warn_on_error);
- else
- mer_stream.set_error_reporter(die_on_error);
- }
-
- mer_stream.parse(counter);
-
- bool is_serial = sync_barrier.wait() == PTHREAD_BARRIER_SERIAL_THREAD;
- if(is_serial) {
- hash->dump();
- }
-
- atomic::gcc::fetch_add(&distinct, mer_stream.get_distinct());
- atomic::gcc::fetch_add(&total, mer_stream.get_total());
- }
-
- void count() {
- exec_join(args->threads_arg);
- }
-
- virtual Time get_writing_time() const { return hash->get_writing_time(); }
- virtual uint64_t get_distinct() const { return distinct; }
- virtual uint64_t get_total() const { return total; }
-};
-
-class mer_counting_fasta_hash : public mer_counting<jellyfish::parse_dna, inv_hash_t> {
-public:
- mer_counting_fasta_hash(const std::vector<const char *> &files,
- count_args &_args) :
- mer_counting<jellyfish::parse_dna, inv_hash_t>(_args)
- {
- parser = new jellyfish::parse_dna(files.begin(), files.end(),
- args->mer_len_arg, args->buffers_arg,
- args->buffer_size_arg);
- ary = new inv_hash_t::storage_t(args->size_arg, 2*args->mer_len_arg,
- args->counter_len_arg,
- args->reprobes_arg,
- jellyfish::quadratic_reprobes);
- if(args->matrix_given) {
- std::ifstream fd;
- fd.exceptions(std::ifstream::eofbit|std::ifstream::failbit|std::ifstream::badbit);
- fd.open(args->matrix_arg.c_str());
- SquareBinaryMatrix m(&fd);
- fd.close();
- ary->set_matrix(m);
- }
- hash = new inv_hash_t(ary);
-
- if(args->no_write_flag) {
- dumper = new jellyfish::noop_dumper();
- } else {
- // if(args->measure) {
- // dumper = new jellyfish::measure_dumper<inv_hash_t::storage_t>(ary);
- // } else
- if(args->raw_flag) {
- dumper = new raw_inv_hash_dumper_t((uint_t)4, args->output_arg.c_str(),
- args->out_buffer_size_arg, ary);
- } else {
- inv_hash_dumper_t *_dumper =
- new inv_hash_dumper_t(args->threads_arg, args->output_arg.c_str(),
- args->out_buffer_size_arg,
- 8*args->out_counter_len_arg, ary);
- _dumper->set_one_file(args->O_flag);
- if(args->lower_count_given)
- _dumper->set_lower_count(args->lower_count_arg);
- if(args->upper_count_given)
- _dumper->set_upper_count(args->upper_count_arg);
- dumper = _dumper;
- }
- }
- hash->set_dumper(dumper);
- parser->set_canonical(args->both_strands_flag);
- }
-};
-
-class mer_counting_qual_fasta_hash : public mer_counting<jellyfish::parse_qual_dna, inv_hash_t> {
-public:
- mer_counting_qual_fasta_hash(const std::vector<const char *> &files,
- count_args &_args) :
- mer_counting<jellyfish::parse_qual_dna, inv_hash_t>(_args)
- {
- parser = new jellyfish::parse_qual_dna(files,
- args->mer_len_arg, args->buffers_arg,
- args->buffer_size_arg, args->quality_start_arg,
- args->min_quality_arg);
- ary = new inv_hash_t::storage_t(args->size_arg, 2*args->mer_len_arg,
- args->counter_len_arg,
- args->reprobes_arg,
- jellyfish::quadratic_reprobes);
- if(args->matrix_given) {
- std::ifstream fd;
- fd.exceptions(std::ifstream::eofbit|std::ifstream::failbit|std::ifstream::badbit);
- fd.open(args->matrix_arg.c_str());
- SquareBinaryMatrix m(&fd);
- fd.close();
- ary->set_matrix(m);
- }
- hash = new inv_hash_t(ary);
-
- if(args->no_write_flag) {
- dumper = new jellyfish::noop_dumper();
- } else {
- if(args->raw_flag) {
- dumper = new raw_inv_hash_dumper_t((uint_t)4, args->output_arg.c_str(),
- args->out_buffer_size_arg, ary);
- } else {
- inv_hash_dumper_t *_dumper =
- new inv_hash_dumper_t(args->threads_arg, args->output_arg.c_str(),
- args->out_buffer_size_arg,
- 8*args->out_counter_len_arg, ary);
- _dumper->set_one_file(args->O_flag);
- if(args->lower_count_given)
- _dumper->set_lower_count(args->lower_count_arg);
- if(args->upper_count_given)
- _dumper->set_upper_count(args->upper_count_arg);
- dumper = _dumper;
- }
- }
- hash->set_dumper(dumper);
- parser->set_canonical(args->both_strands_flag);
- }
-};
-
-
-class mer_counting_fasta_direct : public mer_counting<jellyfish::parse_dna, direct_index_t> {
-public:
- mer_counting_fasta_direct(const std::vector<const char *> &files,
- count_args &_args) :
- mer_counting<jellyfish::parse_dna, direct_index_t>(_args)
- {
- parser = new jellyfish::parse_dna(files.begin(), files.end(),
- args->mer_len_arg, args->buffers_arg,
- args->buffer_size_arg);
- ary = new direct_index_t::storage_t(2 * args->mer_len_arg);
- hash = new direct_index_t(ary);
- if(args->no_write_flag) {
- dumper = new jellyfish::noop_dumper();
- } else {
- if(args->raw_flag)
- std::cerr << "Switch --raw not (yet) supported with direct indexing. Ignoring." << std::endl;
- direct_index_dumper_t *_dumper =
- new direct_index_dumper_t(args->threads_arg, args->output_arg.c_str(),
- args->out_buffer_size_arg,
- 8*args->out_counter_len_arg,
- ary);
- _dumper->set_one_file(args->O_flag);
- if(args->lower_count_given)
- _dumper->set_lower_count(args->lower_count_arg);
- if(args->upper_count_given)
- _dumper->set_upper_count(args->upper_count_arg);
- dumper = _dumper;
- }
- hash->set_dumper(dumper);
- parser->set_canonical(args->both_strands_flag);
- }
-};
-
-class mer_counting_qual_fasta_direct : public mer_counting<jellyfish::parse_qual_dna, direct_index_t> {
-public:
- mer_counting_qual_fasta_direct(const std::vector<const char *> &files,
- count_args &_args) :
- mer_counting<jellyfish::parse_qual_dna, direct_index_t>(_args)
- {
- parser = new jellyfish::parse_qual_dna(files,
- args->mer_len_arg, args->buffers_arg,
- args->buffer_size_arg, args->quality_start_arg,
- args->min_quality_arg);
- ary = new direct_index_t::storage_t(2 * args->mer_len_arg);
- hash = new direct_index_t(ary);
- if(args->no_write_flag) {
- dumper = new jellyfish::noop_dumper();
- } else {
- if(args->raw_flag)
- std::cerr << "Switch --raw not (yet) supported with direct indexing. Ignoring." << std::endl;
- direct_index_dumper_t *_dumper =
- new direct_index_dumper_t(args->threads_arg, args->output_arg.c_str(),
- args->out_buffer_size_arg,
- 8*args->out_counter_len_arg,
- ary);
- _dumper->set_one_file(args->O_flag);
- if(args->lower_count_given)
- _dumper->set_lower_count(args->lower_count_arg);
- if(args->upper_count_given)
- _dumper->set_upper_count(args->upper_count_arg);
- dumper = _dumper;
- }
- hash->set_dumper(dumper);
- parser->set_canonical(args->both_strands_flag);
- }
-};
-
-class mer_counting_quake : public mer_counting<jellyfish::parse_quake, fastq_hash_t> {
-public:
- mer_counting_quake(std::vector<const char *>,
- count_args &_args) :
- mer_counting<jellyfish::parse_quake, fastq_hash_t>(_args)
- {
- parser = new jellyfish::parse_quake(args->file_arg,
- args->mer_len_arg, args->buffers_arg,
- args->buffer_size_arg,
- args->quality_start_arg);
- ary = new fastq_hash_t::storage_t(args->size_arg, 2*args->mer_len_arg,
- args->reprobes_arg,
- jellyfish::quadratic_reprobes);
- hash = new fastq_hash_t(ary);
- if(args->no_write_flag) {
- dumper = new jellyfish::noop_dumper();
- } else {
- dumper = new raw_fastq_dumper_t(args->threads_arg, args->output_arg.c_str(),
- args->out_buffer_size_arg,
- ary);
- }
- hash->set_dumper(dumper);
- parser->set_canonical(args->both_strands_flag);
- }
-};
-
-int count_main(int argc, char *argv[])
-{
- count_args args(argc, argv);
-
- if(args.mer_len_arg < 2 || args.mer_len_arg > 31)
- die << "Invalid mer length '" << args.mer_len_arg
- << "'. It must be in [2, 31].";
-
- Time start;
- mer_counting_base *counter;
- if(!args.buffers_given)
- args.buffers_arg = 20 * args.threads_arg;
-
- if(args.quake_flag) {
- counter = new mer_counting_quake(args.file_arg, args);
- } else if(ceilLog2((unsigned long)args.size_arg) > 2 * (unsigned long)args.mer_len_arg) {
- if(args.min_quality_given)
- counter = new mer_counting_qual_fasta_direct(args.file_arg, args);
- else
- counter = new mer_counting_fasta_direct(args.file_arg, args);
- } else if(args.min_quality_given) {
- counter = new mer_counting_qual_fasta_hash(args.file_arg, args);
- } else {
- counter = new mer_counting_fasta_hash(args.file_arg, args);
- }
- Time after_init;
- counter->count();
- Time all_done;
-
- if(args.timing_given) {
- std::ofstream timing_fd(args.timing_arg);
- if(!timing_fd.good()) {
- std::cerr << "Can't open timing file '" << args.timing_arg << err::no
- << std::endl;
- } else {
- Time writing = counter->get_writing_time();
- Time counting = (all_done - after_init) - writing;
- timing_fd << "Init " << (after_init - start).str() << "\n"
- << "Counting " << counting.str() << "\n"
- << "Writing " << writing.str() << "\n";
- timing_fd.close();
- }
- }
-
- if(args.stats_given) {
- std::ofstream stats_fd(args.stats_arg);
- if(!stats_fd.good()) {
- std::cerr << "Can't open stats file '" << args.stats_arg << err::no
- << std::endl;
- } else {
- stats_fd << "Distinct: " << counter->get_distinct() << "\n"
- << "Total: " << counter->get_total() << std::endl;
- stats_fd.close();
- }
- }
-
- return 0;
-}
diff --git a/jellyfish/mer_counting.hpp b/jellyfish/mer_counting.hpp
deleted file mode 100644
index 42bc2c2..0000000
--- a/jellyfish/mer_counting.hpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_MER_COUNTING__
-#define __JELLYFISH_MER_COUNTING__
-
-#include <sys/types.h>
-#include <stdint.h>
-#include <stdarg.h>
-#include <vector>
-#include <utility>
-
-#include <jellyfish/misc.hpp>
-#include <jellyfish/storage.hpp>
-#include <jellyfish/hash.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/allocators_mmap.hpp>
-#include <jellyfish/compacted_hash.hpp>
-#include <jellyfish/compacted_dumper.hpp>
-#include <jellyfish/raw_dumper.hpp>
-#include <jellyfish/parse_dna.hpp>
-#include <jellyfish/parse_qual_dna.hpp>
-
-// Invertible hash types
-#include <jellyfish/invertible_hash_array.hpp>
-#include <jellyfish/sorted_dumper.hpp>
-typedef jellyfish::invertible_hash::array<uint64_t,atomic::gcc,allocators::mmap> inv_hash_storage_t;
-typedef jellyfish::sorted_dumper< inv_hash_storage_t,atomic::gcc> inv_hash_dumper_t;
-typedef jellyfish::raw_hash::dumper<inv_hash_storage_t> raw_inv_hash_dumper_t;
-typedef jellyfish::raw_hash::query<inv_hash_storage_t> raw_inv_hash_query_t;
-typedef jellyfish::hash< uint64_t,uint64_t,inv_hash_storage_t,atomic::gcc > inv_hash_t;
-
-// Direct indexing types
-#include <jellyfish/direct_indexing_array.hpp>
-#include <jellyfish/direct_sorted_dumper.hpp>
-#include <jellyfish/capped_integer.hpp>
-typedef jellyfish::direct_indexing::array<uint64_t,jellyfish::capped_integer<uint32_t>,atomic::gcc,allocators::mmap> direct_index_storage_t;
-typedef jellyfish::direct_sorted_dumper< direct_index_storage_t, atomic::gcc> direct_index_dumper_t;
-typedef jellyfish::hash< uint64_t,jellyfish::capped_integer<uint32_t>,direct_index_storage_t,atomic::gcc> direct_index_t;
-
-// Quake types
-#include <jellyfish/aligned_values_array.hpp>
-#include <jellyfish/floats.hpp>
-#include <jellyfish/fastq_dumper.hpp>
-#include <jellyfish/parse_quake.hpp>
-typedef jellyfish::aligned_values::array<uint64_t,jellyfish::Float,atomic::gcc,allocators::mmap> fastq_storage_t;
-typedef jellyfish::hash<uint64_t,jellyfish::Float,fastq_storage_t,atomic::gcc> fastq_hash_t;
-typedef jellyfish::fastq_hash::raw_dumper<fastq_storage_t> raw_fastq_dumper_t;
-
-// Compacted hash types
-typedef jellyfish::compacted_hash::reader<uint64_t,uint64_t> hash_reader_t;
-typedef jellyfish::compacted_hash::query<uint64_t,uint64_t> hash_query_t;
-typedef jellyfish::compacted_hash::writer<hash_reader_t> hash_writer_t;
-
-#endif /* __MER_COUNTING__ */
diff --git a/jellyfish/merge_files.cc b/jellyfish/merge_files.cc
new file mode 100644
index 0000000..66fe517
--- /dev/null
+++ b/jellyfish/merge_files.cc
@@ -0,0 +1,151 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <jellyfish/merge_files.hpp>
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <memory>
+#include <string>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/mer_heap.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+#include <jellyfish/cpp_array.hpp>
+
+namespace err = jellyfish::err;
+
+using jellyfish::file_header;
+using jellyfish::RectangularBinaryMatrix;
+using jellyfish::mer_dna;
+using jellyfish::cpp_array;
+typedef std::auto_ptr<binary_reader> binary_reader_ptr;
+typedef std::auto_ptr<text_reader> text_reader_ptr;
+
+struct file_info {
+ std::ifstream is;
+ file_header header;
+
+ file_info(const char* path) :
+ is(path),
+ header(is)
+ { }
+};
+typedef std::auto_ptr<RectangularBinaryMatrix> matrix_ptr;
+
+template<typename reader_type, typename writer_type>
+void do_merge(cpp_array<file_info>& files, std::ostream& out, writer_type& writer,
+ uint64_t min, uint64_t max) {
+ cpp_array<reader_type> readers(files.size());
+ typedef jellyfish::mer_heap::heap<mer_dna, reader_type> heap_type;
+ typedef typename heap_type::const_item_t heap_item;
+ heap_type heap(files.size());
+
+ for(size_t i = 0; i < files.size(); ++i) {
+ readers.init(i, files[i].is, &files[i].header);
+ if(readers[i].next())
+ heap.push(readers[i]);
+ }
+
+ heap_item head = heap.head();
+ mer_dna key;
+ while(heap.is_not_empty()) {
+ key = head->key_;
+ uint64_t sum = 0;
+ do {
+ sum += head->val_;
+ heap.pop();
+ if(head->it_->next())
+ heap.push(*head->it_);
+ head = heap.head();
+ } while(head->key_ == key && heap.is_not_empty());
+ if(sum >= min && sum <= max)
+ writer.write(out, key, sum);
+ }
+}
+
+// Merge files. Throws an error if unsuccessful.
+void merge_files(std::vector<const char*> input_files,
+ const char* out_file,
+ file_header& out_header,
+ uint64_t min, uint64_t max) {
+ unsigned int key_len = 0;
+ size_t max_reprobe_offset = 0;
+ size_t size = 0;
+ unsigned int out_counter_len = std::numeric_limits<unsigned int>::max();
+ std::string format;
+ matrix_ptr matrix;
+
+ cpp_array<file_info> files(input_files.size());
+
+ // create an iterator for each hash file
+ for(size_t i = 0; i < files.size(); i++) {
+ files.init(i, input_files[i]);
+ if(!files[i].is.good())
+ throw MergeError(err::msg() << "Failed to open input file '" << input_files[i] << "'");
+
+ file_header& h = files[i].header;
+ if(i == 0) {
+ key_len = h.key_len();
+ max_reprobe_offset = h.max_reprobe_offset();
+ size = h.size();
+ matrix.reset(new RectangularBinaryMatrix(h.matrix()));
+ out_header.size(size);
+ out_header.key_len(key_len);
+ format = h.format();
+ out_header.matrix(*matrix);
+ out_header.max_reprobe(h.max_reprobe());
+ size_t reprobes[h.max_reprobe() + 1];
+ h.get_reprobes(reprobes);
+ out_header.set_reprobes(reprobes);
+ out_counter_len = std::min(out_counter_len, h.counter_len());
+ } else {
+ if(format != h.format())
+ throw MergeError(err::msg() << "Can't merge files with different formats (" << format << ", " << h.format() << ")");
+ if(h.key_len() != key_len)
+ throw MergeError(err::msg() << "Can't merge hashes of different key lengths (" << key_len << ", " << h.key_len() << ")");
+ if(h.max_reprobe_offset() != max_reprobe_offset)
+ throw MergeError("Can't merge hashes with different reprobing strategies");
+ if(h.size() != size)
+ throw MergeError(err::msg() << "Can't merge hash with different size (" << size << ", " << h.size() << ")");
+ if(h.matrix() != *matrix)
+ throw MergeError("Can't merge hash with different hash function");
+ }
+ }
+ mer_dna::k(key_len / 2);
+
+ std::ofstream out(out_file);
+ if(!out.good())
+ throw MergeError(err::msg() << "Can't open out file '" << out_file << "'");
+ out_header.format(format);
+
+ if(!format.compare(binary_dumper::format)) {
+ out_header.counter_len(out_counter_len);
+ out_header.write(out);
+ binary_writer writer(out_counter_len, key_len);
+ do_merge<binary_reader, binary_writer>(files, out, writer, min, max);
+ } else if(!format.compare(text_dumper::format)) {
+ out_header.write(out);
+ text_writer writer;
+ do_merge<text_reader, text_writer>(files, out, writer, min, max);
+ } else {
+ throw MergeError(err::msg() << "Unknown format '" << format << "'");
+ }
+ out.close();
+}
diff --git a/jellyfish/err.cc b/jellyfish/merge_files.hpp
similarity index 63%
copy from jellyfish/err.cc
copy to jellyfish/merge_files.hpp
index 933d488..d717975 100644
--- a/jellyfish/err.cc
+++ b/jellyfish/merge_files.hpp
@@ -14,16 +14,17 @@
along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
*/
+#ifndef __JELLYFISH_MERGE_FILES_HPP__
+#define __JELLYFISH_MERGE_FILES_HPP__
+
+#include <vector>
#include <jellyfish/err.hpp>
+#include <jellyfish/file_header.hpp>
+
+define_error_class(MergeError);
+
+/// Merge files. Throw a MergeError in case of error.
+void merge_files(std::vector<const char*> input_files, const char* out_file,
+ jellyfish::file_header& h, uint64_t min, uint64_t max);
-namespace err {
- std::ostream &operator<<(std::ostream &os, const err::substr &ss) {
- os.write(ss._s, ss._l);
- return os;
- }
-
- std::ostream &operator<<(std::ostream &os, const err::no_t &x) {
- x.write(os, errno);
- return os;
- }
-}
+#endif /* __JELLYFISH_MERGE_FILES_HPP__ */
diff --git a/jellyfish/misc.hpp b/jellyfish/misc.hpp
deleted file mode 100644
index 889adf5..0000000
--- a/jellyfish/misc.hpp
+++ /dev/null
@@ -1,144 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_MISC_HPP__
-#define __JELLYFISH_MISC_HPP__
-
-#include <stdio.h>
-#include <string.h>
-#include <inttypes.h>
-#include <stdint.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <exception>
-#include <stdexcept>
-#include <string>
-#include <new>
-#include <ostream>
-#include <utility>
-
-#define bsizeof(v) (8 * sizeof(v))
-typedef uint_fast64_t uint_t;
-//#define UINT_C(x)
-#define PRIUINTu PRIuFAST64
-#define PRIUINTx PRIxFAST64
-
-inline int leading_zeroes(int x) { return __builtin_clz(x); } // CLK
-inline int leading_zeroes(unsigned int x) { return __builtin_clz(x); }
-inline int leading_zeroes(unsigned long x) { return __builtin_clzl(x); }
-inline int leading_zeroes(unsigned long long x) { return __builtin_clzll(x); }
-
-
-template <typename T>
-unsigned int floorLog2(T n) {
- return sizeof(T) * 8 - 1 - leading_zeroes(n);
-}
-
-template<typename T>
-uint_t ceilLog2(T n) {
- uint_t r = floorLog2(n);
- return n > (((T)1) << r) ? r + 1 : r;
-}
-
-template<typename T>
-T div_ceil(T a, T b) {
- T q = a / b;
- return a % b == 0 ? q : q + 1;
-}
-
-template<typename T>
-uint_t bitsize(T n) {
- return floorLog2(n) + 1;
-}
-
-inline uint32_t reverse_bits(uint32_t v) {
- // swap odd and even bits
- v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);
- // swap consecutive pairs
- v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
- // swap nibbles ...
- v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
- // swap bytes
- v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
- // swap 2-byte long pairs
- v = ( v >> 16 ) | ( v << 16);
- return v;
-}
-
-inline uint64_t reverse_bits(uint64_t v) {
- v = ((v >> 1) & 0x5555555555555555UL) | ((v & 0x5555555555555555UL) << 1);
- v = ((v >> 2) & 0x3333333333333333UL) | ((v & 0x3333333333333333UL) << 2);
- v = ((v >> 4) & 0x0F0F0F0F0F0F0F0FUL) | ((v & 0x0F0F0F0F0F0F0F0FUL) << 4);
- v = ((v >> 8) & 0x00FF00FF00FF00FFUL) | ((v & 0x00FF00FF00FF00FFUL) << 8);
- v = ((v >> 16) & 0x0000FFFF0000FFFFUL) | ((v & 0x0000FFFF0000FFFFUL) << 16);
- v = ( v >> 32 ) | ( v << 32);
- return v;
-}
-
-uint64_t bogus_sum(void *data, size_t len);
-
-template <typename T>
-size_t bits_to_bytes(T bits) {
- return (size_t)((bits / 8) + (bits % 8 != 0));
-}
-
-template <typename T>
-union Tptr {
- void *v;
- T *t;
-};
-template <typename T>
-T *calloc_align(size_t nmemb, size_t alignment) {
- Tptr<T> ptr;
- if(posix_memalign(&ptr.v, alignment, sizeof(T) * nmemb) < 0)
- throw std::bad_alloc();
- return ptr.t;
-}
-
-/* Be pedantic about memory access. Any misaligned access will
- * generate a BUS error.
- */
-void disabled_misaligned_mem_access();
-
-/* Raison d'etre of this version of mem_copy: It seems we have slow
- * down due to misaligned cache accesses. glibc memcpy does unaligned
- * memory accesses and crashes when they are disabled. This version
- * does only aligned memory access (see above).
- */
-template <typename T>
-void mem_copy(char *dest, const char *src, const T &len) {
- // dumb copying char by char
- for(T i = (T)0; i < len; ++i)
- *dest++ = *src++;
-}
-
-/* Slice a large number (total) in almost equal parts. return [start,
- end) corresponding to the ith part (0 <= i < number_of_slices)
- */
-template<typename T>
-std::pair<T,T> slice(T i, T number_of_slices, T total) {
- if(number_of_slices > 1)
- --number_of_slices;
- T slice_size = total / number_of_slices;
- T slice_remain = total % number_of_slices;
- T start = std::min(total, i * slice_size + i * slice_remain / number_of_slices);
- T end = std::min(total, (i + 1) * slice_size + (i + 1) * slice_remain / number_of_slices);
- return std::make_pair(start, end);
-}
-
-std::streamoff get_file_size(std::istream& is);
-#endif // __MISC_HPP__
diff --git a/jellyfish/noop_dumper.hpp b/jellyfish/noop_dumper.hpp
deleted file mode 100644
index 49ac27a..0000000
--- a/jellyfish/noop_dumper.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_NOOP_DUMPER_HPP
-#define __JELLYFISH_NOOP_DUMPER_HPP
-
-#include <jellyfish/dumper.hpp>
-
-namespace jellyfish {
- class noop_dumper : public dumper_t {
- public:
- noop_dumper() {}
- virtual void _dump() {}
- };
-}
-
-#endif /* __JELLYFISH_NOOP_DUMPER_HPP */
diff --git a/jellyfish/offsets_key_value.hpp b/jellyfish/offsets_key_value.hpp
deleted file mode 100644
index fdc16e3..0000000
--- a/jellyfish/offsets_key_value.hpp
+++ /dev/null
@@ -1,239 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_OFFSETS_KEY_VALUE_HPP__
-#define __JELLYFISH_OFFSETS_KEY_VALUE_HPP__
-
-#include <jellyfish/misc.hpp>
-#include <jellyfish/divisor.hpp>
-#include <signal.h>
-
-namespace jellyfish {
- /* A word is whatever aligned type used for atomic operations
- * (CAS). Typically, a uint64_t. We store pairs of (key, value), in a
- * bit packed fashion. The key and value can have abritrary size as
- * long as they each fit in one word. A block is the largest number of
- * (key, value) pair such that the first key, and only the first,
- * starts at an aligned word.
- *
- * The key 0x0 is not valid. A key which fits completely within one
- * word is not protected by a "set" bit. A key which straddle the
- * boundary between two aligned words has a set bit in each parts.
- *
- * A value field can have any value and is initialized to 0x0. It has
- * no "set" bit ever.
- *
- * A key is prefixed with a "large" bit. If this bit is 0, the key
- * field is length key_len (not counting the possible set bits) and
- * the value field has length val_len. If the large bit has value 1,
- * the key field is just long enough to encode the number of
- * reprobing hops to go backward to find the actual key. The
- * remainder bits is used for the value field. In this scheme, we
- * assume the length needed to encode the number of reprobes is much
- * less than the length needed to encode the key.
- */
-
- /* Offsets holds all the possible offset for a given combination of
- * key length, value length and reprobe limit.
- */
- template<typename word>
- class Offsets {
- public:
- // woff: offset in words from beginning of block
- // boff: offset in bits within that word. Past large bit.
- // shift: shift in second word, if any
- // mask1: includes the large bit and the set bit if any.
- // mask2: mask in second word. Idem as mask1. 0 if fits in one word.
- // sb_mask[12]: mask for set bit in word 1 and 2, if any. set bit is the
- // last usable bit of the field.
- // lb_mask: mask for the large bit. It is the first bit of the key field.
- typedef struct {
- struct {
- uint_t woff, boff, shift, cshift;
- word mask1, mask2, sb_mask1, sb_mask2, lb_mask;
- } key;
- struct {
- uint_t woff, boff, shift, cshift;
- word mask1, mask2;
- } val;
- } offset_t;
- typedef struct {
- offset_t normal;
- offset_t large;
- } offset_pair_t;
- struct block_info {
- uint_t len;
- uint_t word_len;
- };
- // Offsets() {}
-
- Offsets(uint_t _key_len, uint_t _val_len, uint_t _reprobe_limit) :
- key_len(_key_len),
- val_len(_val_len),
- reprobe_limit(_reprobe_limit),
- reprobe_len(bitsize(reprobe_limit)),
- lval_len(key_len + val_len - reprobe_len),
- block(compute_offsets()),
- bld(block.len)
- { }
-
- ~Offsets() {}
-
- uint_t get_block_len() const { return block.len; }
- uint_t get_block_word_len() const { return block.word_len; }
- uint_t get_reprobe_len() const { return reprobe_len; }
- uint_t get_key_len() const { return key_len; }
- uint_t get_val_len() const { return val_len; }
- uint_t get_lval_len() const { return lval_len; }
- word get_max_val(bool large) const {
- return (((uint64_t)1) << (large ? lval_len : val_len)) - 1;
- }
-
- // Discretize and round down number of entries according to length
- // of a block. Return in blocks the number of blocks.
- size_t floor_block(size_t entries, size_t &blocks) const {
- blocks = entries / bld;
- return block.len * blocks;
- }
-
- word *get_word_offset(size_t id, const offset_t **o, const offset_t **lo,
- word * const base) const {
- uint64_t q, r;
- bld.division(id, q, r);
- word *w = base + (block.word_len * q);
- *o = &offsets[r].normal;
- *lo = &offsets[r].large;
- return w;
- }
-
- private:
- const uint_t key_len, val_len;
- const uint_t reprobe_limit, reprobe_len, lval_len;
- const block_info block;
- const divisor64 bld; // Fast divisor by block.len
- offset_pair_t offsets[bsizeof(word)];
-
- block_info compute_offsets();
- bool update_current_offsets(uint_t &cword, uint_t &cboff, uint_t add);
- word mask(uint_t length, uint_t shift);
- };
-
- template<typename word>
- bool Offsets<word>::update_current_offsets(uint_t &cword, uint_t &cboff, uint_t add)
- {
- cboff += add;
- if(cboff >= bsizeof(word)) {
- cword++;
- cboff %= bsizeof(word);
- return cboff > 0;
- }
- return false;
- }
-
- template<typename word>
- word Offsets<word>::mask(uint_t length, uint_t shift)
- {
- return (((word)1u << length) - 1) << shift;
- }
-
- template<typename word>
- typename Offsets<word>::block_info Offsets<word>::compute_offsets()
- {
- offset_pair_t *offset = offsets;
- uint_t cword = 0; // current word in block
- uint_t cboff = 0; // current offset in word
- uint_t lcword; // idem for large fields
- uint_t lcboff;
- uint_t ocboff;
-
- memset(offsets, '\0', sizeof(offsets));
- do {
- offset->normal.key.woff = offset->large.key.woff = lcword = cword;
- ocboff = lcboff = cboff;
- offset->normal.key.boff = cboff + 1;
- offset->normal.key.lb_mask = mask(1, cboff);
- if(update_current_offsets(cword, cboff, key_len + 1)) {
- // key extends over two words -> add extra set bits
- update_current_offsets(cword, cboff, 2);
- offset->normal.key.mask1 = mask(bsizeof(word) - ocboff, ocboff);
- offset->normal.key.mask2 = mask(cboff, 0);
- offset->normal.key.shift = key_len + 1 - cboff;
- offset->normal.key.cshift = cboff - 1;
- offset->normal.key.sb_mask1 = mask(1, bsizeof(word) - 1);
- offset->normal.key.sb_mask2 = mask(1, cboff - 1);
- } else {
- offset->normal.key.mask1 = mask(key_len + 1, ocboff);
- offset->normal.key.mask2 = 0;
- offset->normal.key.shift = 0;
- offset->normal.key.cshift = 0;
- offset->normal.key.sb_mask1 = 0;
- offset->normal.key.sb_mask2 = 0;
- }
- offset->normal.val.woff = cword;
- offset->normal.val.boff = cboff;
- offset->normal.val.mask1 = mask(val_len, cboff);
- if(update_current_offsets(cword, cboff, val_len)) {
- offset->normal.val.mask2 = mask(cboff, 0);
- offset->normal.val.shift = val_len - cboff;
- offset->normal.val.cshift = cboff;
- } else {
- offset->normal.val.mask2 = 0;
- offset->normal.val.shift = val_len;
- offset->normal.val.cshift = 0;
- }
-
- ocboff = lcboff;
- offset->large.key.boff = lcboff + 1;
- offset->large.key.lb_mask = mask(1, lcboff);
- if(update_current_offsets(lcword, lcboff, reprobe_len + 1)) {
- update_current_offsets(lcword, lcboff, 2);
- offset->large.key.mask1 = mask(bsizeof(word) - ocboff, ocboff);
- offset->large.key.mask2 = mask(lcboff, 0);
- offset->large.key.shift = reprobe_len + 1 - lcboff;
- offset->large.key.cshift = lcboff - 1;
- offset->large.key.sb_mask1 = mask(1, bsizeof(word) - 1);
- offset->large.key.sb_mask2 = mask(1, lcboff - 1);
- } else {
- offset->large.key.mask1 = mask(reprobe_len + 1, ocboff);
- offset->large.key.mask2 = 0;
- offset->large.key.boff = ocboff + 1;
- offset->large.key.shift = 0;
- offset->large.key.cshift = 0;
- offset->large.key.sb_mask1 = 0;
- offset->large.key.sb_mask2 = 0;
- }
- offset->large.val.woff = lcword;
- offset->large.val.boff = lcboff;
- offset->large.val.mask1 = mask(lval_len, lcboff);
- if(update_current_offsets(lcword, lcboff, lval_len)) {
- offset->large.val.mask2 = mask(lcboff, 0);
- offset->large.val.shift = lval_len - lcboff;
- offset->large.val.cshift = lcboff;
- } else {
- offset->large.val.mask2 = 0;
- offset->large.val.shift = lval_len;
- offset->large.val.cshift = 0;
- }
-
- offset++;
- } while(cboff != 0 && cboff < bsizeof(word) - 2);
-
- block_info res = { static_cast<uint_t>(offset - offsets), cword + (cboff == 0 ? 0 : 1) };
- return res;
- }
-}
-
-#endif // __OFFSETS_KEY_VALUE_HPP__
diff --git a/jellyfish/parse_dna.cc b/jellyfish/parse_dna.cc
deleted file mode 100644
index 801513d..0000000
--- a/jellyfish/parse_dna.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/parse_dna.hpp>
-#include <jellyfish/time.hpp>
-
-namespace jellyfish {
- void parse_dna::fill() {
- bucket_t *new_seq = 0;
-
- while(true) {
- if(!new_seq) {
- new_seq = write_next();
- if(!new_seq)
- break;
- }
- new_seq->end = new_seq->start + buffer_size;
- char *start = new_seq->start;
- if(have_seam) {
- have_seam = false;
- // mem_copy(start, seam, mer_len - 1);
- memcpy(start, seam, mer_len - 1);
- start += mer_len - 1;
- }
-
- bool input_eof = !fparser->parse(start, &new_seq->end);
-
- if(new_seq->end > new_seq->start + mer_len) {
- have_seam = true;
- // mem_copy(seam, new_seq->end - mer_len + 1, mer_len - 1);
- memcpy(seam, new_seq->end - mer_len + 1, mer_len - 1);
- write_release(new_seq);
- new_seq = 0;
- }
- if(input_eof) {
- delete fparser;
- have_seam = false;
- if(++current_file == files.end()) {
- close();
- break;
- }
- fparser = sequence_parser::new_parser(*current_file);
- }
- }
- }
-}
diff --git a/jellyfish/parse_dna.hpp b/jellyfish/parse_dna.hpp
deleted file mode 100644
index cd1eb83..0000000
--- a/jellyfish/parse_dna.hpp
+++ /dev/null
@@ -1,194 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_PARSE_DNA_HPP__
-#define __JELLYFISH_PARSE_DNA_HPP__
-
-#include <iostream>
-#include <vector>
-#include <jellyfish/double_fifo_input.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/sequence_parser.hpp>
-#include <jellyfish/allocators_mmap.hpp>
-#include <jellyfish/dna_codes.hpp>
-
-namespace jellyfish {
- class parse_dna : public double_fifo_input<sequence_parser::sequence_t> {
- typedef std::vector<const char *> fary_t;
-
- uint_t mer_len;
- size_t buffer_size;
- const fary_t files;
- fary_t::const_iterator current_file;
- bool have_seam;
- char *seam;
- allocators::mmap buffer_data;
- bool canonical;
- sequence_parser *fparser;
-
- public:
- /* Action to take for a given letter in fasta file:
- * A, C, G, T: map to 0, 1, 2, 3. Append to kmer
- * Other nucleic acid code: map to -1. reset kmer
- * '\n': map to -2. ignore
- * Other ASCII: map to -3. Report error.
- */
- static uint64_t mer_string_to_binary(const char *in, uint_t klen) {
- uint64_t res = 0;
- for(uint_t i = 0; i < klen; i++) {
- const uint_t c = dna_codes[(uint_t)*in++];
- if(c & CODE_NOT_DNA)
- return 0;
- res = (res << 2) | c;
- }
- return res;
- }
- static void mer_binary_to_string(uint64_t mer, uint_t klen, char *out) {
- static const char table[4] = { 'A', 'C', 'G', 'T' };
-
- for(unsigned int i = 0 ; i < klen; i++) {
- out[klen-1-i] = table[mer & (uint64_t)0x3];
- mer >>= 2;
- }
- out[klen] = '\0';
- }
-
- static uint64_t reverse_complement(uint64_t v, uint_t length) {
- v = ((v >> 2) & 0x3333333333333333UL) | ((v & 0x3333333333333333UL) << 2);
- v = ((v >> 4) & 0x0F0F0F0F0F0F0F0FUL) | ((v & 0x0F0F0F0F0F0F0F0FUL) << 4);
- v = ((v >> 8) & 0x00FF00FF00FF00FFUL) | ((v & 0x00FF00FF00FF00FFUL) << 8);
- v = ((v >> 16) & 0x0000FFFF0000FFFFUL) | ((v & 0x0000FFFF0000FFFFUL) << 16);
- v = ( v >> 32 ) | ( v << 32);
- return (((uint64_t)-1) - v) >> (bsizeof(v) - (length << 1));
- }
-
- template<typename T>
- parse_dna(T _files_start, T _files_end, uint_t _mer_len,
- unsigned int nb_buffers, size_t _buffer_size);
-
- ~parse_dna() {
- delete [] seam;
- }
-
- void set_canonical(bool v = true) { canonical = v; }
- virtual void fill();
-
- class thread {
- parse_dna *parser;
- bucket_t *sequence;
- const uint_t mer_len, lshift;
- uint64_t kmer, rkmer;
- const uint64_t masq;
- uint_t cmlen;
- const bool canonical;
- uint64_t distinct, total;
- typedef void (*error_reporter)(std::string& err);
- error_reporter error_report;
-
- public:
- explicit thread(parse_dna *_parser) :
- parser(_parser), sequence(0),
- mer_len(_parser->mer_len), lshift(2 * (mer_len - 1)),
- kmer(0), rkmer(0), masq((1UL << (2 * mer_len)) - 1),
- cmlen(0), canonical(parser->canonical),
- distinct(0), total(0), error_report(0) {}
-
- uint64_t get_uniq() const { return 0; }
- uint64_t get_distinct() const { return distinct; }
- uint64_t get_total() const { return total; }
-
- template<typename T>
- void parse(T &counter) {
- cmlen = kmer = rkmer = 0;
- while((sequence = parser->next())) {
- const char *start = sequence->start;
- const char * const end = sequence->end;
- while(start < end) {
- const uint_t c = dna_codes[(uint_t)*start++];
- switch(c) {
- case CODE_IGNORE: break;
- case CODE_COMMENT:
- report_bad_input(*(start-1));
- // Fall through
- case CODE_RESET:
- cmlen = kmer = rkmer = 0;
- break;
-
- default:
- kmer = ((kmer << 2) & masq) | c;
- rkmer = (rkmer >> 2) | ((0x3 - c) << lshift);
- if(++cmlen >= mer_len) {
- cmlen = mer_len;
- typename T::val_type oval;
- if(canonical)
- counter->add(kmer < rkmer ? kmer : rkmer, 1, &oval);
- else
- counter->add(kmer, 1, &oval);
- distinct += oval == (typename T::val_type)0;
- ++total;
- }
- }
- }
-
- // Buffer exhausted. Get a new one
- cmlen = kmer = rkmer = 0;
- parser->release(sequence);
- }
- }
-
- void set_error_reporter(error_reporter e) {
- error_report = e;
- }
-
- private:
- void report_bad_input(char c) {
- if(!error_report)
- return;
- std::string err("Bad character in sequence: ");
- err += c;
- error_report(err);
- }
- };
- friend class thread;
- thread new_thread() { return thread(this); }
- };
-}
-
-template<typename T>
-jellyfish::parse_dna::parse_dna(T _files_start, T _files_end,
- uint_t _mer_len,
- unsigned int nb_buffers, size_t _buffer_size) :
- double_fifo_input<sequence_parser::sequence_t>(nb_buffers), mer_len(_mer_len),
- buffer_size(allocators::mmap::round_to_page(_buffer_size)),
- files(_files_start, _files_end), current_file(files.begin()),
- have_seam(false), buffer_data(buffer_size * nb_buffers), canonical(false)
-{
- seam = new char[mer_len];
- memset(seam, 'A', mer_len);
-
- unsigned long i = 0;
- for(bucket_iterator it = bucket_begin();
- it != bucket_end(); ++it, ++i) {
- it->end = it->start = (char *)buffer_data.get_ptr() + i * buffer_size;
- }
- assert(i == nb_buffers);
-
- fparser = sequence_parser::new_parser(*current_file);
-}
-
-
-#endif
diff --git a/jellyfish/parse_quake.cc b/jellyfish/parse_quake.cc
deleted file mode 100644
index ffa53be..0000000
--- a/jellyfish/parse_quake.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/parse_quake.hpp>
-
-namespace jellyfish {
- parse_quake::parse_quake(const fary_t &_files, uint_t _mer_len,
- unsigned int nb_buffers, size_t _buffer_size,
- const char _qs) :
- double_fifo_input<seq_qual_parser::sequence_t>(nb_buffers), mer_len(_mer_len),
- buffer_size(allocators::mmap::round_to_page(_buffer_size)),
- files(_files), current_file(files.begin()),
- have_seam(false), buffer_data(buffer_size * nb_buffers),
- quality_start(_qs), canonical(false)
- {
- seam = new char[2*mer_len];
-
- unsigned long i = 0;
- for(bucket_iterator it = bucket_begin();
- it != bucket_end(); ++it, ++i) {
- it->end = it->start = (char*)buffer_data.get_ptr() + i * buffer_size;
- }
-
- fparser = seq_qual_parser::new_parser(*current_file);
- }
-
- void parse_quake::fill() {
- bucket_t *new_seq = 0;
-
- while(true) {
- if(!new_seq) {
- new_seq = write_next();
- if(!new_seq)
- break;
- }
- new_seq->end = new_seq->start + buffer_size;
- char *start = new_seq->start;
- if(have_seam) {
- have_seam = false;
- memcpy(start, seam, 2 * (mer_len - 1));
- start += 2 * (mer_len - 1);
- }
- bool input_eof = !fparser->parse(start, &new_seq->end);
- if(new_seq->end > new_seq->start + 2 * mer_len) {
- have_seam = true;
- memcpy(seam, new_seq->end - 2 * (mer_len - 1), 2 * (mer_len - 1));
- write_release(new_seq);
- new_seq = 0;
- }
- if(input_eof) {
- delete fparser;
- have_seam = false;
- if(++current_file == files.end()) {
- close();
- break;
- }
- fparser = seq_qual_parser::new_parser(*current_file);
- }
- }
- }
-
- const float parse_quake::proba_codes[41] = {
- 1.00000000000000000000f, 0.79432823472428149003f, 0.63095734448019324958f,
- 0.50118723362727224391f, 0.39810717055349720273f, 0.31622776601683794118f,
- 0.25118864315095801309f, 0.19952623149688797355f, 0.15848931924611134314f,
- 0.12589254117941672817f, 0.10000000000000000000f, 0.07943282347242813790f,
- 0.06309573444801933051f, 0.05011872336272722023f, 0.03981071705534973415f,
- 0.03162277660168379134f, 0.02511886431509579437f, 0.01995262314968879874f,
- 0.01584893192461113431f, 0.01258925411794167490f, 0.01000000000000000000f,
- 0.00794328234724281379f, 0.00630957344480193028f, 0.00501187233627272462f,
- 0.00398107170553497342f, 0.00316227766016837939f, 0.00251188643150957944f,
- 0.00199526231496887892f, 0.00158489319246111408f, 0.00125892541179416749f,
- 0.00100000000000000000f, 0.00079432823472428131f, 0.00063095734448019298f,
- 0.00050118723362727253f, 0.00039810717055349735f, 0.00031622776601683794f,
- 0.00025118864315095795f, 0.00019952623149688788f, 0.00015848931924611142f,
- 0.00012589254117941674f, 0.00010000000000000000f,
- };
- const float parse_quake::one_minus_proba_codes[41] = {
- 0.00000000000000000000f, 0.20567176527571850997f, 0.36904265551980675042f,
- 0.49881276637272775609f, 0.60189282944650279727f, 0.68377223398316200331f,
- 0.74881135684904198691f, 0.80047376850311202645f, 0.84151068075388868461f,
- 0.87410745882058327183f, 0.90000000000000002220f, 0.92056717652757180659f,
- 0.93690426555198069725f, 0.94988127663727273120f, 0.96018928294465022422f,
- 0.96837722339831622254f, 0.97488113568490419869f, 0.98004737685031118044f,
- 0.98415106807538887956f, 0.98741074588205834939f, 0.98999999999999999112f,
- 0.99205671765275715845f, 0.99369042655519801421f, 0.99498812766372723981f,
- 0.99601892829446503352f, 0.99683772233983158895f, 0.99748811356849043097f,
- 0.99800473768503117356f, 0.99841510680753886575f, 0.99874107458820582384f,
- 0.99899999999999999911f, 0.99920567176527574915f, 0.99936904265551984583f,
- 0.99949881276637275729f, 0.99960189282944644784f, 0.99968377223398319220f,
- 0.99974881135684900979f, 0.99980047376850311736f, 0.99984151068075388658f,
- 0.99987410745882054908f, 0.99990000000000001101f
- };
-}
diff --git a/jellyfish/parse_quake.hpp b/jellyfish/parse_quake.hpp
deleted file mode 100644
index 1b55b27..0000000
--- a/jellyfish/parse_quake.hpp
+++ /dev/null
@@ -1,152 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_PARSE_QUAKE_HPP__
-#define __JELLYFISH_PARSE_QUAKE_HPP__
-
-#include <iostream>
-#include <vector>
-#include <jellyfish/double_fifo_input.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/seq_qual_parser.hpp>
-#include <jellyfish/circular_buffer.hpp>
-#include <jellyfish/floats.hpp>
-#include <jellyfish/allocators_mmap.hpp>
-#include <jellyfish/dna_codes.hpp>
-
-namespace jellyfish {
- class parse_quake : public double_fifo_input<seq_qual_parser::sequence_t> {
- typedef std::vector<const char *> fary_t;
-
- uint_t mer_len;
- size_t buffer_size;
- const fary_t files;
- fary_t::const_iterator current_file;
- bool have_seam;
- allocators::mmap buffer_data;
- struct seq *buffers;
- char *seam;
- const char quality_start;
- bool canonical;
- seq_qual_parser *fparser;
-
- public:
- /* Action to take for a given letter in fasta file:
- * A, C, G, T: map to 0, 1, 2, 3. Append to kmer
- * Other nucleic acid code: map to -1. reset kmer
- * '\n': map to -2. ignore
- * Other ASCII: map to -3. Skip to next line
- */
-
- static const float proba_codes[41];
- static const float one_minus_proba_codes[41];
-
- parse_quake(const fary_t &_files, uint_t _mer_len,
- unsigned int nb_buffers, size_t _buffer_size,
- const char _qs);
-
- ~parse_quake() { }
-
- void set_canonical(bool v = true) { canonical = v; }
- virtual void fill();
-
- class thread {
- parse_quake *parser;
- bucket_t *sequence;
- const uint_t mer_len, lshift;
- uint64_t kmer, rkmer;
- const uint64_t masq;
- uint_t cmlen;
- const bool canonical;
- circular_buffer<float> quals;
- const char quality_start;
- uint64_t distinct, total;
- typedef void (*error_reporter)(std::string& err);
- error_reporter error_report;
-
- public:
- thread(parse_quake *_parser, const char _qs) :
- parser(_parser), sequence(0),
- mer_len(_parser->mer_len), lshift(2 * (mer_len - 1)),
- kmer(0), rkmer(0), masq((1UL << (2 * mer_len)) - 1),
- cmlen(0), canonical(parser->canonical), quals(mer_len),
- quality_start(_qs),
- distinct(0), total(0), error_report(0) { }
-
- uint64_t get_distinct() const { return distinct; }
- uint64_t get_total() const { return total; }
-
- template<typename T>
- void parse(T &counter) {
- cmlen = kmer = rkmer = 0;
- while((sequence = parser->next())) {
- const char *start = sequence->start;
- const char * const end = sequence->end;
- while(start < end) {
- const uint_t c = dna_codes[(uint_t)*start++];
- const char q = *start++;
- switch(c) {
- case CODE_IGNORE: break;
- case CODE_COMMENT:
- report_bad_input(*(start-2));
- // Fall through
- case CODE_RESET:
- cmlen = kmer = rkmer = 0;
- break;
-
- default:
- kmer = ((kmer << 2) & masq) | c;
- rkmer = (rkmer >> 2) | ((0x3 - c) << lshift);
- const float one_minus_p = one_minus_proba_codes[(uint_t)(q - quality_start)];
- quals.append(one_minus_p);
- if(++cmlen >= mer_len) {
- cmlen = mer_len;
- Float oval;
-
- if(canonical)
- counter->add(kmer < rkmer ? kmer : rkmer, quals.prod(), &oval);
- else
- counter->add(kmer, quals.prod(), &oval);
- distinct += oval == (Float)0.0f;
- ++total;
- }
- }
- }
-
- // Buffer exhausted. Get a new one
- cmlen = kmer = rkmer = 0;
- parser->release(sequence);
- }
- }
-
- void set_error_reporter(error_reporter e) {
- error_report = e;
- }
- private:
- void report_bad_input(char c) {
- if(!error_report)
- return;
- std::string error("Bad character in sequence: ");
- error += c;
- error_report(error);
- }
- };
- friend class thread;
- thread new_thread() { return thread(this, quality_start); }
- };
-}
-
-#endif
diff --git a/jellyfish/parse_qual_dna.cc b/jellyfish/parse_qual_dna.cc
deleted file mode 100644
index 67fb560..0000000
--- a/jellyfish/parse_qual_dna.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/parse_qual_dna.hpp>
-
-namespace jellyfish {
- parse_qual_dna::parse_qual_dna(const fary_t &_files, uint_t _mer_len,
- unsigned int nb_buffers, size_t _buffer_size,
- const char _qs, const char _min_q) :
- double_fifo_input<seq_qual_parser::sequence_t>(nb_buffers), mer_len(_mer_len),
- buffer_size(allocators::mmap::round_to_page(_buffer_size)),
- files(_files), current_file(files.begin()),
- have_seam(false), buffer_data(buffer_size * nb_buffers),
- quality_start(_qs), min_q(_min_q), canonical(false)
- {
- seam = new char[2*mer_len];
-
- unsigned long i = 0;
- for(bucket_iterator it = bucket_begin();
- it != bucket_end(); ++it, ++i) {
- it->end = it->start = (char*)buffer_data.get_ptr() + i * buffer_size;
- }
-
- fparser = seq_qual_parser::new_parser(*current_file);
- }
-
- void parse_qual_dna::fill() {
- bucket_t *new_seq = 0;
-
- while(true) {
- if(!new_seq) {
- new_seq = write_next();
- if(!new_seq)
- break;
- }
- new_seq->end = new_seq->start + buffer_size;
- char *start = new_seq->start;
- if(have_seam) {
- have_seam = false;
- memcpy(start, seam, 2 * (mer_len - 1));
- start += 2 * (mer_len - 1);
- }
- bool input_eof = !fparser->parse(start, &new_seq->end);
- if(new_seq->end > new_seq->start + 2 * mer_len) {
- have_seam = true;
- memcpy(seam, new_seq->end - 2 * (mer_len - 1), 2 * (mer_len - 1));
- write_release(new_seq);
- new_seq = 0;
- }
- if(input_eof) {
- delete fparser;
- have_seam = false;
- if(++current_file == files.end()) {
- close();
- break;
- }
- fparser = seq_qual_parser::new_parser(*current_file);
- }
- }
- }
-}
diff --git a/jellyfish/parse_qual_dna.hpp b/jellyfish/parse_qual_dna.hpp
deleted file mode 100644
index cdaa2d0..0000000
--- a/jellyfish/parse_qual_dna.hpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_PARSE_QUAL_DNA_HPP__
-#define __JELLYFISH_PARSE_QUAL_DNA_HPP__
-
-#include <iostream>
-#include <vector>
-#include <jellyfish/double_fifo_input.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/seq_qual_parser.hpp>
-#include <jellyfish/allocators_mmap.hpp>
-#include <jellyfish/dna_codes.hpp>
-
-namespace jellyfish {
- class parse_qual_dna : public double_fifo_input<seq_qual_parser::sequence_t> {
- typedef std::vector<const char *> fary_t;
-
- uint_t mer_len;
- size_t buffer_size;
- const fary_t files;
- fary_t::const_iterator current_file;
- bool have_seam;
- allocators::mmap buffer_data;
- char *seam;
- const char quality_start;
- const char min_q;
- bool canonical;
- seq_qual_parser *fparser;
-
- public:
- /* Action to take for a given letter in fasta file:
- * A, C, G, T: map to 0, 1, 2, 3. Append to kmer
- * Other nucleic acid code: map to -1. reset kmer
- * '\n': map to -2. ignore
- * Other ASCII: map to -3. Skip to next line
- */
- parse_qual_dna(const fary_t &_files, uint_t _mer_len,
- unsigned int nb_buffers, size_t _buffer_size,
- const char _qs, const char _min_q);
-
- ~parse_qual_dna() { }
-
- void set_canonical(bool v = true) { canonical = v; }
- virtual void fill();
-
- class thread {
- parse_qual_dna *parser;
- bucket_t *sequence;
- const uint_t mer_len, lshift;
- uint64_t kmer, rkmer;
- const uint64_t masq;
- uint_t cmlen;
- const bool canonical;
- const char q_thresh;
- uint64_t distinct, total;
- typedef void (*error_reporter)(std::string& err);
- error_reporter error_report;
-
- public:
- thread(parse_qual_dna *_parser, const char _qs, const char _min_q) :
- parser(_parser), sequence(0),
- mer_len(_parser->mer_len), lshift(2 * (mer_len - 1)),
- kmer(0), rkmer(0), masq((1UL << (2 * mer_len)) - 1),
- cmlen(0), canonical(parser->canonical),
- q_thresh(_qs + _min_q),
- distinct(0), total(0), error_report(0) { }
-
- uint64_t get_distinct() const { return distinct; }
- uint64_t get_total() const { return total; }
-
- template<typename T>
- void parse(T &counter) {
- cmlen = kmer = rkmer = 0;
- while((sequence = parser->next())) {
- const char *start = sequence->start;
- const char * const end = sequence->end;
- while(start < end) {
- uint_t c = dna_codes[(uint_t)*start++];
- const char q = *start++;
- if(q < q_thresh)
- c = CODE_RESET;
-
- switch(c) {
- case CODE_IGNORE: break;
- case CODE_COMMENT:
- report_bad_input(*(start-1));
- // Fall through
- case CODE_RESET:
- cmlen = kmer = rkmer = 0;
- break;
-
- default:
- kmer = ((kmer << 2) & masq) | c;
- rkmer = (rkmer >> 2) | ((0x3 - c) << lshift);
- if(++cmlen >= mer_len) {
- cmlen = mer_len;
- typename T::val_type oval;
- if(canonical)
- counter->add(kmer < rkmer ? kmer : rkmer, 1, &oval);
- else
- counter->add(kmer, 1, &oval);
- distinct += !oval;
- ++total;
- }
- }
- }
-
- // Buffer exhausted. Get a new one
- cmlen = kmer = rkmer = 0;
- parser->release(sequence);
- }
- }
-
- void set_error_reporter(error_reporter e) {
- error_report = e;
- }
-
- private:
- void report_bad_input(char c) {
- if(!error_report)
- return;
- std::string error("Bad input: ");
- error += c;
- error_report(error);
- }
- };
- friend class thread;
- thread new_thread() { return thread(this, quality_start, min_q); }
- };
-}
-
-#endif
diff --git a/jellyfish/parse_read.hpp b/jellyfish/parse_read.hpp
deleted file mode 100644
index f87d5ae..0000000
--- a/jellyfish/parse_read.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_FASTQ_READ_PARSER_HPP__
-#define __JELLYFISH_FASTQ_READ_PARSER_HPP__
-
-#include <vector>
-#include <limits>
-
-#include <jellyfish/double_fifo_input.hpp>
-#include <jellyfish/read_parser.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/dbg.hpp>
-
-namespace jellyfish {
- class parse_read : public double_fifo_input<read_parser::reads_t> {
- private:
- typedef std::vector<const char *> fary_t;
-
- fary_t files;
- fary_t::const_iterator current_file;
- bool canonical;
- read_parser *fparser;
-
- public:
- typedef read_parser::read_t read_t;
-
- static const uint_t codes[256];
- static const uint_t CODE_RESET = (uint_t)-1;
-
- // parse_read(int nb_files, char *argv[], unsigned int nb_buffers);
- template<typename T>
- parse_read(T argv_start, T argv_end, unsigned int nb_buffers);
- template<typename T>
- parse_read(int argc, T argv, unsigned int nb_buffers);
- ~parse_read() { }
-
- void set_canonical(bool v = true) { canonical = v; }
- virtual void fill();
-
- class thread {
- parse_read *parser;
- bucket_t *sequence;
- int current_read;
-
- public:
- explicit thread(parse_read *_parser) :
- parser(_parser), sequence(parser->next()),
- current_read(0) {}
-
- read_parser::read_t * next_read() {
- while(sequence) {
- if(current_read < sequence->nb_reads)
- return &sequence->reads[current_read++];
-
- sequence->unlink(); // unmap file if not used anymore
- parser->release(sequence);
- sequence = parser->next();
- current_read = 0;
- }
- return 0;
- }
-
- private:
- bool next_sequence();
- };
- friend class thread;
- thread new_thread() { return thread(this); }
- };
-}
-
-template<typename T>
-jellyfish::parse_read::parse_read(T argv_start, T argv_end, unsigned int nb_buffers) :
- double_fifo_input<read_parser::reads_t>(nb_buffers),
- files(argv_start, argv_end),
- current_file(files.begin()),
- fparser(read_parser::new_parser(*current_file))
-{
- fparser->link();
-}
-
-template<typename T>
-jellyfish::parse_read::parse_read(int argc, T argv, unsigned int nb_buffers) :
- double_fifo_input<read_parser::reads_t>(nb_buffers),
- files(argv, argv + argc),
- current_file(files.begin()),
- fparser(read_parser::new_parser(*current_file))
-{
- fparser->link();
-}
-
-#endif
diff --git a/jellyfish/query_cmdline.hpp b/jellyfish/query_cmdline.hpp
deleted file mode 100644
index 6c1a157..0000000
--- a/jellyfish/query_cmdline.hpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __QUERY_ARGS_HPP__
-#define __QUERY_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class query_args {
-public:
- bool both_strands_flag;
- bool cary_bit_flag;
- const char * input_arg;
- bool input_given;
- const char * output_arg;
- bool output_given;
- yaggo::string db_arg;
-
- enum {
- USAGE_OPT = 1000
- };
-
- query_args() :
- both_strands_flag(false),
- cary_bit_flag(false),
- input_arg(""), input_given(false),
- output_arg(""), output_given(false)
- { }
-
- query_args(int argc, char* argv[]) :
- both_strands_flag(false),
- cary_bit_flag(false),
- input_arg(""), input_given(false),
- output_arg(""), output_given(false)
- { parse(argc, argv); }
-
- void parse(int argc, char* argv[]) {
- static struct option long_options[] = {
- {"both-strands", 0, 0, 'C'},
- {"cary-bit", 0, 0, 'c'},
- {"input", 1, 0, 'i'},
- {"output", 1, 0, 'o'},
- {"help", 0, 0, 'h'},
- {"usage", 0, 0, USAGE_OPT},
- {"version", 0, 0, 'V'},
- {0, 0, 0, 0}
- };
- static const char *short_options = "hVCci:o:";
-
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
- while(true) {
- int index = -1;
- int c = getopt_long(argc, argv, short_options, long_options, &index);
- if(c == -1) break;
- switch(c) {
- case ':':
- std::cerr << "Missing required argument for "
- << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
- << std::endl;
- exit(1);
- case 'h':
- std::cout << usage() << "\n\n" << help() << std::endl;
- exit(0);
- case USAGE_OPT:
- std::cout << usage() << "\nUse --help for more information." << std::endl;
- exit(0);
- case 'V':
- print_version();
- exit(0);
- case '?':
- std::cerr << "Use --usage or --help for some help\n";
- exit(1);
- case 'C':
- both_strands_flag = true;
- break;
- case 'c':
- cary_bit_flag = true;
- break;
- case 'i':
- input_given = true;
- input_arg = optarg;
- break;
- case 'o':
- output_given = true;
- output_arg = optarg;
- break;
- }
- }
-
- // Parse arguments
- if(argc - optind != 1)
- error("Requires exactly 1 argument.");
- db_arg = yaggo::string(argv[optind]);
- ++optind;
- }
-
-#define query_args_USAGE "Usage: jellyfish query [options] db:path"
- const char * usage() const { return query_args_USAGE; }
- void error(const char *msg) {
- std::cerr << "Error: " << msg << "\n" << usage()
- << "\nUse --help for more information"
- << std::endl;
- exit(1);
- }
-
-#define query_args_HELP "Query from a compacted database\n\nQuery a hash. It reads k-mers from the standard input and write the counts on the standard output.\n\n" \
- "Options (default value in (), *required):\n" \
- " -C, --both-strands Both strands (false)\n" \
- " -c, --cary-bit Value field as the cary bit information (false)\n" \
- " -i, --input=file Input file\n" \
- " -o, --output=file Output file\n" \
- " --usage Usage\n" \
- " -h, --help This message\n" \
- " -V, --version Version"
-
- const char * help() const { return query_args_HELP; }
-#define query_args_HIDDEN "Hidden options:"
-
- const char * hidden() const { return query_args_HIDDEN; }
- void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
- os << PACKAGE_VERSION << "\n";
- }
- void dump(std::ostream &os = std::cout) {
- os << "both_strands_flag:" << both_strands_flag << "\n";
- os << "cary_bit_flag:" << cary_bit_flag << "\n";
- os << "input_given:" << input_given << " input_arg:" << input_arg << "\n";
- os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
- os << "db_arg:" << db_arg << "\n";
- }
-private:
-};
-
-#endif // __QUERY_ARGS_HPP__"
diff --git a/jellyfish/query_main.cc b/jellyfish/query_main.cc
deleted file mode 100644
index 396599c..0000000
--- a/jellyfish/query_main.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <iostream>
-#include <fstream>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/compacted_hash.hpp>
-#include <jellyfish/query_cmdline.hpp>
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/fstream_default.hpp>
-
-template<typename hash_t>
-void print_mer_counts(const hash_t &h, std::istream &in, std::ostream &out) {
- uint_t mer_len = h.get_mer_len();
- uint_t width = mer_len + 2;
- char mer[width + 1];
-
- while(true) {
- in >> std::setw(width) >> mer;
- if(!in.good())
- break;
- if(strlen(mer) != mer_len)
- die << "Invalid mer " << (char*)mer;
-
- out << mer << " " << h[mer] << "\n";
- }
-}
-
-int query_main(int argc, char *argv[])
-{
- query_args args(argc, argv);
-
- ifstream_default in(args.input_given ? args.input_arg : 0, std::cin);
- if(!in.good())
- die << "Can't open input file '" << args.input_arg << "'" << err::no;
- ofstream_default out(args.input_given ? args.output_arg : 0, std::cout);
- if(!out.good())
- die << "Can't open output file '" << args.output_arg << "'" << err::no;
-
- mapped_file dbf(args.db_arg.c_str());
- char type[8];
- memcpy(type, dbf.base(), sizeof(type));
- if(!strncmp(type, jellyfish::raw_hash::file_type, sizeof(type))) {
- raw_inv_hash_query_t hash(dbf);
- hash.set_canonical(args.both_strands_flag);
- hash.set_cary_bit(args.cary_bit_flag);
- print_mer_counts(hash, in, out);
- } else if(!strncmp(type, jellyfish::compacted_hash::file_type, sizeof(type))) {
- hash_query_t hash(dbf);
- hash.set_canonical(args.both_strands_flag);
- print_mer_counts(hash, in, out);
- }
-
- out.close();
-
- return 0;
-}
diff --git a/jellyfish/randomc.h b/jellyfish/randomc.h
index dccd64c..39724f4 100644
--- a/jellyfish/randomc.h
+++ b/jellyfish/randomc.h
@@ -165,7 +165,7 @@ class CRandomMersenne { // Encapsulate random number generator
#endif
public:
- explicit CRandomMersenne(int seed) { // Constructor
+ CRandomMersenne(int seed) { // Constructor
RandomInit(seed); LastInterval = 0;}
void RandomInit(int seed); // Re-seed
void RandomInitByArray(int const seeds[], int NumSeeds); // Seed by more than 32 bits
@@ -188,7 +188,7 @@ public:
int IRandom(int min, int max); // Get integer random number in desired interval
double Random(); // Get floating point random number
uint32_t BRandom(); // Output random bits
- explicit CRandomMother(int seed) { // Constructor
+ CRandomMother(int seed) { // Constructor
RandomInit(seed);}
protected:
uint32_t x[5]; // History buffer
diff --git a/jellyfish/raw_dumper.hpp b/jellyfish/raw_dumper.hpp
deleted file mode 100644
index 3b9c8af..0000000
--- a/jellyfish/raw_dumper.hpp
+++ /dev/null
@@ -1,244 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __RAW_DUMPER_HPP__
-#define __RAW_DUMPER_HPP__
-
-#include <jellyfish/dumper.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/token_ring.hpp>
-#include <jellyfish/locks_pthread.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
-
-namespace jellyfish {
- namespace raw_hash {
- static const char *file_type __attribute__((used)) = "JFRHSHDN";
- struct header {
- char type[8];
- uint64_t key_len;
- uint64_t val_len;
- uint64_t size;
- uint64_t max_reprobe;
- };
- define_error_class(ErrorReading);
- template<typename storage_t>
- class dumper : public dumper_t, public thread_exec {
- typedef token_ring<locks::pthread::cond> token_ring_t;
- struct thread_info_t {
- token_ring_t::token *token;
- };
- const uint_t threads;
- const std::string file_prefix;
- storage_t *const ary;
- int file_index;
- token_ring_t tr;
-
- struct thread_info_t *thread_info;
- size_t nb_records, nb_blocks;
- std::ofstream *out;
-
- public:
- dumper(uint_t _threads, const char *_file_prefix, size_t chunk_size, storage_t *_ary) :
- threads(_threads), file_prefix(_file_prefix),
- ary(_ary), file_index(0), tr()
- {
- nb_records = ary->floor_block(chunk_size / ary->get_block_len(), nb_blocks);
- while(nb_records < ary->get_max_reprobe_offset()) {
- nb_records = ary->floor_block(2 * nb_records, nb_blocks);
- }
- thread_info = new struct thread_info_t[threads];
- for(uint_t i = 0; i < threads; i++) {
- thread_info[i].token = tr.new_token();
- }
- }
-
- ~dumper() {
- if(thread_info) {
- delete[] thread_info;
- }
- }
-
- virtual void start(int i) { dump_to_file(i); }
- void dump_to_file(int i);
- void write_header();
-
- virtual void _dump();
- };
-
- template<typename _storage_t>
- class query {
- public:
- typedef _storage_t storage_t;
- typedef typename storage_t::iterator iterator;
-
- private:
- mapped_file _file;
- storage_t *_ary;
- bool _canonical;
- bool _cary_bit;
- SquareBinaryMatrix hash_matrix;
- SquareBinaryMatrix hash_inverse_matrix;
-
- public:
- explicit query(mapped_file &map) :
- _file(map), _ary(0), _canonical(false), _cary_bit(false) {
- _ary = init(_file, hash_matrix, hash_inverse_matrix);
- }
- explicit query(std::string filename) :
- _file(filename.c_str()), _ary(0), _canonical(false), _cary_bit(false)
- {
- _ary = init(_file, hash_matrix, hash_inverse_matrix);
- }
- explicit query(const char* filename) :
- _file(filename), _ary(0), _canonical(false), _cary_bit(false)
- {
- _ary = init(_file, hash_matrix, hash_inverse_matrix);
- }
-
- ~query() {
- if(_ary)
- delete _ary;
- }
-
- size_t get_size() const { return _ary->get_size(); }
- size_t get_key_len() const { return _ary->get_key_len(); }
- uint_t get_mer_len() const { return _ary->get_key_len() / 2; }
- uint_t get_val_len() const { return _ary->get_val_len(); }
- uint_t get_max_reprobe() const { return _ary->get_max_reprobe(); }
- size_t get_max_reprobe_offset() const { return _ary->get_max_reprobe_offset(); }
- bool get_canonical() const { return _canonical; }
- void set_canonical(bool v) { _canonical = v; }
- bool get_cary_bit() const { return _cary_bit; }
- void set_cary_bit(bool v) { _cary_bit = v; }
- SquareBinaryMatrix get_hash_matrix() { return hash_matrix; }
- SquareBinaryMatrix get_hash_inverse_matrix() { return hash_inverse_matrix; }
- storage_t *get_ary() const { return _ary; }
-
- iterator get_iterator() const { return iterator_all(); }
- iterator iterator_all() const { return _ary->iterator_all(); }
- iterator iterator_slice(size_t slice_number, size_t number_of_slice) const {
- return _ary->iterator_slice(slice_number, number_of_slice);
- }
-
- typename storage_t::val_t operator[](const char *key_s) const {
- typename storage_t::key_t key = parse_dna::mer_string_to_binary(key_s, get_mer_len());
- return (*this)[key];
- }
- typename storage_t::val_t operator[](const typename storage_t::key_t &key) const {
- typename storage_t::val_t res = 0;
- bool success;
- if(_canonical) {
- typename storage_t::key_t key2 = parse_dna::reverse_complement(key, get_mer_len());
- success = _ary->get_val(key2 < key ? key2 : key, res, true, _cary_bit);
- } else
- success = _ary->get_val(key, res, true, _cary_bit);
- return success ? res : 0;
- }
-
- bool has_key(const char *key_s) const {
- return has_key(parse_dna::mer_string_to_binary(key_s, get_mer_len()));
- }
- bool has_key(const typename storage_t::key_t &key) const {
- typename storage_t::val_t res = 0;
- if(_canonical) {
- typename storage_t::key_t key2 = parse_dna::reverse_complement(key, get_mer_len());
- return _ary->get_val(key2 < key ? key2 : key, res, false);
- } else {
- return _ary->get_val(key, res, false);
- }
- }
-
-
- static storage_t* init(mapped_file& _file,
- SquareBinaryMatrix& hash_matrix,
- SquareBinaryMatrix& hash_inverse_matrix) {
- if(_file.length() < sizeof(struct header))
- eraise(ErrorReading) << "'" << _file.path() << "': "
- << "File truncated";
- char *map = _file.base();
- struct header *header = (struct header *)map;
- map += sizeof(struct header);
- if(strncmp(header->type, file_type, sizeof(header->type)))
- eraise(ErrorReading) << "'" << _file.path() << "': "
- << "Invalid file format '"
- << err::substr(header->type, sizeof(header->type))
- << "'. Expected '" << file_type << "'.";
- if(header->size != (1UL << floorLog2(header->size)))
- eraise(ErrorReading) << "'" << _file.path() << "': "
- << "Size '" << header->size << "' is not a power of 2";
- if(header->key_len > 64 || header->key_len == 0)
- eraise(ErrorReading) << "'" << _file.path() << "': "
- << "Invalid key length '" << header->key_len << "'";
- // TODO: Should that be in the file instead?
- // reprobes = jellyfish::quadratic_reprobes;
- map += hash_matrix.read(map);
- if((uint_t)hash_matrix.get_size() != header->key_len)
- eraise(ErrorReading) << "'" << _file.path() << "': "
- << "Size of hash matrix '" << hash_matrix.get_size()
- << "' not equal to key length '" << header->key_len << "'";
- map += hash_inverse_matrix.read(map);
- if((uint_t)hash_inverse_matrix.get_size() != header->key_len)
- eraise(ErrorReading) << "'" << _file.path() << "': "
- << "Size of inverse hash matrix '" << hash_inverse_matrix.get_size()
- << "' not equal to key length '" << header->key_len << "'";
- if((size_t)map & 0x7)
- map += 0x8 - ((size_t)map & 0x7); // Make sure aligned for 64bits word. TODO: use alignof?
- return new storage_t(map, header->size, header->key_len, header->val_len,
- header->max_reprobe, jellyfish::quadratic_reprobes,
- hash_matrix, hash_inverse_matrix);
- }
- };
-
- template<typename storage_t>
- void dumper<storage_t>::_dump() {
- std::ofstream _out;
- open_next_file(file_prefix.c_str(), &file_index, _out);
- out = &_out;
- tr.reset();
- write_header();
- exec_join(threads);
- _out.close();
- }
-
- template<typename storage_t>
- void dumper<storage_t>::dump_to_file(int id) {
- size_t i;
- struct thread_info_t *my_info = &thread_info[id];
-
- for(i = id; i * nb_records < ary->get_size(); i += threads) {
- my_info->token->wait();
- ary->write_blocks(out, i * nb_blocks, nb_blocks);
- my_info->token->pass();
- ary->zero_blocks(i * nb_blocks, nb_blocks);
- }
- }
-
- template<typename storage_t>
- void dumper<storage_t>::write_header() {
- struct header header;
- memcpy(&header.type, file_type, sizeof(header.type));
- header.key_len = ary->get_key_len();
- header.val_len = ary->get_val_len();
- header.size = ary->get_size();
- header.max_reprobe = ary->get_max_reprobe();
- out->write((char *)&header, sizeof(header));
- ary->write_ary_header(out);
- }
-
- }
-}
-
-#endif
diff --git a/jellyfish/read_parser.cc b/jellyfish/read_parser.cc
deleted file mode 100644
index badaf28..0000000
--- a/jellyfish/read_parser.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/read_parser.hpp>
-#include <jellyfish/dbg.hpp>
-
-jellyfish::read_parser *
-jellyfish::read_parser::new_parser(const char *path) {
- int fd;
- char peek;
- fd = file_peek(path, &peek);
-
- switch(peek) {
- case '>': return new fasta_read_parser(fd, path, &peek, 1);
- case '@': return new fastq_read_parser(fd, path, &peek, 1);
- default:
- eraise(FileParserError) << "'" << path << "'"
- << "Invalid input file. Expected fasta or fastq format";
- }
- return 0;
-}
-
-#define BREAK_AT_END if(eof()) break;
-namespace jellyfish {
- bool fasta_read_parser::next_reads(read_parser::reads_t *rs) {
- for(rs->nb_reads = 0;
- rs->nb_reads < read_parser::reads_t::max_nb_reads && !eof();
- ++rs->nb_reads) {
- read_t *r = &rs->reads[rs->nb_reads];
- r->qual_s = r->qual_e = 0;
- while(sbumpc() != '>')
- BREAK_AT_END;
- BREAK_AT_END;
- r->header = ptr();
- while(sbumpc() != '\n')
- BREAK_AT_END;
- BREAK_AT_END;
- r->hlen = ptr() - r->header - 1;
- r->seq_s = ptr();
- // find end of sequence
- while(!eof())
- if(sbumpc() == '\n')
- if(speekc() == '>')
- break;
- r->seq_e = ptr();
- }
- return !eof();
- }
-
-
- bool fastq_read_parser::next_reads(read_parser::reads_t *rs) {
- for(rs->nb_reads = 0;
- rs->nb_reads < read_parser::reads_t::max_nb_reads && !eof();
- ++rs->nb_reads) {
- read_t *r = &rs->reads[rs->nb_reads];
- while(sbumpc() != '@')
- BREAK_AT_END;
- BREAK_AT_END;
- r->header = ptr();
- while(sbumpc() != '\n')
- BREAK_AT_END;
- BREAK_AT_END;
- r->hlen = ptr() - r->header - 1;
- r->seq_s = ptr();
- // find end of sequence
- size_t nb_bases = 0;
- while(!eof()) {
- if(sbumpc() == '\n') {
- if(speekc() == '+')
- break;
- } else {
- ++nb_bases;
- }
- }
- r->seq_e = ptr();
-
- // Skip qual header
- while(sbumpc() != '\n')
- BREAK_AT_END;
- BREAK_AT_END;
- r->qual_s = ptr();
-
- // Skip qual values
- while(!eof() && nb_bases > 0)
- if(sbumpc() != '\n')
- --nb_bases;
- if(nb_bases == 0)
- r->qual_e = ptr();
- else
- BREAK_AT_END;
- }
- return !eof();
- }
-}
-
diff --git a/jellyfish/read_parser.hpp b/jellyfish/read_parser.hpp
deleted file mode 100644
index e821624..0000000
--- a/jellyfish/read_parser.hpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH__READ_PARSER_HPP__
-#define __JELLYFISH__READ_PARSER_HPP__
-
-#include <jellyfish/file_parser.hpp>
-#include <jellyfish/atomic_gcc.hpp>
-
-namespace jellyfish {
- class read_parser : public file_parser {
- unsigned long usage;
- public:
- struct read_t {
- const char *seq_s, *seq_e, *header, *qual_s, *qual_e;
- size_t hlen;
- };
- struct reads_t {
- static const int max_nb_reads = 100;
- int nb_reads;
- read_t reads[max_nb_reads];
- read_parser *file;
-
- void unlink() {
- if(file->unlink() == 0)
- delete file;
- }
- void link() {
- file->link();
- }
- };
-
- read_parser(int fd, const char *path, const char *str, size_t len) :
- file_parser(fd, path, str, len), usage(0) {}
-
- virtual ~read_parser() {}
-
- static read_parser *new_parser(const char *path);
- virtual bool next_reads(reads_t *rs) = 0;
- unsigned long unlink() {
- return atomic::gcc::add_fetch(&usage, (unsigned long)-1);
- }
- unsigned long link() {
- return atomic::gcc::add_fetch(&usage, (unsigned long)1);
- }
- };
-
- class fasta_read_parser : public read_parser {
- public:
- fasta_read_parser(int fd, const char *path, const char *str, size_t len) :
- read_parser(fd, path, str, len) {}
-
- virtual ~fasta_read_parser() {}
- virtual bool next_reads(reads_t *rs);
- };
-
- class fastq_read_parser : public read_parser {
- public:
- fastq_read_parser(int fd, const char *path, const char *str, size_t len) :
- read_parser(fd, path, str, len) {}
- virtual ~fastq_read_parser() {}
- virtual bool next_reads(reads_t *rs);
- };
-}
-#endif
diff --git a/jellyfish/seq_qual_parser.cc b/jellyfish/seq_qual_parser.cc
deleted file mode 100644
index 0f22e65..0000000
--- a/jellyfish/seq_qual_parser.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/seq_qual_parser.hpp>
-#include <stddef.h>
-
-jellyfish::seq_qual_parser *
-jellyfish::seq_qual_parser::new_parser(const char *path) {
- int fd;
- char peek;
-
- fd = file_peek(path, &peek);
-
- switch(peek) {
- case '@': return new fastq_seq_qual_parser(fd, path, &peek, 1);
-
- default:
- eraise(FileParserError) << "'" << path << "': "
- << "Invalid input file. Expected fastq";
- }
-
- return 0;
-}
-
-
-bool jellyfish::fastq_seq_qual_parser::parse(char *start, char **end) {
- char *qual_start = start + 1;
- // Make sure even length
- *end -= (*end - start) & 0x1;
- if(!_read_buf.empty()) {
- // Copy the saved sequence, then the quality score for this
- // saved sequence. The stream is left at the first qual value.
- if((*end - start) / 2 < (ptrdiff_t)_read_buf.size())
- eraise(FastqSeqQualParserError) << "Buffer is too small to "
- "contain an entire read and its qual values";
- qual_start = start + 1;
- for(const char *b = _read_buf.begin(); b < _read_buf.end(); b++, start += 2)
- *start = *b;
- _read_buf.reset();
- copy_qual_values(qual_start, start);
- }
-
- while(start < *end) {
- // Read sequence header
- bool found_seq_header = false;
- while(!found_seq_header) {
- switch(sbumpc()) {
- case EOF:
- goto done;
- case '\n':
- break;
- case '@':
- found_seq_header = pbase() == '\n';
- if(found_seq_header)
- break;
- // fall through
- default:
- eraise(FastqSeqQualParserError) << "Unexpected character '" << base()
- << "'. Expected '@'";
- }
- }
- // skip seq header
- while(base() != EOF && base() != '\n') { sbumpc(); }
- *start = 'N';
- start += 2;
- qual_start = start + 1;
-
- // copy sequence
- bool found_qual_header = false;
- // char *save_start = start;
- // std::cerr << "save_start " << save_start << std::endl;
- while(start < *end && !found_qual_header) {
- switch(sbumpc()) {
- case EOF:
- eraise(FastqSeqQualParserError) << "Truncated input file";
- case '\n':
- break;
- case '+':
- if((found_qual_header = pbase() == '\n'))
- break;
- // fall through regular character
- default:
- *start = base();
- start += 2;
- }
- }
-
- if(!found_qual_header) { // copy extra sequence to read buffer
- while(!found_qual_header) {
- switch(sbumpc()) {
- case EOF:
- eraise(FastqSeqQualParserError) << "Truncated input file";
- case '\n':
- break;
- case '+':
- if((found_qual_header = pbase() == '\n'))
- break;
- default:
- _read_buf.push_back(base());
- }
- }
- }
- // skip qual header && copy qual values
- while(base() != EOF && base() != '\n') { sbumpc(); }
- // std::cerr << "Copy qual values" << std::endl;
- copy_qual_values(qual_start, start);
- }
-
- done:
- *end = start;
- return base() != EOF;
-}
-
-void jellyfish::fastq_seq_qual_parser::copy_qual_values(char *&qual_start, const char *start) {
- while(qual_start < start + 1) {
- switch(sbumpc()) {
- case EOF:
- eraise(FastqSeqQualParserError) << "Truncated input file";
- case '\n':
- break;
- default:
- *qual_start = base();
- qual_start += 2;
- }
- }
-}
diff --git a/jellyfish/seq_qual_parser.hpp b/jellyfish/seq_qual_parser.hpp
deleted file mode 100644
index c6c38cf..0000000
--- a/jellyfish/seq_qual_parser.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_SEQ_QUAL_PARSER_HPP__
-#define __JELLYFISH_SEQ_QUAL_PARSER_HPP__
-
-#include <iostream>
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/file_parser.hpp>
-#include <jellyfish/simple_growing_array.hpp>
-
-namespace jellyfish {
- class seq_qual_parser : public file_parser {
- public:
- seq_qual_parser(int fd, const char *path, const char *str, size_t len) :
- file_parser(fd, path, str, len) {}
- virtual ~seq_qual_parser() {}
-
- struct sequence_t {
- char *start;
- char *end;
- };
- static seq_qual_parser *new_parser(const char *path);
-
- // parse some input data into the buffer [start, *end). Returns
- // false if there is no more data in the input. **end is an
- // input/output parameter. It points past the end of the buffer
- // when called and should point past the end of the data when
- // returned. The base and its ASCII qual value are one next to
- // another.
- virtual bool parse(char *start, char **end) = 0;
-
- protected:
- };
-
- class fastq_seq_qual_parser : public seq_qual_parser {
- public:
- fastq_seq_qual_parser(int fd, const char *path, const char *str, size_t len) :
- seq_qual_parser(fd, path, str, len) {}
-
- virtual ~fastq_seq_qual_parser() {}
- virtual bool parse(char *start, char **end);
-
- define_error_class(FastqSeqQualParserError);
-
- private:
- void copy_qual_values(char *&qual_start, const char *start);
- simple_growing_array<char> _read_buf;
- };
-}
-
-#endif
diff --git a/jellyfish/sequence_parser.cc b/jellyfish/sequence_parser.cc
deleted file mode 100644
index b32d542..0000000
--- a/jellyfish/sequence_parser.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/sequence_parser.hpp>
-#include <jellyfish/time.hpp>
-
-jellyfish::sequence_parser *
-jellyfish::sequence_parser::new_parser(const char *path) {
- int fd;
- char peek;
- fd = file_peek(path, &peek);
-
- switch(peek) {
- case '>': return new jellyfish::fasta_sequence_parser(fd, path, &peek, 1);
- case '@': return new jellyfish::fastq_sequence_parser(fd, path, &peek, 1);
-
- default:
- eraise(FileParserError) << "'" << path << "': "
- << "Invalid input file. Expected fasta or fastq" ;
- }
-
- return 0;
-}
-
-bool jellyfish::fasta_sequence_parser::parse(char *start, char **end) {
- while(start < *end && base() != _eof) {
- char c = 0;
- switch(c = sbumpc()) {
- case _eof:
- break;
-
- case '>':
- if(pbase() == '\n') {
- while(c != _eof && c != '\n') { c = sbumpc(); }
- *start++ = 'N';
- } else
- *start++ = c;
- break;
-
- case '\n':
- break;
-
- default:
- *start++ = c;
- }
- }
-
- *end = start;
- return !eof();
-}
-
-bool jellyfish::fastq_sequence_parser::parse(char *start, char **end) {
- while(start < *end && base() != _eof) {
- switch(sbumpc()) {
- case _eof:
- break;
-
- case '@':
- if(pbase() == '\n') {
- while(base() != _eof && base() != '\n') { sbumpc(); }
- *start++ = 'N';
- seq_len = 0;
- } else
- *start++ = base();
- break;
-
- case '+':
- if(pbase() == '\n') { // Skip qual header & values
- while(base() != _eof && base() != '\n') { sbumpc(); }
- while(base() != _eof && seq_len > 0) {
- if(base() != '\n')
- --seq_len;
- sbumpc();
- }
- } else
- *start++ = base();
- break;
-
- case '\n':
- break;
-
- default:
- *start++ = base();
- ++seq_len;
- }
- }
-
- *end = start;
- return base() != _eof;
-}
diff --git a/jellyfish/sequence_parser.hpp b/jellyfish/sequence_parser.hpp
deleted file mode 100644
index 5df903f..0000000
--- a/jellyfish/sequence_parser.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_SEQUENCE_PARSER_HPP__
-#define __JELLYFISH_SEQUENCE_PARSER_HPP__
-
-#include <iostream>
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/file_parser.hpp>
-#include <jellyfish/time.hpp>
-
-namespace jellyfish {
- class sequence_parser : public file_parser {
- protected:
- public:
- sequence_parser(int fd, const char *path, const char *str, size_t len) :
- file_parser(fd, path, str, len) { }
- virtual ~sequence_parser() { }
-
- struct sequence_t {
- char *start;
- char *end;
- };
- static sequence_parser *new_parser(const char *path);
-
- // parse some input data into the buffer [start, *end). Returns
- // false if there is no more data in the input. **end is an
- // input/output parameter. It points past the end of the buffer
- // when called and should point past the end of the data when
- // returned.
- virtual bool parse(char *start, char **end) = 0;
- };
-
- class fasta_sequence_parser : public sequence_parser {
- public:
- fasta_sequence_parser(int fd, const char *path, const char *str, size_t len) :
- sequence_parser(fd, path, str, len) {}
-
- virtual ~fasta_sequence_parser() {}
-
- virtual bool parse(char *start, char **end);
- };
-
- class fastq_sequence_parser : public sequence_parser {
- unsigned long seq_len;
- public:
- fastq_sequence_parser(int fd, const char *path, const char *str,
- size_t len) :
- sequence_parser(fd, path, str, len), seq_len(0) {}
-
- virtual ~fastq_sequence_parser() {}
- virtual bool parse(char *start, char **end);
-
- };
-}
-
-#endif
diff --git a/jellyfish/simple_growing_array.hpp b/jellyfish/simple_growing_array.hpp
deleted file mode 100644
index 9a7f117..0000000
--- a/jellyfish/simple_growing_array.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-// Simple growing array. Never shrinks. No construction or destruction
-// of objects in array, only copy with pushback() methods
-namespace jellyfish {
- template<typename T>
- class simple_growing_array {
- size_t _capacity;
- size_t _size;
- T *_data;
- public:
- explicit simple_growing_array(size_t capacity = 100) :
- _capacity(capacity / 2), _size(0), _data(0) { resize(); }
-
- virtual ~simple_growing_array() {
- free(_data);
- }
-
- void push_back(const T &x) {
- if(_size >= _capacity)
- resize();
- _data[_size++] = x;
- }
-
- void reset() { _size = 0; }
-
- size_t size() const { return _size; }
- bool empty() const { return _size == 0; }
- const T * begin() const { return _data; }
- const T * end() const { return _data + _size; }
-
- private:
- define_error_class(SimpleGrowingArrayError);
- void resize() {
- _capacity *= 2;
- void * ndata = realloc(_data, sizeof(T) * _capacity);
- if(ndata == 0) {
- free(ndata);
- _data = 0;
- _capacity = _capacity / 2;
- eraise(SimpleGrowingArrayError) << "Out of memory" << err::no;
- }
- _data = (T*)ndata;
- }
- };
-}
diff --git a/jellyfish/sorted_dumper.hpp b/jellyfish/sorted_dumper.hpp
deleted file mode 100644
index ef34738..0000000
--- a/jellyfish/sorted_dumper.hpp
+++ /dev/null
@@ -1,166 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/dumper.hpp>
-#include <jellyfish/heap.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/token_ring.hpp>
-
-namespace jellyfish {
- template<typename storage_t, typename atomic_t>
- class sorted_dumper : public dumper_t, public thread_exec {
- typedef typename storage_t::overlap_iterator iterator;
- typedef compacted_hash::writer<storage_t> writer_t;
- typedef heap_t<iterator> oheap_t;
- typedef token_ring<locks::pthread::cond> token_ring_t;
-
- struct thread_info_t {
- writer_t writer;
- oheap_t heap;
- token_ring_t::token *token;
- };
-
- uint_t threads;
- std::string file_prefix;
- size_t buffer_size;
- uint_t klen, vlen;
- uint_t key_len, val_len;
- size_t record_len, nb_records, nb_blocks;
- storage_t *ary;
- int file_index;
- token_ring_t tr;
- uint64_t lower_count, upper_count;
- struct thread_info_t *thread_info;
- uint64_t volatile unique, distinct, total, max_count;
- std::ofstream *out;
- locks::pthread::mutex dump_mutex;
- bool one_file;
-
- public:
- // klen: key field length in bits in hash (i.e before rounding up to bytes)
- // vlen: value field length in bits
- sorted_dumper(uint_t _threads, const char *_file_prefix, size_t _buffer_size,
- uint_t _vlen, storage_t *_ary) :
- threads(_threads), file_prefix(_file_prefix), buffer_size(_buffer_size),
- klen(_ary->get_key_len()), vlen(_vlen), ary(_ary), file_index(0),
- tr(), lower_count(0), upper_count(std::numeric_limits<uint64_t>::max()),
- one_file(false)
- {
- key_len = bits_to_bytes(klen);
- val_len = bits_to_bytes(vlen);
- record_len = key_len + val_len;
- nb_records = ary->floor_block(_buffer_size / record_len, nb_blocks);
- while(nb_records < ary->get_max_reprobe_offset()) {
- nb_records = ary->floor_block(2 * nb_records, nb_blocks);
- }
-
- thread_info = new struct thread_info_t[threads];
- for(uint_t i = 0; i < threads; i++) {
- // thread_info[i].token = i == 0;
- thread_info[i].writer.initialize(nb_records, klen, vlen, ary);
- thread_info[i].heap.initialize(ary->get_max_reprobe_offset());
- thread_info[i].token = tr.new_token();
- }
- unique = distinct = total = max_count = 0;
- }
-
- ~sorted_dumper() {
- if(thread_info) {
- delete[] thread_info;
- }
- }
-
- bool get_one_file() const { return one_file; }
- void set_one_file(bool nv) { one_file = nv; }
-
- void set_lower_count(uint64_t l) { lower_count = l; }
- void set_upper_count(uint64_t u) { upper_count = u; }
-
- virtual void start(int i) { dump_to_file(i); }
- void dump_to_file(int i);
-
- virtual void _dump();
- void update_stats() {
- thread_info[0].writer.update_stats_with(out, unique, distinct, total,
- max_count);
- }
- };
-
- template<typename storage_t, typename atomic_t>
- void sorted_dumper<storage_t,atomic_t>::_dump() {
- std::ofstream _out;
- assert(dump_mutex.try_lock());
- if(one_file) {
- _out.open(file_prefix.c_str());
- } else {
- open_next_file(file_prefix.c_str(), &file_index, _out);
- }
- out = &_out;
- unique = distinct = total = max_count = 0;
- tr.reset();
- thread_info[0].writer.write_header(out);
- exec_join(threads);
- ary->zero_blocks(0, nb_blocks); // zero out last group of blocks
- update_stats();
- _out.close();
- dump_mutex.unlock();
- }
-
- template<typename storage_t, typename atomic_t>
- void sorted_dumper<storage_t,atomic_t>::dump_to_file(int id) {
- size_t i;
- struct thread_info_t *my_info = &thread_info[id];
- atomic_t atomic;
-
- my_info->writer.reset_counters();
-
- for(i = id; i * nb_records < ary->get_size(); i += threads) {
- // fill up buffer
- iterator it(ary, i * nb_records, (i + 1) * nb_records);
- my_info->heap.fill(it);
-
- while(it.next()) {
- typename oheap_t::const_item_t item = my_info->heap.head();
- if(item->val >= lower_count && item->val <= upper_count)
- my_info->writer.append(item->key, item->val);
- my_info->heap.pop();
- my_info->heap.push(it);
- }
-
- while(my_info->heap.is_not_empty()) {
- typename oheap_t::const_item_t item = my_info->heap.head();
- if(item->val >= lower_count && item->val <= upper_count)
- my_info->writer.append(item->key, item->val);
- my_info->heap.pop();
- }
-
- my_info->token->wait();
- my_info->writer.dump(out);
- my_info->token->pass();
-
- // zero out memory
- if(i > 0)
- ary->zero_blocks(i * nb_blocks, nb_blocks);
- }
-
- atomic.add_fetch(&unique, my_info->writer.get_unique());
- atomic.add_fetch(&distinct, my_info->writer.get_distinct());
- atomic.add_fetch(&total, my_info->writer.get_total());
- atomic.set_to_max(&max_count, my_info->writer.get_max_count());
- }
-}
diff --git a/jellyfish/square_binary_matrix.cc b/jellyfish/square_binary_matrix.cc
deleted file mode 100644
index 5ecab6d..0000000
--- a/jellyfish/square_binary_matrix.cc
+++ /dev/null
@@ -1,289 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <iostream>
-#include <sstream>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/square_binary_matrix.hpp>
-
-#ifndef random
-// Implement random from the old rand() function. Don't trust low bit
-// to be as random, so call rand twice and reverse one of the result.
-long random() {
- return rand() ^ reverse_bits((uint32_t)rand());
-}
-#endif
-
-void SquareBinaryMatrix::init_random() {
- uint64_t _mask = mask();
- int i, j;
- int lrm = floorLog2((unsigned long)RAND_MAX);
- for(i = 0; i < size; i++) {
- for(j = 0; j < size; j += lrm)
- columns[i] ^= (uint64_t)random() << j;
- columns[i] &= _mask;
- }
-}
-
-SquareBinaryMatrix SquareBinaryMatrix::init_random_inverse() {
- while(true) {
- init_random();
- try {
- return inverse();
- } catch(SquareBinaryMatrix::SingularMatrix &e) { }
- }
-}
-
-SquareBinaryMatrix SquareBinaryMatrix::transpose() const {
- SquareBinaryMatrix res(size);
- uint64_t *a = res.columns, *b;
- int i, j;
-
- for(i = size - 1; i >= 0; i--, a++)
- for(j = size - 1, b = columns; j >= 0; j--, b++)
- *a |= ((*b >> i) & 0x1) << j;
-
- return res;
-}
-
-SquareBinaryMatrix SquareBinaryMatrix::operator*(const SquareBinaryMatrix &other) const {
- int i;
- SquareBinaryMatrix res(size);
-
- if(size != other.get_size())
- eraise(MismatchingSize) << "Multiplication operator dimension mismatch:"
- << size << "x" << size << " != "
- << other.get_size() << "x" << other.get_size();
-
- for(i = 0; i < size; i++) {
- res[i] = this->times(other[i]);
- }
-
- return res;
-}
-
-SquareBinaryMatrix SquareBinaryMatrix::inverse() const {
- SquareBinaryMatrix pivot(*this);
- SquareBinaryMatrix res(size);
- int i, j;
-
- res.init_identity();
-
- // forward elimination
- for(i = 0; i < size; i++) {
- if(!((pivot.columns[i] >> (size - i - 1)) & (uint64_t)0x1)) {
- for(j = i + 1; j < size; j++)
- if((pivot.columns[j] >> (size - i - 1)) & (uint64_t)0x1)
- break;
- if(j >= size)
- eraise(SingularMatrix) << "Matrix is singular";
- pivot.columns[i] ^= pivot.columns[j];
- res.columns[i] ^= res.columns[j];
- }
-
- for(j = i+1; j < size; j++) {
- if((pivot.columns[j] >> (size - i - 1)) & (uint64_t)0x1) {
- pivot.columns[j] ^= pivot.columns[i];
- res.columns[j] ^= res.columns[i];
- }
- }
- }
-
- // backward elimination
- for(i = size - 1; i > 0; i--) {
- for(j = i - 1; j >= 0; j--) {
- if((pivot.columns[j] >> (size - i - 1)) & (uint64_t)0x1) {
- pivot.columns[j] ^= pivot.columns[i];
- res.columns[j] ^= res.columns[i];
- }
- }
- }
- return res;
-}
-
-void SquareBinaryMatrix::print(std::ostream *os) const {
- int i, j;
- uint64_t a, *v;
-
- *os << size << "x" << size << std::endl;
- for(i = 0, a = msb(); i < size; i++, a >>= 1) {
- for(j = 0, v = columns; j < size; j++, v++)
- *os << ((*v & a) ? 1 : 0);
- *os << std::endl;
- }
-}
-
-std::string SquareBinaryMatrix::str() const {
- std::ostringstream os;
- print(&os);
- return os.str();
-}
-
-void SquareBinaryMatrix::dump(std::ostream *os) const {
- os->write((char *)&size, sizeof(size));
- os->write((char *)columns, sizeof(uint64_t) * size);
-}
-
-void SquareBinaryMatrix::load(std::istream *is) {
- is->read((char *)&size, sizeof(size));
- alloc_columns();
- is->read((char *)columns, sizeof(uint64_t) * size);
-}
-
-size_t SquareBinaryMatrix::read(const char *map) {
- int nsize = 0;
- memcpy(&nsize, map, sizeof(nsize));
- if(nsize <= 0 || nsize > 64)
- eraise(MismatchingSize) << "Invalid matrix size '" << nsize << "'. Must be between 1 and 64";
-
- size = nsize;
- alloc_columns();
- memcpy(columns, map + sizeof(size), sizeof(uint64_t) * size);
- return sizeof(size) + sizeof(uint64_t) * size;
-}
-
-void SquareBinaryMatrix::print_vector(std::ostream *os, uint64_t v, bool vertical) const {
- uint64_t a;
- for(a = msb(); a; a >>= 1)
- *os << ((v & a) ? 1 : 0) << (vertical ? "\n" : "");
-}
-
-std::string SquareBinaryMatrix::str_vector(uint64_t v, bool vertical) const {
- std::ostringstream os;
- print_vector(&os, v, vertical);
- return os.str();
-}
-
-#ifdef HAVE_SSE
-uint64_t SquareBinaryMatrix::times_sse(uint64_t v) const {
-#define FFs ((uint64_t)-1)
- static const uint64_t smear[8] asm("smear") __attribute__ ((aligned(16),used)) =
- {0, 0, 0, FFs, FFs, 0, FFs, FFs};
-
- uint64_t *c = columns + (size - 2);
- uint64_t res;
- // How do I make sure that gcc does not use the smear register for something else?
- // Is the & constraint for res enough?
-
- __asm__ __volatile__ ("pxor %%xmm0, %%xmm0\n"
- "times_sse_loop%=:\n\t"
- "movq %2, %0\n\t"
- "andq $3, %0\n\t"
- "shlq $4, %0\n\t"
- "movdqa (%5,%0), %%xmm1\n\t"
- "pand (%1), %%xmm1\n\t"
- "pxor %%xmm1, %%xmm0\n\t"
- "subq $0x10, %1\n\t"
- "shrq $2, %2\n\t"
- "movq %2, %0\n\t"
- "andq $3, %0\n\t"
- "shlq $4, %0\n\t"
- "movdqa (%5,%0), %%xmm1\n\t"
- "pand (%1), %%xmm1\n\t"
- "pxor %%xmm1, %%xmm0\n\t"
- "subq $0x10, %1\n\t"
- "shrq $2, %2\n\t"
- "jnz times_sse_loop%=\n\t"
- "movd %%xmm0, %0\n\t"
- "psrldq $8, %%xmm0\n\t"
- "movd %%xmm0, %1\n\t"
- "xorq %1, %0\n\t"
- : "=&r" (res), "=r" (c), "=r" (v)
- : "1" (c), "2" (v), "r" (smear)
- : "xmm0", "xmm1");
-
- return res;
-}
-
-#else
-
-uint64_t SquareBinaryMatrix::times_sse(uint64_t v) const { return 0; }
-
-#endif
-
-uint64_t SquareBinaryMatrix::times_unrolled(uint64_t v) const {
- uint64_t res = 0, *c = columns+(size-1);
-
- switch(size) {
- case 64: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 63: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 62: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 61: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 60: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 59: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 58: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 57: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 56: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 55: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 54: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 53: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 52: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 51: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 50: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 49: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 48: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 47: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 46: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 45: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 44: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 43: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 42: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 41: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 40: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 39: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 38: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 37: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 36: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 35: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 34: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 33: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 32: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 31: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 30: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 29: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 28: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 27: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 26: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 25: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 24: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 23: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 22: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 21: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 20: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 19: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 18: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 17: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 16: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 15: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 14: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 13: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 12: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 11: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 10: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 9: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 8: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 7: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 6: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 5: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 4: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 3: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 2: res ^= (-(v & 1)) & *c--; v >>= 1;
- case 1: res ^= (-(v & 1)) & *c;
- }
- return res;
-}
-
diff --git a/jellyfish/square_binary_matrix.hpp b/jellyfish/square_binary_matrix.hpp
deleted file mode 100644
index 67e3f49..0000000
--- a/jellyfish/square_binary_matrix.hpp
+++ /dev/null
@@ -1,203 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef __JELLYFISH_SQUARE_BINARY_MATRIX_HPP__
-#define __JELLYFISH_SQUARE_BINARY_MATRIX_HPP__
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <iostream>
-#include <exception>
-#include <algorithm>
-#include <assert.h>
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-
-class SquareBinaryMatrix {
-public:
- define_error_class(ErrorAllocation);
- define_error_class(SingularMatrix);
- define_error_class(MismatchingSize);
-
-private:
- uint64_t *columns;
- int size;
-
- uint64_t mask() const { return (((uint64_t)1) << size) - 1; }
- uint64_t msb() const { return ((uint64_t)1) << (size - 1); }
- uint64_t *first_alloc(size_t size) {
- uint64_t *res = calloc_align<uint64_t>((size_t)size, (size_t)16);
- if(!res)
- eraise(ErrorAllocation) << "Can't allocate matrix of size '" << size << "'";
- return res;
- }
- void alloc_columns() {
- if(columns) {
- free(columns);
- columns = 0;
- }
- if(size < 0 || size > 64)
- eraise(MismatchingSize) << "Invalid matrix size '" << size << "'";
- columns = first_alloc(size);
- }
-
-public:
- SquareBinaryMatrix() : columns(0), size(0) { }
-
- explicit SquareBinaryMatrix(int _size) :columns(first_alloc(_size)), size(_size) {
- memset(columns, '\0', sizeof(uint64_t) * _size);
- }
- SquareBinaryMatrix(const SquareBinaryMatrix &rhs) : columns(first_alloc(rhs.get_size())), size(rhs.get_size()) {
- int i;
-
- uint64_t _mask = mask();
- for(i = 0; i < size; i++)
- columns[i] = rhs.columns[i] & _mask;
- }
- SquareBinaryMatrix(const uint64_t *_columns, int _size) : columns(first_alloc(_size)), size(_size) {
- int i;
- uint64_t _mask = mask();
-
- for(i = 0; i < size; i++)
- columns[i] = _columns[i] & _mask;
- }
- explicit SquareBinaryMatrix(const char *map) : columns(0), size(0) {
- read(map);
- }
- explicit SquareBinaryMatrix(std::istream *is) : columns(0), size(0) {
- load(is);
- }
-
- ~SquareBinaryMatrix() {
- if(columns)
- free(columns);
- }
-
- void swap(SquareBinaryMatrix &rhs) {
- std::swap(columns, rhs.columns);
- std::swap(size, rhs.size);
- }
-
- SquareBinaryMatrix &operator=(SquareBinaryMatrix rhs) {
- this->swap(rhs);
- return *this;
- }
-
- void init_random();
-
- SquareBinaryMatrix init_random_inverse();
-
- void init_identity() {
- uint64_t v = msb();
- int i;
- for(i = 0; v; i++, v >>= 1)
- columns[i] = v;
- }
-
- bool is_identity() const {
- uint64_t v = msb();
- int i;
-
- for(i = 0; i < size; i++, v >>= 1) {
- if(columns[i] != v)
- return false;
- }
- return true;
- }
-
- bool is_zero() const {
- int i;
- for(i = 0; i < size; i++)
- if(columns[i])
- return false;
- return true;
- }
-
- void resize(int ns) { size = ns; alloc_columns(); }
- int get_size() const { return size; }
-
- bool operator==(const SquareBinaryMatrix &other) const {
- int i;
- if(size != other.get_size())
- return false;
- for(i = 0; i < size; i++)
- if(columns[i] != other.columns[i])
- return false;
-
- return true;
- }
-
- bool operator!=(const SquareBinaryMatrix &other) const {
- return !(*this == other);
- }
-
- uint64_t & operator[](int i) {
- return columns[i];
- }
-
- uint64_t operator[](int i) const {
- return columns[i];
- }
-
- uint64_t times_loop(uint64_t v) const {
- uint64_t res = 0, *c = columns+(size-1);
-
- for ( ; v; v >>= 1)
- res ^= (-(v & 1)) & *c--;
- return res;
- }
-
- uint64_t times_unrolled(uint64_t v) const;
- uint64_t times_sse(uint64_t v) const;
-
- inline uint64_t times(uint64_t v) const {
-#ifdef HAVE_SSE
- return times_sse(v);
-#else
- return times_unrolled(v);
-#endif
- }
-
- SquareBinaryMatrix transpose() const;
- SquareBinaryMatrix operator*(const SquareBinaryMatrix &other) const;
-
- SquareBinaryMatrix inverse() const;
- int pop_count() const {
- int i, res = 0;
- for(i = 0; i < size; i++)
- res += __builtin_popcountl(columns[i]);
- return res;
- }
-
- uint64_t xor_sum() const {
- uint64_t sum = 0;
- for(int i = 0; i < size; ++i)
- sum ^= columns[i];
- return sum;
- }
-
- void print(std::ostream *os) const;
- std::string str() const;
- void dump(std::ostream *os) const;
- void load(std::istream *is);
- size_t read(const char *map);
- size_t dump_size() { return sizeof(size) + sizeof(uint64_t) * size; }
- void print_vector(std::ostream *os, uint64_t v, bool vertical = false) const;
- std::string str_vector(uint64_t v, bool vertical = false) const;
-};
-
-#endif // __SQUARE_BINARY_MATRIX_HPP__
diff --git a/jellyfish/stats_main.cc b/jellyfish/stats_main.cc
deleted file mode 100644
index 33f1dfb..0000000
--- a/jellyfish/stats_main.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <iostream>
-#include <fstream>
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/misc.hpp>
-#include <jellyfish/mer_counting.hpp>
-#include <jellyfish/compacted_hash.hpp>
-#include <jellyfish/stats_main_cmdline.hpp>
-#include <jellyfish/fstream_default.hpp>
-
-template<typename hash_t>
-void compute_stats(const hash_t &h, uint64_t lower_count, uint64_t upper_count,
- uint64_t &unique, uint64_t &distinct, uint64_t &total,
- uint64_t &max_count) {
- typename hash_t::iterator it = h.iterator_all();
- while(it.next()) {
- if(it.get_val() < lower_count || it.get_val() > upper_count)
- continue;
- unique += it.get_val() == 1;
- distinct++;
- total += it.get_val();
- if(it.get_val() > max_count)
- max_count = it.get_val();
- }
-}
-
-int stats_main(int argc, char *argv[])
-{
- stats_args args(argc, argv);
-
- ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
- if(!out.good())
- die << "Error opening output file '" << args.output_arg << "'";
-
- mapped_file dbf(args.db_arg);
- dbf.sequential().will_need();
- char type[8];
- memcpy(type, dbf.base(), sizeof(type));
-
- args.recompute_flag |= args.lower_count_given | args.upper_count_given;
- uint64_t lower_count = args.lower_count_given ? args.lower_count_arg : 0;
- uint64_t upper_count = args.upper_count_given ? args.upper_count_arg : (uint64_t)-1;
-
- uint64_t unique = 0, distinct = 0, total = 0, max_count = 0;
- if(!strncmp(type, jellyfish::compacted_hash::file_type, sizeof(type))) {
- hash_query_t hash(dbf);
- if(args.verbose_flag)
- out << "k-mer length (bases): " << hash.get_mer_len() << "\n"
- << "value length (bytes): " << hash.get_val_len() << "\n"
- << "max reprobe : " << hash.get_max_reprobe() << "\n"
- << "hash size : " << hash.get_size() << "\n";
-
- if(args.recompute_flag) {
- compute_stats(hash, lower_count, upper_count, unique, distinct,
- total, max_count);
- } else {
- unique = hash.get_unique();
- distinct = hash.get_distinct();
- total = hash.get_total();
- max_count = hash.get_max_count();
- }
- } else if(!strncmp(type, jellyfish::raw_hash::file_type, sizeof(type))) {
- raw_inv_hash_query_t hash(dbf);
- if(args.verbose_flag)
- out << "k-mer length (bases): " << hash.get_mer_len() << "\n"
- << "value length (bits) : " << hash.get_val_len() << "\n";
- compute_stats(hash, lower_count, upper_count, unique, distinct,
- total, max_count);
- } else {
- die << "Invalid file type '" << err::substr(type, sizeof(type)) << "'.";
- }
- out << "Unique: " << unique << "\n"
- << "Distinct: " << distinct << "\n"
- << "Total: " << total << "\n"
- << "Max_count: " << max_count << "\n";
- out.close();
-
- // if(args.fasta_flag) {
- // char key[hash.get_mer_len() + 1];
- // while(hash.next()) {
- // if(hash.val < lower_count || hash.val > upper_count)
- // continue;
- // hash.get_string(key);
- // out << ">" << hash.val << "\n" << key << "\n";
- // }
- // } else if(args.column_flag) {
- // char key[hash.get_mer_len() + 1];
- // char spacer = args.tab_flag ? '\t' : ' ';
- // while(hash.next()) {
- // if(hash.val < lower_count || hash.val > upper_count)
- // continue;
- // hash.get_string(key);
- // out << key << spacer << hash.val << "\n";
- // }
- // } else {
- // die << "Invalid file type '" << err::substr(type, sizeof(type)) << "'.";
- // }
- // out.close();
-
- return 0;
-}
diff --git a/jellyfish/stats_main_cmdline.hpp b/jellyfish/stats_main_cmdline.hpp
deleted file mode 100644
index 4db8e3a..0000000
--- a/jellyfish/stats_main_cmdline.hpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/***** This code was generated by Yaggo. Do not edit ******/
-
-#ifndef __STATS_ARGS_HPP__
-#define __STATS_ARGS_HPP__
-
-#include <jellyfish/yaggo.hpp>
-
-class stats_args {
-public:
- bool recompute_flag;
- uint64_t lower_count_arg;
- bool lower_count_given;
- uint64_t upper_count_arg;
- bool upper_count_given;
- bool verbose_flag;
- const char * output_arg;
- bool output_given;
- const char * db_arg;
-
- enum {
- USAGE_OPT = 1000,
- FULL_HELP_OPT
- };
-
- stats_args() :
- recompute_flag(false),
- lower_count_arg(), lower_count_given(false),
- upper_count_arg(), upper_count_given(false),
- verbose_flag(false),
- output_arg(""), output_given(false)
- { }
-
- stats_args(int argc, char* argv[]) :
- recompute_flag(false),
- lower_count_arg(), lower_count_given(false),
- upper_count_arg(), upper_count_given(false),
- verbose_flag(false),
- output_arg(""), output_given(false)
- { parse(argc, argv); }
-
- void parse(int argc, char* argv[]) {
- static struct option long_options[] = {
- {"recompute", 0, 0, 'r'},
- {"lower-count", 1, 0, 'L'},
- {"upper-count", 1, 0, 'U'},
- {"verbose", 0, 0, 'v'},
- {"output", 1, 0, 'o'},
- {"help", 0, 0, 'h'},
- {"full-help", 0, 0, FULL_HELP_OPT},
- {"usage", 0, 0, USAGE_OPT},
- {"version", 0, 0, 'V'},
- {0, 0, 0, 0}
- };
- static const char *short_options = "hVrL:U:vo:";
-
- std::string err;
-#define CHECK_ERR(type,val,which) if(!err.empty()) { std::cerr << "Invalid " #type " '" << val << "' for [" which "]: " << err << "\n"; exit(1); }
- while(true) {
- int index = -1;
- int c = getopt_long(argc, argv, short_options, long_options, &index);
- if(c == -1) break;
- switch(c) {
- case ':':
- std::cerr << "Missing required argument for "
- << (index == -1 ? std::string(1, (char)optopt) : std::string(long_options[index].name))
- << std::endl;
- exit(1);
- case 'h':
- std::cout << usage() << "\n\n" << help() << std::endl;
- exit(0);
- case USAGE_OPT:
- std::cout << usage() << "\nUse --help for more information." << std::endl;
- exit(0);
- case 'V':
- print_version();
- exit(0);
- case '?':
- std::cerr << "Use --usage or --help for some help\n";
- exit(1);
- case FULL_HELP_OPT:
- std::cout << usage() << "\n\n" << help() << "\n\n" << hidden() << std::endl;
- exit(0);
- case 'r':
- recompute_flag = true;
- break;
- case 'L':
- lower_count_given = true;
- lower_count_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, "-L, --lower-count=uint64")
- break;
- case 'U':
- upper_count_given = true;
- upper_count_arg = yaggo::conv_uint<uint64_t>((const char *)optarg, err, false);
- CHECK_ERR(uint64_t, optarg, "-U, --upper-count=uint64")
- break;
- case 'v':
- verbose_flag = true;
- break;
- case 'o':
- output_given = true;
- output_arg = optarg;
- break;
- }
- }
-
- // Parse arguments
- if(argc - optind != 1)
- error("Requires exactly 1 argument.");
- db_arg = argv[optind];
- ++optind;
- }
-
-#define stats_args_USAGE "Usage: jellyfish stats [options] db:path"
- const char * usage() const { return stats_args_USAGE; }
- void error(const char *msg) {
- std::cerr << "Error: " << msg << "\n" << usage()
- << "\nUse --help for more information"
- << std::endl;
- exit(1);
- }
-
-#define stats_args_HELP "Statistics\n\nDisplay some statistics about the k-mers in the hash:\n" \
- "\n" \
- "Unique: Number of k-mers which occur only once.\n" \
- "Distinct: Number of k-mers, not counting multiplicity.\n" \
- "Total: Number of k-mers, including multiplicity.\n" \
- "Max_count: Maximum number of occurrence of a k-mer.\n\n" \
- "Options (default value in (), *required):\n" \
- " -L, --lower-count=uint64 Don't consider k-mer with count < lower-count\n" \
- " -U, --upper-count=uint64 Don't consider k-mer with count > upper-count\n" \
- " -v, --verbose Verbose (false)\n" \
- " -o, --output=string Output file\n" \
- " --usage Usage\n" \
- " -h, --help This message\n" \
- " --full-help Detailed help\n" \
- " -V, --version Version"
-
- const char * help() const { return stats_args_HELP; }
-#define stats_args_HIDDEN "Hidden options:\n" \
- " -r, --recompute Recompute (false)"
-
- const char * hidden() const { return stats_args_HIDDEN; }
- void print_version(std::ostream &os = std::cout) const {
-#ifndef PACKAGE_VERSION
-#define PACKAGE_VERSION "0.0.0"
-#endif
- os << PACKAGE_VERSION << "\n";
- }
- void dump(std::ostream &os = std::cout) {
- os << "recompute_flag:" << recompute_flag << "\n";
- os << "lower_count_given:" << lower_count_given << " lower_count_arg:" << lower_count_arg << "\n";
- os << "upper_count_given:" << upper_count_given << " upper_count_arg:" << upper_count_arg << "\n";
- os << "verbose_flag:" << verbose_flag << "\n";
- os << "output_given:" << output_given << " output_arg:" << output_arg << "\n";
- os << "db_arg:" << db_arg << "\n";
- }
-private:
-};
-
-#endif // __STATS_ARGS_HPP__"
diff --git a/jellyfish/storage.cc b/jellyfish/storage.cc
deleted file mode 100644
index fca7f80..0000000
--- a/jellyfish/storage.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "config.h"
-#include <jellyfish/storage.hpp>
-
-namespace jellyfish {
- size_t _quadratic_reprobes[257] = {
- 1,
- 1, 3, 6, 10, 15, 21, 28, 36, 45, 55,
- 66, 78, 91, 105, 120, 136, 153, 171, 190, 210,
- 231, 253, 276, 300, 325, 351, 378, 406, 435, 465,
- 496, 528, 561, 595, 630, 666, 703, 741, 780, 820,
- 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275,
- 1326, 1378, 1431, 1485, 1540, 1596, 1653, 1711, 1770, 1830,
- 1891, 1953, 2016, 2080, 2145, 2211, 2278, 2346, 2415, 2485,
- 2556, 2628, 2701, 2775, 2850, 2926, 3003, 3081, 3160, 3240,
- 3321, 3403, 3486, 3570, 3655, 3741, 3828, 3916, 4005, 4095,
- 4186, 4278, 4371, 4465, 4560, 4656, 4753, 4851, 4950, 5050,
- 5151, 5253, 5356, 5460, 5565, 5671, 5778, 5886, 5995, 6105,
- 6216, 6328, 6441, 6555, 6670, 6786, 6903, 7021, 7140, 7260,
- 7381, 7503, 7626, 7750, 7875, 8001, 8128, 8256, 8385, 8515,
- 8646, 8778, 8911, 9045, 9180, 9316, 9453, 9591, 9730, 9870,
- 10011, 10153, 10296, 10440, 10585, 10731, 10878, 11026, 11175, 11325,
- 11476, 11628, 11781, 11935, 12090, 12246, 12403, 12561, 12720, 12880,
- 13041, 13203, 13366, 13530, 13695, 13861, 14028, 14196, 14365, 14535,
- 14706, 14878, 15051, 15225, 15400, 15576, 15753, 15931, 16110, 16290,
- 16471, 16653, 16836, 17020, 17205, 17391, 17578, 17766, 17955, 18145,
- 18336, 18528, 18721, 18915, 19110, 19306, 19503, 19701, 19900, 20100,
- 20301, 20503, 20706, 20910, 21115, 21321, 21528, 21736, 21945, 22155,
- 22366, 22578, 22791, 23005, 23220, 23436, 23653, 23871, 24090, 24310,
- 24531, 24753, 24976, 25200, 25425, 25651, 25878, 26106, 26335, 26565,
- 26796, 27028, 27261, 27495, 27730, 27966, 28203, 28441, 28680, 28920,
- 29161, 29403, 29646, 29890, 30135, 30381, 30628, 30876, 31125, 31375,
- 31626, 31878, 32131, 32385, 32640, 32896
- };
- size_t *quadratic_reprobes = _quadratic_reprobes;
-}
diff --git a/jellyfish/test_double_fifo_input.cc b/jellyfish/test_double_fifo_input.cc
deleted file mode 100644
index a703e63..0000000
--- a/jellyfish/test_double_fifo_input.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/err.hpp>
-#include <jellyfish/parse_dna.hpp>
-#include <jellyfish/thread_exec.hpp>
-#include <jellyfish/backtrace.hpp>
-#include <stdlib.h>
-
-class display_kmer {
- int _k;
- unsigned long count;
-public:
- typedef unsigned long val_type;
- explicit display_kmer(int k) : _k(k), count(0) {}
-
- void add(uint64_t mer, int i, val_type *oval = 0) {
- ++count;
- }
- void inc(uint64_t mer) {
- // char mer_str[_k+1];
- // jellyfish::parse_dna::mer_binary_to_string(mer, _k, mer_str);
- // std::cout << mer_str << std::endl;
- ++count;
- }
-
- display_kmer *operator->() { return this; }
- unsigned long get_count() { return count; }
-};
-
-
-class parser : public thread_exec {
- jellyfish::parse_dna _parser;
- unsigned long count;
-
-public:
- parser(int argc, const char *argv[]) :
- _parser(argv, argv + argc, 25, 100, 1024*10),
- count(0)
- { }
-
- void start(int id) {
- jellyfish::parse_dna::thread tparse = _parser.new_thread();
-
- display_kmer display(25);
- tparse.parse(display);
- atomic::gcc::fetch_add(&count, display.get_count());
- }
-
- unsigned long get_count() { return count; }
-};
-
-
-int main(int argc, const char *argv[])
-{
- show_backtrace();
-
- if(argc != 3)
- die << "Need the number of threads and file name";
-
- parser parse(argc - 2, argv + 2);
- parse.exec_join(atoi(argv[1]));
- std::cout << "Get count " << parse.get_count() << std::endl;
-
- return 0;
-}
diff --git a/jellyfish/test_read_parser.cc b/jellyfish/test_read_parser.cc
deleted file mode 100644
index bf498c3..0000000
--- a/jellyfish/test_read_parser.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/* This file is part of Jellyfish.
-
- Jellyfish is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Jellyfish is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <jellyfish/parse_read.hpp>
-#include <iostream>
-#include <fstream>
-#include <string>
-#include <jellyfish/dbg.hpp>
-#include <jellyfish/backtrace.hpp>
-
-int main(int argc, char *argv[])
-{
- show_backtrace();
- jellyfish::parse_read parser(argv + 1, argv + argc, 100);
- jellyfish::parse_read::thread stream = parser.new_thread();
-
- jellyfish::read_parser::read_t *read;
- while((read = stream.next_read())) {
- unsigned long count = 0;
- for(const char *base = read->seq_s; base < read->seq_e; ++base) {
- switch(*base) {
- case 'a': case 'A':
- case 'c': case 'C':
- case 'g': case 'G':
- case 't': case 'T':
- ++count;
-
- default: break; //skip
- }
- }
- std::cout << "'" << std::string(read->header, read->hlen) << "' "
- << count << "\n";
- }
- std::cout << std::flush;
-
- return 0;
-}
diff --git a/jellyfish/toFloat.h b/jellyfish/toFloat.h
deleted file mode 100644
index 37c9556..0000000
--- a/jellyfish/toFloat.h
+++ /dev/null
@@ -1,16391 +0,0 @@
-//
-// This is an automatically generated file.
-// Do not edit.
-//
-
-{
- {0x00000000}, {0x33800000}, {0x34000000}, {0x34400000},
- {0x34800000}, {0x34a00000}, {0x34c00000}, {0x34e00000},
- {0x35000000}, {0x35100000}, {0x35200000}, {0x35300000},
- {0x35400000}, {0x35500000}, {0x35600000}, {0x35700000},
- {0x35800000}, {0x35880000}, {0x35900000}, {0x35980000},
- {0x35a00000}, {0x35a80000}, {0x35b00000}, {0x35b80000},
- {0x35c00000}, {0x35c80000}, {0x35d00000}, {0x35d80000},
- {0x35e00000}, {0x35e80000}, {0x35f00000}, {0x35f80000},
- {0x36000000}, {0x36040000}, {0x36080000}, {0x360c0000},
- {0x36100000}, {0x36140000}, {0x36180000}, {0x361c0000},
- {0x36200000}, {0x36240000}, {0x36280000}, {0x362c0000},
- {0x36300000}, {0x36340000}, {0x36380000}, {0x363c0000},
- {0x36400000}, {0x36440000}, {0x36480000}, {0x364c0000},
- {0x36500000}, {0x36540000}, {0x36580000}, {0x365c0000},
- {0x36600000}, {0x36640000}, {0x36680000}, {0x366c0000},
- {0x36700000}, {0x36740000}, {0x36780000}, {0x367c0000},
- {0x36800000}, {0x36820000}, {0x36840000}, {0x36860000},
- {0x36880000}, {0x368a0000}, {0x368c0000}, {0x368e0000},
- {0x36900000}, {0x36920000}, {0x36940000}, {0x36960000},
- {0x36980000}, {0x369a0000}, {0x369c0000}, {0x369e0000},
- {0x36a00000}, {0x36a20000}, {0x36a40000}, {0x36a60000},
- {0x36a80000}, {0x36aa0000}, {0x36ac0000}, {0x36ae0000},
- {0x36b00000}, {0x36b20000}, {0x36b40000}, {0x36b60000},
- {0x36b80000}, {0x36ba0000}, {0x36bc0000}, {0x36be0000},
- {0x36c00000}, {0x36c20000}, {0x36c40000}, {0x36c60000},
- {0x36c80000}, {0x36ca0000}, {0x36cc0000}, {0x36ce0000},
- {0x36d00000}, {0x36d20000}, {0x36d40000}, {0x36d60000},
- {0x36d80000}, {0x36da0000}, {0x36dc0000}, {0x36de0000},
- {0x36e00000}, {0x36e20000}, {0x36e40000}, {0x36e60000},
- {0x36e80000}, {0x36ea0000}, {0x36ec0000}, {0x36ee0000},
- {0x36f00000}, {0x36f20000}, {0x36f40000}, {0x36f60000},
- {0x36f80000}, {0x36fa0000}, {0x36fc0000}, {0x36fe0000},
- {0x37000000}, {0x37010000}, {0x37020000}, {0x37030000},
- {0x37040000}, {0x37050000}, {0x37060000}, {0x37070000},
- {0x37080000}, {0x37090000}, {0x370a0000}, {0x370b0000},
- {0x370c0000}, {0x370d0000}, {0x370e0000}, {0x370f0000},
- {0x37100000}, {0x37110000}, {0x37120000}, {0x37130000},
- {0x37140000}, {0x37150000}, {0x37160000}, {0x37170000},
- {0x37180000}, {0x37190000}, {0x371a0000}, {0x371b0000},
- {0x371c0000}, {0x371d0000}, {0x371e0000}, {0x371f0000},
- {0x37200000}, {0x37210000}, {0x37220000}, {0x37230000},
- {0x37240000}, {0x37250000}, {0x37260000}, {0x37270000},
- {0x37280000}, {0x37290000}, {0x372a0000}, {0x372b0000},
- {0x372c0000}, {0x372d0000}, {0x372e0000}, {0x372f0000},
- {0x37300000}, {0x37310000}, {0x37320000}, {0x37330000},
- {0x37340000}, {0x37350000}, {0x37360000}, {0x37370000},
- {0x37380000}, {0x37390000}, {0x373a0000}, {0x373b0000},
- {0x373c0000}, {0x373d0000}, {0x373e0000}, {0x373f0000},
- {0x37400000}, {0x37410000}, {0x37420000}, {0x37430000},
- {0x37440000}, {0x37450000}, {0x37460000}, {0x37470000},
- {0x37480000}, {0x37490000}, {0x374a0000}, {0x374b0000},
- {0x374c0000}, {0x374d0000}, {0x374e0000}, {0x374f0000},
- {0x37500000}, {0x37510000}, {0x37520000}, {0x37530000},
- {0x37540000}, {0x37550000}, {0x37560000}, {0x37570000},
- {0x37580000}, {0x37590000}, {0x375a0000}, {0x375b0000},
- {0x375c0000}, {0x375d0000}, {0x375e0000}, {0x375f0000},
- {0x37600000}, {0x37610000}, {0x37620000}, {0x37630000},
- {0x37640000}, {0x37650000}, {0x37660000}, {0x37670000},
- {0x37680000}, {0x37690000}, {0x376a0000}, {0x376b0000},
- {0x376c0000}, {0x376d0000}, {0x376e0000}, {0x376f0000},
- {0x37700000}, {0x37710000}, {0x37720000}, {0x37730000},
- {0x37740000}, {0x37750000}, {0x37760000}, {0x37770000},
- {0x37780000}, {0x37790000}, {0x377a0000}, {0x377b0000},
- {0x377c0000}, {0x377d0000}, {0x377e0000}, {0x377f0000},
- {0x37800000}, {0x37808000}, {0x37810000}, {0x37818000},
- {0x37820000}, {0x37828000}, {0x37830000}, {0x37838000},
- {0x37840000}, {0x37848000}, {0x37850000}, {0x37858000},
- {0x37860000}, {0x37868000}, {0x37870000}, {0x37878000},
- {0x37880000}, {0x37888000}, {0x37890000}, {0x37898000},
- {0x378a0000}, {0x378a8000}, {0x378b0000}, {0x378b8000},
- {0x378c0000}, {0x378c8000}, {0x378d0000}, {0x378d8000},
- {0x378e0000}, {0x378e8000}, {0x378f0000}, {0x378f8000},
- {0x37900000}, {0x37908000}, {0x37910000}, {0x37918000},
- {0x37920000}, {0x37928000}, {0x37930000}, {0x37938000},
- {0x37940000}, {0x37948000}, {0x37950000}, {0x37958000},
- {0x37960000}, {0x37968000}, {0x37970000}, {0x37978000},
- {0x37980000}, {0x37988000}, {0x37990000}, {0x37998000},
- {0x379a0000}, {0x379a8000}, {0x379b0000}, {0x379b8000},
- {0x379c0000}, {0x379c8000}, {0x379d0000}, {0x379d8000},
- {0x379e0000}, {0x379e8000}, {0x379f0000}, {0x379f8000},
- {0x37a00000}, {0x37a08000}, {0x37a10000}, {0x37a18000},
- {0x37a20000}, {0x37a28000}, {0x37a30000}, {0x37a38000},
- {0x37a40000}, {0x37a48000}, {0x37a50000}, {0x37a58000},
- {0x37a60000}, {0x37a68000}, {0x37a70000}, {0x37a78000},
- {0x37a80000}, {0x37a88000}, {0x37a90000}, {0x37a98000},
- {0x37aa0000}, {0x37aa8000}, {0x37ab0000}, {0x37ab8000},
- {0x37ac0000}, {0x37ac8000}, {0x37ad0000}, {0x37ad8000},
- {0x37ae0000}, {0x37ae8000}, {0x37af0000}, {0x37af8000},
- {0x37b00000}, {0x37b08000}, {0x37b10000}, {0x37b18000},
- {0x37b20000}, {0x37b28000}, {0x37b30000}, {0x37b38000},
- {0x37b40000}, {0x37b48000}, {0x37b50000}, {0x37b58000},
- {0x37b60000}, {0x37b68000}, {0x37b70000}, {0x37b78000},
- {0x37b80000}, {0x37b88000}, {0x37b90000}, {0x37b98000},
- {0x37ba0000}, {0x37ba8000}, {0x37bb0000}, {0x37bb8000},
- {0x37bc0000}, {0x37bc8000}, {0x37bd0000}, {0x37bd8000},
- {0x37be0000}, {0x37be8000}, {0x37bf0000}, {0x37bf8000},
- {0x37c00000}, {0x37c08000}, {0x37c10000}, {0x37c18000},
- {0x37c20000}, {0x37c28000}, {0x37c30000}, {0x37c38000},
- {0x37c40000}, {0x37c48000}, {0x37c50000}, {0x37c58000},
- {0x37c60000}, {0x37c68000}, {0x37c70000}, {0x37c78000},
- {0x37c80000}, {0x37c88000}, {0x37c90000}, {0x37c98000},
- {0x37ca0000}, {0x37ca8000}, {0x37cb0000}, {0x37cb8000},
- {0x37cc0000}, {0x37cc8000}, {0x37cd0000}, {0x37cd8000},
- {0x37ce0000}, {0x37ce8000}, {0x37cf0000}, {0x37cf8000},
- {0x37d00000}, {0x37d08000}, {0x37d10000}, {0x37d18000},
- {0x37d20000}, {0x37d28000}, {0x37d30000}, {0x37d38000},
- {0x37d40000}, {0x37d48000}, {0x37d50000}, {0x37d58000},
- {0x37d60000}, {0x37d68000}, {0x37d70000}, {0x37d78000},
- {0x37d80000}, {0x37d88000}, {0x37d90000}, {0x37d98000},
- {0x37da0000}, {0x37da8000}, {0x37db0000}, {0x37db8000},
- {0x37dc0000}, {0x37dc8000}, {0x37dd0000}, {0x37dd8000},
- {0x37de0000}, {0x37de8000}, {0x37df0000}, {0x37df8000},
- {0x37e00000}, {0x37e08000}, {0x37e10000}, {0x37e18000},
- {0x37e20000}, {0x37e28000}, {0x37e30000}, {0x37e38000},
- {0x37e40000}, {0x37e48000}, {0x37e50000}, {0x37e58000},
- {0x37e60000}, {0x37e68000}, {0x37e70000}, {0x37e78000},
- {0x37e80000}, {0x37e88000}, {0x37e90000}, {0x37e98000},
- {0x37ea0000}, {0x37ea8000}, {0x37eb0000}, {0x37eb8000},
- {0x37ec0000}, {0x37ec8000}, {0x37ed0000}, {0x37ed8000},
- {0x37ee0000}, {0x37ee8000}, {0x37ef0000}, {0x37ef8000},
- {0x37f00000}, {0x37f08000}, {0x37f10000}, {0x37f18000},
- {0x37f20000}, {0x37f28000}, {0x37f30000}, {0x37f38000},
- {0x37f40000}, {0x37f48000}, {0x37f50000}, {0x37f58000},
- {0x37f60000}, {0x37f68000}, {0x37f70000}, {0x37f78000},
- {0x37f80000}, {0x37f88000}, {0x37f90000}, {0x37f98000},
- {0x37fa0000}, {0x37fa8000}, {0x37fb0000}, {0x37fb8000},
- {0x37fc0000}, {0x37fc8000}, {0x37fd0000}, {0x37fd8000},
- {0x37fe0000}, {0x37fe8000}, {0x37ff0000}, {0x37ff8000},
- {0x38000000}, {0x38004000}, {0x38008000}, {0x3800c000},
- {0x38010000}, {0x38014000}, {0x38018000}, {0x3801c000},
- {0x38020000}, {0x38024000}, {0x38028000}, {0x3802c000},
- {0x38030000}, {0x38034000}, {0x38038000}, {0x3803c000},
- {0x38040000}, {0x38044000}, {0x38048000}, {0x3804c000},
- {0x38050000}, {0x38054000}, {0x38058000}, {0x3805c000},
- {0x38060000}, {0x38064000}, {0x38068000}, {0x3806c000},
- {0x38070000}, {0x38074000}, {0x38078000}, {0x3807c000},
- {0x38080000}, {0x38084000}, {0x38088000}, {0x3808c000},
- {0x38090000}, {0x38094000}, {0x38098000}, {0x3809c000},
- {0x380a0000}, {0x380a4000}, {0x380a8000}, {0x380ac000},
- {0x380b0000}, {0x380b4000}, {0x380b8000}, {0x380bc000},
- {0x380c0000}, {0x380c4000}, {0x380c8000}, {0x380cc000},
- {0x380d0000}, {0x380d4000}, {0x380d8000}, {0x380dc000},
- {0x380e0000}, {0x380e4000}, {0x380e8000}, {0x380ec000},
- {0x380f0000}, {0x380f4000}, {0x380f8000}, {0x380fc000},
- {0x38100000}, {0x38104000}, {0x38108000}, {0x3810c000},
- {0x38110000}, {0x38114000}, {0x38118000}, {0x3811c000},
- {0x38120000}, {0x38124000}, {0x38128000}, {0x3812c000},
- {0x38130000}, {0x38134000}, {0x38138000}, {0x3813c000},
- {0x38140000}, {0x38144000}, {0x38148000}, {0x3814c000},
- {0x38150000}, {0x38154000}, {0x38158000}, {0x3815c000},
- {0x38160000}, {0x38164000}, {0x38168000}, {0x3816c000},
- {0x38170000}, {0x38174000}, {0x38178000}, {0x3817c000},
- {0x38180000}, {0x38184000}, {0x38188000}, {0x3818c000},
- {0x38190000}, {0x38194000}, {0x38198000}, {0x3819c000},
- {0x381a0000}, {0x381a4000}, {0x381a8000}, {0x381ac000},
- {0x381b0000}, {0x381b4000}, {0x381b8000}, {0x381bc000},
- {0x381c0000}, {0x381c4000}, {0x381c8000}, {0x381cc000},
- {0x381d0000}, {0x381d4000}, {0x381d8000}, {0x381dc000},
- {0x381e0000}, {0x381e4000}, {0x381e8000}, {0x381ec000},
- {0x381f0000}, {0x381f4000}, {0x381f8000}, {0x381fc000},
- {0x38200000}, {0x38204000}, {0x38208000}, {0x3820c000},
- {0x38210000}, {0x38214000}, {0x38218000}, {0x3821c000},
- {0x38220000}, {0x38224000}, {0x38228000}, {0x3822c000},
- {0x38230000}, {0x38234000}, {0x38238000}, {0x3823c000},
- {0x38240000}, {0x38244000}, {0x38248000}, {0x3824c000},
- {0x38250000}, {0x38254000}, {0x38258000}, {0x3825c000},
- {0x38260000}, {0x38264000}, {0x38268000}, {0x3826c000},
- {0x38270000}, {0x38274000}, {0x38278000}, {0x3827c000},
- {0x38280000}, {0x38284000}, {0x38288000}, {0x3828c000},
- {0x38290000}, {0x38294000}, {0x38298000}, {0x3829c000},
- {0x382a0000}, {0x382a4000}, {0x382a8000}, {0x382ac000},
- {0x382b0000}, {0x382b4000}, {0x382b8000}, {0x382bc000},
- {0x382c0000}, {0x382c4000}, {0x382c8000}, {0x382cc000},
- {0x382d0000}, {0x382d4000}, {0x382d8000}, {0x382dc000},
- {0x382e0000}, {0x382e4000}, {0x382e8000}, {0x382ec000},
- {0x382f0000}, {0x382f4000}, {0x382f8000}, {0x382fc000},
- {0x38300000}, {0x38304000}, {0x38308000}, {0x3830c000},
- {0x38310000}, {0x38314000}, {0x38318000}, {0x3831c000},
- {0x38320000}, {0x38324000}, {0x38328000}, {0x3832c000},
- {0x38330000}, {0x38334000}, {0x38338000}, {0x3833c000},
- {0x38340000}, {0x38344000}, {0x38348000}, {0x3834c000},
- {0x38350000}, {0x38354000}, {0x38358000}, {0x3835c000},
- {0x38360000}, {0x38364000}, {0x38368000}, {0x3836c000},
- {0x38370000}, {0x38374000}, {0x38378000}, {0x3837c000},
- {0x38380000}, {0x38384000}, {0x38388000}, {0x3838c000},
- {0x38390000}, {0x38394000}, {0x38398000}, {0x3839c000},
- {0x383a0000}, {0x383a4000}, {0x383a8000}, {0x383ac000},
- {0x383b0000}, {0x383b4000}, {0x383b8000}, {0x383bc000},
- {0x383c0000}, {0x383c4000}, {0x383c8000}, {0x383cc000},
- {0x383d0000}, {0x383d4000}, {0x383d8000}, {0x383dc000},
- {0x383e0000}, {0x383e4000}, {0x383e8000}, {0x383ec000},
- {0x383f0000}, {0x383f4000}, {0x383f8000}, {0x383fc000},
- {0x38400000}, {0x38404000}, {0x38408000}, {0x3840c000},
- {0x38410000}, {0x38414000}, {0x38418000}, {0x3841c000},
- {0x38420000}, {0x38424000}, {0x38428000}, {0x3842c000},
- {0x38430000}, {0x38434000}, {0x38438000}, {0x3843c000},
- {0x38440000}, {0x38444000}, {0x38448000}, {0x3844c000},
- {0x38450000}, {0x38454000}, {0x38458000}, {0x3845c000},
- {0x38460000}, {0x38464000}, {0x38468000}, {0x3846c000},
- {0x38470000}, {0x38474000}, {0x38478000}, {0x3847c000},
- {0x38480000}, {0x38484000}, {0x38488000}, {0x3848c000},
- {0x38490000}, {0x38494000}, {0x38498000}, {0x3849c000},
- {0x384a0000}, {0x384a4000}, {0x384a8000}, {0x384ac000},
- {0x384b0000}, {0x384b4000}, {0x384b8000}, {0x384bc000},
- {0x384c0000}, {0x384c4000}, {0x384c8000}, {0x384cc000},
- {0x384d0000}, {0x384d4000}, {0x384d8000}, {0x384dc000},
- {0x384e0000}, {0x384e4000}, {0x384e8000}, {0x384ec000},
- {0x384f0000}, {0x384f4000}, {0x384f8000}, {0x384fc000},
- {0x38500000}, {0x38504000}, {0x38508000}, {0x3850c000},
- {0x38510000}, {0x38514000}, {0x38518000}, {0x3851c000},
- {0x38520000}, {0x38524000}, {0x38528000}, {0x3852c000},
- {0x38530000}, {0x38534000}, {0x38538000}, {0x3853c000},
- {0x38540000}, {0x38544000}, {0x38548000}, {0x3854c000},
- {0x38550000}, {0x38554000}, {0x38558000}, {0x3855c000},
- {0x38560000}, {0x38564000}, {0x38568000}, {0x3856c000},
- {0x38570000}, {0x38574000}, {0x38578000}, {0x3857c000},
- {0x38580000}, {0x38584000}, {0x38588000}, {0x3858c000},
- {0x38590000}, {0x38594000}, {0x38598000}, {0x3859c000},
- {0x385a0000}, {0x385a4000}, {0x385a8000}, {0x385ac000},
- {0x385b0000}, {0x385b4000}, {0x385b8000}, {0x385bc000},
- {0x385c0000}, {0x385c4000}, {0x385c8000}, {0x385cc000},
- {0x385d0000}, {0x385d4000}, {0x385d8000}, {0x385dc000},
- {0x385e0000}, {0x385e4000}, {0x385e8000}, {0x385ec000},
- {0x385f0000}, {0x385f4000}, {0x385f8000}, {0x385fc000},
- {0x38600000}, {0x38604000}, {0x38608000}, {0x3860c000},
- {0x38610000}, {0x38614000}, {0x38618000}, {0x3861c000},
- {0x38620000}, {0x38624000}, {0x38628000}, {0x3862c000},
- {0x38630000}, {0x38634000}, {0x38638000}, {0x3863c000},
- {0x38640000}, {0x38644000}, {0x38648000}, {0x3864c000},
- {0x38650000}, {0x38654000}, {0x38658000}, {0x3865c000},
- {0x38660000}, {0x38664000}, {0x38668000}, {0x3866c000},
- {0x38670000}, {0x38674000}, {0x38678000}, {0x3867c000},
- {0x38680000}, {0x38684000}, {0x38688000}, {0x3868c000},
- {0x38690000}, {0x38694000}, {0x38698000}, {0x3869c000},
- {0x386a0000}, {0x386a4000}, {0x386a8000}, {0x386ac000},
- {0x386b0000}, {0x386b4000}, {0x386b8000}, {0x386bc000},
- {0x386c0000}, {0x386c4000}, {0x386c8000}, {0x386cc000},
- {0x386d0000}, {0x386d4000}, {0x386d8000}, {0x386dc000},
- {0x386e0000}, {0x386e4000}, {0x386e8000}, {0x386ec000},
- {0x386f0000}, {0x386f4000}, {0x386f8000}, {0x386fc000},
- {0x38700000}, {0x38704000}, {0x38708000}, {0x3870c000},
- {0x38710000}, {0x38714000}, {0x38718000}, {0x3871c000},
- {0x38720000}, {0x38724000}, {0x38728000}, {0x3872c000},
- {0x38730000}, {0x38734000}, {0x38738000}, {0x3873c000},
- {0x38740000}, {0x38744000}, {0x38748000}, {0x3874c000},
- {0x38750000}, {0x38754000}, {0x38758000}, {0x3875c000},
- {0x38760000}, {0x38764000}, {0x38768000}, {0x3876c000},
- {0x38770000}, {0x38774000}, {0x38778000}, {0x3877c000},
- {0x38780000}, {0x38784000}, {0x38788000}, {0x3878c000},
- {0x38790000}, {0x38794000}, {0x38798000}, {0x3879c000},
- {0x387a0000}, {0x387a4000}, {0x387a8000}, {0x387ac000},
- {0x387b0000}, {0x387b4000}, {0x387b8000}, {0x387bc000},
- {0x387c0000}, {0x387c4000}, {0x387c8000}, {0x387cc000},
- {0x387d0000}, {0x387d4000}, {0x387d8000}, {0x387dc000},
- {0x387e0000}, {0x387e4000}, {0x387e8000}, {0x387ec000},
- {0x387f0000}, {0x387f4000}, {0x387f8000}, {0x387fc000},
- {0x38800000}, {0x38802000}, {0x38804000}, {0x38806000},
- {0x38808000}, {0x3880a000}, {0x3880c000}, {0x3880e000},
- {0x38810000}, {0x38812000}, {0x38814000}, {0x38816000},
- {0x38818000}, {0x3881a000}, {0x3881c000}, {0x3881e000},
- {0x38820000}, {0x38822000}, {0x38824000}, {0x38826000},
- {0x38828000}, {0x3882a000}, {0x3882c000}, {0x3882e000},
- {0x38830000}, {0x38832000}, {0x38834000}, {0x38836000},
- {0x38838000}, {0x3883a000}, {0x3883c000}, {0x3883e000},
- {0x38840000}, {0x38842000}, {0x38844000}, {0x38846000},
- {0x38848000}, {0x3884a000}, {0x3884c000}, {0x3884e000},
- {0x38850000}, {0x38852000}, {0x38854000}, {0x38856000},
- {0x38858000}, {0x3885a000}, {0x3885c000}, {0x3885e000},
- {0x38860000}, {0x38862000}, {0x38864000}, {0x38866000},
- {0x38868000}, {0x3886a000}, {0x3886c000}, {0x3886e000},
- {0x38870000}, {0x38872000}, {0x38874000}, {0x38876000},
- {0x38878000}, {0x3887a000}, {0x3887c000}, {0x3887e000},
- {0x38880000}, {0x38882000}, {0x38884000}, {0x38886000},
- {0x38888000}, {0x3888a000}, {0x3888c000}, {0x3888e000},
- {0x38890000}, {0x38892000}, {0x38894000}, {0x38896000},
- {0x38898000}, {0x3889a000}, {0x3889c000}, {0x3889e000},
- {0x388a0000}, {0x388a2000}, {0x388a4000}, {0x388a6000},
- {0x388a8000}, {0x388aa000}, {0x388ac000}, {0x388ae000},
- {0x388b0000}, {0x388b2000}, {0x388b4000}, {0x388b6000},
- {0x388b8000}, {0x388ba000}, {0x388bc000}, {0x388be000},
- {0x388c0000}, {0x388c2000}, {0x388c4000}, {0x388c6000},
- {0x388c8000}, {0x388ca000}, {0x388cc000}, {0x388ce000},
- {0x388d0000}, {0x388d2000}, {0x388d4000}, {0x388d6000},
- {0x388d8000}, {0x388da000}, {0x388dc000}, {0x388de000},
- {0x388e0000}, {0x388e2000}, {0x388e4000}, {0x388e6000},
- {0x388e8000}, {0x388ea000}, {0x388ec000}, {0x388ee000},
- {0x388f0000}, {0x388f2000}, {0x388f4000}, {0x388f6000},
- {0x388f8000}, {0x388fa000}, {0x388fc000}, {0x388fe000},
- {0x38900000}, {0x38902000}, {0x38904000}, {0x38906000},
- {0x38908000}, {0x3890a000}, {0x3890c000}, {0x3890e000},
- {0x38910000}, {0x38912000}, {0x38914000}, {0x38916000},
- {0x38918000}, {0x3891a000}, {0x3891c000}, {0x3891e000},
- {0x38920000}, {0x38922000}, {0x38924000}, {0x38926000},
- {0x38928000}, {0x3892a000}, {0x3892c000}, {0x3892e000},
- {0x38930000}, {0x38932000}, {0x38934000}, {0x38936000},
- {0x38938000}, {0x3893a000}, {0x3893c000}, {0x3893e000},
- {0x38940000}, {0x38942000}, {0x38944000}, {0x38946000},
- {0x38948000}, {0x3894a000}, {0x3894c000}, {0x3894e000},
- {0x38950000}, {0x38952000}, {0x38954000}, {0x38956000},
- {0x38958000}, {0x3895a000}, {0x3895c000}, {0x3895e000},
- {0x38960000}, {0x38962000}, {0x38964000}, {0x38966000},
- {0x38968000}, {0x3896a000}, {0x3896c000}, {0x3896e000},
- {0x38970000}, {0x38972000}, {0x38974000}, {0x38976000},
- {0x38978000}, {0x3897a000}, {0x3897c000}, {0x3897e000},
- {0x38980000}, {0x38982000}, {0x38984000}, {0x38986000},
- {0x38988000}, {0x3898a000}, {0x3898c000}, {0x3898e000},
- {0x38990000}, {0x38992000}, {0x38994000}, {0x38996000},
- {0x38998000}, {0x3899a000}, {0x3899c000}, {0x3899e000},
- {0x389a0000}, {0x389a2000}, {0x389a4000}, {0x389a6000},
- {0x389a8000}, {0x389aa000}, {0x389ac000}, {0x389ae000},
- {0x389b0000}, {0x389b2000}, {0x389b4000}, {0x389b6000},
- {0x389b8000}, {0x389ba000}, {0x389bc000}, {0x389be000},
- {0x389c0000}, {0x389c2000}, {0x389c4000}, {0x389c6000},
- {0x389c8000}, {0x389ca000}, {0x389cc000}, {0x389ce000},
- {0x389d0000}, {0x389d2000}, {0x389d4000}, {0x389d6000},
- {0x389d8000}, {0x389da000}, {0x389dc000}, {0x389de000},
- {0x389e0000}, {0x389e2000}, {0x389e4000}, {0x389e6000},
- {0x389e8000}, {0x389ea000}, {0x389ec000}, {0x389ee000},
- {0x389f0000}, {0x389f2000}, {0x389f4000}, {0x389f6000},
- {0x389f8000}, {0x389fa000}, {0x389fc000}, {0x389fe000},
- {0x38a00000}, {0x38a02000}, {0x38a04000}, {0x38a06000},
- {0x38a08000}, {0x38a0a000}, {0x38a0c000}, {0x38a0e000},
- {0x38a10000}, {0x38a12000}, {0x38a14000}, {0x38a16000},
- {0x38a18000}, {0x38a1a000}, {0x38a1c000}, {0x38a1e000},
- {0x38a20000}, {0x38a22000}, {0x38a24000}, {0x38a26000},
- {0x38a28000}, {0x38a2a000}, {0x38a2c000}, {0x38a2e000},
- {0x38a30000}, {0x38a32000}, {0x38a34000}, {0x38a36000},
- {0x38a38000}, {0x38a3a000}, {0x38a3c000}, {0x38a3e000},
- {0x38a40000}, {0x38a42000}, {0x38a44000}, {0x38a46000},
- {0x38a48000}, {0x38a4a000}, {0x38a4c000}, {0x38a4e000},
- {0x38a50000}, {0x38a52000}, {0x38a54000}, {0x38a56000},
- {0x38a58000}, {0x38a5a000}, {0x38a5c000}, {0x38a5e000},
- {0x38a60000}, {0x38a62000}, {0x38a64000}, {0x38a66000},
- {0x38a68000}, {0x38a6a000}, {0x38a6c000}, {0x38a6e000},
- {0x38a70000}, {0x38a72000}, {0x38a74000}, {0x38a76000},
- {0x38a78000}, {0x38a7a000}, {0x38a7c000}, {0x38a7e000},
- {0x38a80000}, {0x38a82000}, {0x38a84000}, {0x38a86000},
- {0x38a88000}, {0x38a8a000}, {0x38a8c000}, {0x38a8e000},
- {0x38a90000}, {0x38a92000}, {0x38a94000}, {0x38a96000},
- {0x38a98000}, {0x38a9a000}, {0x38a9c000}, {0x38a9e000},
- {0x38aa0000}, {0x38aa2000}, {0x38aa4000}, {0x38aa6000},
- {0x38aa8000}, {0x38aaa000}, {0x38aac000}, {0x38aae000},
- {0x38ab0000}, {0x38ab2000}, {0x38ab4000}, {0x38ab6000},
- {0x38ab8000}, {0x38aba000}, {0x38abc000}, {0x38abe000},
- {0x38ac0000}, {0x38ac2000}, {0x38ac4000}, {0x38ac6000},
- {0x38ac8000}, {0x38aca000}, {0x38acc000}, {0x38ace000},
- {0x38ad0000}, {0x38ad2000}, {0x38ad4000}, {0x38ad6000},
- {0x38ad8000}, {0x38ada000}, {0x38adc000}, {0x38ade000},
- {0x38ae0000}, {0x38ae2000}, {0x38ae4000}, {0x38ae6000},
- {0x38ae8000}, {0x38aea000}, {0x38aec000}, {0x38aee000},
- {0x38af0000}, {0x38af2000}, {0x38af4000}, {0x38af6000},
- {0x38af8000}, {0x38afa000}, {0x38afc000}, {0x38afe000},
- {0x38b00000}, {0x38b02000}, {0x38b04000}, {0x38b06000},
- {0x38b08000}, {0x38b0a000}, {0x38b0c000}, {0x38b0e000},
- {0x38b10000}, {0x38b12000}, {0x38b14000}, {0x38b16000},
- {0x38b18000}, {0x38b1a000}, {0x38b1c000}, {0x38b1e000},
- {0x38b20000}, {0x38b22000}, {0x38b24000}, {0x38b26000},
- {0x38b28000}, {0x38b2a000}, {0x38b2c000}, {0x38b2e000},
- {0x38b30000}, {0x38b32000}, {0x38b34000}, {0x38b36000},
- {0x38b38000}, {0x38b3a000}, {0x38b3c000}, {0x38b3e000},
- {0x38b40000}, {0x38b42000}, {0x38b44000}, {0x38b46000},
- {0x38b48000}, {0x38b4a000}, {0x38b4c000}, {0x38b4e000},
- {0x38b50000}, {0x38b52000}, {0x38b54000}, {0x38b56000},
- {0x38b58000}, {0x38b5a000}, {0x38b5c000}, {0x38b5e000},
- {0x38b60000}, {0x38b62000}, {0x38b64000}, {0x38b66000},
- {0x38b68000}, {0x38b6a000}, {0x38b6c000}, {0x38b6e000},
- {0x38b70000}, {0x38b72000}, {0x38b74000}, {0x38b76000},
- {0x38b78000}, {0x38b7a000}, {0x38b7c000}, {0x38b7e000},
- {0x38b80000}, {0x38b82000}, {0x38b84000}, {0x38b86000},
- {0x38b88000}, {0x38b8a000}, {0x38b8c000}, {0x38b8e000},
- {0x38b90000}, {0x38b92000}, {0x38b94000}, {0x38b96000},
- {0x38b98000}, {0x38b9a000}, {0x38b9c000}, {0x38b9e000},
- {0x38ba0000}, {0x38ba2000}, {0x38ba4000}, {0x38ba6000},
- {0x38ba8000}, {0x38baa000}, {0x38bac000}, {0x38bae000},
- {0x38bb0000}, {0x38bb2000}, {0x38bb4000}, {0x38bb6000},
- {0x38bb8000}, {0x38bba000}, {0x38bbc000}, {0x38bbe000},
- {0x38bc0000}, {0x38bc2000}, {0x38bc4000}, {0x38bc6000},
- {0x38bc8000}, {0x38bca000}, {0x38bcc000}, {0x38bce000},
- {0x38bd0000}, {0x38bd2000}, {0x38bd4000}, {0x38bd6000},
- {0x38bd8000}, {0x38bda000}, {0x38bdc000}, {0x38bde000},
- {0x38be0000}, {0x38be2000}, {0x38be4000}, {0x38be6000},
- {0x38be8000}, {0x38bea000}, {0x38bec000}, {0x38bee000},
- {0x38bf0000}, {0x38bf2000}, {0x38bf4000}, {0x38bf6000},
- {0x38bf8000}, {0x38bfa000}, {0x38bfc000}, {0x38bfe000},
- {0x38c00000}, {0x38c02000}, {0x38c04000}, {0x38c06000},
- {0x38c08000}, {0x38c0a000}, {0x38c0c000}, {0x38c0e000},
- {0x38c10000}, {0x38c12000}, {0x38c14000}, {0x38c16000},
- {0x38c18000}, {0x38c1a000}, {0x38c1c000}, {0x38c1e000},
- {0x38c20000}, {0x38c22000}, {0x38c24000}, {0x38c26000},
- {0x38c28000}, {0x38c2a000}, {0x38c2c000}, {0x38c2e000},
- {0x38c30000}, {0x38c32000}, {0x38c34000}, {0x38c36000},
- {0x38c38000}, {0x38c3a000}, {0x38c3c000}, {0x38c3e000},
- {0x38c40000}, {0x38c42000}, {0x38c44000}, {0x38c46000},
- {0x38c48000}, {0x38c4a000}, {0x38c4c000}, {0x38c4e000},
- {0x38c50000}, {0x38c52000}, {0x38c54000}, {0x38c56000},
- {0x38c58000}, {0x38c5a000}, {0x38c5c000}, {0x38c5e000},
- {0x38c60000}, {0x38c62000}, {0x38c64000}, {0x38c66000},
- {0x38c68000}, {0x38c6a000}, {0x38c6c000}, {0x38c6e000},
- {0x38c70000}, {0x38c72000}, {0x38c74000}, {0x38c76000},
- {0x38c78000}, {0x38c7a000}, {0x38c7c000}, {0x38c7e000},
- {0x38c80000}, {0x38c82000}, {0x38c84000}, {0x38c86000},
- {0x38c88000}, {0x38c8a000}, {0x38c8c000}, {0x38c8e000},
- {0x38c90000}, {0x38c92000}, {0x38c94000}, {0x38c96000},
- {0x38c98000}, {0x38c9a000}, {0x38c9c000}, {0x38c9e000},
- {0x38ca0000}, {0x38ca2000}, {0x38ca4000}, {0x38ca6000},
- {0x38ca8000}, {0x38caa000}, {0x38cac000}, {0x38cae000},
- {0x38cb0000}, {0x38cb2000}, {0x38cb4000}, {0x38cb6000},
- {0x38cb8000}, {0x38cba000}, {0x38cbc000}, {0x38cbe000},
- {0x38cc0000}, {0x38cc2000}, {0x38cc4000}, {0x38cc6000},
- {0x38cc8000}, {0x38cca000}, {0x38ccc000}, {0x38cce000},
- {0x38cd0000}, {0x38cd2000}, {0x38cd4000}, {0x38cd6000},
- {0x38cd8000}, {0x38cda000}, {0x38cdc000}, {0x38cde000},
- {0x38ce0000}, {0x38ce2000}, {0x38ce4000}, {0x38ce6000},
- {0x38ce8000}, {0x38cea000}, {0x38cec000}, {0x38cee000},
- {0x38cf0000}, {0x38cf2000}, {0x38cf4000}, {0x38cf6000},
- {0x38cf8000}, {0x38cfa000}, {0x38cfc000}, {0x38cfe000},
- {0x38d00000}, {0x38d02000}, {0x38d04000}, {0x38d06000},
- {0x38d08000}, {0x38d0a000}, {0x38d0c000}, {0x38d0e000},
- {0x38d10000}, {0x38d12000}, {0x38d14000}, {0x38d16000},
- {0x38d18000}, {0x38d1a000}, {0x38d1c000}, {0x38d1e000},
- {0x38d20000}, {0x38d22000}, {0x38d24000}, {0x38d26000},
- {0x38d28000}, {0x38d2a000}, {0x38d2c000}, {0x38d2e000},
- {0x38d30000}, {0x38d32000}, {0x38d34000}, {0x38d36000},
- {0x38d38000}, {0x38d3a000}, {0x38d3c000}, {0x38d3e000},
- {0x38d40000}, {0x38d42000}, {0x38d44000}, {0x38d46000},
- {0x38d48000}, {0x38d4a000}, {0x38d4c000}, {0x38d4e000},
- {0x38d50000}, {0x38d52000}, {0x38d54000}, {0x38d56000},
- {0x38d58000}, {0x38d5a000}, {0x38d5c000}, {0x38d5e000},
- {0x38d60000}, {0x38d62000}, {0x38d64000}, {0x38d66000},
- {0x38d68000}, {0x38d6a000}, {0x38d6c000}, {0x38d6e000},
- {0x38d70000}, {0x38d72000}, {0x38d74000}, {0x38d76000},
- {0x38d78000}, {0x38d7a000}, {0x38d7c000}, {0x38d7e000},
- {0x38d80000}, {0x38d82000}, {0x38d84000}, {0x38d86000},
- {0x38d88000}, {0x38d8a000}, {0x38d8c000}, {0x38d8e000},
- {0x38d90000}, {0x38d92000}, {0x38d94000}, {0x38d96000},
- {0x38d98000}, {0x38d9a000}, {0x38d9c000}, {0x38d9e000},
- {0x38da0000}, {0x38da2000}, {0x38da4000}, {0x38da6000},
- {0x38da8000}, {0x38daa000}, {0x38dac000}, {0x38dae000},
- {0x38db0000}, {0x38db2000}, {0x38db4000}, {0x38db6000},
- {0x38db8000}, {0x38dba000}, {0x38dbc000}, {0x38dbe000},
- {0x38dc0000}, {0x38dc2000}, {0x38dc4000}, {0x38dc6000},
- {0x38dc8000}, {0x38dca000}, {0x38dcc000}, {0x38dce000},
- {0x38dd0000}, {0x38dd2000}, {0x38dd4000}, {0x38dd6000},
- {0x38dd8000}, {0x38dda000}, {0x38ddc000}, {0x38dde000},
- {0x38de0000}, {0x38de2000}, {0x38de4000}, {0x38de6000},
- {0x38de8000}, {0x38dea000}, {0x38dec000}, {0x38dee000},
- {0x38df0000}, {0x38df2000}, {0x38df4000}, {0x38df6000},
- {0x38df8000}, {0x38dfa000}, {0x38dfc000}, {0x38dfe000},
- {0x38e00000}, {0x38e02000}, {0x38e04000}, {0x38e06000},
- {0x38e08000}, {0x38e0a000}, {0x38e0c000}, {0x38e0e000},
- {0x38e10000}, {0x38e12000}, {0x38e14000}, {0x38e16000},
- {0x38e18000}, {0x38e1a000}, {0x38e1c000}, {0x38e1e000},
- {0x38e20000}, {0x38e22000}, {0x38e24000}, {0x38e26000},
- {0x38e28000}, {0x38e2a000}, {0x38e2c000}, {0x38e2e000},
- {0x38e30000}, {0x38e32000}, {0x38e34000}, {0x38e36000},
- {0x38e38000}, {0x38e3a000}, {0x38e3c000}, {0x38e3e000},
- {0x38e40000}, {0x38e42000}, {0x38e44000}, {0x38e46000},
- {0x38e48000}, {0x38e4a000}, {0x38e4c000}, {0x38e4e000},
- {0x38e50000}, {0x38e52000}, {0x38e54000}, {0x38e56000},
- {0x38e58000}, {0x38e5a000}, {0x38e5c000}, {0x38e5e000},
- {0x38e60000}, {0x38e62000}, {0x38e64000}, {0x38e66000},
- {0x38e68000}, {0x38e6a000}, {0x38e6c000}, {0x38e6e000},
- {0x38e70000}, {0x38e72000}, {0x38e74000}, {0x38e76000},
- {0x38e78000}, {0x38e7a000}, {0x38e7c000}, {0x38e7e000},
- {0x38e80000}, {0x38e82000}, {0x38e84000}, {0x38e86000},
- {0x38e88000}, {0x38e8a000}, {0x38e8c000}, {0x38e8e000},
- {0x38e90000}, {0x38e92000}, {0x38e94000}, {0x38e96000},
- {0x38e98000}, {0x38e9a000}, {0x38e9c000}, {0x38e9e000},
- {0x38ea0000}, {0x38ea2000}, {0x38ea4000}, {0x38ea6000},
- {0x38ea8000}, {0x38eaa000}, {0x38eac000}, {0x38eae000},
- {0x38eb0000}, {0x38eb2000}, {0x38eb4000}, {0x38eb6000},
- {0x38eb8000}, {0x38eba000}, {0x38ebc000}, {0x38ebe000},
- {0x38ec0000}, {0x38ec2000}, {0x38ec4000}, {0x38ec6000},
- {0x38ec8000}, {0x38eca000}, {0x38ecc000}, {0x38ece000},
- {0x38ed0000}, {0x38ed2000}, {0x38ed4000}, {0x38ed6000},
- {0x38ed8000}, {0x38eda000}, {0x38edc000}, {0x38ede000},
- {0x38ee0000}, {0x38ee2000}, {0x38ee4000}, {0x38ee6000},
- {0x38ee8000}, {0x38eea000}, {0x38eec000}, {0x38eee000},
- {0x38ef0000}, {0x38ef2000}, {0x38ef4000}, {0x38ef6000},
- {0x38ef8000}, {0x38efa000}, {0x38efc000}, {0x38efe000},
- {0x38f00000}, {0x38f02000}, {0x38f04000}, {0x38f06000},
- {0x38f08000}, {0x38f0a000}, {0x38f0c000}, {0x38f0e000},
- {0x38f10000}, {0x38f12000}, {0x38f14000}, {0x38f16000},
- {0x38f18000}, {0x38f1a000}, {0x38f1c000}, {0x38f1e000},
- {0x38f20000}, {0x38f22000}, {0x38f24000}, {0x38f26000},
- {0x38f28000}, {0x38f2a000}, {0x38f2c000}, {0x38f2e000},
- {0x38f30000}, {0x38f32000}, {0x38f34000}, {0x38f36000},
- {0x38f38000}, {0x38f3a000}, {0x38f3c000}, {0x38f3e000},
- {0x38f40000}, {0x38f42000}, {0x38f44000}, {0x38f46000},
- {0x38f48000}, {0x38f4a000}, {0x38f4c000}, {0x38f4e000},
- {0x38f50000}, {0x38f52000}, {0x38f54000}, {0x38f56000},
- {0x38f58000}, {0x38f5a000}, {0x38f5c000}, {0x38f5e000},
- {0x38f60000}, {0x38f62000}, {0x38f64000}, {0x38f66000},
- {0x38f68000}, {0x38f6a000}, {0x38f6c000}, {0x38f6e000},
- {0x38f70000}, {0x38f72000}, {0x38f74000}, {0x38f76000},
- {0x38f78000}, {0x38f7a000}, {0x38f7c000}, {0x38f7e000},
- {0x38f80000}, {0x38f82000}, {0x38f84000}, {0x38f86000},
- {0x38f88000}, {0x38f8a000}, {0x38f8c000}, {0x38f8e000},
- {0x38f90000}, {0x38f92000}, {0x38f94000}, {0x38f96000},
- {0x38f98000}, {0x38f9a000}, {0x38f9c000}, {0x38f9e000},
- {0x38fa0000}, {0x38fa2000}, {0x38fa4000}, {0x38fa6000},
- {0x38fa8000}, {0x38faa000}, {0x38fac000}, {0x38fae000},
- {0x38fb0000}, {0x38fb2000}, {0x38fb4000}, {0x38fb6000},
- {0x38fb8000}, {0x38fba000}, {0x38fbc000}, {0x38fbe000},
- {0x38fc0000}, {0x38fc2000}, {0x38fc4000}, {0x38fc6000},
- {0x38fc8000}, {0x38fca000}, {0x38fcc000}, {0x38fce000},
- {0x38fd0000}, {0x38fd2000}, {0x38fd4000}, {0x38fd6000},
- {0x38fd8000}, {0x38fda000}, {0x38fdc000}, {0x38fde000},
- {0x38fe0000}, {0x38fe2000}, {0x38fe4000}, {0x38fe6000},
- {0x38fe8000}, {0x38fea000}, {0x38fec000}, {0x38fee000},
- {0x38ff0000}, {0x38ff2000}, {0x38ff4000}, {0x38ff6000},
- {0x38ff8000}, {0x38ffa000}, {0x38ffc000}, {0x38ffe000},
- {0x39000000}, {0x39002000}, {0x39004000}, {0x39006000},
- {0x39008000}, {0x3900a000}, {0x3900c000}, {0x3900e000},
- {0x39010000}, {0x39012000}, {0x39014000}, {0x39016000},
- {0x39018000}, {0x3901a000}, {0x3901c000}, {0x3901e000},
- {0x39020000}, {0x39022000}, {0x39024000}, {0x39026000},
- {0x39028000}, {0x3902a000}, {0x3902c000}, {0x3902e000},
- {0x39030000}, {0x39032000}, {0x39034000}, {0x39036000},
- {0x39038000}, {0x3903a000}, {0x3903c000}, {0x3903e000},
- {0x39040000}, {0x39042000}, {0x39044000}, {0x39046000},
- {0x39048000}, {0x3904a000}, {0x3904c000}, {0x3904e000},
- {0x39050000}, {0x39052000}, {0x39054000}, {0x39056000},
- {0x39058000}, {0x3905a000}, {0x3905c000}, {0x3905e000},
- {0x39060000}, {0x39062000}, {0x39064000}, {0x39066000},
- {0x39068000}, {0x3906a000}, {0x3906c000}, {0x3906e000},
- {0x39070000}, {0x39072000}, {0x39074000}, {0x39076000},
- {0x39078000}, {0x3907a000}, {0x3907c000}, {0x3907e000},
- {0x39080000}, {0x39082000}, {0x39084000}, {0x39086000},
- {0x39088000}, {0x3908a000}, {0x3908c000}, {0x3908e000},
- {0x39090000}, {0x39092000}, {0x39094000}, {0x39096000},
- {0x39098000}, {0x3909a000}, {0x3909c000}, {0x3909e000},
- {0x390a0000}, {0x390a2000}, {0x390a4000}, {0x390a6000},
- {0x390a8000}, {0x390aa000}, {0x390ac000}, {0x390ae000},
- {0x390b0000}, {0x390b2000}, {0x390b4000}, {0x390b6000},
- {0x390b8000}, {0x390ba000}, {0x390bc000}, {0x390be000},
- {0x390c0000}, {0x390c2000}, {0x390c4000}, {0x390c6000},
- {0x390c8000}, {0x390ca000}, {0x390cc000}, {0x390ce000},
- {0x390d0000}, {0x390d2000}, {0x390d4000}, {0x390d6000},
- {0x390d8000}, {0x390da000}, {0x390dc000}, {0x390de000},
- {0x390e0000}, {0x390e2000}, {0x390e4000}, {0x390e6000},
- {0x390e8000}, {0x390ea000}, {0x390ec000}, {0x390ee000},
- {0x390f0000}, {0x390f2000}, {0x390f4000}, {0x390f6000},
- {0x390f8000}, {0x390fa000}, {0x390fc000}, {0x390fe000},
- {0x39100000}, {0x39102000}, {0x39104000}, {0x39106000},
- {0x39108000}, {0x3910a000}, {0x3910c000}, {0x3910e000},
- {0x39110000}, {0x39112000}, {0x39114000}, {0x39116000},
- {0x39118000}, {0x3911a000}, {0x3911c000}, {0x3911e000},
- {0x39120000}, {0x39122000}, {0x39124000}, {0x39126000},
- {0x39128000}, {0x3912a000}, {0x3912c000}, {0x3912e000},
- {0x39130000}, {0x39132000}, {0x39134000}, {0x39136000},
- {0x39138000}, {0x3913a000}, {0x3913c000}, {0x3913e000},
- {0x39140000}, {0x39142000}, {0x39144000}, {0x39146000},
- {0x39148000}, {0x3914a000}, {0x3914c000}, {0x3914e000},
- {0x39150000}, {0x39152000}, {0x39154000}, {0x39156000},
- {0x39158000}, {0x3915a000}, {0x3915c000}, {0x3915e000},
- {0x39160000}, {0x39162000}, {0x39164000}, {0x39166000},
- {0x39168000}, {0x3916a000}, {0x3916c000}, {0x3916e000},
- {0x39170000}, {0x39172000}, {0x39174000}, {0x39176000},
- {0x39178000}, {0x3917a000}, {0x3917c000}, {0x3917e000},
- {0x39180000}, {0x39182000}, {0x39184000}, {0x39186000},
- {0x39188000}, {0x3918a000}, {0x3918c000}, {0x3918e000},
- {0x39190000}, {0x39192000}, {0x39194000}, {0x39196000},
- {0x39198000}, {0x3919a000}, {0x3919c000}, {0x3919e000},
- {0x391a0000}, {0x391a2000}, {0x391a4000}, {0x391a6000},
- {0x391a8000}, {0x391aa000}, {0x391ac000}, {0x391ae000},
- {0x391b0000}, {0x391b2000}, {0x391b4000}, {0x391b6000},
- {0x391b8000}, {0x391ba000}, {0x391bc000}, {0x391be000},
- {0x391c0000}, {0x391c2000}, {0x391c4000}, {0x391c6000},
- {0x391c8000}, {0x391ca000}, {0x391cc000}, {0x391ce000},
- {0x391d0000}, {0x391d2000}, {0x391d4000}, {0x391d6000},
- {0x391d8000}, {0x391da000}, {0x391dc000}, {0x391de000},
- {0x391e0000}, {0x391e2000}, {0x391e4000}, {0x391e6000},
- {0x391e8000}, {0x391ea000}, {0x391ec000}, {0x391ee000},
- {0x391f0000}, {0x391f2000}, {0x391f4000}, {0x391f6000},
- {0x391f8000}, {0x391fa000}, {0x391fc000}, {0x391fe000},
- {0x39200000}, {0x39202000}, {0x39204000}, {0x39206000},
- {0x39208000}, {0x3920a000}, {0x3920c000}, {0x3920e000},
- {0x39210000}, {0x39212000}, {0x39214000}, {0x39216000},
- {0x39218000}, {0x3921a000}, {0x3921c000}, {0x3921e000},
- {0x39220000}, {0x39222000}, {0x39224000}, {0x39226000},
- {0x39228000}, {0x3922a000}, {0x3922c000}, {0x3922e000},
- {0x39230000}, {0x39232000}, {0x39234000}, {0x39236000},
- {0x39238000}, {0x3923a000}, {0x3923c000}, {0x3923e000},
- {0x39240000}, {0x39242000}, {0x39244000}, {0x39246000},
- {0x39248000}, {0x3924a000}, {0x3924c000}, {0x3924e000},
- {0x39250000}, {0x39252000}, {0x39254000}, {0x39256000},
- {0x39258000}, {0x3925a000}, {0x3925c000}, {0x3925e000},
- {0x39260000}, {0x39262000}, {0x39264000}, {0x39266000},
- {0x39268000}, {0x3926a000}, {0x3926c000}, {0x3926e000},
- {0x39270000}, {0x39272000}, {0x39274000}, {0x39276000},
- {0x39278000}, {0x3927a000}, {0x3927c000}, {0x3927e000},
- {0x39280000}, {0x39282000}, {0x39284000}, {0x39286000},
- {0x39288000}, {0x3928a000}, {0x3928c000}, {0x3928e000},
- {0x39290000}, {0x39292000}, {0x39294000}, {0x39296000},
- {0x39298000}, {0x3929a000}, {0x3929c000}, {0x3929e000},
- {0x392a0000}, {0x392a2000}, {0x392a4000}, {0x392a6000},
- {0x392a8000}, {0x392aa000}, {0x392ac000}, {0x392ae000},
- {0x392b0000}, {0x392b2000}, {0x392b4000}, {0x392b6000},
- {0x392b8000}, {0x392ba000}, {0x392bc000}, {0x392be000},
- {0x392c0000}, {0x392c2000}, {0x392c4000}, {0x392c6000},
- {0x392c8000}, {0x392ca000}, {0x392cc000}, {0x392ce000},
- {0x392d0000}, {0x392d2000}, {0x392d4000}, {0x392d6000},
- {0x392d8000}, {0x392da000}, {0x392dc000}, {0x392de000},
- {0x392e0000}, {0x392e2000}, {0x392e4000}, {0x392e6000},
- {0x392e8000}, {0x392ea000}, {0x392ec000}, {0x392ee000},
- {0x392f0000}, {0x392f2000}, {0x392f4000}, {0x392f6000},
- {0x392f8000}, {0x392fa000}, {0x392fc000}, {0x392fe000},
- {0x39300000}, {0x39302000}, {0x39304000}, {0x39306000},
- {0x39308000}, {0x3930a000}, {0x3930c000}, {0x3930e000},
- {0x39310000}, {0x39312000}, {0x39314000}, {0x39316000},
- {0x39318000}, {0x3931a000}, {0x3931c000}, {0x3931e000},
- {0x39320000}, {0x39322000}, {0x39324000}, {0x39326000},
- {0x39328000}, {0x3932a000}, {0x3932c000}, {0x3932e000},
- {0x39330000}, {0x39332000}, {0x39334000}, {0x39336000},
- {0x39338000}, {0x3933a000}, {0x3933c000}, {0x3933e000},
- {0x39340000}, {0x39342000}, {0x39344000}, {0x39346000},
- {0x39348000}, {0x3934a000}, {0x3934c000}, {0x3934e000},
- {0x39350000}, {0x39352000}, {0x39354000}, {0x39356000},
- {0x39358000}, {0x3935a000}, {0x3935c000}, {0x3935e000},
- {0x39360000}, {0x39362000}, {0x39364000}, {0x39366000},
- {0x39368000}, {0x3936a000}, {0x3936c000}, {0x3936e000},
- {0x39370000}, {0x39372000}, {0x39374000}, {0x39376000},
- {0x39378000}, {0x3937a000}, {0x3937c000}, {0x3937e000},
- {0x39380000}, {0x39382000}, {0x39384000}, {0x39386000},
- {0x39388000}, {0x3938a000}, {0x3938c000}, {0x3938e000},
- {0x39390000}, {0x39392000}, {0x39394000}, {0x39396000},
- {0x39398000}, {0x3939a000}, {0x3939c000}, {0x3939e000},
- {0x393a0000}, {0x393a2000}, {0x393a4000}, {0x393a6000},
- {0x393a8000}, {0x393aa000}, {0x393ac000}, {0x393ae000},
- {0x393b0000}, {0x393b2000}, {0x393b4000}, {0x393b6000},
- {0x393b8000}, {0x393ba000}, {0x393bc000}, {0x393be000},
- {0x393c0000}, {0x393c2000}, {0x393c4000}, {0x393c6000},
- {0x393c8000}, {0x393ca000}, {0x393cc000}, {0x393ce000},
- {0x393d0000}, {0x393d2000}, {0x393d4000}, {0x393d6000},
- {0x393d8000}, {0x393da000}, {0x393dc000}, {0x393de000},
- {0x393e0000}, {0x393e2000}, {0x393e4000}, {0x393e6000},
- {0x393e8000}, {0x393ea000}, {0x393ec000}, {0x393ee000},
- {0x393f0000}, {0x393f2000}, {0x393f4000}, {0x393f6000},
- {0x393f8000}, {0x393fa000}, {0x393fc000}, {0x393fe000},
- {0x39400000}, {0x39402000}, {0x39404000}, {0x39406000},
- {0x39408000}, {0x3940a000}, {0x3940c000}, {0x3940e000},
- {0x39410000}, {0x39412000}, {0x39414000}, {0x39416000},
- {0x39418000}, {0x3941a000}, {0x3941c000}, {0x3941e000},
- {0x39420000}, {0x39422000}, {0x39424000}, {0x39426000},
- {0x39428000}, {0x3942a000}, {0x3942c000}, {0x3942e000},
- {0x39430000}, {0x39432000}, {0x39434000}, {0x39436000},
- {0x39438000}, {0x3943a000}, {0x3943c000}, {0x3943e000},
- {0x39440000}, {0x39442000}, {0x39444000}, {0x39446000},
- {0x39448000}, {0x3944a000}, {0x3944c000}, {0x3944e000},
- {0x39450000}, {0x39452000}, {0x39454000}, {0x39456000},
- {0x39458000}, {0x3945a000}, {0x3945c000}, {0x3945e000},
- {0x39460000}, {0x39462000}, {0x39464000}, {0x39466000},
- {0x39468000}, {0x3946a000}, {0x3946c000}, {0x3946e000},
- {0x39470000}, {0x39472000}, {0x39474000}, {0x39476000},
- {0x39478000}, {0x3947a000}, {0x3947c000}, {0x3947e000},
- {0x39480000}, {0x39482000}, {0x39484000}, {0x39486000},
- {0x39488000}, {0x3948a000}, {0x3948c000}, {0x3948e000},
- {0x39490000}, {0x39492000}, {0x39494000}, {0x39496000},
- {0x39498000}, {0x3949a000}, {0x3949c000}, {0x3949e000},
- {0x394a0000}, {0x394a2000}, {0x394a4000}, {0x394a6000},
- {0x394a8000}, {0x394aa000}, {0x394ac000}, {0x394ae000},
- {0x394b0000}, {0x394b2000}, {0x394b4000}, {0x394b6000},
- {0x394b8000}, {0x394ba000}, {0x394bc000}, {0x394be000},
- {0x394c0000}, {0x394c2000}, {0x394c4000}, {0x394c6000},
- {0x394c8000}, {0x394ca000}, {0x394cc000}, {0x394ce000},
- {0x394d0000}, {0x394d2000}, {0x394d4000}, {0x394d6000},
- {0x394d8000}, {0x394da000}, {0x394dc000}, {0x394de000},
- {0x394e0000}, {0x394e2000}, {0x394e4000}, {0x394e6000},
- {0x394e8000}, {0x394ea000}, {0x394ec000}, {0x394ee000},
- {0x394f0000}, {0x394f2000}, {0x394f4000}, {0x394f6000},
- {0x394f8000}, {0x394fa000}, {0x394fc000}, {0x394fe000},
- {0x39500000}, {0x39502000}, {0x39504000}, {0x39506000},
- {0x39508000}, {0x3950a000}, {0x3950c000}, {0x3950e000},
- {0x39510000}, {0x39512000}, {0x39514000}, {0x39516000},
- {0x39518000}, {0x3951a000}, {0x3951c000}, {0x3951e000},
- {0x39520000}, {0x39522000}, {0x39524000}, {0x39526000},
- {0x39528000}, {0x3952a000}, {0x3952c000}, {0x3952e000},
- {0x39530000}, {0x39532000}, {0x39534000}, {0x39536000},
- {0x39538000}, {0x3953a000}, {0x3953c000}, {0x3953e000},
- {0x39540000}, {0x39542000}, {0x39544000}, {0x39546000},
- {0x39548000}, {0x3954a000}, {0x3954c000}, {0x3954e000},
- {0x39550000}, {0x39552000}, {0x39554000}, {0x39556000},
- {0x39558000}, {0x3955a000}, {0x3955c000}, {0x3955e000},
- {0x39560000}, {0x39562000}, {0x39564000}, {0x39566000},
- {0x39568000}, {0x3956a000}, {0x3956c000}, {0x3956e000},
- {0x39570000}, {0x39572000}, {0x39574000}, {0x39576000},
- {0x39578000}, {0x3957a000}, {0x3957c000}, {0x3957e000},
- {0x39580000}, {0x39582000}, {0x39584000}, {0x39586000},
- {0x39588000}, {0x3958a000}, {0x3958c000}, {0x3958e000},
- {0x39590000}, {0x39592000}, {0x39594000}, {0x39596000},
- {0x39598000}, {0x3959a000}, {0x3959c000}, {0x3959e000},
- {0x395a0000}, {0x395a2000}, {0x395a4000}, {0x395a6000},
- {0x395a8000}, {0x395aa000}, {0x395ac000}, {0x395ae000},
- {0x395b0000}, {0x395b2000}, {0x395b4000}, {0x395b6000},
- {0x395b8000}, {0x395ba000}, {0x395bc000}, {0x395be000},
- {0x395c0000}, {0x395c2000}, {0x395c4000}, {0x395c6000},
- {0x395c8000}, {0x395ca000}, {0x395cc000}, {0x395ce000},
- {0x395d0000}, {0x395d2000}, {0x395d4000}, {0x395d6000},
- {0x395d8000}, {0x395da000}, {0x395dc000}, {0x395de000},
- {0x395e0000}, {0x395e2000}, {0x395e4000}, {0x395e6000},
- {0x395e8000}, {0x395ea000}, {0x395ec000}, {0x395ee000},
- {0x395f0000}, {0x395f2000}, {0x395f4000}, {0x395f6000},
- {0x395f8000}, {0x395fa000}, {0x395fc000}, {0x395fe000},
- {0x39600000}, {0x39602000}, {0x39604000}, {0x39606000},
- {0x39608000}, {0x3960a000}, {0x3960c000}, {0x3960e000},
- {0x39610000}, {0x39612000}, {0x39614000}, {0x39616000},
- {0x39618000}, {0x3961a000}, {0x3961c000}, {0x3961e000},
- {0x39620000}, {0x39622000}, {0x39624000}, {0x39626000},
- {0x39628000}, {0x3962a000}, {0x3962c000}, {0x3962e000},
- {0x39630000}, {0x39632000}, {0x39634000}, {0x39636000},
- {0x39638000}, {0x3963a000}, {0x3963c000}, {0x3963e000},
- {0x39640000}, {0x39642000}, {0x39644000}, {0x39646000},
- {0x39648000}, {0x3964a000}, {0x3964c000}, {0x3964e000},
- {0x39650000}, {0x39652000}, {0x39654000}, {0x39656000},
- {0x39658000}, {0x3965a000}, {0x3965c000}, {0x3965e000},
- {0x39660000}, {0x39662000}, {0x39664000}, {0x39666000},
- {0x39668000}, {0x3966a000}, {0x3966c000}, {0x3966e000},
- {0x39670000}, {0x39672000}, {0x39674000}, {0x39676000},
- {0x39678000}, {0x3967a000}, {0x3967c000}, {0x3967e000},
- {0x39680000}, {0x39682000}, {0x39684000}, {0x39686000},
- {0x39688000}, {0x3968a000}, {0x3968c000}, {0x3968e000},
- {0x39690000}, {0x39692000}, {0x39694000}, {0x39696000},
- {0x39698000}, {0x3969a000}, {0x3969c000}, {0x3969e000},
- {0x396a0000}, {0x396a2000}, {0x396a4000}, {0x396a6000},
- {0x396a8000}, {0x396aa000}, {0x396ac000}, {0x396ae000},
- {0x396b0000}, {0x396b2000}, {0x396b4000}, {0x396b6000},
- {0x396b8000}, {0x396ba000}, {0x396bc000}, {0x396be000},
- {0x396c0000}, {0x396c2000}, {0x396c4000}, {0x396c6000},
- {0x396c8000}, {0x396ca000}, {0x396cc000}, {0x396ce000},
- {0x396d0000}, {0x396d2000}, {0x396d4000}, {0x396d6000},
- {0x396d8000}, {0x396da000}, {0x396dc000}, {0x396de000},
- {0x396e0000}, {0x396e2000}, {0x396e4000}, {0x396e6000},
- {0x396e8000}, {0x396ea000}, {0x396ec000}, {0x396ee000},
- {0x396f0000}, {0x396f2000}, {0x396f4000}, {0x396f6000},
- {0x396f8000}, {0x396fa000}, {0x396fc000}, {0x396fe000},
- {0x39700000}, {0x39702000}, {0x39704000}, {0x39706000},
- {0x39708000}, {0x3970a000}, {0x3970c000}, {0x3970e000},
- {0x39710000}, {0x39712000}, {0x39714000}, {0x39716000},
- {0x39718000}, {0x3971a000}, {0x3971c000}, {0x3971e000},
- {0x39720000}, {0x39722000}, {0x39724000}, {0x39726000},
- {0x39728000}, {0x3972a000}, {0x3972c000}, {0x3972e000},
- {0x39730000}, {0x39732000}, {0x39734000}, {0x39736000},
- {0x39738000}, {0x3973a000}, {0x3973c000}, {0x3973e000},
- {0x39740000}, {0x39742000}, {0x39744000}, {0x39746000},
- {0x39748000}, {0x3974a000}, {0x3974c000}, {0x3974e000},
- {0x39750000}, {0x39752000}, {0x39754000}, {0x39756000},
- {0x39758000}, {0x3975a000}, {0x3975c000}, {0x3975e000},
- {0x39760000}, {0x39762000}, {0x39764000}, {0x39766000},
- {0x39768000}, {0x3976a000}, {0x3976c000}, {0x3976e000},
- {0x39770000}, {0x39772000}, {0x39774000}, {0x39776000},
- {0x39778000}, {0x3977a000}, {0x3977c000}, {0x3977e000},
- {0x39780000}, {0x39782000}, {0x39784000}, {0x39786000},
- {0x39788000}, {0x3978a000}, {0x3978c000}, {0x3978e000},
- {0x39790000}, {0x39792000}, {0x39794000}, {0x39796000},
- {0x39798000}, {0x3979a000}, {0x3979c000}, {0x3979e000},
- {0x397a0000}, {0x397a2000}, {0x397a4000}, {0x397a6000},
- {0x397a8000}, {0x397aa000}, {0x397ac000}, {0x397ae000},
- {0x397b0000}, {0x397b2000}, {0x397b4000}, {0x397b6000},
- {0x397b8000}, {0x397ba000}, {0x397bc000}, {0x397be000},
- {0x397c0000}, {0x397c2000}, {0x397c4000}, {0x397c6000},
- {0x397c8000}, {0x397ca000}, {0x397cc000}, {0x397ce000},
- {0x397d0000}, {0x397d2000}, {0x397d4000}, {0x397d6000},
- {0x397d8000}, {0x397da000}, {0x397dc000}, {0x397de000},
- {0x397e0000}, {0x397e2000}, {0x397e4000}, {0x397e6000},
- {0x397e8000}, {0x397ea000}, {0x397ec000}, {0x397ee000},
- {0x397f0000}, {0x397f2000}, {0x397f4000}, {0x397f6000},
- {0x397f8000}, {0x397fa000}, {0x397fc000}, {0x397fe000},
- {0x39800000}, {0x39802000}, {0x39804000}, {0x39806000},
- {0x39808000}, {0x3980a000}, {0x3980c000}, {0x3980e000},
- {0x39810000}, {0x39812000}, {0x39814000}, {0x39816000},
- {0x39818000}, {0x3981a000}, {0x3981c000}, {0x3981e000},
- {0x39820000}, {0x39822000}, {0x39824000}, {0x39826000},
- {0x39828000}, {0x3982a000}, {0x3982c000}, {0x3982e000},
- {0x39830000}, {0x39832000}, {0x39834000}, {0x39836000},
- {0x39838000}, {0x3983a000}, {0x3983c000}, {0x3983e000},
- {0x39840000}, {0x39842000}, {0x39844000}, {0x39846000},
- {0x39848000}, {0x3984a000}, {0x3984c000}, {0x3984e000},
- {0x39850000}, {0x39852000}, {0x39854000}, {0x39856000},
- {0x39858000}, {0x3985a000}, {0x3985c000}, {0x3985e000},
- {0x39860000}, {0x39862000}, {0x39864000}, {0x39866000},
- {0x39868000}, {0x3986a000}, {0x3986c000}, {0x3986e000},
- {0x39870000}, {0x39872000}, {0x39874000}, {0x39876000},
- {0x39878000}, {0x3987a000}, {0x3987c000}, {0x3987e000},
- {0x39880000}, {0x39882000}, {0x39884000}, {0x39886000},
- {0x39888000}, {0x3988a000}, {0x3988c000}, {0x3988e000},
- {0x39890000}, {0x39892000}, {0x39894000}, {0x39896000},
- {0x39898000}, {0x3989a000}, {0x3989c000}, {0x3989e000},
- {0x398a0000}, {0x398a2000}, {0x398a4000}, {0x398a6000},
- {0x398a8000}, {0x398aa000}, {0x398ac000}, {0x398ae000},
- {0x398b0000}, {0x398b2000}, {0x398b4000}, {0x398b6000},
- {0x398b8000}, {0x398ba000}, {0x398bc000}, {0x398be000},
- {0x398c0000}, {0x398c2000}, {0x398c4000}, {0x398c6000},
- {0x398c8000}, {0x398ca000}, {0x398cc000}, {0x398ce000},
- {0x398d0000}, {0x398d2000}, {0x398d4000}, {0x398d6000},
- {0x398d8000}, {0x398da000}, {0x398dc000}, {0x398de000},
- {0x398e0000}, {0x398e2000}, {0x398e4000}, {0x398e6000},
- {0x398e8000}, {0x398ea000}, {0x398ec000}, {0x398ee000},
- {0x398f0000}, {0x398f2000}, {0x398f4000}, {0x398f6000},
- {0x398f8000}, {0x398fa000}, {0x398fc000}, {0x398fe000},
- {0x39900000}, {0x39902000}, {0x39904000}, {0x39906000},
- {0x39908000}, {0x3990a000}, {0x3990c000}, {0x3990e000},
- {0x39910000}, {0x39912000}, {0x39914000}, {0x39916000},
- {0x39918000}, {0x3991a000}, {0x3991c000}, {0x3991e000},
- {0x39920000}, {0x39922000}, {0x39924000}, {0x39926000},
- {0x39928000}, {0x3992a000}, {0x3992c000}, {0x3992e000},
- {0x39930000}, {0x39932000}, {0x39934000}, {0x39936000},
- {0x39938000}, {0x3993a000}, {0x3993c000}, {0x3993e000},
- {0x39940000}, {0x39942000}, {0x39944000}, {0x39946000},
- {0x39948000}, {0x3994a000}, {0x3994c000}, {0x3994e000},
- {0x39950000}, {0x39952000}, {0x39954000}, {0x39956000},
- {0x39958000}, {0x3995a000}, {0x3995c000}, {0x3995e000},
- {0x39960000}, {0x39962000}, {0x39964000}, {0x39966000},
- {0x39968000}, {0x3996a000}, {0x3996c000}, {0x3996e000},
- {0x39970000}, {0x39972000}, {0x39974000}, {0x39976000},
- {0x39978000}, {0x3997a000}, {0x3997c000}, {0x3997e000},
- {0x39980000}, {0x39982000}, {0x39984000}, {0x39986000},
- {0x39988000}, {0x3998a000}, {0x3998c000}, {0x3998e000},
- {0x39990000}, {0x39992000}, {0x39994000}, {0x39996000},
- {0x39998000}, {0x3999a000}, {0x3999c000}, {0x3999e000},
- {0x399a0000}, {0x399a2000}, {0x399a4000}, {0x399a6000},
- {0x399a8000}, {0x399aa000}, {0x399ac000}, {0x399ae000},
- {0x399b0000}, {0x399b2000}, {0x399b4000}, {0x399b6000},
- {0x399b8000}, {0x399ba000}, {0x399bc000}, {0x399be000},
- {0x399c0000}, {0x399c2000}, {0x399c4000}, {0x399c6000},
- {0x399c8000}, {0x399ca000}, {0x399cc000}, {0x399ce000},
- {0x399d0000}, {0x399d2000}, {0x399d4000}, {0x399d6000},
- {0x399d8000}, {0x399da000}, {0x399dc000}, {0x399de000},
- {0x399e0000}, {0x399e2000}, {0x399e4000}, {0x399e6000},
- {0x399e8000}, {0x399ea000}, {0x399ec000}, {0x399ee000},
- {0x399f0000}, {0x399f2000}, {0x399f4000}, {0x399f6000},
- {0x399f8000}, {0x399fa000}, {0x399fc000}, {0x399fe000},
- {0x39a00000}, {0x39a02000}, {0x39a04000}, {0x39a06000},
- {0x39a08000}, {0x39a0a000}, {0x39a0c000}, {0x39a0e000},
- {0x39a10000}, {0x39a12000}, {0x39a14000}, {0x39a16000},
- {0x39a18000}, {0x39a1a000}, {0x39a1c000}, {0x39a1e000},
- {0x39a20000}, {0x39a22000}, {0x39a24000}, {0x39a26000},
- {0x39a28000}, {0x39a2a000}, {0x39a2c000}, {0x39a2e000},
- {0x39a30000}, {0x39a32000}, {0x39a34000}, {0x39a36000},
- {0x39a38000}, {0x39a3a000}, {0x39a3c000}, {0x39a3e000},
- {0x39a40000}, {0x39a42000}, {0x39a44000}, {0x39a46000},
- {0x39a48000}, {0x39a4a000}, {0x39a4c000}, {0x39a4e000},
- {0x39a50000}, {0x39a52000}, {0x39a54000}, {0x39a56000},
- {0x39a58000}, {0x39a5a000}, {0x39a5c000}, {0x39a5e000},
- {0x39a60000}, {0x39a62000}, {0x39a64000}, {0x39a66000},
- {0x39a68000}, {0x39a6a000}, {0x39a6c000}, {0x39a6e000},
- {0x39a70000}, {0x39a72000}, {0x39a74000}, {0x39a76000},
- {0x39a78000}, {0x39a7a000}, {0x39a7c000}, {0x39a7e000},
- {0x39a80000}, {0x39a82000}, {0x39a84000}, {0x39a86000},
- {0x39a88000}, {0x39a8a000}, {0x39a8c000}, {0x39a8e000},
- {0x39a90000}, {0x39a92000}, {0x39a94000}, {0x39a96000},
- {0x39a98000}, {0x39a9a000}, {0x39a9c000}, {0x39a9e000},
- {0x39aa0000}, {0x39aa2000}, {0x39aa4000}, {0x39aa6000},
- {0x39aa8000}, {0x39aaa000}, {0x39aac000}, {0x39aae000},
- {0x39ab0000}, {0x39ab2000}, {0x39ab4000}, {0x39ab6000},
- {0x39ab8000}, {0x39aba000}, {0x39abc000}, {0x39abe000},
- {0x39ac0000}, {0x39ac2000}, {0x39ac4000}, {0x39ac6000},
- {0x39ac8000}, {0x39aca000}, {0x39acc000}, {0x39ace000},
- {0x39ad0000}, {0x39ad2000}, {0x39ad4000}, {0x39ad6000},
- {0x39ad8000}, {0x39ada000}, {0x39adc000}, {0x39ade000},
- {0x39ae0000}, {0x39ae2000}, {0x39ae4000}, {0x39ae6000},
- {0x39ae8000}, {0x39aea000}, {0x39aec000}, {0x39aee000},
- {0x39af0000}, {0x39af2000}, {0x39af4000}, {0x39af6000},
- {0x39af8000}, {0x39afa000}, {0x39afc000}, {0x39afe000},
- {0x39b00000}, {0x39b02000}, {0x39b04000}, {0x39b06000},
- {0x39b08000}, {0x39b0a000}, {0x39b0c000}, {0x39b0e000},
- {0x39b10000}, {0x39b12000}, {0x39b14000}, {0x39b16000},
- {0x39b18000}, {0x39b1a000}, {0x39b1c000}, {0x39b1e000},
- {0x39b20000}, {0x39b22000}, {0x39b24000}, {0x39b26000},
- {0x39b28000}, {0x39b2a000}, {0x39b2c000}, {0x39b2e000},
- {0x39b30000}, {0x39b32000}, {0x39b34000}, {0x39b36000},
- {0x39b38000}, {0x39b3a000}, {0x39b3c000}, {0x39b3e000},
- {0x39b40000}, {0x39b42000}, {0x39b44000}, {0x39b46000},
- {0x39b48000}, {0x39b4a000}, {0x39b4c000}, {0x39b4e000},
- {0x39b50000}, {0x39b52000}, {0x39b54000}, {0x39b56000},
- {0x39b58000}, {0x39b5a000}, {0x39b5c000}, {0x39b5e000},
- {0x39b60000}, {0x39b62000}, {0x39b64000}, {0x39b66000},
- {0x39b68000}, {0x39b6a000}, {0x39b6c000}, {0x39b6e000},
- {0x39b70000}, {0x39b72000}, {0x39b74000}, {0x39b76000},
- {0x39b78000}, {0x39b7a000}, {0x39b7c000}, {0x39b7e000},
- {0x39b80000}, {0x39b82000}, {0x39b84000}, {0x39b86000},
- {0x39b88000}, {0x39b8a000}, {0x39b8c000}, {0x39b8e000},
- {0x39b90000}, {0x39b92000}, {0x39b94000}, {0x39b96000},
- {0x39b98000}, {0x39b9a000}, {0x39b9c000}, {0x39b9e000},
- {0x39ba0000}, {0x39ba2000}, {0x39ba4000}, {0x39ba6000},
- {0x39ba8000}, {0x39baa000}, {0x39bac000}, {0x39bae000},
- {0x39bb0000}, {0x39bb2000}, {0x39bb4000}, {0x39bb6000},
- {0x39bb8000}, {0x39bba000}, {0x39bbc000}, {0x39bbe000},
- {0x39bc0000}, {0x39bc2000}, {0x39bc4000}, {0x39bc6000},
- {0x39bc8000}, {0x39bca000}, {0x39bcc000}, {0x39bce000},
- {0x39bd0000}, {0x39bd2000}, {0x39bd4000}, {0x39bd6000},
- {0x39bd8000}, {0x39bda000}, {0x39bdc000}, {0x39bde000},
- {0x39be0000}, {0x39be2000}, {0x39be4000}, {0x39be6000},
- {0x39be8000}, {0x39bea000}, {0x39bec000}, {0x39bee000},
- {0x39bf0000}, {0x39bf2000}, {0x39bf4000}, {0x39bf6000},
- {0x39bf8000}, {0x39bfa000}, {0x39bfc000}, {0x39bfe000},
- {0x39c00000}, {0x39c02000}, {0x39c04000}, {0x39c06000},
- {0x39c08000}, {0x39c0a000}, {0x39c0c000}, {0x39c0e000},
- {0x39c10000}, {0x39c12000}, {0x39c14000}, {0x39c16000},
- {0x39c18000}, {0x39c1a000}, {0x39c1c000}, {0x39c1e000},
- {0x39c20000}, {0x39c22000}, {0x39c24000}, {0x39c26000},
- {0x39c28000}, {0x39c2a000}, {0x39c2c000}, {0x39c2e000},
- {0x39c30000}, {0x39c32000}, {0x39c34000}, {0x39c36000},
- {0x39c38000}, {0x39c3a000}, {0x39c3c000}, {0x39c3e000},
- {0x39c40000}, {0x39c42000}, {0x39c44000}, {0x39c46000},
- {0x39c48000}, {0x39c4a000}, {0x39c4c000}, {0x39c4e000},
- {0x39c50000}, {0x39c52000}, {0x39c54000}, {0x39c56000},
- {0x39c58000}, {0x39c5a000}, {0x39c5c000}, {0x39c5e000},
- {0x39c60000}, {0x39c62000}, {0x39c64000}, {0x39c66000},
- {0x39c68000}, {0x39c6a000}, {0x39c6c000}, {0x39c6e000},
- {0x39c70000}, {0x39c72000}, {0x39c74000}, {0x39c76000},
- {0x39c78000}, {0x39c7a000}, {0x39c7c000}, {0x39c7e000},
- {0x39c80000}, {0x39c82000}, {0x39c84000}, {0x39c86000},
- {0x39c88000}, {0x39c8a000}, {0x39c8c000}, {0x39c8e000},
- {0x39c90000}, {0x39c92000}, {0x39c94000}, {0x39c96000},
- {0x39c98000}, {0x39c9a000}, {0x39c9c000}, {0x39c9e000},
- {0x39ca0000}, {0x39ca2000}, {0x39ca4000}, {0x39ca6000},
- {0x39ca8000}, {0x39caa000}, {0x39cac000}, {0x39cae000},
- {0x39cb0000}, {0x39cb2000}, {0x39cb4000}, {0x39cb6000},
- {0x39cb8000}, {0x39cba000}, {0x39cbc000}, {0x39cbe000},
- {0x39cc0000}, {0x39cc2000}, {0x39cc4000}, {0x39cc6000},
- {0x39cc8000}, {0x39cca000}, {0x39ccc000}, {0x39cce000},
- {0x39cd0000}, {0x39cd2000}, {0x39cd4000}, {0x39cd6000},
- {0x39cd8000}, {0x39cda000}, {0x39cdc000}, {0x39cde000},
- {0x39ce0000}, {0x39ce2000}, {0x39ce4000}, {0x39ce6000},
- {0x39ce8000}, {0x39cea000}, {0x39cec000}, {0x39cee000},
- {0x39cf0000}, {0x39cf2000}, {0x39cf4000}, {0x39cf6000},
- {0x39cf8000}, {0x39cfa000}, {0x39cfc000}, {0x39cfe000},
- {0x39d00000}, {0x39d02000}, {0x39d04000}, {0x39d06000},
- {0x39d08000}, {0x39d0a000}, {0x39d0c000}, {0x39d0e000},
- {0x39d10000}, {0x39d12000}, {0x39d14000}, {0x39d16000},
- {0x39d18000}, {0x39d1a000}, {0x39d1c000}, {0x39d1e000},
- {0x39d20000}, {0x39d22000}, {0x39d24000}, {0x39d26000},
- {0x39d28000}, {0x39d2a000}, {0x39d2c000}, {0x39d2e000},
- {0x39d30000}, {0x39d32000}, {0x39d34000}, {0x39d36000},
- {0x39d38000}, {0x39d3a000}, {0x39d3c000}, {0x39d3e000},
- {0x39d40000}, {0x39d42000}, {0x39d44000}, {0x39d46000},
- {0x39d48000}, {0x39d4a000}, {0x39d4c000}, {0x39d4e000},
- {0x39d50000}, {0x39d52000}, {0x39d54000}, {0x39d56000},
- {0x39d58000}, {0x39d5a000}, {0x39d5c000}, {0x39d5e000},
- {0x39d60000}, {0x39d62000}, {0x39d64000}, {0x39d66000},
- {0x39d68000}, {0x39d6a000}, {0x39d6c000}, {0x39d6e000},
- {0x39d70000}, {0x39d72000}, {0x39d74000}, {0x39d76000},
- {0x39d78000}, {0x39d7a000}, {0x39d7c000}, {0x39d7e000},
- {0x39d80000}, {0x39d82000}, {0x39d84000}, {0x39d86000},
- {0x39d88000}, {0x39d8a000}, {0x39d8c000}, {0x39d8e000},
- {0x39d90000}, {0x39d92000}, {0x39d94000}, {0x39d96000},
- {0x39d98000}, {0x39d9a000}, {0x39d9c000}, {0x39d9e000},
- {0x39da0000}, {0x39da2000}, {0x39da4000}, {0x39da6000},
- {0x39da8000}, {0x39daa000}, {0x39dac000}, {0x39dae000},
- {0x39db0000}, {0x39db2000}, {0x39db4000}, {0x39db6000},
- {0x39db8000}, {0x39dba000}, {0x39dbc000}, {0x39dbe000},
- {0x39dc0000}, {0x39dc2000}, {0x39dc4000}, {0x39dc6000},
- {0x39dc8000}, {0x39dca000}, {0x39dcc000}, {0x39dce000},
- {0x39dd0000}, {0x39dd2000}, {0x39dd4000}, {0x39dd6000},
- {0x39dd8000}, {0x39dda000}, {0x39ddc000}, {0x39dde000},
- {0x39de0000}, {0x39de2000}, {0x39de4000}, {0x39de6000},
- {0x39de8000}, {0x39dea000}, {0x39dec000}, {0x39dee000},
- {0x39df0000}, {0x39df2000}, {0x39df4000}, {0x39df6000},
- {0x39df8000}, {0x39dfa000}, {0x39dfc000}, {0x39dfe000},
- {0x39e00000}, {0x39e02000}, {0x39e04000}, {0x39e06000},
- {0x39e08000}, {0x39e0a000}, {0x39e0c000}, {0x39e0e000},
- {0x39e10000}, {0x39e12000}, {0x39e14000}, {0x39e16000},
- {0x39e18000}, {0x39e1a000}, {0x39e1c000}, {0x39e1e000},
- {0x39e20000}, {0x39e22000}, {0x39e24000}, {0x39e26000},
- {0x39e28000}, {0x39e2a000}, {0x39e2c000}, {0x39e2e000},
- {0x39e30000}, {0x39e32000}, {0x39e34000}, {0x39e36000},
- {0x39e38000}, {0x39e3a000}, {0x39e3c000}, {0x39e3e000},
- {0x39e40000}, {0x39e42000}, {0x39e44000}, {0x39e46000},
- {0x39e48000}, {0x39e4a000}, {0x39e4c000}, {0x39e4e000},
- {0x39e50000}, {0x39e52000}, {0x39e54000}, {0x39e56000},
- {0x39e58000}, {0x39e5a000}, {0x39e5c000}, {0x39e5e000},
- {0x39e60000}, {0x39e62000}, {0x39e64000}, {0x39e66000},
- {0x39e68000}, {0x39e6a000}, {0x39e6c000}, {0x39e6e000},
- {0x39e70000}, {0x39e72000}, {0x39e74000}, {0x39e76000},
- {0x39e78000}, {0x39e7a000}, {0x39e7c000}, {0x39e7e000},
- {0x39e80000}, {0x39e82000}, {0x39e84000}, {0x39e86000},
- {0x39e88000}, {0x39e8a000}, {0x39e8c000}, {0x39e8e000},
- {0x39e90000}, {0x39e92000}, {0x39e94000}, {0x39e96000},
- {0x39e98000}, {0x39e9a000}, {0x39e9c000}, {0x39e9e000},
- {0x39ea0000}, {0x39ea2000}, {0x39ea4000}, {0x39ea6000},
- {0x39ea8000}, {0x39eaa000}, {0x39eac000}, {0x39eae000},
- {0x39eb0000}, {0x39eb2000}, {0x39eb4000}, {0x39eb6000},
- {0x39eb8000}, {0x39eba000}, {0x39ebc000}, {0x39ebe000},
- {0x39ec0000}, {0x39ec2000}, {0x39ec4000}, {0x39ec6000},
- {0x39ec8000}, {0x39eca000}, {0x39ecc000}, {0x39ece000},
- {0x39ed0000}, {0x39ed2000}, {0x39ed4000}, {0x39ed6000},
- {0x39ed8000}, {0x39eda000}, {0x39edc000}, {0x39ede000},
- {0x39ee0000}, {0x39ee2000}, {0x39ee4000}, {0x39ee6000},
- {0x39ee8000}, {0x39eea000}, {0x39eec000}, {0x39eee000},
- {0x39ef0000}, {0x39ef2000}, {0x39ef4000}, {0x39ef6000},
- {0x39ef8000}, {0x39efa000}, {0x39efc000}, {0x39efe000},
- {0x39f00000}, {0x39f02000}, {0x39f04000}, {0x39f06000},
- {0x39f08000}, {0x39f0a000}, {0x39f0c000}, {0x39f0e000},
- {0x39f10000}, {0x39f12000}, {0x39f14000}, {0x39f16000},
- {0x39f18000}, {0x39f1a000}, {0x39f1c000}, {0x39f1e000},
- {0x39f20000}, {0x39f22000}, {0x39f24000}, {0x39f26000},
- {0x39f28000}, {0x39f2a000}, {0x39f2c000}, {0x39f2e000},
- {0x39f30000}, {0x39f32000}, {0x39f34000}, {0x39f36000},
- {0x39f38000}, {0x39f3a000}, {0x39f3c000}, {0x39f3e000},
- {0x39f40000}, {0x39f42000}, {0x39f44000}, {0x39f46000},
- {0x39f48000}, {0x39f4a000}, {0x39f4c000}, {0x39f4e000},
- {0x39f50000}, {0x39f52000}, {0x39f54000}, {0x39f56000},
- {0x39f58000}, {0x39f5a000}, {0x39f5c000}, {0x39f5e000},
- {0x39f60000}, {0x39f62000}, {0x39f64000}, {0x39f66000},
- {0x39f68000}, {0x39f6a000}, {0x39f6c000}, {0x39f6e000},
- {0x39f70000}, {0x39f72000}, {0x39f74000}, {0x39f76000},
- {0x39f78000}, {0x39f7a000}, {0x39f7c000}, {0x39f7e000},
- {0x39f80000}, {0x39f82000}, {0x39f84000}, {0x39f86000},
- {0x39f88000}, {0x39f8a000}, {0x39f8c000}, {0x39f8e000},
- {0x39f90000}, {0x39f92000}, {0x39f94000}, {0x39f96000},
- {0x39f98000}, {0x39f9a000}, {0x39f9c000}, {0x39f9e000},
- {0x39fa0000}, {0x39fa2000}, {0x39fa4000}, {0x39fa6000},
- {0x39fa8000}, {0x39faa000}, {0x39fac000}, {0x39fae000},
- {0x39fb0000}, {0x39fb2000}, {0x39fb4000}, {0x39fb6000},
- {0x39fb8000}, {0x39fba000}, {0x39fbc000}, {0x39fbe000},
- {0x39fc0000}, {0x39fc2000}, {0x39fc4000}, {0x39fc6000},
- {0x39fc8000}, {0x39fca000}, {0x39fcc000}, {0x39fce000},
- {0x39fd0000}, {0x39fd2000}, {0x39fd4000}, {0x39fd6000},
- {0x39fd8000}, {0x39fda000}, {0x39fdc000}, {0x39fde000},
- {0x39fe0000}, {0x39fe2000}, {0x39fe4000}, {0x39fe6000},
- {0x39fe8000}, {0x39fea000}, {0x39fec000}, {0x39fee000},
- {0x39ff0000}, {0x39ff2000}, {0x39ff4000}, {0x39ff6000},
- {0x39ff8000}, {0x39ffa000}, {0x39ffc000}, {0x39ffe000},
- {0x3a000000}, {0x3a002000}, {0x3a004000}, {0x3a006000},
- {0x3a008000}, {0x3a00a000}, {0x3a00c000}, {0x3a00e000},
- {0x3a010000}, {0x3a012000}, {0x3a014000}, {0x3a016000},
- {0x3a018000}, {0x3a01a000}, {0x3a01c000}, {0x3a01e000},
- {0x3a020000}, {0x3a022000}, {0x3a024000}, {0x3a026000},
- {0x3a028000}, {0x3a02a000}, {0x3a02c000}, {0x3a02e000},
- {0x3a030000}, {0x3a032000}, {0x3a034000}, {0x3a036000},
- {0x3a038000}, {0x3a03a000}, {0x3a03c000}, {0x3a03e000},
- {0x3a040000}, {0x3a042000}, {0x3a044000}, {0x3a046000},
- {0x3a048000}, {0x3a04a000}, {0x3a04c000}, {0x3a04e000},
- {0x3a050000}, {0x3a052000}, {0x3a054000}, {0x3a056000},
- {0x3a058000}, {0x3a05a000}, {0x3a05c000}, {0x3a05e000},
- {0x3a060000}, {0x3a062000}, {0x3a064000}, {0x3a066000},
- {0x3a068000}, {0x3a06a000}, {0x3a06c000}, {0x3a06e000},
- {0x3a070000}, {0x3a072000}, {0x3a074000}, {0x3a076000},
- {0x3a078000}, {0x3a07a000}, {0x3a07c000}, {0x3a07e000},
- {0x3a080000}, {0x3a082000}, {0x3a084000}, {0x3a086000},
- {0x3a088000}, {0x3a08a000}, {0x3a08c000}, {0x3a08e000},
- {0x3a090000}, {0x3a092000}, {0x3a094000}, {0x3a096000},
- {0x3a098000}, {0x3a09a000}, {0x3a09c000}, {0x3a09e000},
- {0x3a0a0000}, {0x3a0a2000}, {0x3a0a4000}, {0x3a0a6000},
- {0x3a0a8000}, {0x3a0aa000}, {0x3a0ac000}, {0x3a0ae000},
- {0x3a0b0000}, {0x3a0b2000}, {0x3a0b4000}, {0x3a0b6000},
- {0x3a0b8000}, {0x3a0ba000}, {0x3a0bc000}, {0x3a0be000},
- {0x3a0c0000}, {0x3a0c2000}, {0x3a0c4000}, {0x3a0c6000},
- {0x3a0c8000}, {0x3a0ca000}, {0x3a0cc000}, {0x3a0ce000},
- {0x3a0d0000}, {0x3a0d2000}, {0x3a0d4000}, {0x3a0d6000},
- {0x3a0d8000}, {0x3a0da000}, {0x3a0dc000}, {0x3a0de000},
- {0x3a0e0000}, {0x3a0e2000}, {0x3a0e4000}, {0x3a0e6000},
- {0x3a0e8000}, {0x3a0ea000}, {0x3a0ec000}, {0x3a0ee000},
- {0x3a0f0000}, {0x3a0f2000}, {0x3a0f4000}, {0x3a0f6000},
- {0x3a0f8000}, {0x3a0fa000}, {0x3a0fc000}, {0x3a0fe000},
- {0x3a100000}, {0x3a102000}, {0x3a104000}, {0x3a106000},
- {0x3a108000}, {0x3a10a000}, {0x3a10c000}, {0x3a10e000},
- {0x3a110000}, {0x3a112000}, {0x3a114000}, {0x3a116000},
- {0x3a118000}, {0x3a11a000}, {0x3a11c000}, {0x3a11e000},
- {0x3a120000}, {0x3a122000}, {0x3a124000}, {0x3a126000},
- {0x3a128000}, {0x3a12a000}, {0x3a12c000}, {0x3a12e000},
- {0x3a130000}, {0x3a132000}, {0x3a134000}, {0x3a136000},
- {0x3a138000}, {0x3a13a000}, {0x3a13c000}, {0x3a13e000},
- {0x3a140000}, {0x3a142000}, {0x3a144000}, {0x3a146000},
- {0x3a148000}, {0x3a14a000}, {0x3a14c000}, {0x3a14e000},
- {0x3a150000}, {0x3a152000}, {0x3a154000}, {0x3a156000},
- {0x3a158000}, {0x3a15a000}, {0x3a15c000}, {0x3a15e000},
- {0x3a160000}, {0x3a162000}, {0x3a164000}, {0x3a166000},
- {0x3a168000}, {0x3a16a000}, {0x3a16c000}, {0x3a16e000},
- {0x3a170000}, {0x3a172000}, {0x3a174000}, {0x3a176000},
- {0x3a178000}, {0x3a17a000}, {0x3a17c000}, {0x3a17e000},
- {0x3a180000}, {0x3a182000}, {0x3a184000}, {0x3a186000},
- {0x3a188000}, {0x3a18a000}, {0x3a18c000}, {0x3a18e000},
- {0x3a190000}, {0x3a192000}, {0x3a194000}, {0x3a196000},
- {0x3a198000}, {0x3a19a000}, {0x3a19c000}, {0x3a19e000},
- {0x3a1a0000}, {0x3a1a2000}, {0x3a1a4000}, {0x3a1a6000},
- {0x3a1a8000}, {0x3a1aa000}, {0x3a1ac000}, {0x3a1ae000},
- {0x3a1b0000}, {0x3a1b2000}, {0x3a1b4000}, {0x3a1b6000},
- {0x3a1b8000}, {0x3a1ba000}, {0x3a1bc000}, {0x3a1be000},
- {0x3a1c0000}, {0x3a1c2000}, {0x3a1c4000}, {0x3a1c6000},
- {0x3a1c8000}, {0x3a1ca000}, {0x3a1cc000}, {0x3a1ce000},
- {0x3a1d0000}, {0x3a1d2000}, {0x3a1d4000}, {0x3a1d6000},
- {0x3a1d8000}, {0x3a1da000}, {0x3a1dc000}, {0x3a1de000},
- {0x3a1e0000}, {0x3a1e2000}, {0x3a1e4000}, {0x3a1e6000},
- {0x3a1e8000}, {0x3a1ea000}, {0x3a1ec000}, {0x3a1ee000},
- {0x3a1f0000}, {0x3a1f2000}, {0x3a1f4000}, {0x3a1f6000},
- {0x3a1f8000}, {0x3a1fa000}, {0x3a1fc000}, {0x3a1fe000},
- {0x3a200000}, {0x3a202000}, {0x3a204000}, {0x3a206000},
- {0x3a208000}, {0x3a20a000}, {0x3a20c000}, {0x3a20e000},
- {0x3a210000}, {0x3a212000}, {0x3a214000}, {0x3a216000},
- {0x3a218000}, {0x3a21a000}, {0x3a21c000}, {0x3a21e000},
- {0x3a220000}, {0x3a222000}, {0x3a224000}, {0x3a226000},
- {0x3a228000}, {0x3a22a000}, {0x3a22c000}, {0x3a22e000},
- {0x3a230000}, {0x3a232000}, {0x3a234000}, {0x3a236000},
- {0x3a238000}, {0x3a23a000}, {0x3a23c000}, {0x3a23e000},
- {0x3a240000}, {0x3a242000}, {0x3a244000}, {0x3a246000},
- {0x3a248000}, {0x3a24a000}, {0x3a24c000}, {0x3a24e000},
- {0x3a250000}, {0x3a252000}, {0x3a254000}, {0x3a256000},
- {0x3a258000}, {0x3a25a000}, {0x3a25c000}, {0x3a25e000},
- {0x3a260000}, {0x3a262000}, {0x3a264000}, {0x3a266000},
- {0x3a268000}, {0x3a26a000}, {0x3a26c000}, {0x3a26e000},
- {0x3a270000}, {0x3a272000}, {0x3a274000}, {0x3a276000},
- {0x3a278000}, {0x3a27a000}, {0x3a27c000}, {0x3a27e000},
- {0x3a280000}, {0x3a282000}, {0x3a284000}, {0x3a286000},
- {0x3a288000}, {0x3a28a000}, {0x3a28c000}, {0x3a28e000},
- {0x3a290000}, {0x3a292000}, {0x3a294000}, {0x3a296000},
- {0x3a298000}, {0x3a29a000}, {0x3a29c000}, {0x3a29e000},
- {0x3a2a0000}, {0x3a2a2000}, {0x3a2a4000}, {0x3a2a6000},
- {0x3a2a8000}, {0x3a2aa000}, {0x3a2ac000}, {0x3a2ae000},
- {0x3a2b0000}, {0x3a2b2000}, {0x3a2b4000}, {0x3a2b6000},
- {0x3a2b8000}, {0x3a2ba000}, {0x3a2bc000}, {0x3a2be000},
- {0x3a2c0000}, {0x3a2c2000}, {0x3a2c4000}, {0x3a2c6000},
- {0x3a2c8000}, {0x3a2ca000}, {0x3a2cc000}, {0x3a2ce000},
- {0x3a2d0000}, {0x3a2d2000}, {0x3a2d4000}, {0x3a2d6000},
- {0x3a2d8000}, {0x3a2da000}, {0x3a2dc000}, {0x3a2de000},
- {0x3a2e0000}, {0x3a2e2000}, {0x3a2e4000}, {0x3a2e6000},
- {0x3a2e8000}, {0x3a2ea000}, {0x3a2ec000}, {0x3a2ee000},
- {0x3a2f0000}, {0x3a2f2000}, {0x3a2f4000}, {0x3a2f6000},
- {0x3a2f8000}, {0x3a2fa000}, {0x3a2fc000}, {0x3a2fe000},
- {0x3a300000}, {0x3a302000}, {0x3a304000}, {0x3a306000},
- {0x3a308000}, {0x3a30a000}, {0x3a30c000}, {0x3a30e000},
- {0x3a310000}, {0x3a312000}, {0x3a314000}, {0x3a316000},
- {0x3a318000}, {0x3a31a000}, {0x3a31c000}, {0x3a31e000},
- {0x3a320000}, {0x3a322000}, {0x3a324000}, {0x3a326000},
- {0x3a328000}, {0x3a32a000}, {0x3a32c000}, {0x3a32e000},
- {0x3a330000}, {0x3a332000}, {0x3a334000}, {0x3a336000},
- {0x3a338000}, {0x3a33a000}, {0x3a33c000}, {0x3a33e000},
- {0x3a340000}, {0x3a342000}, {0x3a344000}, {0x3a346000},
- {0x3a348000}, {0x3a34a000}, {0x3a34c000}, {0x3a34e000},
- {0x3a350000}, {0x3a352000}, {0x3a354000}, {0x3a356000},
- {0x3a358000}, {0x3a35a000}, {0x3a35c000}, {0x3a35e000},
- {0x3a360000}, {0x3a362000}, {0x3a364000}, {0x3a366000},
- {0x3a368000}, {0x3a36a000}, {0x3a36c000}, {0x3a36e000},
- {0x3a370000}, {0x3a372000}, {0x3a374000}, {0x3a376000},
- {0x3a378000}, {0x3a37a000}, {0x3a37c000}, {0x3a37e000},
- {0x3a380000}, {0x3a382000}, {0x3a384000}, {0x3a386000},
- {0x3a388000}, {0x3a38a000}, {0x3a38c000}, {0x3a38e000},
- {0x3a390000}, {0x3a392000}, {0x3a394000}, {0x3a396000},
- {0x3a398000}, {0x3a39a000}, {0x3a39c000}, {0x3a39e000},
- {0x3a3a0000}, {0x3a3a2000}, {0x3a3a4000}, {0x3a3a6000},
- {0x3a3a8000}, {0x3a3aa000}, {0x3a3ac000}, {0x3a3ae000},
- {0x3a3b0000}, {0x3a3b2000}, {0x3a3b4000}, {0x3a3b6000},
- {0x3a3b8000}, {0x3a3ba000}, {0x3a3bc000}, {0x3a3be000},
- {0x3a3c0000}, {0x3a3c2000}, {0x3a3c4000}, {0x3a3c6000},
- {0x3a3c8000}, {0x3a3ca000}, {0x3a3cc000}, {0x3a3ce000},
- {0x3a3d0000}, {0x3a3d2000}, {0x3a3d4000}, {0x3a3d6000},
- {0x3a3d8000}, {0x3a3da000}, {0x3a3dc000}, {0x3a3de000},
- {0x3a3e0000}, {0x3a3e2000}, {0x3a3e4000}, {0x3a3e6000},
- {0x3a3e8000}, {0x3a3ea000}, {0x3a3ec000}, {0x3a3ee000},
- {0x3a3f0000}, {0x3a3f2000}, {0x3a3f4000}, {0x3a3f6000},
- {0x3a3f8000}, {0x3a3fa000}, {0x3a3fc000}, {0x3a3fe000},
- {0x3a400000}, {0x3a402000}, {0x3a404000}, {0x3a406000},
- {0x3a408000}, {0x3a40a000}, {0x3a40c000}, {0x3a40e000},
- {0x3a410000}, {0x3a412000}, {0x3a414000}, {0x3a416000},
- {0x3a418000}, {0x3a41a000}, {0x3a41c000}, {0x3a41e000},
- {0x3a420000}, {0x3a422000}, {0x3a424000}, {0x3a426000},
- {0x3a428000}, {0x3a42a000}, {0x3a42c000}, {0x3a42e000},
- {0x3a430000}, {0x3a432000}, {0x3a434000}, {0x3a436000},
- {0x3a438000}, {0x3a43a000}, {0x3a43c000}, {0x3a43e000},
- {0x3a440000}, {0x3a442000}, {0x3a444000}, {0x3a446000},
- {0x3a448000}, {0x3a44a000}, {0x3a44c000}, {0x3a44e000},
- {0x3a450000}, {0x3a452000}, {0x3a454000}, {0x3a456000},
- {0x3a458000}, {0x3a45a000}, {0x3a45c000}, {0x3a45e000},
- {0x3a460000}, {0x3a462000}, {0x3a464000}, {0x3a466000},
- {0x3a468000}, {0x3a46a000}, {0x3a46c000}, {0x3a46e000},
- {0x3a470000}, {0x3a472000}, {0x3a474000}, {0x3a476000},
- {0x3a478000}, {0x3a47a000}, {0x3a47c000}, {0x3a47e000},
- {0x3a480000}, {0x3a482000}, {0x3a484000}, {0x3a486000},
- {0x3a488000}, {0x3a48a000}, {0x3a48c000}, {0x3a48e000},
- {0x3a490000}, {0x3a492000}, {0x3a494000}, {0x3a496000},
- {0x3a498000}, {0x3a49a000}, {0x3a49c000}, {0x3a49e000},
- {0x3a4a0000}, {0x3a4a2000}, {0x3a4a4000}, {0x3a4a6000},
- {0x3a4a8000}, {0x3a4aa000}, {0x3a4ac000}, {0x3a4ae000},
- {0x3a4b0000}, {0x3a4b2000}, {0x3a4b4000}, {0x3a4b6000},
- {0x3a4b8000}, {0x3a4ba000}, {0x3a4bc000}, {0x3a4be000},
- {0x3a4c0000}, {0x3a4c2000}, {0x3a4c4000}, {0x3a4c6000},
- {0x3a4c8000}, {0x3a4ca000}, {0x3a4cc000}, {0x3a4ce000},
- {0x3a4d0000}, {0x3a4d2000}, {0x3a4d4000}, {0x3a4d6000},
- {0x3a4d8000}, {0x3a4da000}, {0x3a4dc000}, {0x3a4de000},
- {0x3a4e0000}, {0x3a4e2000}, {0x3a4e4000}, {0x3a4e6000},
- {0x3a4e8000}, {0x3a4ea000}, {0x3a4ec000}, {0x3a4ee000},
- {0x3a4f0000}, {0x3a4f2000}, {0x3a4f4000}, {0x3a4f6000},
- {0x3a4f8000}, {0x3a4fa000}, {0x3a4fc000}, {0x3a4fe000},
- {0x3a500000}, {0x3a502000}, {0x3a504000}, {0x3a506000},
- {0x3a508000}, {0x3a50a000}, {0x3a50c000}, {0x3a50e000},
- {0x3a510000}, {0x3a512000}, {0x3a514000}, {0x3a516000},
- {0x3a518000}, {0x3a51a000}, {0x3a51c000}, {0x3a51e000},
- {0x3a520000}, {0x3a522000}, {0x3a524000}, {0x3a526000},
- {0x3a528000}, {0x3a52a000}, {0x3a52c000}, {0x3a52e000},
- {0x3a530000}, {0x3a532000}, {0x3a534000}, {0x3a536000},
- {0x3a538000}, {0x3a53a000}, {0x3a53c000}, {0x3a53e000},
- {0x3a540000}, {0x3a542000}, {0x3a544000}, {0x3a546000},
- {0x3a548000}, {0x3a54a000}, {0x3a54c000}, {0x3a54e000},
- {0x3a550000}, {0x3a552000}, {0x3a554000}, {0x3a556000},
- {0x3a558000}, {0x3a55a000}, {0x3a55c000}, {0x3a55e000},
- {0x3a560000}, {0x3a562000}, {0x3a564000}, {0x3a566000},
- {0x3a568000}, {0x3a56a000}, {0x3a56c000}, {0x3a56e000},
- {0x3a570000}, {0x3a572000}, {0x3a574000}, {0x3a576000},
- {0x3a578000}, {0x3a57a000}, {0x3a57c000}, {0x3a57e000},
- {0x3a580000}, {0x3a582000}, {0x3a584000}, {0x3a586000},
- {0x3a588000}, {0x3a58a000}, {0x3a58c000}, {0x3a58e000},
- {0x3a590000}, {0x3a592000}, {0x3a594000}, {0x3a596000},
- {0x3a598000}, {0x3a59a000}, {0x3a59c000}, {0x3a59e000},
- {0x3a5a0000}, {0x3a5a2000}, {0x3a5a4000}, {0x3a5a6000},
- {0x3a5a8000}, {0x3a5aa000}, {0x3a5ac000}, {0x3a5ae000},
- {0x3a5b0000}, {0x3a5b2000}, {0x3a5b4000}, {0x3a5b6000},
- {0x3a5b8000}, {0x3a5ba000}, {0x3a5bc000}, {0x3a5be000},
- {0x3a5c0000}, {0x3a5c2000}, {0x3a5c4000}, {0x3a5c6000},
- {0x3a5c8000}, {0x3a5ca000}, {0x3a5cc000}, {0x3a5ce000},
- {0x3a5d0000}, {0x3a5d2000}, {0x3a5d4000}, {0x3a5d6000},
- {0x3a5d8000}, {0x3a5da000}, {0x3a5dc000}, {0x3a5de000},
- {0x3a5e0000}, {0x3a5e2000}, {0x3a5e4000}, {0x3a5e6000},
- {0x3a5e8000}, {0x3a5ea000}, {0x3a5ec000}, {0x3a5ee000},
- {0x3a5f0000}, {0x3a5f2000}, {0x3a5f4000}, {0x3a5f6000},
- {0x3a5f8000}, {0x3a5fa000}, {0x3a5fc000}, {0x3a5fe000},
- {0x3a600000}, {0x3a602000}, {0x3a604000}, {0x3a606000},
- {0x3a608000}, {0x3a60a000}, {0x3a60c000}, {0x3a60e000},
- {0x3a610000}, {0x3a612000}, {0x3a614000}, {0x3a616000},
- {0x3a618000}, {0x3a61a000}, {0x3a61c000}, {0x3a61e000},
- {0x3a620000}, {0x3a622000}, {0x3a624000}, {0x3a626000},
- {0x3a628000}, {0x3a62a000}, {0x3a62c000}, {0x3a62e000},
- {0x3a630000}, {0x3a632000}, {0x3a634000}, {0x3a636000},
- {0x3a638000}, {0x3a63a000}, {0x3a63c000}, {0x3a63e000},
- {0x3a640000}, {0x3a642000}, {0x3a644000}, {0x3a646000},
- {0x3a648000}, {0x3a64a000}, {0x3a64c000}, {0x3a64e000},
- {0x3a650000}, {0x3a652000}, {0x3a654000}, {0x3a656000},
- {0x3a658000}, {0x3a65a000}, {0x3a65c000}, {0x3a65e000},
- {0x3a660000}, {0x3a662000}, {0x3a664000}, {0x3a666000},
- {0x3a668000}, {0x3a66a000}, {0x3a66c000}, {0x3a66e000},
- {0x3a670000}, {0x3a672000}, {0x3a674000}, {0x3a676000},
- {0x3a678000}, {0x3a67a000}, {0x3a67c000}, {0x3a67e000},
- {0x3a680000}, {0x3a682000}, {0x3a684000}, {0x3a686000},
- {0x3a688000}, {0x3a68a000}, {0x3a68c000}, {0x3a68e000},
- {0x3a690000}, {0x3a692000}, {0x3a694000}, {0x3a696000},
- {0x3a698000}, {0x3a69a000}, {0x3a69c000}, {0x3a69e000},
- {0x3a6a0000}, {0x3a6a2000}, {0x3a6a4000}, {0x3a6a6000},
- {0x3a6a8000}, {0x3a6aa000}, {0x3a6ac000}, {0x3a6ae000},
- {0x3a6b0000}, {0x3a6b2000}, {0x3a6b4000}, {0x3a6b6000},
- {0x3a6b8000}, {0x3a6ba000}, {0x3a6bc000}, {0x3a6be000},
- {0x3a6c0000}, {0x3a6c2000}, {0x3a6c4000}, {0x3a6c6000},
- {0x3a6c8000}, {0x3a6ca000}, {0x3a6cc000}, {0x3a6ce000},
- {0x3a6d0000}, {0x3a6d2000}, {0x3a6d4000}, {0x3a6d6000},
- {0x3a6d8000}, {0x3a6da000}, {0x3a6dc000}, {0x3a6de000},
- {0x3a6e0000}, {0x3a6e2000}, {0x3a6e4000}, {0x3a6e6000},
- {0x3a6e8000}, {0x3a6ea000}, {0x3a6ec000}, {0x3a6ee000},
- {0x3a6f0000}, {0x3a6f2000}, {0x3a6f4000}, {0x3a6f6000},
- {0x3a6f8000}, {0x3a6fa000}, {0x3a6fc000}, {0x3a6fe000},
- {0x3a700000}, {0x3a702000}, {0x3a704000}, {0x3a706000},
- {0x3a708000}, {0x3a70a000}, {0x3a70c000}, {0x3a70e000},
- {0x3a710000}, {0x3a712000}, {0x3a714000}, {0x3a716000},
- {0x3a718000}, {0x3a71a000}, {0x3a71c000}, {0x3a71e000},
- {0x3a720000}, {0x3a722000}, {0x3a724000}, {0x3a726000},
- {0x3a728000}, {0x3a72a000}, {0x3a72c000}, {0x3a72e000},
- {0x3a730000}, {0x3a732000}, {0x3a734000}, {0x3a736000},
- {0x3a738000}, {0x3a73a000}, {0x3a73c000}, {0x3a73e000},
- {0x3a740000}, {0x3a742000}, {0x3a744000}, {0x3a746000},
- {0x3a748000}, {0x3a74a000}, {0x3a74c000}, {0x3a74e000},
- {0x3a750000}, {0x3a752000}, {0x3a754000}, {0x3a756000},
- {0x3a758000}, {0x3a75a000}, {0x3a75c000}, {0x3a75e000},
- {0x3a760000}, {0x3a762000}, {0x3a764000}, {0x3a766000},
- {0x3a768000}, {0x3a76a000}, {0x3a76c000}, {0x3a76e000},
- {0x3a770000}, {0x3a772000}, {0x3a774000}, {0x3a776000},
- {0x3a778000}, {0x3a77a000}, {0x3a77c000}, {0x3a77e000},
- {0x3a780000}, {0x3a782000}, {0x3a784000}, {0x3a786000},
- {0x3a788000}, {0x3a78a000}, {0x3a78c000}, {0x3a78e000},
- {0x3a790000}, {0x3a792000}, {0x3a794000}, {0x3a796000},
- {0x3a798000}, {0x3a79a000}, {0x3a79c000}, {0x3a79e000},
- {0x3a7a0000}, {0x3a7a2000}, {0x3a7a4000}, {0x3a7a6000},
- {0x3a7a8000}, {0x3a7aa000}, {0x3a7ac000}, {0x3a7ae000},
- {0x3a7b0000}, {0x3a7b2000}, {0x3a7b4000}, {0x3a7b6000},
- {0x3a7b8000}, {0x3a7ba000}, {0x3a7bc000}, {0x3a7be000},
- {0x3a7c0000}, {0x3a7c2000}, {0x3a7c4000}, {0x3a7c6000},
- {0x3a7c8000}, {0x3a7ca000}, {0x3a7cc000}, {0x3a7ce000},
- {0x3a7d0000}, {0x3a7d2000}, {0x3a7d4000}, {0x3a7d6000},
- {0x3a7d8000}, {0x3a7da000}, {0x3a7dc000}, {0x3a7de000},
- {0x3a7e0000}, {0x3a7e2000}, {0x3a7e4000}, {0x3a7e6000},
- {0x3a7e8000}, {0x3a7ea000}, {0x3a7ec000}, {0x3a7ee000},
- {0x3a7f0000}, {0x3a7f2000}, {0x3a7f4000}, {0x3a7f6000},
- {0x3a7f8000}, {0x3a7fa000}, {0x3a7fc000}, {0x3a7fe000},
- {0x3a800000}, {0x3a802000}, {0x3a804000}, {0x3a806000},
- {0x3a808000}, {0x3a80a000}, {0x3a80c000}, {0x3a80e000},
- {0x3a810000}, {0x3a812000}, {0x3a814000}, {0x3a816000},
- {0x3a818000}, {0x3a81a000}, {0x3a81c000}, {0x3a81e000},
- {0x3a820000}, {0x3a822000}, {0x3a824000}, {0x3a826000},
- {0x3a828000}, {0x3a82a000}, {0x3a82c000}, {0x3a82e000},
- {0x3a830000}, {0x3a832000}, {0x3a834000}, {0x3a836000},
- {0x3a838000}, {0x3a83a000}, {0x3a83c000}, {0x3a83e000},
- {0x3a840000}, {0x3a842000}, {0x3a844000}, {0x3a846000},
- {0x3a848000}, {0x3a84a000}, {0x3a84c000}, {0x3a84e000},
- {0x3a850000}, {0x3a852000}, {0x3a854000}, {0x3a856000},
- {0x3a858000}, {0x3a85a000}, {0x3a85c000}, {0x3a85e000},
- {0x3a860000}, {0x3a862000}, {0x3a864000}, {0x3a866000},
- {0x3a868000}, {0x3a86a000}, {0x3a86c000}, {0x3a86e000},
- {0x3a870000}, {0x3a872000}, {0x3a874000}, {0x3a876000},
- {0x3a878000}, {0x3a87a000}, {0x3a87c000}, {0x3a87e000},
- {0x3a880000}, {0x3a882000}, {0x3a884000}, {0x3a886000},
- {0x3a888000}, {0x3a88a000}, {0x3a88c000}, {0x3a88e000},
- {0x3a890000}, {0x3a892000}, {0x3a894000}, {0x3a896000},
- {0x3a898000}, {0x3a89a000}, {0x3a89c000}, {0x3a89e000},
- {0x3a8a0000}, {0x3a8a2000}, {0x3a8a4000}, {0x3a8a6000},
- {0x3a8a8000}, {0x3a8aa000}, {0x3a8ac000}, {0x3a8ae000},
- {0x3a8b0000}, {0x3a8b2000}, {0x3a8b4000}, {0x3a8b6000},
- {0x3a8b8000}, {0x3a8ba000}, {0x3a8bc000}, {0x3a8be000},
- {0x3a8c0000}, {0x3a8c2000}, {0x3a8c4000}, {0x3a8c6000},
- {0x3a8c8000}, {0x3a8ca000}, {0x3a8cc000}, {0x3a8ce000},
- {0x3a8d0000}, {0x3a8d2000}, {0x3a8d4000}, {0x3a8d6000},
- {0x3a8d8000}, {0x3a8da000}, {0x3a8dc000}, {0x3a8de000},
- {0x3a8e0000}, {0x3a8e2000}, {0x3a8e4000}, {0x3a8e6000},
- {0x3a8e8000}, {0x3a8ea000}, {0x3a8ec000}, {0x3a8ee000},
- {0x3a8f0000}, {0x3a8f2000}, {0x3a8f4000}, {0x3a8f6000},
- {0x3a8f8000}, {0x3a8fa000}, {0x3a8fc000}, {0x3a8fe000},
- {0x3a900000}, {0x3a902000}, {0x3a904000}, {0x3a906000},
- {0x3a908000}, {0x3a90a000}, {0x3a90c000}, {0x3a90e000},
- {0x3a910000}, {0x3a912000}, {0x3a914000}, {0x3a916000},
- {0x3a918000}, {0x3a91a000}, {0x3a91c000}, {0x3a91e000},
- {0x3a920000}, {0x3a922000}, {0x3a924000}, {0x3a926000},
- {0x3a928000}, {0x3a92a000}, {0x3a92c000}, {0x3a92e000},
- {0x3a930000}, {0x3a932000}, {0x3a934000}, {0x3a936000},
- {0x3a938000}, {0x3a93a000}, {0x3a93c000}, {0x3a93e000},
- {0x3a940000}, {0x3a942000}, {0x3a944000}, {0x3a946000},
- {0x3a948000}, {0x3a94a000}, {0x3a94c000}, {0x3a94e000},
- {0x3a950000}, {0x3a952000}, {0x3a954000}, {0x3a956000},
- {0x3a958000}, {0x3a95a000}, {0x3a95c000}, {0x3a95e000},
- {0x3a960000}, {0x3a962000}, {0x3a964000}, {0x3a966000},
- {0x3a968000}, {0x3a96a000}, {0x3a96c000}, {0x3a96e000},
- {0x3a970000}, {0x3a972000}, {0x3a974000}, {0x3a976000},
- {0x3a978000}, {0x3a97a000}, {0x3a97c000}, {0x3a97e000},
- {0x3a980000}, {0x3a982000}, {0x3a984000}, {0x3a986000},
- {0x3a988000}, {0x3a98a000}, {0x3a98c000}, {0x3a98e000},
- {0x3a990000}, {0x3a992000}, {0x3a994000}, {0x3a996000},
- {0x3a998000}, {0x3a99a000}, {0x3a99c000}, {0x3a99e000},
- {0x3a9a0000}, {0x3a9a2000}, {0x3a9a4000}, {0x3a9a6000},
- {0x3a9a8000}, {0x3a9aa000}, {0x3a9ac000}, {0x3a9ae000},
- {0x3a9b0000}, {0x3a9b2000}, {0x3a9b4000}, {0x3a9b6000},
- {0x3a9b8000}, {0x3a9ba000}, {0x3a9bc000}, {0x3a9be000},
- {0x3a9c0000}, {0x3a9c2000}, {0x3a9c4000}, {0x3a9c6000},
- {0x3a9c8000}, {0x3a9ca000}, {0x3a9cc000}, {0x3a9ce000},
- {0x3a9d0000}, {0x3a9d2000}, {0x3a9d4000}, {0x3a9d6000},
- {0x3a9d8000}, {0x3a9da000}, {0x3a9dc000}, {0x3a9de000},
- {0x3a9e0000}, {0x3a9e2000}, {0x3a9e4000}, {0x3a9e6000},
- {0x3a9e8000}, {0x3a9ea000}, {0x3a9ec000}, {0x3a9ee000},
- {0x3a9f0000}, {0x3a9f2000}, {0x3a9f4000}, {0x3a9f6000},
- {0x3a9f8000}, {0x3a9fa000}, {0x3a9fc000}, {0x3a9fe000},
- {0x3aa00000}, {0x3aa02000}, {0x3aa04000}, {0x3aa06000},
- {0x3aa08000}, {0x3aa0a000}, {0x3aa0c000}, {0x3aa0e000},
- {0x3aa10000}, {0x3aa12000}, {0x3aa14000}, {0x3aa16000},
- {0x3aa18000}, {0x3aa1a000}, {0x3aa1c000}, {0x3aa1e000},
- {0x3aa20000}, {0x3aa22000}, {0x3aa24000}, {0x3aa26000},
- {0x3aa28000}, {0x3aa2a000}, {0x3aa2c000}, {0x3aa2e000},
- {0x3aa30000}, {0x3aa32000}, {0x3aa34000}, {0x3aa36000},
- {0x3aa38000}, {0x3aa3a000}, {0x3aa3c000}, {0x3aa3e000},
- {0x3aa40000}, {0x3aa42000}, {0x3aa44000}, {0x3aa46000},
- {0x3aa48000}, {0x3aa4a000}, {0x3aa4c000}, {0x3aa4e000},
- {0x3aa50000}, {0x3aa52000}, {0x3aa54000}, {0x3aa56000},
- {0x3aa58000}, {0x3aa5a000}, {0x3aa5c000}, {0x3aa5e000},
- {0x3aa60000}, {0x3aa62000}, {0x3aa64000}, {0x3aa66000},
- {0x3aa68000}, {0x3aa6a000}, {0x3aa6c000}, {0x3aa6e000},
- {0x3aa70000}, {0x3aa72000}, {0x3aa74000}, {0x3aa76000},
- {0x3aa78000}, {0x3aa7a000}, {0x3aa7c000}, {0x3aa7e000},
- {0x3aa80000}, {0x3aa82000}, {0x3aa84000}, {0x3aa86000},
- {0x3aa88000}, {0x3aa8a000}, {0x3aa8c000}, {0x3aa8e000},
- {0x3aa90000}, {0x3aa92000}, {0x3aa94000}, {0x3aa96000},
- {0x3aa98000}, {0x3aa9a000}, {0x3aa9c000}, {0x3aa9e000},
- {0x3aaa0000}, {0x3aaa2000}, {0x3aaa4000}, {0x3aaa6000},
- {0x3aaa8000}, {0x3aaaa000}, {0x3aaac000}, {0x3aaae000},
- {0x3aab0000}, {0x3aab2000}, {0x3aab4000}, {0x3aab6000},
- {0x3aab8000}, {0x3aaba000}, {0x3aabc000}, {0x3aabe000},
- {0x3aac0000}, {0x3aac2000}, {0x3aac4000}, {0x3aac6000},
- {0x3aac8000}, {0x3aaca000}, {0x3aacc000}, {0x3aace000},
- {0x3aad0000}, {0x3aad2000}, {0x3aad4000}, {0x3aad6000},
- {0x3aad8000}, {0x3aada000}, {0x3aadc000}, {0x3aade000},
- {0x3aae0000}, {0x3aae2000}, {0x3aae4000}, {0x3aae6000},
- {0x3aae8000}, {0x3aaea000}, {0x3aaec000}, {0x3aaee000},
- {0x3aaf0000}, {0x3aaf2000}, {0x3aaf4000}, {0x3aaf6000},
- {0x3aaf8000}, {0x3aafa000}, {0x3aafc000}, {0x3aafe000},
- {0x3ab00000}, {0x3ab02000}, {0x3ab04000}, {0x3ab06000},
- {0x3ab08000}, {0x3ab0a000}, {0x3ab0c000}, {0x3ab0e000},
- {0x3ab10000}, {0x3ab12000}, {0x3ab14000}, {0x3ab16000},
- {0x3ab18000}, {0x3ab1a000}, {0x3ab1c000}, {0x3ab1e000},
- {0x3ab20000}, {0x3ab22000}, {0x3ab24000}, {0x3ab26000},
- {0x3ab28000}, {0x3ab2a000}, {0x3ab2c000}, {0x3ab2e000},
- {0x3ab30000}, {0x3ab32000}, {0x3ab34000}, {0x3ab36000},
- {0x3ab38000}, {0x3ab3a000}, {0x3ab3c000}, {0x3ab3e000},
- {0x3ab40000}, {0x3ab42000}, {0x3ab44000}, {0x3ab46000},
- {0x3ab48000}, {0x3ab4a000}, {0x3ab4c000}, {0x3ab4e000},
- {0x3ab50000}, {0x3ab52000}, {0x3ab54000}, {0x3ab56000},
- {0x3ab58000}, {0x3ab5a000}, {0x3ab5c000}, {0x3ab5e000},
- {0x3ab60000}, {0x3ab62000}, {0x3ab64000}, {0x3ab66000},
- {0x3ab68000}, {0x3ab6a000}, {0x3ab6c000}, {0x3ab6e000},
- {0x3ab70000}, {0x3ab72000}, {0x3ab74000}, {0x3ab76000},
- {0x3ab78000}, {0x3ab7a000}, {0x3ab7c000}, {0x3ab7e000},
- {0x3ab80000}, {0x3ab82000}, {0x3ab84000}, {0x3ab86000},
- {0x3ab88000}, {0x3ab8a000}, {0x3ab8c000}, {0x3ab8e000},
- {0x3ab90000}, {0x3ab92000}, {0x3ab94000}, {0x3ab96000},
- {0x3ab98000}, {0x3ab9a000}, {0x3ab9c000}, {0x3ab9e000},
- {0x3aba0000}, {0x3aba2000}, {0x3aba4000}, {0x3aba6000},
- {0x3aba8000}, {0x3abaa000}, {0x3abac000}, {0x3abae000},
- {0x3abb0000}, {0x3abb2000}, {0x3abb4000}, {0x3abb6000},
- {0x3abb8000}, {0x3abba000}, {0x3abbc000}, {0x3abbe000},
- {0x3abc0000}, {0x3abc2000}, {0x3abc4000}, {0x3abc6000},
- {0x3abc8000}, {0x3abca000}, {0x3abcc000}, {0x3abce000},
- {0x3abd0000}, {0x3abd2000}, {0x3abd4000}, {0x3abd6000},
- {0x3abd8000}, {0x3abda000}, {0x3abdc000}, {0x3abde000},
- {0x3abe0000}, {0x3abe2000}, {0x3abe4000}, {0x3abe6000},
- {0x3abe8000}, {0x3abea000}, {0x3abec000}, {0x3abee000},
- {0x3abf0000}, {0x3abf2000}, {0x3abf4000}, {0x3abf6000},
- {0x3abf8000}, {0x3abfa000}, {0x3abfc000}, {0x3abfe000},
- {0x3ac00000}, {0x3ac02000}, {0x3ac04000}, {0x3ac06000},
- {0x3ac08000}, {0x3ac0a000}, {0x3ac0c000}, {0x3ac0e000},
- {0x3ac10000}, {0x3ac12000}, {0x3ac14000}, {0x3ac16000},
- {0x3ac18000}, {0x3ac1a000}, {0x3ac1c000}, {0x3ac1e000},
- {0x3ac20000}, {0x3ac22000}, {0x3ac24000}, {0x3ac26000},
- {0x3ac28000}, {0x3ac2a000}, {0x3ac2c000}, {0x3ac2e000},
- {0x3ac30000}, {0x3ac32000}, {0x3ac34000}, {0x3ac36000},
- {0x3ac38000}, {0x3ac3a000}, {0x3ac3c000}, {0x3ac3e000},
- {0x3ac40000}, {0x3ac42000}, {0x3ac44000}, {0x3ac46000},
- {0x3ac48000}, {0x3ac4a000}, {0x3ac4c000}, {0x3ac4e000},
- {0x3ac50000}, {0x3ac52000}, {0x3ac54000}, {0x3ac56000},
- {0x3ac58000}, {0x3ac5a000}, {0x3ac5c000}, {0x3ac5e000},
- {0x3ac60000}, {0x3ac62000}, {0x3ac64000}, {0x3ac66000},
- {0x3ac68000}, {0x3ac6a000}, {0x3ac6c000}, {0x3ac6e000},
- {0x3ac70000}, {0x3ac72000}, {0x3ac74000}, {0x3ac76000},
- {0x3ac78000}, {0x3ac7a000}, {0x3ac7c000}, {0x3ac7e000},
- {0x3ac80000}, {0x3ac82000}, {0x3ac84000}, {0x3ac86000},
- {0x3ac88000}, {0x3ac8a000}, {0x3ac8c000}, {0x3ac8e000},
- {0x3ac90000}, {0x3ac92000}, {0x3ac94000}, {0x3ac96000},
- {0x3ac98000}, {0x3ac9a000}, {0x3ac9c000}, {0x3ac9e000},
- {0x3aca0000}, {0x3aca2000}, {0x3aca4000}, {0x3aca6000},
- {0x3aca8000}, {0x3acaa000}, {0x3acac000}, {0x3acae000},
- {0x3acb0000}, {0x3acb2000}, {0x3acb4000}, {0x3acb6000},
- {0x3acb8000}, {0x3acba000}, {0x3acbc000}, {0x3acbe000},
- {0x3acc0000}, {0x3acc2000}, {0x3acc4000}, {0x3acc6000},
- {0x3acc8000}, {0x3acca000}, {0x3accc000}, {0x3acce000},
- {0x3acd0000}, {0x3acd2000}, {0x3acd4000}, {0x3acd6000},
- {0x3acd8000}, {0x3acda000}, {0x3acdc000}, {0x3acde000},
- {0x3ace0000}, {0x3ace2000}, {0x3ace4000}, {0x3ace6000},
- {0x3ace8000}, {0x3acea000}, {0x3acec000}, {0x3acee000},
- {0x3acf0000}, {0x3acf2000}, {0x3acf4000}, {0x3acf6000},
- {0x3acf8000}, {0x3acfa000}, {0x3acfc000}, {0x3acfe000},
- {0x3ad00000}, {0x3ad02000}, {0x3ad04000}, {0x3ad06000},
- {0x3ad08000}, {0x3ad0a000}, {0x3ad0c000}, {0x3ad0e000},
- {0x3ad10000}, {0x3ad12000}, {0x3ad14000}, {0x3ad16000},
- {0x3ad18000}, {0x3ad1a000}, {0x3ad1c000}, {0x3ad1e000},
- {0x3ad20000}, {0x3ad22000}, {0x3ad24000}, {0x3ad26000},
- {0x3ad28000}, {0x3ad2a000}, {0x3ad2c000}, {0x3ad2e000},
- {0x3ad30000}, {0x3ad32000}, {0x3ad34000}, {0x3ad36000},
- {0x3ad38000}, {0x3ad3a000}, {0x3ad3c000}, {0x3ad3e000},
- {0x3ad40000}, {0x3ad42000}, {0x3ad44000}, {0x3ad46000},
- {0x3ad48000}, {0x3ad4a000}, {0x3ad4c000}, {0x3ad4e000},
- {0x3ad50000}, {0x3ad52000}, {0x3ad54000}, {0x3ad56000},
- {0x3ad58000}, {0x3ad5a000}, {0x3ad5c000}, {0x3ad5e000},
- {0x3ad60000}, {0x3ad62000}, {0x3ad64000}, {0x3ad66000},
- {0x3ad68000}, {0x3ad6a000}, {0x3ad6c000}, {0x3ad6e000},
- {0x3ad70000}, {0x3ad72000}, {0x3ad74000}, {0x3ad76000},
- {0x3ad78000}, {0x3ad7a000}, {0x3ad7c000}, {0x3ad7e000},
- {0x3ad80000}, {0x3ad82000}, {0x3ad84000}, {0x3ad86000},
- {0x3ad88000}, {0x3ad8a000}, {0x3ad8c000}, {0x3ad8e000},
- {0x3ad90000}, {0x3ad92000}, {0x3ad94000}, {0x3ad96000},
- {0x3ad98000}, {0x3ad9a000}, {0x3ad9c000}, {0x3ad9e000},
- {0x3ada0000}, {0x3ada2000}, {0x3ada4000}, {0x3ada6000},
- {0x3ada8000}, {0x3adaa000}, {0x3adac000}, {0x3adae000},
- {0x3adb0000}, {0x3adb2000}, {0x3adb4000}, {0x3adb6000},
- {0x3adb8000}, {0x3adba000}, {0x3adbc000}, {0x3adbe000},
- {0x3adc0000}, {0x3adc2000}, {0x3adc4000}, {0x3adc6000},
- {0x3adc8000}, {0x3adca000}, {0x3adcc000}, {0x3adce000},
- {0x3add0000}, {0x3add2000}, {0x3add4000}, {0x3add6000},
- {0x3add8000}, {0x3adda000}, {0x3addc000}, {0x3adde000},
- {0x3ade0000}, {0x3ade2000}, {0x3ade4000}, {0x3ade6000},
- {0x3ade8000}, {0x3adea000}, {0x3adec000}, {0x3adee000},
- {0x3adf0000}, {0x3adf2000}, {0x3adf4000}, {0x3adf6000},
- {0x3adf8000}, {0x3adfa000}, {0x3adfc000}, {0x3adfe000},
- {0x3ae00000}, {0x3ae02000}, {0x3ae04000}, {0x3ae06000},
- {0x3ae08000}, {0x3ae0a000}, {0x3ae0c000}, {0x3ae0e000},
- {0x3ae10000}, {0x3ae12000}, {0x3ae14000}, {0x3ae16000},
- {0x3ae18000}, {0x3ae1a000}, {0x3ae1c000}, {0x3ae1e000},
- {0x3ae20000}, {0x3ae22000}, {0x3ae24000}, {0x3ae26000},
- {0x3ae28000}, {0x3ae2a000}, {0x3ae2c000}, {0x3ae2e000},
- {0x3ae30000}, {0x3ae32000}, {0x3ae34000}, {0x3ae36000},
- {0x3ae38000}, {0x3ae3a000}, {0x3ae3c000}, {0x3ae3e000},
- {0x3ae40000}, {0x3ae42000}, {0x3ae44000}, {0x3ae46000},
- {0x3ae48000}, {0x3ae4a000}, {0x3ae4c000}, {0x3ae4e000},
- {0x3ae50000}, {0x3ae52000}, {0x3ae54000}, {0x3ae56000},
- {0x3ae58000}, {0x3ae5a000}, {0x3ae5c000}, {0x3ae5e000},
- {0x3ae60000}, {0x3ae62000}, {0x3ae64000}, {0x3ae66000},
- {0x3ae68000}, {0x3ae6a000}, {0x3ae6c000}, {0x3ae6e000},
- {0x3ae70000}, {0x3ae72000}, {0x3ae74000}, {0x3ae76000},
- {0x3ae78000}, {0x3ae7a000}, {0x3ae7c000}, {0x3ae7e000},
- {0x3ae80000}, {0x3ae82000}, {0x3ae84000}, {0x3ae86000},
- {0x3ae88000}, {0x3ae8a000}, {0x3ae8c000}, {0x3ae8e000},
- {0x3ae90000}, {0x3ae92000}, {0x3ae94000}, {0x3ae96000},
- {0x3ae98000}, {0x3ae9a000}, {0x3ae9c000}, {0x3ae9e000},
- {0x3aea0000}, {0x3aea2000}, {0x3aea4000}, {0x3aea6000},
- {0x3aea8000}, {0x3aeaa000}, {0x3aeac000}, {0x3aeae000},
- {0x3aeb0000}, {0x3aeb2000}, {0x3aeb4000}, {0x3aeb6000},
- {0x3aeb8000}, {0x3aeba000}, {0x3aebc000}, {0x3aebe000},
- {0x3aec0000}, {0x3aec2000}, {0x3aec4000}, {0x3aec6000},
- {0x3aec8000}, {0x3aeca000}, {0x3aecc000}, {0x3aece000},
- {0x3aed0000}, {0x3aed2000}, {0x3aed4000}, {0x3aed6000},
- {0x3aed8000}, {0x3aeda000}, {0x3aedc000}, {0x3aede000},
- {0x3aee0000}, {0x3aee2000}, {0x3aee4000}, {0x3aee6000},
- {0x3aee8000}, {0x3aeea000}, {0x3aeec000}, {0x3aeee000},
- {0x3aef0000}, {0x3aef2000}, {0x3aef4000}, {0x3aef6000},
- {0x3aef8000}, {0x3aefa000}, {0x3aefc000}, {0x3aefe000},
- {0x3af00000}, {0x3af02000}, {0x3af04000}, {0x3af06000},
- {0x3af08000}, {0x3af0a000}, {0x3af0c000}, {0x3af0e000},
- {0x3af10000}, {0x3af12000}, {0x3af14000}, {0x3af16000},
- {0x3af18000}, {0x3af1a000}, {0x3af1c000}, {0x3af1e000},
- {0x3af20000}, {0x3af22000}, {0x3af24000}, {0x3af26000},
- {0x3af28000}, {0x3af2a000}, {0x3af2c000}, {0x3af2e000},
- {0x3af30000}, {0x3af32000}, {0x3af34000}, {0x3af36000},
- {0x3af38000}, {0x3af3a000}, {0x3af3c000}, {0x3af3e000},
- {0x3af40000}, {0x3af42000}, {0x3af44000}, {0x3af46000},
- {0x3af48000}, {0x3af4a000}, {0x3af4c000}, {0x3af4e000},
- {0x3af50000}, {0x3af52000}, {0x3af54000}, {0x3af56000},
- {0x3af58000}, {0x3af5a000}, {0x3af5c000}, {0x3af5e000},
- {0x3af60000}, {0x3af62000}, {0x3af64000}, {0x3af66000},
- {0x3af68000}, {0x3af6a000}, {0x3af6c000}, {0x3af6e000},
- {0x3af70000}, {0x3af72000}, {0x3af74000}, {0x3af76000},
- {0x3af78000}, {0x3af7a000}, {0x3af7c000}, {0x3af7e000},
- {0x3af80000}, {0x3af82000}, {0x3af84000}, {0x3af86000},
- {0x3af88000}, {0x3af8a000}, {0x3af8c000}, {0x3af8e000},
- {0x3af90000}, {0x3af92000}, {0x3af94000}, {0x3af96000},
- {0x3af98000}, {0x3af9a000}, {0x3af9c000}, {0x3af9e000},
- {0x3afa0000}, {0x3afa2000}, {0x3afa4000}, {0x3afa6000},
- {0x3afa8000}, {0x3afaa000}, {0x3afac000}, {0x3afae000},
- {0x3afb0000}, {0x3afb2000}, {0x3afb4000}, {0x3afb6000},
- {0x3afb8000}, {0x3afba000}, {0x3afbc000}, {0x3afbe000},
- {0x3afc0000}, {0x3afc2000}, {0x3afc4000}, {0x3afc6000},
- {0x3afc8000}, {0x3afca000}, {0x3afcc000}, {0x3afce000},
- {0x3afd0000}, {0x3afd2000}, {0x3afd4000}, {0x3afd6000},
- {0x3afd8000}, {0x3afda000}, {0x3afdc000}, {0x3afde000},
- {0x3afe0000}, {0x3afe2000}, {0x3afe4000}, {0x3afe6000},
- {0x3afe8000}, {0x3afea000}, {0x3afec000}, {0x3afee000},
- {0x3aff0000}, {0x3aff2000}, {0x3aff4000}, {0x3aff6000},
- {0x3aff8000}, {0x3affa000}, {0x3affc000}, {0x3affe000},
- {0x3b000000}, {0x3b002000}, {0x3b004000}, {0x3b006000},
- {0x3b008000}, {0x3b00a000}, {0x3b00c000}, {0x3b00e000},
- {0x3b010000}, {0x3b012000}, {0x3b014000}, {0x3b016000},
- {0x3b018000}, {0x3b01a000}, {0x3b01c000}, {0x3b01e000},
- {0x3b020000}, {0x3b022000}, {0x3b024000}, {0x3b026000},
- {0x3b028000}, {0x3b02a000}, {0x3b02c000}, {0x3b02e000},
- {0x3b030000}, {0x3b032000}, {0x3b034000}, {0x3b036000},
- {0x3b038000}, {0x3b03a000}, {0x3b03c000}, {0x3b03e000},
- {0x3b040000}, {0x3b042000}, {0x3b044000}, {0x3b046000},
- {0x3b048000}, {0x3b04a000}, {0x3b04c000}, {0x3b04e000},
- {0x3b050000}, {0x3b052000}, {0x3b054000}, {0x3b056000},
- {0x3b058000}, {0x3b05a000}, {0x3b05c000}, {0x3b05e000},
- {0x3b060000}, {0x3b062000}, {0x3b064000}, {0x3b066000},
- {0x3b068000}, {0x3b06a000}, {0x3b06c000}, {0x3b06e000},
- {0x3b070000}, {0x3b072000}, {0x3b074000}, {0x3b076000},
- {0x3b078000}, {0x3b07a000}, {0x3b07c000}, {0x3b07e000},
- {0x3b080000}, {0x3b082000}, {0x3b084000}, {0x3b086000},
- {0x3b088000}, {0x3b08a000}, {0x3b08c000}, {0x3b08e000},
- {0x3b090000}, {0x3b092000}, {0x3b094000}, {0x3b096000},
- {0x3b098000}, {0x3b09a000}, {0x3b09c000}, {0x3b09e000},
- {0x3b0a0000}, {0x3b0a2000}, {0x3b0a4000}, {0x3b0a6000},
- {0x3b0a8000}, {0x3b0aa000}, {0x3b0ac000}, {0x3b0ae000},
- {0x3b0b0000}, {0x3b0b2000}, {0x3b0b4000}, {0x3b0b6000},
- {0x3b0b8000}, {0x3b0ba000}, {0x3b0bc000}, {0x3b0be000},
- {0x3b0c0000}, {0x3b0c2000}, {0x3b0c4000}, {0x3b0c6000},
- {0x3b0c8000}, {0x3b0ca000}, {0x3b0cc000}, {0x3b0ce000},
- {0x3b0d0000}, {0x3b0d2000}, {0x3b0d4000}, {0x3b0d6000},
- {0x3b0d8000}, {0x3b0da000}, {0x3b0dc000}, {0x3b0de000},
- {0x3b0e0000}, {0x3b0e2000}, {0x3b0e4000}, {0x3b0e6000},
- {0x3b0e8000}, {0x3b0ea000}, {0x3b0ec000}, {0x3b0ee000},
- {0x3b0f0000}, {0x3b0f2000}, {0x3b0f4000}, {0x3b0f6000},
- {0x3b0f8000}, {0x3b0fa000}, {0x3b0fc000}, {0x3b0fe000},
- {0x3b100000}, {0x3b102000}, {0x3b104000}, {0x3b106000},
- {0x3b108000}, {0x3b10a000}, {0x3b10c000}, {0x3b10e000},
- {0x3b110000}, {0x3b112000}, {0x3b114000}, {0x3b116000},
- {0x3b118000}, {0x3b11a000}, {0x3b11c000}, {0x3b11e000},
- {0x3b120000}, {0x3b122000}, {0x3b124000}, {0x3b126000},
- {0x3b128000}, {0x3b12a000}, {0x3b12c000}, {0x3b12e000},
- {0x3b130000}, {0x3b132000}, {0x3b134000}, {0x3b136000},
- {0x3b138000}, {0x3b13a000}, {0x3b13c000}, {0x3b13e000},
- {0x3b140000}, {0x3b142000}, {0x3b144000}, {0x3b146000},
- {0x3b148000}, {0x3b14a000}, {0x3b14c000}, {0x3b14e000},
- {0x3b150000}, {0x3b152000}, {0x3b154000}, {0x3b156000},
- {0x3b158000}, {0x3b15a000}, {0x3b15c000}, {0x3b15e000},
- {0x3b160000}, {0x3b162000}, {0x3b164000}, {0x3b166000},
- {0x3b168000}, {0x3b16a000}, {0x3b16c000}, {0x3b16e000},
- {0x3b170000}, {0x3b172000}, {0x3b174000}, {0x3b176000},
- {0x3b178000}, {0x3b17a000}, {0x3b17c000}, {0x3b17e000},
- {0x3b180000}, {0x3b182000}, {0x3b184000}, {0x3b186000},
- {0x3b188000}, {0x3b18a000}, {0x3b18c000}, {0x3b18e000},
- {0x3b190000}, {0x3b192000}, {0x3b194000}, {0x3b196000},
- {0x3b198000}, {0x3b19a000}, {0x3b19c000}, {0x3b19e000},
- {0x3b1a0000}, {0x3b1a2000}, {0x3b1a4000}, {0x3b1a6000},
- {0x3b1a8000}, {0x3b1aa000}, {0x3b1ac000}, {0x3b1ae000},
- {0x3b1b0000}, {0x3b1b2000}, {0x3b1b4000}, {0x3b1b6000},
- {0x3b1b8000}, {0x3b1ba000}, {0x3b1bc000}, {0x3b1be000},
- {0x3b1c0000}, {0x3b1c2000}, {0x3b1c4000}, {0x3b1c6000},
- {0x3b1c8000}, {0x3b1ca000}, {0x3b1cc000}, {0x3b1ce000},
- {0x3b1d0000}, {0x3b1d2000}, {0x3b1d4000}, {0x3b1d6000},
- {0x3b1d8000}, {0x3b1da000}, {0x3b1dc000}, {0x3b1de000},
- {0x3b1e0000}, {0x3b1e2000}, {0x3b1e4000}, {0x3b1e6000},
- {0x3b1e8000}, {0x3b1ea000}, {0x3b1ec000}, {0x3b1ee000},
- {0x3b1f0000}, {0x3b1f2000}, {0x3b1f4000}, {0x3b1f6000},
- {0x3b1f8000}, {0x3b1fa000}, {0x3b1fc000}, {0x3b1fe000},
- {0x3b200000}, {0x3b202000}, {0x3b204000}, {0x3b206000},
- {0x3b208000}, {0x3b20a000}, {0x3b20c000}, {0x3b20e000},
- {0x3b210000}, {0x3b212000}, {0x3b214000}, {0x3b216000},
- {0x3b218000}, {0x3b21a000}, {0x3b21c000}, {0x3b21e000},
- {0x3b220000}, {0x3b222000}, {0x3b224000}, {0x3b226000},
- {0x3b228000}, {0x3b22a000}, {0x3b22c000}, {0x3b22e000},
- {0x3b230000}, {0x3b232000}, {0x3b234000}, {0x3b236000},
- {0x3b238000}, {0x3b23a000}, {0x3b23c000}, {0x3b23e000},
- {0x3b240000}, {0x3b242000}, {0x3b244000}, {0x3b246000},
- {0x3b248000}, {0x3b24a000}, {0x3b24c000}, {0x3b24e000},
- {0x3b250000}, {0x3b252000}, {0x3b254000}, {0x3b256000},
- {0x3b258000}, {0x3b25a000}, {0x3b25c000}, {0x3b25e000},
- {0x3b260000}, {0x3b262000}, {0x3b264000}, {0x3b266000},
- {0x3b268000}, {0x3b26a000}, {0x3b26c000}, {0x3b26e000},
- {0x3b270000}, {0x3b272000}, {0x3b274000}, {0x3b276000},
- {0x3b278000}, {0x3b27a000}, {0x3b27c000}, {0x3b27e000},
- {0x3b280000}, {0x3b282000}, {0x3b284000}, {0x3b286000},
- {0x3b288000}, {0x3b28a000}, {0x3b28c000}, {0x3b28e000},
- {0x3b290000}, {0x3b292000}, {0x3b294000}, {0x3b296000},
- {0x3b298000}, {0x3b29a000}, {0x3b29c000}, {0x3b29e000},
- {0x3b2a0000}, {0x3b2a2000}, {0x3b2a4000}, {0x3b2a6000},
- {0x3b2a8000}, {0x3b2aa000}, {0x3b2ac000}, {0x3b2ae000},
- {0x3b2b0000}, {0x3b2b2000}, {0x3b2b4000}, {0x3b2b6000},
- {0x3b2b8000}, {0x3b2ba000}, {0x3b2bc000}, {0x3b2be000},
- {0x3b2c0000}, {0x3b2c2000}, {0x3b2c4000}, {0x3b2c6000},
- {0x3b2c8000}, {0x3b2ca000}, {0x3b2cc000}, {0x3b2ce000},
- {0x3b2d0000}, {0x3b2d2000}, {0x3b2d4000}, {0x3b2d6000},
- {0x3b2d8000}, {0x3b2da000}, {0x3b2dc000}, {0x3b2de000},
- {0x3b2e0000}, {0x3b2e2000}, {0x3b2e4000}, {0x3b2e6000},
- {0x3b2e8000}, {0x3b2ea000}, {0x3b2ec000}, {0x3b2ee000},
- {0x3b2f0000}, {0x3b2f2000}, {0x3b2f4000}, {0x3b2f6000},
- {0x3b2f8000}, {0x3b2fa000}, {0x3b2fc000}, {0x3b2fe000},
- {0x3b300000}, {0x3b302000}, {0x3b304000}, {0x3b306000},
- {0x3b308000}, {0x3b30a000}, {0x3b30c000}, {0x3b30e000},
- {0x3b310000}, {0x3b312000}, {0x3b314000}, {0x3b316000},
- {0x3b318000}, {0x3b31a000}, {0x3b31c000}, {0x3b31e000},
- {0x3b320000}, {0x3b322000}, {0x3b324000}, {0x3b326000},
- {0x3b328000}, {0x3b32a000}, {0x3b32c000}, {0x3b32e000},
- {0x3b330000}, {0x3b332000}, {0x3b334000}, {0x3b336000},
- {0x3b338000}, {0x3b33a000}, {0x3b33c000}, {0x3b33e000},
- {0x3b340000}, {0x3b342000}, {0x3b344000}, {0x3b346000},
- {0x3b348000}, {0x3b34a000}, {0x3b34c000}, {0x3b34e000},
- {0x3b350000}, {0x3b352000}, {0x3b354000}, {0x3b356000},
- {0x3b358000}, {0x3b35a000}, {0x3b35c000}, {0x3b35e000},
- {0x3b360000}, {0x3b362000}, {0x3b364000}, {0x3b366000},
- {0x3b368000}, {0x3b36a000}, {0x3b36c000}, {0x3b36e000},
- {0x3b370000}, {0x3b372000}, {0x3b374000}, {0x3b376000},
- {0x3b378000}, {0x3b37a000}, {0x3b37c000}, {0x3b37e000},
- {0x3b380000}, {0x3b382000}, {0x3b384000}, {0x3b386000},
- {0x3b388000}, {0x3b38a000}, {0x3b38c000}, {0x3b38e000},
- {0x3b390000}, {0x3b392000}, {0x3b394000}, {0x3b396000},
- {0x3b398000}, {0x3b39a000}, {0x3b39c000}, {0x3b39e000},
- {0x3b3a0000}, {0x3b3a2000}, {0x3b3a4000}, {0x3b3a6000},
- {0x3b3a8000}, {0x3b3aa000}, {0x3b3ac000}, {0x3b3ae000},
- {0x3b3b0000}, {0x3b3b2000}, {0x3b3b4000}, {0x3b3b6000},
- {0x3b3b8000}, {0x3b3ba000}, {0x3b3bc000}, {0x3b3be000},
- {0x3b3c0000}, {0x3b3c2000}, {0x3b3c4000}, {0x3b3c6000},
- {0x3b3c8000}, {0x3b3ca000}, {0x3b3cc000}, {0x3b3ce000},
- {0x3b3d0000}, {0x3b3d2000}, {0x3b3d4000}, {0x3b3d6000},
- {0x3b3d8000}, {0x3b3da000}, {0x3b3dc000}, {0x3b3de000},
- {0x3b3e0000}, {0x3b3e2000}, {0x3b3e4000}, {0x3b3e6000},
- {0x3b3e8000}, {0x3b3ea000}, {0x3b3ec000}, {0x3b3ee000},
- {0x3b3f0000}, {0x3b3f2000}, {0x3b3f4000}, {0x3b3f6000},
- {0x3b3f8000}, {0x3b3fa000}, {0x3b3fc000}, {0x3b3fe000},
- {0x3b400000}, {0x3b402000}, {0x3b404000}, {0x3b406000},
- {0x3b408000}, {0x3b40a000}, {0x3b40c000}, {0x3b40e000},
- {0x3b410000}, {0x3b412000}, {0x3b414000}, {0x3b416000},
- {0x3b418000}, {0x3b41a000}, {0x3b41c000}, {0x3b41e000},
- {0x3b420000}, {0x3b422000}, {0x3b424000}, {0x3b426000},
- {0x3b428000}, {0x3b42a000}, {0x3b42c000}, {0x3b42e000},
- {0x3b430000}, {0x3b432000}, {0x3b434000}, {0x3b436000},
- {0x3b438000}, {0x3b43a000}, {0x3b43c000}, {0x3b43e000},
- {0x3b440000}, {0x3b442000}, {0x3b444000}, {0x3b446000},
- {0x3b448000}, {0x3b44a000}, {0x3b44c000}, {0x3b44e000},
- {0x3b450000}, {0x3b452000}, {0x3b454000}, {0x3b456000},
- {0x3b458000}, {0x3b45a000}, {0x3b45c000}, {0x3b45e000},
- {0x3b460000}, {0x3b462000}, {0x3b464000}, {0x3b466000},
- {0x3b468000}, {0x3b46a000}, {0x3b46c000}, {0x3b46e000},
- {0x3b470000}, {0x3b472000}, {0x3b474000}, {0x3b476000},
- {0x3b478000}, {0x3b47a000}, {0x3b47c000}, {0x3b47e000},
- {0x3b480000}, {0x3b482000}, {0x3b484000}, {0x3b486000},
- {0x3b488000}, {0x3b48a000}, {0x3b48c000}, {0x3b48e000},
- {0x3b490000}, {0x3b492000}, {0x3b494000}, {0x3b496000},
- {0x3b498000}, {0x3b49a000}, {0x3b49c000}, {0x3b49e000},
- {0x3b4a0000}, {0x3b4a2000}, {0x3b4a4000}, {0x3b4a6000},
- {0x3b4a8000}, {0x3b4aa000}, {0x3b4ac000}, {0x3b4ae000},
- {0x3b4b0000}, {0x3b4b2000}, {0x3b4b4000}, {0x3b4b6000},
- {0x3b4b8000}, {0x3b4ba000}, {0x3b4bc000}, {0x3b4be000},
- {0x3b4c0000}, {0x3b4c2000}, {0x3b4c4000}, {0x3b4c6000},
- {0x3b4c8000}, {0x3b4ca000}, {0x3b4cc000}, {0x3b4ce000},
- {0x3b4d0000}, {0x3b4d2000}, {0x3b4d4000}, {0x3b4d6000},
- {0x3b4d8000}, {0x3b4da000}, {0x3b4dc000}, {0x3b4de000},
- {0x3b4e0000}, {0x3b4e2000}, {0x3b4e4000}, {0x3b4e6000},
- {0x3b4e8000}, {0x3b4ea000}, {0x3b4ec000}, {0x3b4ee000},
- {0x3b4f0000}, {0x3b4f2000}, {0x3b4f4000}, {0x3b4f6000},
- {0x3b4f8000}, {0x3b4fa000}, {0x3b4fc000}, {0x3b4fe000},
- {0x3b500000}, {0x3b502000}, {0x3b504000}, {0x3b506000},
- {0x3b508000}, {0x3b50a000}, {0x3b50c000}, {0x3b50e000},
- {0x3b510000}, {0x3b512000}, {0x3b514000}, {0x3b516000},
- {0x3b518000}, {0x3b51a000}, {0x3b51c000}, {0x3b51e000},
- {0x3b520000}, {0x3b522000}, {0x3b524000}, {0x3b526000},
- {0x3b528000}, {0x3b52a000}, {0x3b52c000}, {0x3b52e000},
- {0x3b530000}, {0x3b532000}, {0x3b534000}, {0x3b536000},
- {0x3b538000}, {0x3b53a000}, {0x3b53c000}, {0x3b53e000},
- {0x3b540000}, {0x3b542000}, {0x3b544000}, {0x3b546000},
- {0x3b548000}, {0x3b54a000}, {0x3b54c000}, {0x3b54e000},
- {0x3b550000}, {0x3b552000}, {0x3b554000}, {0x3b556000},
- {0x3b558000}, {0x3b55a000}, {0x3b55c000}, {0x3b55e000},
- {0x3b560000}, {0x3b562000}, {0x3b564000}, {0x3b566000},
- {0x3b568000}, {0x3b56a000}, {0x3b56c000}, {0x3b56e000},
- {0x3b570000}, {0x3b572000}, {0x3b574000}, {0x3b576000},
- {0x3b578000}, {0x3b57a000}, {0x3b57c000}, {0x3b57e000},
- {0x3b580000}, {0x3b582000}, {0x3b584000}, {0x3b586000},
- {0x3b588000}, {0x3b58a000}, {0x3b58c000}, {0x3b58e000},
- {0x3b590000}, {0x3b592000}, {0x3b594000}, {0x3b596000},
- {0x3b598000}, {0x3b59a000}, {0x3b59c000}, {0x3b59e000},
- {0x3b5a0000}, {0x3b5a2000}, {0x3b5a4000}, {0x3b5a6000},
- {0x3b5a8000}, {0x3b5aa000}, {0x3b5ac000}, {0x3b5ae000},
- {0x3b5b0000}, {0x3b5b2000}, {0x3b5b4000}, {0x3b5b6000},
- {0x3b5b8000}, {0x3b5ba000}, {0x3b5bc000}, {0x3b5be000},
- {0x3b5c0000}, {0x3b5c2000}, {0x3b5c4000}, {0x3b5c6000},
- {0x3b5c8000}, {0x3b5ca000}, {0x3b5cc000}, {0x3b5ce000},
- {0x3b5d0000}, {0x3b5d2000}, {0x3b5d4000}, {0x3b5d6000},
- {0x3b5d8000}, {0x3b5da000}, {0x3b5dc000}, {0x3b5de000},
- {0x3b5e0000}, {0x3b5e2000}, {0x3b5e4000}, {0x3b5e6000},
- {0x3b5e8000}, {0x3b5ea000}, {0x3b5ec000}, {0x3b5ee000},
- {0x3b5f0000}, {0x3b5f2000}, {0x3b5f4000}, {0x3b5f6000},
- {0x3b5f8000}, {0x3b5fa000}, {0x3b5fc000}, {0x3b5fe000},
- {0x3b600000}, {0x3b602000}, {0x3b604000}, {0x3b606000},
- {0x3b608000}, {0x3b60a000}, {0x3b60c000}, {0x3b60e000},
- {0x3b610000}, {0x3b612000}, {0x3b614000}, {0x3b616000},
- {0x3b618000}, {0x3b61a000}, {0x3b61c000}, {0x3b61e000},
- {0x3b620000}, {0x3b622000}, {0x3b624000}, {0x3b626000},
- {0x3b628000}, {0x3b62a000}, {0x3b62c000}, {0x3b62e000},
- {0x3b630000}, {0x3b632000}, {0x3b634000}, {0x3b636000},
- {0x3b638000}, {0x3b63a000}, {0x3b63c000}, {0x3b63e000},
- {0x3b640000}, {0x3b642000}, {0x3b644000}, {0x3b646000},
- {0x3b648000}, {0x3b64a000}, {0x3b64c000}, {0x3b64e000},
- {0x3b650000}, {0x3b652000}, {0x3b654000}, {0x3b656000},
- {0x3b658000}, {0x3b65a000}, {0x3b65c000}, {0x3b65e000},
- {0x3b660000}, {0x3b662000}, {0x3b664000}, {0x3b666000},
- {0x3b668000}, {0x3b66a000}, {0x3b66c000}, {0x3b66e000},
- {0x3b670000}, {0x3b672000}, {0x3b674000}, {0x3b676000},
- {0x3b678000}, {0x3b67a000}, {0x3b67c000}, {0x3b67e000},
- {0x3b680000}, {0x3b682000}, {0x3b684000}, {0x3b686000},
- {0x3b688000}, {0x3b68a000}, {0x3b68c000}, {0x3b68e000},
- {0x3b690000}, {0x3b692000}, {0x3b694000}, {0x3b696000},
- {0x3b698000}, {0x3b69a000}, {0x3b69c000}, {0x3b69e000},
- {0x3b6a0000}, {0x3b6a2000}, {0x3b6a4000}, {0x3b6a6000},
- {0x3b6a8000}, {0x3b6aa000}, {0x3b6ac000}, {0x3b6ae000},
- {0x3b6b0000}, {0x3b6b2000}, {0x3b6b4000}, {0x3b6b6000},
- {0x3b6b8000}, {0x3b6ba000}, {0x3b6bc000}, {0x3b6be000},
- {0x3b6c0000}, {0x3b6c2000}, {0x3b6c4000}, {0x3b6c6000},
- {0x3b6c8000}, {0x3b6ca000}, {0x3b6cc000}, {0x3b6ce000},
- {0x3b6d0000}, {0x3b6d2000}, {0x3b6d4000}, {0x3b6d6000},
- {0x3b6d8000}, {0x3b6da000}, {0x3b6dc000}, {0x3b6de000},
- {0x3b6e0000}, {0x3b6e2000}, {0x3b6e4000}, {0x3b6e6000},
- {0x3b6e8000}, {0x3b6ea000}, {0x3b6ec000}, {0x3b6ee000},
- {0x3b6f0000}, {0x3b6f2000}, {0x3b6f4000}, {0x3b6f6000},
- {0x3b6f8000}, {0x3b6fa000}, {0x3b6fc000}, {0x3b6fe000},
- {0x3b700000}, {0x3b702000}, {0x3b704000}, {0x3b706000},
- {0x3b708000}, {0x3b70a000}, {0x3b70c000}, {0x3b70e000},
- {0x3b710000}, {0x3b712000}, {0x3b714000}, {0x3b716000},
- {0x3b718000}, {0x3b71a000}, {0x3b71c000}, {0x3b71e000},
- {0x3b720000}, {0x3b722000}, {0x3b724000}, {0x3b726000},
- {0x3b728000}, {0x3b72a000}, {0x3b72c000}, {0x3b72e000},
- {0x3b730000}, {0x3b732000}, {0x3b734000}, {0x3b736000},
- {0x3b738000}, {0x3b73a000}, {0x3b73c000}, {0x3b73e000},
- {0x3b740000}, {0x3b742000}, {0x3b744000}, {0x3b746000},
- {0x3b748000}, {0x3b74a000}, {0x3b74c000}, {0x3b74e000},
- {0x3b750000}, {0x3b752000}, {0x3b754000}, {0x3b756000},
- {0x3b758000}, {0x3b75a000}, {0x3b75c000}, {0x3b75e000},
- {0x3b760000}, {0x3b762000}, {0x3b764000}, {0x3b766000},
- {0x3b768000}, {0x3b76a000}, {0x3b76c000}, {0x3b76e000},
- {0x3b770000}, {0x3b772000}, {0x3b774000}, {0x3b776000},
- {0x3b778000}, {0x3b77a000}, {0x3b77c000}, {0x3b77e000},
- {0x3b780000}, {0x3b782000}, {0x3b784000}, {0x3b786000},
- {0x3b788000}, {0x3b78a000}, {0x3b78c000}, {0x3b78e000},
- {0x3b790000}, {0x3b792000}, {0x3b794000}, {0x3b796000},
- {0x3b798000}, {0x3b79a000}, {0x3b79c000}, {0x3b79e000},
- {0x3b7a0000}, {0x3b7a2000}, {0x3b7a4000}, {0x3b7a6000},
- {0x3b7a8000}, {0x3b7aa000}, {0x3b7ac000}, {0x3b7ae000},
- {0x3b7b0000}, {0x3b7b2000}, {0x3b7b4000}, {0x3b7b6000},
- {0x3b7b8000}, {0x3b7ba000}, {0x3b7bc000}, {0x3b7be000},
- {0x3b7c0000}, {0x3b7c2000}, {0x3b7c4000}, {0x3b7c6000},
- {0x3b7c8000}, {0x3b7ca000}, {0x3b7cc000}, {0x3b7ce000},
- {0x3b7d0000}, {0x3b7d2000}, {0x3b7d4000}, {0x3b7d6000},
- {0x3b7d8000}, {0x3b7da000}, {0x3b7dc000}, {0x3b7de000},
- {0x3b7e0000}, {0x3b7e2000}, {0x3b7e4000}, {0x3b7e6000},
- {0x3b7e8000}, {0x3b7ea000}, {0x3b7ec000}, {0x3b7ee000},
- {0x3b7f0000}, {0x3b7f2000}, {0x3b7f4000}, {0x3b7f6000},
- {0x3b7f8000}, {0x3b7fa000}, {0x3b7fc000}, {0x3b7fe000},
- {0x3b800000}, {0x3b802000}, {0x3b804000}, {0x3b806000},
- {0x3b808000}, {0x3b80a000}, {0x3b80c000}, {0x3b80e000},
- {0x3b810000}, {0x3b812000}, {0x3b814000}, {0x3b816000},
- {0x3b818000}, {0x3b81a000}, {0x3b81c000}, {0x3b81e000},
- {0x3b820000}, {0x3b822000}, {0x3b824000}, {0x3b826000},
- {0x3b828000}, {0x3b82a000}, {0x3b82c000}, {0x3b82e000},
- {0x3b830000}, {0x3b832000}, {0x3b834000}, {0x3b836000},
- {0x3b838000}, {0x3b83a000}, {0x3b83c000}, {0x3b83e000},
- {0x3b840000}, {0x3b842000}, {0x3b844000}, {0x3b846000},
- {0x3b848000}, {0x3b84a000}, {0x3b84c000}, {0x3b84e000},
- {0x3b850000}, {0x3b852000}, {0x3b854000}, {0x3b856000},
- {0x3b858000}, {0x3b85a000}, {0x3b85c000}, {0x3b85e000},
- {0x3b860000}, {0x3b862000}, {0x3b864000}, {0x3b866000},
- {0x3b868000}, {0x3b86a000}, {0x3b86c000}, {0x3b86e000},
- {0x3b870000}, {0x3b872000}, {0x3b874000}, {0x3b876000},
- {0x3b878000}, {0x3b87a000}, {0x3b87c000}, {0x3b87e000},
- {0x3b880000}, {0x3b882000}, {0x3b884000}, {0x3b886000},
- {0x3b888000}, {0x3b88a000}, {0x3b88c000}, {0x3b88e000},
- {0x3b890000}, {0x3b892000}, {0x3b894000}, {0x3b896000},
- {0x3b898000}, {0x3b89a000}, {0x3b89c000}, {0x3b89e000},
- {0x3b8a0000}, {0x3b8a2000}, {0x3b8a4000}, {0x3b8a6000},
- {0x3b8a8000}, {0x3b8aa000}, {0x3b8ac000}, {0x3b8ae000},
- {0x3b8b0000}, {0x3b8b2000}, {0x3b8b4000}, {0x3b8b6000},
- {0x3b8b8000}, {0x3b8ba000}, {0x3b8bc000}, {0x3b8be000},
- {0x3b8c0000}, {0x3b8c2000}, {0x3b8c4000}, {0x3b8c6000},
- {0x3b8c8000}, {0x3b8ca000}, {0x3b8cc000}, {0x3b8ce000},
- {0x3b8d0000}, {0x3b8d2000}, {0x3b8d4000}, {0x3b8d6000},
- {0x3b8d8000}, {0x3b8da000}, {0x3b8dc000}, {0x3b8de000},
- {0x3b8e0000}, {0x3b8e2000}, {0x3b8e4000}, {0x3b8e6000},
- {0x3b8e8000}, {0x3b8ea000}, {0x3b8ec000}, {0x3b8ee000},
- {0x3b8f0000}, {0x3b8f2000}, {0x3b8f4000}, {0x3b8f6000},
- {0x3b8f8000}, {0x3b8fa000}, {0x3b8fc000}, {0x3b8fe000},
- {0x3b900000}, {0x3b902000}, {0x3b904000}, {0x3b906000},
- {0x3b908000}, {0x3b90a000}, {0x3b90c000}, {0x3b90e000},
- {0x3b910000}, {0x3b912000}, {0x3b914000}, {0x3b916000},
- {0x3b918000}, {0x3b91a000}, {0x3b91c000}, {0x3b91e000},
- {0x3b920000}, {0x3b922000}, {0x3b924000}, {0x3b926000},
- {0x3b928000}, {0x3b92a000}, {0x3b92c000}, {0x3b92e000},
- {0x3b930000}, {0x3b932000}, {0x3b934000}, {0x3b936000},
- {0x3b938000}, {0x3b93a000}, {0x3b93c000}, {0x3b93e000},
- {0x3b940000}, {0x3b942000}, {0x3b944000}, {0x3b946000},
- {0x3b948000}, {0x3b94a000}, {0x3b94c000}, {0x3b94e000},
- {0x3b950000}, {0x3b952000}, {0x3b954000}, {0x3b956000},
- {0x3b958000}, {0x3b95a000}, {0x3b95c000}, {0x3b95e000},
- {0x3b960000}, {0x3b962000}, {0x3b964000}, {0x3b966000},
- {0x3b968000}, {0x3b96a000}, {0x3b96c000}, {0x3b96e000},
- {0x3b970000}, {0x3b972000}, {0x3b974000}, {0x3b976000},
- {0x3b978000}, {0x3b97a000}, {0x3b97c000}, {0x3b97e000},
- {0x3b980000}, {0x3b982000}, {0x3b984000}, {0x3b986000},
- {0x3b988000}, {0x3b98a000}, {0x3b98c000}, {0x3b98e000},
- {0x3b990000}, {0x3b992000}, {0x3b994000}, {0x3b996000},
- {0x3b998000}, {0x3b99a000}, {0x3b99c000}, {0x3b99e000},
- {0x3b9a0000}, {0x3b9a2000}, {0x3b9a4000}, {0x3b9a6000},
- {0x3b9a8000}, {0x3b9aa000}, {0x3b9ac000}, {0x3b9ae000},
- {0x3b9b0000}, {0x3b9b2000}, {0x3b9b4000}, {0x3b9b6000},
- {0x3b9b8000}, {0x3b9ba000}, {0x3b9bc000}, {0x3b9be000},
- {0x3b9c0000}, {0x3b9c2000}, {0x3b9c4000}, {0x3b9c6000},
- {0x3b9c8000}, {0x3b9ca000}, {0x3b9cc000}, {0x3b9ce000},
- {0x3b9d0000}, {0x3b9d2000}, {0x3b9d4000}, {0x3b9d6000},
- {0x3b9d8000}, {0x3b9da000}, {0x3b9dc000}, {0x3b9de000},
- {0x3b9e0000}, {0x3b9e2000}, {0x3b9e4000}, {0x3b9e6000},
- {0x3b9e8000}, {0x3b9ea000}, {0x3b9ec000}, {0x3b9ee000},
- {0x3b9f0000}, {0x3b9f2000}, {0x3b9f4000}, {0x3b9f6000},
- {0x3b9f8000}, {0x3b9fa000}, {0x3b9fc000}, {0x3b9fe000},
- {0x3ba00000}, {0x3ba02000}, {0x3ba04000}, {0x3ba06000},
- {0x3ba08000}, {0x3ba0a000}, {0x3ba0c000}, {0x3ba0e000},
- {0x3ba10000}, {0x3ba12000}, {0x3ba14000}, {0x3ba16000},
- {0x3ba18000}, {0x3ba1a000}, {0x3ba1c000}, {0x3ba1e000},
- {0x3ba20000}, {0x3ba22000}, {0x3ba24000}, {0x3ba26000},
- {0x3ba28000}, {0x3ba2a000}, {0x3ba2c000}, {0x3ba2e000},
- {0x3ba30000}, {0x3ba32000}, {0x3ba34000}, {0x3ba36000},
- {0x3ba38000}, {0x3ba3a000}, {0x3ba3c000}, {0x3ba3e000},
- {0x3ba40000}, {0x3ba42000}, {0x3ba44000}, {0x3ba46000},
- {0x3ba48000}, {0x3ba4a000}, {0x3ba4c000}, {0x3ba4e000},
- {0x3ba50000}, {0x3ba52000}, {0x3ba54000}, {0x3ba56000},
- {0x3ba58000}, {0x3ba5a000}, {0x3ba5c000}, {0x3ba5e000},
- {0x3ba60000}, {0x3ba62000}, {0x3ba64000}, {0x3ba66000},
- {0x3ba68000}, {0x3ba6a000}, {0x3ba6c000}, {0x3ba6e000},
- {0x3ba70000}, {0x3ba72000}, {0x3ba74000}, {0x3ba76000},
- {0x3ba78000}, {0x3ba7a000}, {0x3ba7c000}, {0x3ba7e000},
- {0x3ba80000}, {0x3ba82000}, {0x3ba84000}, {0x3ba86000},
- {0x3ba88000}, {0x3ba8a000}, {0x3ba8c000}, {0x3ba8e000},
- {0x3ba90000}, {0x3ba92000}, {0x3ba94000}, {0x3ba96000},
- {0x3ba98000}, {0x3ba9a000}, {0x3ba9c000}, {0x3ba9e000},
- {0x3baa0000}, {0x3baa2000}, {0x3baa4000}, {0x3baa6000},
- {0x3baa8000}, {0x3baaa000}, {0x3baac000}, {0x3baae000},
- {0x3bab0000}, {0x3bab2000}, {0x3bab4000}, {0x3bab6000},
- {0x3bab8000}, {0x3baba000}, {0x3babc000}, {0x3babe000},
- {0x3bac0000}, {0x3bac2000}, {0x3bac4000}, {0x3bac6000},
- {0x3bac8000}, {0x3baca000}, {0x3bacc000}, {0x3bace000},
- {0x3bad0000}, {0x3bad2000}, {0x3bad4000}, {0x3bad6000},
- {0x3bad8000}, {0x3bada000}, {0x3badc000}, {0x3bade000},
- {0x3bae0000}, {0x3bae2000}, {0x3bae4000}, {0x3bae6000},
- {0x3bae8000}, {0x3baea000}, {0x3baec000}, {0x3baee000},
- {0x3baf0000}, {0x3baf2000}, {0x3baf4000}, {0x3baf6000},
- {0x3baf8000}, {0x3bafa000}, {0x3bafc000}, {0x3bafe000},
- {0x3bb00000}, {0x3bb02000}, {0x3bb04000}, {0x3bb06000},
- {0x3bb08000}, {0x3bb0a000}, {0x3bb0c000}, {0x3bb0e000},
- {0x3bb10000}, {0x3bb12000}, {0x3bb14000}, {0x3bb16000},
- {0x3bb18000}, {0x3bb1a000}, {0x3bb1c000}, {0x3bb1e000},
- {0x3bb20000}, {0x3bb22000}, {0x3bb24000}, {0x3bb26000},
- {0x3bb28000}, {0x3bb2a000}, {0x3bb2c000}, {0x3bb2e000},
- {0x3bb30000}, {0x3bb32000}, {0x3bb34000}, {0x3bb36000},
- {0x3bb38000}, {0x3bb3a000}, {0x3bb3c000}, {0x3bb3e000},
- {0x3bb40000}, {0x3bb42000}, {0x3bb44000}, {0x3bb46000},
- {0x3bb48000}, {0x3bb4a000}, {0x3bb4c000}, {0x3bb4e000},
- {0x3bb50000}, {0x3bb52000}, {0x3bb54000}, {0x3bb56000},
- {0x3bb58000}, {0x3bb5a000}, {0x3bb5c000}, {0x3bb5e000},
- {0x3bb60000}, {0x3bb62000}, {0x3bb64000}, {0x3bb66000},
- {0x3bb68000}, {0x3bb6a000}, {0x3bb6c000}, {0x3bb6e000},
- {0x3bb70000}, {0x3bb72000}, {0x3bb74000}, {0x3bb76000},
- {0x3bb78000}, {0x3bb7a000}, {0x3bb7c000}, {0x3bb7e000},
- {0x3bb80000}, {0x3bb82000}, {0x3bb84000}, {0x3bb86000},
- {0x3bb88000}, {0x3bb8a000}, {0x3bb8c000}, {0x3bb8e000},
- {0x3bb90000}, {0x3bb92000}, {0x3bb94000}, {0x3bb96000},
- {0x3bb98000}, {0x3bb9a000}, {0x3bb9c000}, {0x3bb9e000},
- {0x3bba0000}, {0x3bba2000}, {0x3bba4000}, {0x3bba6000},
- {0x3bba8000}, {0x3bbaa000}, {0x3bbac000}, {0x3bbae000},
- {0x3bbb0000}, {0x3bbb2000}, {0x3bbb4000}, {0x3bbb6000},
- {0x3bbb8000}, {0x3bbba000}, {0x3bbbc000}, {0x3bbbe000},
- {0x3bbc0000}, {0x3bbc2000}, {0x3bbc4000}, {0x3bbc6000},
- {0x3bbc8000}, {0x3bbca000}, {0x3bbcc000}, {0x3bbce000},
- {0x3bbd0000}, {0x3bbd2000}, {0x3bbd4000}, {0x3bbd6000},
- {0x3bbd8000}, {0x3bbda000}, {0x3bbdc000}, {0x3bbde000},
- {0x3bbe0000}, {0x3bbe2000}, {0x3bbe4000}, {0x3bbe6000},
- {0x3bbe8000}, {0x3bbea000}, {0x3bbec000}, {0x3bbee000},
- {0x3bbf0000}, {0x3bbf2000}, {0x3bbf4000}, {0x3bbf6000},
- {0x3bbf8000}, {0x3bbfa000}, {0x3bbfc000}, {0x3bbfe000},
- {0x3bc00000}, {0x3bc02000}, {0x3bc04000}, {0x3bc06000},
- {0x3bc08000}, {0x3bc0a000}, {0x3bc0c000}, {0x3bc0e000},
- {0x3bc10000}, {0x3bc12000}, {0x3bc14000}, {0x3bc16000},
- {0x3bc18000}, {0x3bc1a000}, {0x3bc1c000}, {0x3bc1e000},
- {0x3bc20000}, {0x3bc22000}, {0x3bc24000}, {0x3bc26000},
- {0x3bc28000}, {0x3bc2a000}, {0x3bc2c000}, {0x3bc2e000},
- {0x3bc30000}, {0x3bc32000}, {0x3bc34000}, {0x3bc36000},
- {0x3bc38000}, {0x3bc3a000}, {0x3bc3c000}, {0x3bc3e000},
- {0x3bc40000}, {0x3bc42000}, {0x3bc44000}, {0x3bc46000},
- {0x3bc48000}, {0x3bc4a000}, {0x3bc4c000}, {0x3bc4e000},
- {0x3bc50000}, {0x3bc52000}, {0x3bc54000}, {0x3bc56000},
- {0x3bc58000}, {0x3bc5a000}, {0x3bc5c000}, {0x3bc5e000},
- {0x3bc60000}, {0x3bc62000}, {0x3bc64000}, {0x3bc66000},
- {0x3bc68000}, {0x3bc6a000}, {0x3bc6c000}, {0x3bc6e000},
- {0x3bc70000}, {0x3bc72000}, {0x3bc74000}, {0x3bc76000},
- {0x3bc78000}, {0x3bc7a000}, {0x3bc7c000}, {0x3bc7e000},
- {0x3bc80000}, {0x3bc82000}, {0x3bc84000}, {0x3bc86000},
- {0x3bc88000}, {0x3bc8a000}, {0x3bc8c000}, {0x3bc8e000},
- {0x3bc90000}, {0x3bc92000}, {0x3bc94000}, {0x3bc96000},
- {0x3bc98000}, {0x3bc9a000}, {0x3bc9c000}, {0x3bc9e000},
- {0x3bca0000}, {0x3bca2000}, {0x3bca4000}, {0x3bca6000},
- {0x3bca8000}, {0x3bcaa000}, {0x3bcac000}, {0x3bcae000},
- {0x3bcb0000}, {0x3bcb2000}, {0x3bcb4000}, {0x3bcb6000},
- {0x3bcb8000}, {0x3bcba000}, {0x3bcbc000}, {0x3bcbe000},
- {0x3bcc0000}, {0x3bcc2000}, {0x3bcc4000}, {0x3bcc6000},
- {0x3bcc8000}, {0x3bcca000}, {0x3bccc000}, {0x3bcce000},
- {0x3bcd0000}, {0x3bcd2000}, {0x3bcd4000}, {0x3bcd6000},
- {0x3bcd8000}, {0x3bcda000}, {0x3bcdc000}, {0x3bcde000},
- {0x3bce0000}, {0x3bce2000}, {0x3bce4000}, {0x3bce6000},
- {0x3bce8000}, {0x3bcea000}, {0x3bcec000}, {0x3bcee000},
- {0x3bcf0000}, {0x3bcf2000}, {0x3bcf4000}, {0x3bcf6000},
- {0x3bcf8000}, {0x3bcfa000}, {0x3bcfc000}, {0x3bcfe000},
- {0x3bd00000}, {0x3bd02000}, {0x3bd04000}, {0x3bd06000},
- {0x3bd08000}, {0x3bd0a000}, {0x3bd0c000}, {0x3bd0e000},
- {0x3bd10000}, {0x3bd12000}, {0x3bd14000}, {0x3bd16000},
- {0x3bd18000}, {0x3bd1a000}, {0x3bd1c000}, {0x3bd1e000},
- {0x3bd20000}, {0x3bd22000}, {0x3bd24000}, {0x3bd26000},
- {0x3bd28000}, {0x3bd2a000}, {0x3bd2c000}, {0x3bd2e000},
- {0x3bd30000}, {0x3bd32000}, {0x3bd34000}, {0x3bd36000},
- {0x3bd38000}, {0x3bd3a000}, {0x3bd3c000}, {0x3bd3e000},
- {0x3bd40000}, {0x3bd42000}, {0x3bd44000}, {0x3bd46000},
- {0x3bd48000}, {0x3bd4a000}, {0x3bd4c000}, {0x3bd4e000},
- {0x3bd50000}, {0x3bd52000}, {0x3bd54000}, {0x3bd56000},
- {0x3bd58000}, {0x3bd5a000}, {0x3bd5c000}, {0x3bd5e000},
- {0x3bd60000}, {0x3bd62000}, {0x3bd64000}, {0x3bd66000},
- {0x3bd68000}, {0x3bd6a000}, {0x3bd6c000}, {0x3bd6e000},
- {0x3bd70000}, {0x3bd72000}, {0x3bd74000}, {0x3bd76000},
- {0x3bd78000}, {0x3bd7a000}, {0x3bd7c000}, {0x3bd7e000},
- {0x3bd80000}, {0x3bd82000}, {0x3bd84000}, {0x3bd86000},
- {0x3bd88000}, {0x3bd8a000}, {0x3bd8c000}, {0x3bd8e000},
- {0x3bd90000}, {0x3bd92000}, {0x3bd94000}, {0x3bd96000},
- {0x3bd98000}, {0x3bd9a000}, {0x3bd9c000}, {0x3bd9e000},
- {0x3bda0000}, {0x3bda2000}, {0x3bda4000}, {0x3bda6000},
- {0x3bda8000}, {0x3bdaa000}, {0x3bdac000}, {0x3bdae000},
- {0x3bdb0000}, {0x3bdb2000}, {0x3bdb4000}, {0x3bdb6000},
- {0x3bdb8000}, {0x3bdba000}, {0x3bdbc000}, {0x3bdbe000},
- {0x3bdc0000}, {0x3bdc2000}, {0x3bdc4000}, {0x3bdc6000},
- {0x3bdc8000}, {0x3bdca000}, {0x3bdcc000}, {0x3bdce000},
- {0x3bdd0000}, {0x3bdd2000}, {0x3bdd4000}, {0x3bdd6000},
- {0x3bdd8000}, {0x3bdda000}, {0x3bddc000}, {0x3bdde000},
- {0x3bde0000}, {0x3bde2000}, {0x3bde4000}, {0x3bde6000},
- {0x3bde8000}, {0x3bdea000}, {0x3bdec000}, {0x3bdee000},
- {0x3bdf0000}, {0x3bdf2000}, {0x3bdf4000}, {0x3bdf6000},
- {0x3bdf8000}, {0x3bdfa000}, {0x3bdfc000}, {0x3bdfe000},
- {0x3be00000}, {0x3be02000}, {0x3be04000}, {0x3be06000},
- {0x3be08000}, {0x3be0a000}, {0x3be0c000}, {0x3be0e000},
- {0x3be10000}, {0x3be12000}, {0x3be14000}, {0x3be16000},
- {0x3be18000}, {0x3be1a000}, {0x3be1c000}, {0x3be1e000},
- {0x3be20000}, {0x3be22000}, {0x3be24000}, {0x3be26000},
- {0x3be28000}, {0x3be2a000}, {0x3be2c000}, {0x3be2e000},
- {0x3be30000}, {0x3be32000}, {0x3be34000}, {0x3be36000},
- {0x3be38000}, {0x3be3a000}, {0x3be3c000}, {0x3be3e000},
- {0x3be40000}, {0x3be42000}, {0x3be44000}, {0x3be46000},
- {0x3be48000}, {0x3be4a000}, {0x3be4c000}, {0x3be4e000},
- {0x3be50000}, {0x3be52000}, {0x3be54000}, {0x3be56000},
- {0x3be58000}, {0x3be5a000}, {0x3be5c000}, {0x3be5e000},
- {0x3be60000}, {0x3be62000}, {0x3be64000}, {0x3be66000},
- {0x3be68000}, {0x3be6a000}, {0x3be6c000}, {0x3be6e000},
- {0x3be70000}, {0x3be72000}, {0x3be74000}, {0x3be76000},
- {0x3be78000}, {0x3be7a000}, {0x3be7c000}, {0x3be7e000},
- {0x3be80000}, {0x3be82000}, {0x3be84000}, {0x3be86000},
- {0x3be88000}, {0x3be8a000}, {0x3be8c000}, {0x3be8e000},
- {0x3be90000}, {0x3be92000}, {0x3be94000}, {0x3be96000},
- {0x3be98000}, {0x3be9a000}, {0x3be9c000}, {0x3be9e000},
- {0x3bea0000}, {0x3bea2000}, {0x3bea4000}, {0x3bea6000},
- {0x3bea8000}, {0x3beaa000}, {0x3beac000}, {0x3beae000},
- {0x3beb0000}, {0x3beb2000}, {0x3beb4000}, {0x3beb6000},
- {0x3beb8000}, {0x3beba000}, {0x3bebc000}, {0x3bebe000},
- {0x3bec0000}, {0x3bec2000}, {0x3bec4000}, {0x3bec6000},
- {0x3bec8000}, {0x3beca000}, {0x3becc000}, {0x3bece000},
- {0x3bed0000}, {0x3bed2000}, {0x3bed4000}, {0x3bed6000},
- {0x3bed8000}, {0x3beda000}, {0x3bedc000}, {0x3bede000},
- {0x3bee0000}, {0x3bee2000}, {0x3bee4000}, {0x3bee6000},
- {0x3bee8000}, {0x3beea000}, {0x3beec000}, {0x3beee000},
- {0x3bef0000}, {0x3bef2000}, {0x3bef4000}, {0x3bef6000},
- {0x3bef8000}, {0x3befa000}, {0x3befc000}, {0x3befe000},
- {0x3bf00000}, {0x3bf02000}, {0x3bf04000}, {0x3bf06000},
- {0x3bf08000}, {0x3bf0a000}, {0x3bf0c000}, {0x3bf0e000},
- {0x3bf10000}, {0x3bf12000}, {0x3bf14000}, {0x3bf16000},
- {0x3bf18000}, {0x3bf1a000}, {0x3bf1c000}, {0x3bf1e000},
- {0x3bf20000}, {0x3bf22000}, {0x3bf24000}, {0x3bf26000},
- {0x3bf28000}, {0x3bf2a000}, {0x3bf2c000}, {0x3bf2e000},
- {0x3bf30000}, {0x3bf32000}, {0x3bf34000}, {0x3bf36000},
- {0x3bf38000}, {0x3bf3a000}, {0x3bf3c000}, {0x3bf3e000},
- {0x3bf40000}, {0x3bf42000}, {0x3bf44000}, {0x3bf46000},
- {0x3bf48000}, {0x3bf4a000}, {0x3bf4c000}, {0x3bf4e000},
- {0x3bf50000}, {0x3bf52000}, {0x3bf54000}, {0x3bf56000},
- {0x3bf58000}, {0x3bf5a000}, {0x3bf5c000}, {0x3bf5e000},
- {0x3bf60000}, {0x3bf62000}, {0x3bf64000}, {0x3bf66000},
- {0x3bf68000}, {0x3bf6a000}, {0x3bf6c000}, {0x3bf6e000},
- {0x3bf70000}, {0x3bf72000}, {0x3bf74000}, {0x3bf76000},
- {0x3bf78000}, {0x3bf7a000}, {0x3bf7c000}, {0x3bf7e000},
- {0x3bf80000}, {0x3bf82000}, {0x3bf84000}, {0x3bf86000},
- {0x3bf88000}, {0x3bf8a000}, {0x3bf8c000}, {0x3bf8e000},
- {0x3bf90000}, {0x3bf92000}, {0x3bf94000}, {0x3bf96000},
- {0x3bf98000}, {0x3bf9a000}, {0x3bf9c000}, {0x3bf9e000},
- {0x3bfa0000}, {0x3bfa2000}, {0x3bfa4000}, {0x3bfa6000},
- {0x3bfa8000}, {0x3bfaa000}, {0x3bfac000}, {0x3bfae000},
- {0x3bfb0000}, {0x3bfb2000}, {0x3bfb4000}, {0x3bfb6000},
- {0x3bfb8000}, {0x3bfba000}, {0x3bfbc000}, {0x3bfbe000},
- {0x3bfc0000}, {0x3bfc2000}, {0x3bfc4000}, {0x3bfc6000},
- {0x3bfc8000}, {0x3bfca000}, {0x3bfcc000}, {0x3bfce000},
- {0x3bfd0000}, {0x3bfd2000}, {0x3bfd4000}, {0x3bfd6000},
- {0x3bfd8000}, {0x3bfda000}, {0x3bfdc000}, {0x3bfde000},
- {0x3bfe0000}, {0x3bfe2000}, {0x3bfe4000}, {0x3bfe6000},
- {0x3bfe8000}, {0x3bfea000}, {0x3bfec000}, {0x3bfee000},
- {0x3bff0000}, {0x3bff2000}, {0x3bff4000}, {0x3bff6000},
- {0x3bff8000}, {0x3bffa000}, {0x3bffc000}, {0x3bffe000},
- {0x3c000000}, {0x3c002000}, {0x3c004000}, {0x3c006000},
- {0x3c008000}, {0x3c00a000}, {0x3c00c000}, {0x3c00e000},
- {0x3c010000}, {0x3c012000}, {0x3c014000}, {0x3c016000},
- {0x3c018000}, {0x3c01a000}, {0x3c01c000}, {0x3c01e000},
- {0x3c020000}, {0x3c022000}, {0x3c024000}, {0x3c026000},
- {0x3c028000}, {0x3c02a000}, {0x3c02c000}, {0x3c02e000},
- {0x3c030000}, {0x3c032000}, {0x3c034000}, {0x3c036000},
- {0x3c038000}, {0x3c03a000}, {0x3c03c000}, {0x3c03e000},
- {0x3c040000}, {0x3c042000}, {0x3c044000}, {0x3c046000},
- {0x3c048000}, {0x3c04a000}, {0x3c04c000}, {0x3c04e000},
- {0x3c050000}, {0x3c052000}, {0x3c054000}, {0x3c056000},
- {0x3c058000}, {0x3c05a000}, {0x3c05c000}, {0x3c05e000},
- {0x3c060000}, {0x3c062000}, {0x3c064000}, {0x3c066000},
- {0x3c068000}, {0x3c06a000}, {0x3c06c000}, {0x3c06e000},
- {0x3c070000}, {0x3c072000}, {0x3c074000}, {0x3c076000},
- {0x3c078000}, {0x3c07a000}, {0x3c07c000}, {0x3c07e000},
- {0x3c080000}, {0x3c082000}, {0x3c084000}, {0x3c086000},
- {0x3c088000}, {0x3c08a000}, {0x3c08c000}, {0x3c08e000},
- {0x3c090000}, {0x3c092000}, {0x3c094000}, {0x3c096000},
- {0x3c098000}, {0x3c09a000}, {0x3c09c000}, {0x3c09e000},
- {0x3c0a0000}, {0x3c0a2000}, {0x3c0a4000}, {0x3c0a6000},
- {0x3c0a8000}, {0x3c0aa000}, {0x3c0ac000}, {0x3c0ae000},
- {0x3c0b0000}, {0x3c0b2000}, {0x3c0b4000}, {0x3c0b6000},
- {0x3c0b8000}, {0x3c0ba000}, {0x3c0bc000}, {0x3c0be000},
- {0x3c0c0000}, {0x3c0c2000}, {0x3c0c4000}, {0x3c0c6000},
- {0x3c0c8000}, {0x3c0ca000}, {0x3c0cc000}, {0x3c0ce000},
- {0x3c0d0000}, {0x3c0d2000}, {0x3c0d4000}, {0x3c0d6000},
- {0x3c0d8000}, {0x3c0da000}, {0x3c0dc000}, {0x3c0de000},
- {0x3c0e0000}, {0x3c0e2000}, {0x3c0e4000}, {0x3c0e6000},
- {0x3c0e8000}, {0x3c0ea000}, {0x3c0ec000}, {0x3c0ee000},
- {0x3c0f0000}, {0x3c0f2000}, {0x3c0f4000}, {0x3c0f6000},
- {0x3c0f8000}, {0x3c0fa000}, {0x3c0fc000}, {0x3c0fe000},
- {0x3c100000}, {0x3c102000}, {0x3c104000}, {0x3c106000},
- {0x3c108000}, {0x3c10a000}, {0x3c10c000}, {0x3c10e000},
- {0x3c110000}, {0x3c112000}, {0x3c114000}, {0x3c116000},
- {0x3c118000}, {0x3c11a000}, {0x3c11c000}, {0x3c11e000},
- {0x3c120000}, {0x3c122000}, {0x3c124000}, {0x3c126000},
- {0x3c128000}, {0x3c12a000}, {0x3c12c000}, {0x3c12e000},
- {0x3c130000}, {0x3c132000}, {0x3c134000}, {0x3c136000},
- {0x3c138000}, {0x3c13a000}, {0x3c13c000}, {0x3c13e000},
- {0x3c140000}, {0x3c142000}, {0x3c144000}, {0x3c146000},
- {0x3c148000}, {0x3c14a000}, {0x3c14c000}, {0x3c14e000},
- {0x3c150000}, {0x3c152000}, {0x3c154000}, {0x3c156000},
- {0x3c158000}, {0x3c15a000}, {0x3c15c000}, {0x3c15e000},
- {0x3c160000}, {0x3c162000}, {0x3c164000}, {0x3c166000},
- {0x3c168000}, {0x3c16a000}, {0x3c16c000}, {0x3c16e000},
- {0x3c170000}, {0x3c172000}, {0x3c174000}, {0x3c176000},
- {0x3c178000}, {0x3c17a000}, {0x3c17c000}, {0x3c17e000},
- {0x3c180000}, {0x3c182000}, {0x3c184000}, {0x3c186000},
- {0x3c188000}, {0x3c18a000}, {0x3c18c000}, {0x3c18e000},
- {0x3c190000}, {0x3c192000}, {0x3c194000}, {0x3c196000},
- {0x3c198000}, {0x3c19a000}, {0x3c19c000}, {0x3c19e000},
- {0x3c1a0000}, {0x3c1a2000}, {0x3c1a4000}, {0x3c1a6000},
- {0x3c1a8000}, {0x3c1aa000}, {0x3c1ac000}, {0x3c1ae000},
- {0x3c1b0000}, {0x3c1b2000}, {0x3c1b4000}, {0x3c1b6000},
- {0x3c1b8000}, {0x3c1ba000}, {0x3c1bc000}, {0x3c1be000},
- {0x3c1c0000}, {0x3c1c2000}, {0x3c1c4000}, {0x3c1c6000},
- {0x3c1c8000}, {0x3c1ca000}, {0x3c1cc000}, {0x3c1ce000},
- {0x3c1d0000}, {0x3c1d2000}, {0x3c1d4000}, {0x3c1d6000},
- {0x3c1d8000}, {0x3c1da000}, {0x3c1dc000}, {0x3c1de000},
- {0x3c1e0000}, {0x3c1e2000}, {0x3c1e4000}, {0x3c1e6000},
- {0x3c1e8000}, {0x3c1ea000}, {0x3c1ec000}, {0x3c1ee000},
- {0x3c1f0000}, {0x3c1f2000}, {0x3c1f4000}, {0x3c1f6000},
- {0x3c1f8000}, {0x3c1fa000}, {0x3c1fc000}, {0x3c1fe000},
- {0x3c200000}, {0x3c202000}, {0x3c204000}, {0x3c206000},
- {0x3c208000}, {0x3c20a000}, {0x3c20c000}, {0x3c20e000},
- {0x3c210000}, {0x3c212000}, {0x3c214000}, {0x3c216000},
- {0x3c218000}, {0x3c21a000}, {0x3c21c000}, {0x3c21e000},
- {0x3c220000}, {0x3c222000}, {0x3c224000}, {0x3c226000},
- {0x3c228000}, {0x3c22a000}, {0x3c22c000}, {0x3c22e000},
- {0x3c230000}, {0x3c232000}, {0x3c234000}, {0x3c236000},
- {0x3c238000}, {0x3c23a000}, {0x3c23c000}, {0x3c23e000},
- {0x3c240000}, {0x3c242000}, {0x3c244000}, {0x3c246000},
- {0x3c248000}, {0x3c24a000}, {0x3c24c000}, {0x3c24e000},
- {0x3c250000}, {0x3c252000}, {0x3c254000}, {0x3c256000},
- {0x3c258000}, {0x3c25a000}, {0x3c25c000}, {0x3c25e000},
- {0x3c260000}, {0x3c262000}, {0x3c264000}, {0x3c266000},
- {0x3c268000}, {0x3c26a000}, {0x3c26c000}, {0x3c26e000},
- {0x3c270000}, {0x3c272000}, {0x3c274000}, {0x3c276000},
- {0x3c278000}, {0x3c27a000}, {0x3c27c000}, {0x3c27e000},
- {0x3c280000}, {0x3c282000}, {0x3c284000}, {0x3c286000},
- {0x3c288000}, {0x3c28a000}, {0x3c28c000}, {0x3c28e000},
- {0x3c290000}, {0x3c292000}, {0x3c294000}, {0x3c296000},
- {0x3c298000}, {0x3c29a000}, {0x3c29c000}, {0x3c29e000},
- {0x3c2a0000}, {0x3c2a2000}, {0x3c2a4000}, {0x3c2a6000},
- {0x3c2a8000}, {0x3c2aa000}, {0x3c2ac000}, {0x3c2ae000},
- {0x3c2b0000}, {0x3c2b2000}, {0x3c2b4000}, {0x3c2b6000},
- {0x3c2b8000}, {0x3c2ba000}, {0x3c2bc000}, {0x3c2be000},
- {0x3c2c0000}, {0x3c2c2000}, {0x3c2c4000}, {0x3c2c6000},
- {0x3c2c8000}, {0x3c2ca000}, {0x3c2cc000}, {0x3c2ce000},
- {0x3c2d0000}, {0x3c2d2000}, {0x3c2d4000}, {0x3c2d6000},
- {0x3c2d8000}, {0x3c2da000}, {0x3c2dc000}, {0x3c2de000},
- {0x3c2e0000}, {0x3c2e2000}, {0x3c2e4000}, {0x3c2e6000},
- {0x3c2e8000}, {0x3c2ea000}, {0x3c2ec000}, {0x3c2ee000},
- {0x3c2f0000}, {0x3c2f2000}, {0x3c2f4000}, {0x3c2f6000},
- {0x3c2f8000}, {0x3c2fa000}, {0x3c2fc000}, {0x3c2fe000},
- {0x3c300000}, {0x3c302000}, {0x3c304000}, {0x3c306000},
- {0x3c308000}, {0x3c30a000}, {0x3c30c000}, {0x3c30e000},
- {0x3c310000}, {0x3c312000}, {0x3c314000}, {0x3c316000},
- {0x3c318000}, {0x3c31a000}, {0x3c31c000}, {0x3c31e000},
- {0x3c320000}, {0x3c322000}, {0x3c324000}, {0x3c326000},
- {0x3c328000}, {0x3c32a000}, {0x3c32c000}, {0x3c32e000},
- {0x3c330000}, {0x3c332000}, {0x3c334000}, {0x3c336000},
- {0x3c338000}, {0x3c33a000}, {0x3c33c000}, {0x3c33e000},
- {0x3c340000}, {0x3c342000}, {0x3c344000}, {0x3c346000},
- {0x3c348000}, {0x3c34a000}, {0x3c34c000}, {0x3c34e000},
- {0x3c350000}, {0x3c352000}, {0x3c354000}, {0x3c356000},
- {0x3c358000}, {0x3c35a000}, {0x3c35c000}, {0x3c35e000},
- {0x3c360000}, {0x3c362000}, {0x3c364000}, {0x3c366000},
- {0x3c368000}, {0x3c36a000}, {0x3c36c000}, {0x3c36e000},
- {0x3c370000}, {0x3c372000}, {0x3c374000}, {0x3c376000},
- {0x3c378000}, {0x3c37a000}, {0x3c37c000}, {0x3c37e000},
- {0x3c380000}, {0x3c382000}, {0x3c384000}, {0x3c386000},
- {0x3c388000}, {0x3c38a000}, {0x3c38c000}, {0x3c38e000},
- {0x3c390000}, {0x3c392000}, {0x3c394000}, {0x3c396000},
- {0x3c398000}, {0x3c39a000}, {0x3c39c000}, {0x3c39e000},
- {0x3c3a0000}, {0x3c3a2000}, {0x3c3a4000}, {0x3c3a6000},
- {0x3c3a8000}, {0x3c3aa000}, {0x3c3ac000}, {0x3c3ae000},
- {0x3c3b0000}, {0x3c3b2000}, {0x3c3b4000}, {0x3c3b6000},
- {0x3c3b8000}, {0x3c3ba000}, {0x3c3bc000}, {0x3c3be000},
- {0x3c3c0000}, {0x3c3c2000}, {0x3c3c4000}, {0x3c3c6000},
- {0x3c3c8000}, {0x3c3ca000}, {0x3c3cc000}, {0x3c3ce000},
- {0x3c3d0000}, {0x3c3d2000}, {0x3c3d4000}, {0x3c3d6000},
- {0x3c3d8000}, {0x3c3da000}, {0x3c3dc000}, {0x3c3de000},
- {0x3c3e0000}, {0x3c3e2000}, {0x3c3e4000}, {0x3c3e6000},
- {0x3c3e8000}, {0x3c3ea000}, {0x3c3ec000}, {0x3c3ee000},
- {0x3c3f0000}, {0x3c3f2000}, {0x3c3f4000}, {0x3c3f6000},
- {0x3c3f8000}, {0x3c3fa000}, {0x3c3fc000}, {0x3c3fe000},
- {0x3c400000}, {0x3c402000}, {0x3c404000}, {0x3c406000},
- {0x3c408000}, {0x3c40a000}, {0x3c40c000}, {0x3c40e000},
- {0x3c410000}, {0x3c412000}, {0x3c414000}, {0x3c416000},
- {0x3c418000}, {0x3c41a000}, {0x3c41c000}, {0x3c41e000},
- {0x3c420000}, {0x3c422000}, {0x3c424000}, {0x3c426000},
- {0x3c428000}, {0x3c42a000}, {0x3c42c000}, {0x3c42e000},
- {0x3c430000}, {0x3c432000}, {0x3c434000}, {0x3c436000},
- {0x3c438000}, {0x3c43a000}, {0x3c43c000}, {0x3c43e000},
- {0x3c440000}, {0x3c442000}, {0x3c444000}, {0x3c446000},
- {0x3c448000}, {0x3c44a000}, {0x3c44c000}, {0x3c44e000},
- {0x3c450000}, {0x3c452000}, {0x3c454000}, {0x3c456000},
- {0x3c458000}, {0x3c45a000}, {0x3c45c000}, {0x3c45e000},
- {0x3c460000}, {0x3c462000}, {0x3c464000}, {0x3c466000},
- {0x3c468000}, {0x3c46a000}, {0x3c46c000}, {0x3c46e000},
- {0x3c470000}, {0x3c472000}, {0x3c474000}, {0x3c476000},
- {0x3c478000}, {0x3c47a000}, {0x3c47c000}, {0x3c47e000},
- {0x3c480000}, {0x3c482000}, {0x3c484000}, {0x3c486000},
- {0x3c488000}, {0x3c48a000}, {0x3c48c000}, {0x3c48e000},
- {0x3c490000}, {0x3c492000}, {0x3c494000}, {0x3c496000},
- {0x3c498000}, {0x3c49a000}, {0x3c49c000}, {0x3c49e000},
- {0x3c4a0000}, {0x3c4a2000}, {0x3c4a4000}, {0x3c4a6000},
- {0x3c4a8000}, {0x3c4aa000}, {0x3c4ac000}, {0x3c4ae000},
- {0x3c4b0000}, {0x3c4b2000}, {0x3c4b4000}, {0x3c4b6000},
- {0x3c4b8000}, {0x3c4ba000}, {0x3c4bc000}, {0x3c4be000},
- {0x3c4c0000}, {0x3c4c2000}, {0x3c4c4000}, {0x3c4c6000},
- {0x3c4c8000}, {0x3c4ca000}, {0x3c4cc000}, {0x3c4ce000},
- {0x3c4d0000}, {0x3c4d2000}, {0x3c4d4000}, {0x3c4d6000},
- {0x3c4d8000}, {0x3c4da000}, {0x3c4dc000}, {0x3c4de000},
- {0x3c4e0000}, {0x3c4e2000}, {0x3c4e4000}, {0x3c4e6000},
- {0x3c4e8000}, {0x3c4ea000}, {0x3c4ec000}, {0x3c4ee000},
- {0x3c4f0000}, {0x3c4f2000}, {0x3c4f4000}, {0x3c4f6000},
- {0x3c4f8000}, {0x3c4fa000}, {0x3c4fc000}, {0x3c4fe000},
- {0x3c500000}, {0x3c502000}, {0x3c504000}, {0x3c506000},
- {0x3c508000}, {0x3c50a000}, {0x3c50c000}, {0x3c50e000},
- {0x3c510000}, {0x3c512000}, {0x3c514000}, {0x3c516000},
- {0x3c518000}, {0x3c51a000}, {0x3c51c000}, {0x3c51e000},
- {0x3c520000}, {0x3c522000}, {0x3c524000}, {0x3c526000},
- {0x3c528000}, {0x3c52a000}, {0x3c52c000}, {0x3c52e000},
- {0x3c530000}, {0x3c532000}, {0x3c534000}, {0x3c536000},
- {0x3c538000}, {0x3c53a000}, {0x3c53c000}, {0x3c53e000},
- {0x3c540000}, {0x3c542000}, {0x3c544000}, {0x3c546000},
- {0x3c548000}, {0x3c54a000}, {0x3c54c000}, {0x3c54e000},
- {0x3c550000}, {0x3c552000}, {0x3c554000}, {0x3c556000},
- {0x3c558000}, {0x3c55a000}, {0x3c55c000}, {0x3c55e000},
- {0x3c560000}, {0x3c562000}, {0x3c564000}, {0x3c566000},
- {0x3c568000}, {0x3c56a000}, {0x3c56c000}, {0x3c56e000},
- {0x3c570000}, {0x3c572000}, {0x3c574000}, {0x3c576000},
- {0x3c578000}, {0x3c57a000}, {0x3c57c000}, {0x3c57e000},
- {0x3c580000}, {0x3c582000}, {0x3c584000}, {0x3c586000},
- {0x3c588000}, {0x3c58a000}, {0x3c58c000}, {0x3c58e000},
- {0x3c590000}, {0x3c592000}, {0x3c594000}, {0x3c596000},
- {0x3c598000}, {0x3c59a000}, {0x3c59c000}, {0x3c59e000},
- {0x3c5a0000}, {0x3c5a2000}, {0x3c5a4000}, {0x3c5a6000},
- {0x3c5a8000}, {0x3c5aa000}, {0x3c5ac000}, {0x3c5ae000},
- {0x3c5b0000}, {0x3c5b2000}, {0x3c5b4000}, {0x3c5b6000},
- {0x3c5b8000}, {0x3c5ba000}, {0x3c5bc000}, {0x3c5be000},
- {0x3c5c0000}, {0x3c5c2000}, {0x3c5c4000}, {0x3c5c6000},
- {0x3c5c8000}, {0x3c5ca000}, {0x3c5cc000}, {0x3c5ce000},
- {0x3c5d0000}, {0x3c5d2000}, {0x3c5d4000}, {0x3c5d6000},
- {0x3c5d8000}, {0x3c5da000}, {0x3c5dc000}, {0x3c5de000},
- {0x3c5e0000}, {0x3c5e2000}, {0x3c5e4000}, {0x3c5e6000},
- {0x3c5e8000}, {0x3c5ea000}, {0x3c5ec000}, {0x3c5ee000},
- {0x3c5f0000}, {0x3c5f2000}, {0x3c5f4000}, {0x3c5f6000},
- {0x3c5f8000}, {0x3c5fa000}, {0x3c5fc000}, {0x3c5fe000},
- {0x3c600000}, {0x3c602000}, {0x3c604000}, {0x3c606000},
- {0x3c608000}, {0x3c60a000}, {0x3c60c000}, {0x3c60e000},
- {0x3c610000}, {0x3c612000}, {0x3c614000}, {0x3c616000},
- {0x3c618000}, {0x3c61a000}, {0x3c61c000}, {0x3c61e000},
- {0x3c620000}, {0x3c622000}, {0x3c624000}, {0x3c626000},
- {0x3c628000}, {0x3c62a000}, {0x3c62c000}, {0x3c62e000},
- {0x3c630000}, {0x3c632000}, {0x3c634000}, {0x3c636000},
- {0x3c638000}, {0x3c63a000}, {0x3c63c000}, {0x3c63e000},
- {0x3c640000}, {0x3c642000}, {0x3c644000}, {0x3c646000},
- {0x3c648000}, {0x3c64a000}, {0x3c64c000}, {0x3c64e000},
- {0x3c650000}, {0x3c652000}, {0x3c654000}, {0x3c656000},
- {0x3c658000}, {0x3c65a000}, {0x3c65c000}, {0x3c65e000},
- {0x3c660000}, {0x3c662000}, {0x3c664000}, {0x3c666000},
- {0x3c668000}, {0x3c66a000}, {0x3c66c000}, {0x3c66e000},
- {0x3c670000}, {0x3c672000}, {0x3c674000}, {0x3c676000},
- {0x3c678000}, {0x3c67a000}, {0x3c67c000}, {0x3c67e000},
- {0x3c680000}, {0x3c682000}, {0x3c684000}, {0x3c686000},
- {0x3c688000}, {0x3c68a000}, {0x3c68c000}, {0x3c68e000},
- {0x3c690000}, {0x3c692000}, {0x3c694000}, {0x3c696000},
- {0x3c698000}, {0x3c69a000}, {0x3c69c000}, {0x3c69e000},
- {0x3c6a0000}, {0x3c6a2000}, {0x3c6a4000}, {0x3c6a6000},
- {0x3c6a8000}, {0x3c6aa000}, {0x3c6ac000}, {0x3c6ae000},
- {0x3c6b0000}, {0x3c6b2000}, {0x3c6b4000}, {0x3c6b6000},
- {0x3c6b8000}, {0x3c6ba000}, {0x3c6bc000}, {0x3c6be000},
- {0x3c6c0000}, {0x3c6c2000}, {0x3c6c4000}, {0x3c6c6000},
- {0x3c6c8000}, {0x3c6ca000}, {0x3c6cc000}, {0x3c6ce000},
- {0x3c6d0000}, {0x3c6d2000}, {0x3c6d4000}, {0x3c6d6000},
- {0x3c6d8000}, {0x3c6da000}, {0x3c6dc000}, {0x3c6de000},
- {0x3c6e0000}, {0x3c6e2000}, {0x3c6e4000}, {0x3c6e6000},
- {0x3c6e8000}, {0x3c6ea000}, {0x3c6ec000}, {0x3c6ee000},
- {0x3c6f0000}, {0x3c6f2000}, {0x3c6f4000}, {0x3c6f6000},
- {0x3c6f8000}, {0x3c6fa000}, {0x3c6fc000}, {0x3c6fe000},
- {0x3c700000}, {0x3c702000}, {0x3c704000}, {0x3c706000},
- {0x3c708000}, {0x3c70a000}, {0x3c70c000}, {0x3c70e000},
- {0x3c710000}, {0x3c712000}, {0x3c714000}, {0x3c716000},
- {0x3c718000}, {0x3c71a000}, {0x3c71c000}, {0x3c71e000},
- {0x3c720000}, {0x3c722000}, {0x3c724000}, {0x3c726000},
- {0x3c728000}, {0x3c72a000}, {0x3c72c000}, {0x3c72e000},
- {0x3c730000}, {0x3c732000}, {0x3c734000}, {0x3c736000},
- {0x3c738000}, {0x3c73a000}, {0x3c73c000}, {0x3c73e000},
- {0x3c740000}, {0x3c742000}, {0x3c744000}, {0x3c746000},
- {0x3c748000}, {0x3c74a000}, {0x3c74c000}, {0x3c74e000},
- {0x3c750000}, {0x3c752000}, {0x3c754000}, {0x3c756000},
- {0x3c758000}, {0x3c75a000}, {0x3c75c000}, {0x3c75e000},
- {0x3c760000}, {0x3c762000}, {0x3c764000}, {0x3c766000},
- {0x3c768000}, {0x3c76a000}, {0x3c76c000}, {0x3c76e000},
- {0x3c770000}, {0x3c772000}, {0x3c774000}, {0x3c776000},
- {0x3c778000}, {0x3c77a000}, {0x3c77c000}, {0x3c77e000},
- {0x3c780000}, {0x3c782000}, {0x3c784000}, {0x3c786000},
- {0x3c788000}, {0x3c78a000}, {0x3c78c000}, {0x3c78e000},
- {0x3c790000}, {0x3c792000}, {0x3c794000}, {0x3c796000},
- {0x3c798000}, {0x3c79a000}, {0x3c79c000}, {0x3c79e000},
- {0x3c7a0000}, {0x3c7a2000}, {0x3c7a4000}, {0x3c7a6000},
- {0x3c7a8000}, {0x3c7aa000}, {0x3c7ac000}, {0x3c7ae000},
- {0x3c7b0000}, {0x3c7b2000}, {0x3c7b4000}, {0x3c7b6000},
- {0x3c7b8000}, {0x3c7ba000}, {0x3c7bc000}, {0x3c7be000},
- {0x3c7c0000}, {0x3c7c2000}, {0x3c7c4000}, {0x3c7c6000},
- {0x3c7c8000}, {0x3c7ca000}, {0x3c7cc000}, {0x3c7ce000},
- {0x3c7d0000}, {0x3c7d2000}, {0x3c7d4000}, {0x3c7d6000},
- {0x3c7d8000}, {0x3c7da000}, {0x3c7dc000}, {0x3c7de000},
- {0x3c7e0000}, {0x3c7e2000}, {0x3c7e4000}, {0x3c7e6000},
- {0x3c7e8000}, {0x3c7ea000}, {0x3c7ec000}, {0x3c7ee000},
- {0x3c7f0000}, {0x3c7f2000}, {0x3c7f4000}, {0x3c7f6000},
- {0x3c7f8000}, {0x3c7fa000}, {0x3c7fc000}, {0x3c7fe000},
- {0x3c800000}, {0x3c802000}, {0x3c804000}, {0x3c806000},
- {0x3c808000}, {0x3c80a000}, {0x3c80c000}, {0x3c80e000},
- {0x3c810000}, {0x3c812000}, {0x3c814000}, {0x3c816000},
- {0x3c818000}, {0x3c81a000}, {0x3c81c000}, {0x3c81e000},
- {0x3c820000}, {0x3c822000}, {0x3c824000}, {0x3c826000},
- {0x3c828000}, {0x3c82a000}, {0x3c82c000}, {0x3c82e000},
- {0x3c830000}, {0x3c832000}, {0x3c834000}, {0x3c836000},
- {0x3c838000}, {0x3c83a000}, {0x3c83c000}, {0x3c83e000},
- {0x3c840000}, {0x3c842000}, {0x3c844000}, {0x3c846000},
- {0x3c848000}, {0x3c84a000}, {0x3c84c000}, {0x3c84e000},
- {0x3c850000}, {0x3c852000}, {0x3c854000}, {0x3c856000},
- {0x3c858000}, {0x3c85a000}, {0x3c85c000}, {0x3c85e000},
- {0x3c860000}, {0x3c862000}, {0x3c864000}, {0x3c866000},
- {0x3c868000}, {0x3c86a000}, {0x3c86c000}, {0x3c86e000},
- {0x3c870000}, {0x3c872000}, {0x3c874000}, {0x3c876000},
- {0x3c878000}, {0x3c87a000}, {0x3c87c000}, {0x3c87e000},
- {0x3c880000}, {0x3c882000}, {0x3c884000}, {0x3c886000},
- {0x3c888000}, {0x3c88a000}, {0x3c88c000}, {0x3c88e000},
- {0x3c890000}, {0x3c892000}, {0x3c894000}, {0x3c896000},
- {0x3c898000}, {0x3c89a000}, {0x3c89c000}, {0x3c89e000},
- {0x3c8a0000}, {0x3c8a2000}, {0x3c8a4000}, {0x3c8a6000},
- {0x3c8a8000}, {0x3c8aa000}, {0x3c8ac000}, {0x3c8ae000},
- {0x3c8b0000}, {0x3c8b2000}, {0x3c8b4000}, {0x3c8b6000},
- {0x3c8b8000}, {0x3c8ba000}, {0x3c8bc000}, {0x3c8be000},
- {0x3c8c0000}, {0x3c8c2000}, {0x3c8c4000}, {0x3c8c6000},
- {0x3c8c8000}, {0x3c8ca000}, {0x3c8cc000}, {0x3c8ce000},
- {0x3c8d0000}, {0x3c8d2000}, {0x3c8d4000}, {0x3c8d6000},
- {0x3c8d8000}, {0x3c8da000}, {0x3c8dc000}, {0x3c8de000},
- {0x3c8e0000}, {0x3c8e2000}, {0x3c8e4000}, {0x3c8e6000},
- {0x3c8e8000}, {0x3c8ea000}, {0x3c8ec000}, {0x3c8ee000},
- {0x3c8f0000}, {0x3c8f2000}, {0x3c8f4000}, {0x3c8f6000},
- {0x3c8f8000}, {0x3c8fa000}, {0x3c8fc000}, {0x3c8fe000},
- {0x3c900000}, {0x3c902000}, {0x3c904000}, {0x3c906000},
- {0x3c908000}, {0x3c90a000}, {0x3c90c000}, {0x3c90e000},
- {0x3c910000}, {0x3c912000}, {0x3c914000}, {0x3c916000},
- {0x3c918000}, {0x3c91a000}, {0x3c91c000}, {0x3c91e000},
- {0x3c920000}, {0x3c922000}, {0x3c924000}, {0x3c926000},
- {0x3c928000}, {0x3c92a000}, {0x3c92c000}, {0x3c92e000},
- {0x3c930000}, {0x3c932000}, {0x3c934000}, {0x3c936000},
- {0x3c938000}, {0x3c93a000}, {0x3c93c000}, {0x3c93e000},
- {0x3c940000}, {0x3c942000}, {0x3c944000}, {0x3c946000},
- {0x3c948000}, {0x3c94a000}, {0x3c94c000}, {0x3c94e000},
- {0x3c950000}, {0x3c952000}, {0x3c954000}, {0x3c956000},
- {0x3c958000}, {0x3c95a000}, {0x3c95c000}, {0x3c95e000},
- {0x3c960000}, {0x3c962000}, {0x3c964000}, {0x3c966000},
- {0x3c968000}, {0x3c96a000}, {0x3c96c000}, {0x3c96e000},
- {0x3c970000}, {0x3c972000}, {0x3c974000}, {0x3c976000},
- {0x3c978000}, {0x3c97a000}, {0x3c97c000}, {0x3c97e000},
- {0x3c980000}, {0x3c982000}, {0x3c984000}, {0x3c986000},
- {0x3c988000}, {0x3c98a000}, {0x3c98c000}, {0x3c98e000},
- {0x3c990000}, {0x3c992000}, {0x3c994000}, {0x3c996000},
- {0x3c998000}, {0x3c99a000}, {0x3c99c000}, {0x3c99e000},
- {0x3c9a0000}, {0x3c9a2000}, {0x3c9a4000}, {0x3c9a6000},
- {0x3c9a8000}, {0x3c9aa000}, {0x3c9ac000}, {0x3c9ae000},
- {0x3c9b0000}, {0x3c9b2000}, {0x3c9b4000}, {0x3c9b6000},
- {0x3c9b8000}, {0x3c9ba000}, {0x3c9bc000}, {0x3c9be000},
- {0x3c9c0000}, {0x3c9c2000}, {0x3c9c4000}, {0x3c9c6000},
- {0x3c9c8000}, {0x3c9ca000}, {0x3c9cc000}, {0x3c9ce000},
- {0x3c9d0000}, {0x3c9d2000}, {0x3c9d4000}, {0x3c9d6000},
- {0x3c9d8000}, {0x3c9da000}, {0x3c9dc000}, {0x3c9de000},
- {0x3c9e0000}, {0x3c9e2000}, {0x3c9e4000}, {0x3c9e6000},
- {0x3c9e8000}, {0x3c9ea000}, {0x3c9ec000}, {0x3c9ee000},
- {0x3c9f0000}, {0x3c9f2000}, {0x3c9f4000}, {0x3c9f6000},
- {0x3c9f8000}, {0x3c9fa000}, {0x3c9fc000}, {0x3c9fe000},
- {0x3ca00000}, {0x3ca02000}, {0x3ca04000}, {0x3ca06000},
- {0x3ca08000}, {0x3ca0a000}, {0x3ca0c000}, {0x3ca0e000},
- {0x3ca10000}, {0x3ca12000}, {0x3ca14000}, {0x3ca16000},
- {0x3ca18000}, {0x3ca1a000}, {0x3ca1c000}, {0x3ca1e000},
- {0x3ca20000}, {0x3ca22000}, {0x3ca24000}, {0x3ca26000},
- {0x3ca28000}, {0x3ca2a000}, {0x3ca2c000}, {0x3ca2e000},
- {0x3ca30000}, {0x3ca32000}, {0x3ca34000}, {0x3ca36000},
- {0x3ca38000}, {0x3ca3a000}, {0x3ca3c000}, {0x3ca3e000},
- {0x3ca40000}, {0x3ca42000}, {0x3ca44000}, {0x3ca46000},
- {0x3ca48000}, {0x3ca4a000}, {0x3ca4c000}, {0x3ca4e000},
- {0x3ca50000}, {0x3ca52000}, {0x3ca54000}, {0x3ca56000},
- {0x3ca58000}, {0x3ca5a000}, {0x3ca5c000}, {0x3ca5e000},
- {0x3ca60000}, {0x3ca62000}, {0x3ca64000}, {0x3ca66000},
- {0x3ca68000}, {0x3ca6a000}, {0x3ca6c000}, {0x3ca6e000},
- {0x3ca70000}, {0x3ca72000}, {0x3ca74000}, {0x3ca76000},
- {0x3ca78000}, {0x3ca7a000}, {0x3ca7c000}, {0x3ca7e000},
- {0x3ca80000}, {0x3ca82000}, {0x3ca84000}, {0x3ca86000},
- {0x3ca88000}, {0x3ca8a000}, {0x3ca8c000}, {0x3ca8e000},
- {0x3ca90000}, {0x3ca92000}, {0x3ca94000}, {0x3ca96000},
- {0x3ca98000}, {0x3ca9a000}, {0x3ca9c000}, {0x3ca9e000},
- {0x3caa0000}, {0x3caa2000}, {0x3caa4000}, {0x3caa6000},
- {0x3caa8000}, {0x3caaa000}, {0x3caac000}, {0x3caae000},
- {0x3cab0000}, {0x3cab2000}, {0x3cab4000}, {0x3cab6000},
- {0x3cab8000}, {0x3caba000}, {0x3cabc000}, {0x3cabe000},
- {0x3cac0000}, {0x3cac2000}, {0x3cac4000}, {0x3cac6000},
- {0x3cac8000}, {0x3caca000}, {0x3cacc000}, {0x3cace000},
- {0x3cad0000}, {0x3cad2000}, {0x3cad4000}, {0x3cad6000},
- {0x3cad8000}, {0x3cada000}, {0x3cadc000}, {0x3cade000},
- {0x3cae0000}, {0x3cae2000}, {0x3cae4000}, {0x3cae6000},
- {0x3cae8000}, {0x3caea000}, {0x3caec000}, {0x3caee000},
- {0x3caf0000}, {0x3caf2000}, {0x3caf4000}, {0x3caf6000},
- {0x3caf8000}, {0x3cafa000}, {0x3cafc000}, {0x3cafe000},
- {0x3cb00000}, {0x3cb02000}, {0x3cb04000}, {0x3cb06000},
- {0x3cb08000}, {0x3cb0a000}, {0x3cb0c000}, {0x3cb0e000},
- {0x3cb10000}, {0x3cb12000}, {0x3cb14000}, {0x3cb16000},
- {0x3cb18000}, {0x3cb1a000}, {0x3cb1c000}, {0x3cb1e000},
- {0x3cb20000}, {0x3cb22000}, {0x3cb24000}, {0x3cb26000},
- {0x3cb28000}, {0x3cb2a000}, {0x3cb2c000}, {0x3cb2e000},
- {0x3cb30000}, {0x3cb32000}, {0x3cb34000}, {0x3cb36000},
- {0x3cb38000}, {0x3cb3a000}, {0x3cb3c000}, {0x3cb3e000},
- {0x3cb40000}, {0x3cb42000}, {0x3cb44000}, {0x3cb46000},
- {0x3cb48000}, {0x3cb4a000}, {0x3cb4c000}, {0x3cb4e000},
- {0x3cb50000}, {0x3cb52000}, {0x3cb54000}, {0x3cb56000},
- {0x3cb58000}, {0x3cb5a000}, {0x3cb5c000}, {0x3cb5e000},
- {0x3cb60000}, {0x3cb62000}, {0x3cb64000}, {0x3cb66000},
- {0x3cb68000}, {0x3cb6a000}, {0x3cb6c000}, {0x3cb6e000},
- {0x3cb70000}, {0x3cb72000}, {0x3cb74000}, {0x3cb76000},
- {0x3cb78000}, {0x3cb7a000}, {0x3cb7c000}, {0x3cb7e000},
- {0x3cb80000}, {0x3cb82000}, {0x3cb84000}, {0x3cb86000},
- {0x3cb88000}, {0x3cb8a000}, {0x3cb8c000}, {0x3cb8e000},
- {0x3cb90000}, {0x3cb92000}, {0x3cb94000}, {0x3cb96000},
- {0x3cb98000}, {0x3cb9a000}, {0x3cb9c000}, {0x3cb9e000},
- {0x3cba0000}, {0x3cba2000}, {0x3cba4000}, {0x3cba6000},
- {0x3cba8000}, {0x3cbaa000}, {0x3cbac000}, {0x3cbae000},
- {0x3cbb0000}, {0x3cbb2000}, {0x3cbb4000}, {0x3cbb6000},
- {0x3cbb8000}, {0x3cbba000}, {0x3cbbc000}, {0x3cbbe000},
- {0x3cbc0000}, {0x3cbc2000}, {0x3cbc4000}, {0x3cbc6000},
- {0x3cbc8000}, {0x3cbca000}, {0x3cbcc000}, {0x3cbce000},
- {0x3cbd0000}, {0x3cbd2000}, {0x3cbd4000}, {0x3cbd6000},
- {0x3cbd8000}, {0x3cbda000}, {0x3cbdc000}, {0x3cbde000},
- {0x3cbe0000}, {0x3cbe2000}, {0x3cbe4000}, {0x3cbe6000},
- {0x3cbe8000}, {0x3cbea000}, {0x3cbec000}, {0x3cbee000},
- {0x3cbf0000}, {0x3cbf2000}, {0x3cbf4000}, {0x3cbf6000},
- {0x3cbf8000}, {0x3cbfa000}, {0x3cbfc000}, {0x3cbfe000},
- {0x3cc00000}, {0x3cc02000}, {0x3cc04000}, {0x3cc06000},
- {0x3cc08000}, {0x3cc0a000}, {0x3cc0c000}, {0x3cc0e000},
- {0x3cc10000}, {0x3cc12000}, {0x3cc14000}, {0x3cc16000},
- {0x3cc18000}, {0x3cc1a000}, {0x3cc1c000}, {0x3cc1e000},
- {0x3cc20000}, {0x3cc22000}, {0x3cc24000}, {0x3cc26000},
- {0x3cc28000}, {0x3cc2a000}, {0x3cc2c000}, {0x3cc2e000},
- {0x3cc30000}, {0x3cc32000}, {0x3cc34000}, {0x3cc36000},
- {0x3cc38000}, {0x3cc3a000}, {0x3cc3c000}, {0x3cc3e000},
- {0x3cc40000}, {0x3cc42000}, {0x3cc44000}, {0x3cc46000},
- {0x3cc48000}, {0x3cc4a000}, {0x3cc4c000}, {0x3cc4e000},
- {0x3cc50000}, {0x3cc52000}, {0x3cc54000}, {0x3cc56000},
- {0x3cc58000}, {0x3cc5a000}, {0x3cc5c000}, {0x3cc5e000},
- {0x3cc60000}, {0x3cc62000}, {0x3cc64000}, {0x3cc66000},
- {0x3cc68000}, {0x3cc6a000}, {0x3cc6c000}, {0x3cc6e000},
- {0x3cc70000}, {0x3cc72000}, {0x3cc74000}, {0x3cc76000},
- {0x3cc78000}, {0x3cc7a000}, {0x3cc7c000}, {0x3cc7e000},
- {0x3cc80000}, {0x3cc82000}, {0x3cc84000}, {0x3cc86000},
- {0x3cc88000}, {0x3cc8a000}, {0x3cc8c000}, {0x3cc8e000},
- {0x3cc90000}, {0x3cc92000}, {0x3cc94000}, {0x3cc96000},
- {0x3cc98000}, {0x3cc9a000}, {0x3cc9c000}, {0x3cc9e000},
- {0x3cca0000}, {0x3cca2000}, {0x3cca4000}, {0x3cca6000},
- {0x3cca8000}, {0x3ccaa000}, {0x3ccac000}, {0x3ccae000},
- {0x3ccb0000}, {0x3ccb2000}, {0x3ccb4000}, {0x3ccb6000},
- {0x3ccb8000}, {0x3ccba000}, {0x3ccbc000}, {0x3ccbe000},
- {0x3ccc0000}, {0x3ccc2000}, {0x3ccc4000}, {0x3ccc6000},
- {0x3ccc8000}, {0x3ccca000}, {0x3cccc000}, {0x3ccce000},
- {0x3ccd0000}, {0x3ccd2000}, {0x3ccd4000}, {0x3ccd6000},
- {0x3ccd8000}, {0x3ccda000}, {0x3ccdc000}, {0x3ccde000},
- {0x3cce0000}, {0x3cce2000}, {0x3cce4000}, {0x3cce6000},
- {0x3cce8000}, {0x3ccea000}, {0x3ccec000}, {0x3ccee000},
- {0x3ccf0000}, {0x3ccf2000}, {0x3ccf4000}, {0x3ccf6000},
- {0x3ccf8000}, {0x3ccfa000}, {0x3ccfc000}, {0x3ccfe000},
- {0x3cd00000}, {0x3cd02000}, {0x3cd04000}, {0x3cd06000},
- {0x3cd08000}, {0x3cd0a000}, {0x3cd0c000}, {0x3cd0e000},
- {0x3cd10000}, {0x3cd12000}, {0x3cd14000}, {0x3cd16000},
- {0x3cd18000}, {0x3cd1a000}, {0x3cd1c000}, {0x3cd1e000},
- {0x3cd20000}, {0x3cd22000}, {0x3cd24000}, {0x3cd26000},
- {0x3cd28000}, {0x3cd2a000}, {0x3cd2c000}, {0x3cd2e000},
- {0x3cd30000}, {0x3cd32000}, {0x3cd34000}, {0x3cd36000},
- {0x3cd38000}, {0x3cd3a000}, {0x3cd3c000}, {0x3cd3e000},
- {0x3cd40000}, {0x3cd42000}, {0x3cd44000}, {0x3cd46000},
- {0x3cd48000}, {0x3cd4a000}, {0x3cd4c000}, {0x3cd4e000},
- {0x3cd50000}, {0x3cd52000}, {0x3cd54000}, {0x3cd56000},
- {0x3cd58000}, {0x3cd5a000}, {0x3cd5c000}, {0x3cd5e000},
- {0x3cd60000}, {0x3cd62000}, {0x3cd64000}, {0x3cd66000},
- {0x3cd68000}, {0x3cd6a000}, {0x3cd6c000}, {0x3cd6e000},
- {0x3cd70000}, {0x3cd72000}, {0x3cd74000}, {0x3cd76000},
- {0x3cd78000}, {0x3cd7a000}, {0x3cd7c000}, {0x3cd7e000},
- {0x3cd80000}, {0x3cd82000}, {0x3cd84000}, {0x3cd86000},
- {0x3cd88000}, {0x3cd8a000}, {0x3cd8c000}, {0x3cd8e000},
- {0x3cd90000}, {0x3cd92000}, {0x3cd94000}, {0x3cd96000},
- {0x3cd98000}, {0x3cd9a000}, {0x3cd9c000}, {0x3cd9e000},
- {0x3cda0000}, {0x3cda2000}, {0x3cda4000}, {0x3cda6000},
- {0x3cda8000}, {0x3cdaa000}, {0x3cdac000}, {0x3cdae000},
- {0x3cdb0000}, {0x3cdb2000}, {0x3cdb4000}, {0x3cdb6000},
- {0x3cdb8000}, {0x3cdba000}, {0x3cdbc000}, {0x3cdbe000},
- {0x3cdc0000}, {0x3cdc2000}, {0x3cdc4000}, {0x3cdc6000},
- {0x3cdc8000}, {0x3cdca000}, {0x3cdcc000}, {0x3cdce000},
- {0x3cdd0000}, {0x3cdd2000}, {0x3cdd4000}, {0x3cdd6000},
- {0x3cdd8000}, {0x3cdda000}, {0x3cddc000}, {0x3cdde000},
- {0x3cde0000}, {0x3cde2000}, {0x3cde4000}, {0x3cde6000},
- {0x3cde8000}, {0x3cdea000}, {0x3cdec000}, {0x3cdee000},
- {0x3cdf0000}, {0x3cdf2000}, {0x3cdf4000}, {0x3cdf6000},
- {0x3cdf8000}, {0x3cdfa000}, {0x3cdfc000}, {0x3cdfe000},
- {0x3ce00000}, {0x3ce02000}, {0x3ce04000}, {0x3ce06000},
- {0x3ce08000}, {0x3ce0a000}, {0x3ce0c000}, {0x3ce0e000},
- {0x3ce10000}, {0x3ce12000}, {0x3ce14000}, {0x3ce16000},
- {0x3ce18000}, {0x3ce1a000}, {0x3ce1c000}, {0x3ce1e000},
- {0x3ce20000}, {0x3ce22000}, {0x3ce24000}, {0x3ce26000},
- {0x3ce28000}, {0x3ce2a000}, {0x3ce2c000}, {0x3ce2e000},
- {0x3ce30000}, {0x3ce32000}, {0x3ce34000}, {0x3ce36000},
- {0x3ce38000}, {0x3ce3a000}, {0x3ce3c000}, {0x3ce3e000},
- {0x3ce40000}, {0x3ce42000}, {0x3ce44000}, {0x3ce46000},
- {0x3ce48000}, {0x3ce4a000}, {0x3ce4c000}, {0x3ce4e000},
- {0x3ce50000}, {0x3ce52000}, {0x3ce54000}, {0x3ce56000},
- {0x3ce58000}, {0x3ce5a000}, {0x3ce5c000}, {0x3ce5e000},
- {0x3ce60000}, {0x3ce62000}, {0x3ce64000}, {0x3ce66000},
- {0x3ce68000}, {0x3ce6a000}, {0x3ce6c000}, {0x3ce6e000},
- {0x3ce70000}, {0x3ce72000}, {0x3ce74000}, {0x3ce76000},
- {0x3ce78000}, {0x3ce7a000}, {0x3ce7c000}, {0x3ce7e000},
- {0x3ce80000}, {0x3ce82000}, {0x3ce84000}, {0x3ce86000},
- {0x3ce88000}, {0x3ce8a000}, {0x3ce8c000}, {0x3ce8e000},
- {0x3ce90000}, {0x3ce92000}, {0x3ce94000}, {0x3ce96000},
- {0x3ce98000}, {0x3ce9a000}, {0x3ce9c000}, {0x3ce9e000},
- {0x3cea0000}, {0x3cea2000}, {0x3cea4000}, {0x3cea6000},
- {0x3cea8000}, {0x3ceaa000}, {0x3ceac000}, {0x3ceae000},
- {0x3ceb0000}, {0x3ceb2000}, {0x3ceb4000}, {0x3ceb6000},
- {0x3ceb8000}, {0x3ceba000}, {0x3cebc000}, {0x3cebe000},
- {0x3cec0000}, {0x3cec2000}, {0x3cec4000}, {0x3cec6000},
- {0x3cec8000}, {0x3ceca000}, {0x3cecc000}, {0x3cece000},
- {0x3ced0000}, {0x3ced2000}, {0x3ced4000}, {0x3ced6000},
- {0x3ced8000}, {0x3ceda000}, {0x3cedc000}, {0x3cede000},
- {0x3cee0000}, {0x3cee2000}, {0x3cee4000}, {0x3cee6000},
- {0x3cee8000}, {0x3ceea000}, {0x3ceec000}, {0x3ceee000},
- {0x3cef0000}, {0x3cef2000}, {0x3cef4000}, {0x3cef6000},
- {0x3cef8000}, {0x3cefa000}, {0x3cefc000}, {0x3cefe000},
- {0x3cf00000}, {0x3cf02000}, {0x3cf04000}, {0x3cf06000},
- {0x3cf08000}, {0x3cf0a000}, {0x3cf0c000}, {0x3cf0e000},
- {0x3cf10000}, {0x3cf12000}, {0x3cf14000}, {0x3cf16000},
- {0x3cf18000}, {0x3cf1a000}, {0x3cf1c000}, {0x3cf1e000},
- {0x3cf20000}, {0x3cf22000}, {0x3cf24000}, {0x3cf26000},
- {0x3cf28000}, {0x3cf2a000}, {0x3cf2c000}, {0x3cf2e000},
- {0x3cf30000}, {0x3cf32000}, {0x3cf34000}, {0x3cf36000},
- {0x3cf38000}, {0x3cf3a000}, {0x3cf3c000}, {0x3cf3e000},
- {0x3cf40000}, {0x3cf42000}, {0x3cf44000}, {0x3cf46000},
- {0x3cf48000}, {0x3cf4a000}, {0x3cf4c000}, {0x3cf4e000},
- {0x3cf50000}, {0x3cf52000}, {0x3cf54000}, {0x3cf56000},
- {0x3cf58000}, {0x3cf5a000}, {0x3cf5c000}, {0x3cf5e000},
- {0x3cf60000}, {0x3cf62000}, {0x3cf64000}, {0x3cf66000},
- {0x3cf68000}, {0x3cf6a000}, {0x3cf6c000}, {0x3cf6e000},
- {0x3cf70000}, {0x3cf72000}, {0x3cf74000}, {0x3cf76000},
- {0x3cf78000}, {0x3cf7a000}, {0x3cf7c000}, {0x3cf7e000},
- {0x3cf80000}, {0x3cf82000}, {0x3cf84000}, {0x3cf86000},
- {0x3cf88000}, {0x3cf8a000}, {0x3cf8c000}, {0x3cf8e000},
- {0x3cf90000}, {0x3cf92000}, {0x3cf94000}, {0x3cf96000},
- {0x3cf98000}, {0x3cf9a000}, {0x3cf9c000}, {0x3cf9e000},
- {0x3cfa0000}, {0x3cfa2000}, {0x3cfa4000}, {0x3cfa6000},
- {0x3cfa8000}, {0x3cfaa000}, {0x3cfac000}, {0x3cfae000},
- {0x3cfb0000}, {0x3cfb2000}, {0x3cfb4000}, {0x3cfb6000},
- {0x3cfb8000}, {0x3cfba000}, {0x3cfbc000}, {0x3cfbe000},
- {0x3cfc0000}, {0x3cfc2000}, {0x3cfc4000}, {0x3cfc6000},
- {0x3cfc8000}, {0x3cfca000}, {0x3cfcc000}, {0x3cfce000},
- {0x3cfd0000}, {0x3cfd2000}, {0x3cfd4000}, {0x3cfd6000},
- {0x3cfd8000}, {0x3cfda000}, {0x3cfdc000}, {0x3cfde000},
- {0x3cfe0000}, {0x3cfe2000}, {0x3cfe4000}, {0x3cfe6000},
- {0x3cfe8000}, {0x3cfea000}, {0x3cfec000}, {0x3cfee000},
- {0x3cff0000}, {0x3cff2000}, {0x3cff4000}, {0x3cff6000},
- {0x3cff8000}, {0x3cffa000}, {0x3cffc000}, {0x3cffe000},
- {0x3d000000}, {0x3d002000}, {0x3d004000}, {0x3d006000},
- {0x3d008000}, {0x3d00a000}, {0x3d00c000}, {0x3d00e000},
- {0x3d010000}, {0x3d012000}, {0x3d014000}, {0x3d016000},
- {0x3d018000}, {0x3d01a000}, {0x3d01c000}, {0x3d01e000},
- {0x3d020000}, {0x3d022000}, {0x3d024000}, {0x3d026000},
- {0x3d028000}, {0x3d02a000}, {0x3d02c000}, {0x3d02e000},
- {0x3d030000}, {0x3d032000}, {0x3d034000}, {0x3d036000},
- {0x3d038000}, {0x3d03a000}, {0x3d03c000}, {0x3d03e000},
- {0x3d040000}, {0x3d042000}, {0x3d044000}, {0x3d046000},
- {0x3d048000}, {0x3d04a000}, {0x3d04c000}, {0x3d04e000},
- {0x3d050000}, {0x3d052000}, {0x3d054000}, {0x3d056000},
- {0x3d058000}, {0x3d05a000}, {0x3d05c000}, {0x3d05e000},
- {0x3d060000}, {0x3d062000}, {0x3d064000}, {0x3d066000},
- {0x3d068000}, {0x3d06a000}, {0x3d06c000}, {0x3d06e000},
- {0x3d070000}, {0x3d072000}, {0x3d074000}, {0x3d076000},
- {0x3d078000}, {0x3d07a000}, {0x3d07c000}, {0x3d07e000},
- {0x3d080000}, {0x3d082000}, {0x3d084000}, {0x3d086000},
- {0x3d088000}, {0x3d08a000}, {0x3d08c000}, {0x3d08e000},
- {0x3d090000}, {0x3d092000}, {0x3d094000}, {0x3d096000},
- {0x3d098000}, {0x3d09a000}, {0x3d09c000}, {0x3d09e000},
- {0x3d0a0000}, {0x3d0a2000}, {0x3d0a4000}, {0x3d0a6000},
- {0x3d0a8000}, {0x3d0aa000}, {0x3d0ac000}, {0x3d0ae000},
- {0x3d0b0000}, {0x3d0b2000}, {0x3d0b4000}, {0x3d0b6000},
- {0x3d0b8000}, {0x3d0ba000}, {0x3d0bc000}, {0x3d0be000},
- {0x3d0c0000}, {0x3d0c2000}, {0x3d0c4000}, {0x3d0c6000},
- {0x3d0c8000}, {0x3d0ca000}, {0x3d0cc000}, {0x3d0ce000},
- {0x3d0d0000}, {0x3d0d2000}, {0x3d0d4000}, {0x3d0d6000},
- {0x3d0d8000}, {0x3d0da000}, {0x3d0dc000}, {0x3d0de000},
- {0x3d0e0000}, {0x3d0e2000}, {0x3d0e4000}, {0x3d0e6000},
- {0x3d0e8000}, {0x3d0ea000}, {0x3d0ec000}, {0x3d0ee000},
- {0x3d0f0000}, {0x3d0f2000}, {0x3d0f4000}, {0x3d0f6000},
- {0x3d0f8000}, {0x3d0fa000}, {0x3d0fc000}, {0x3d0fe000},
- {0x3d100000}, {0x3d102000}, {0x3d104000}, {0x3d106000},
- {0x3d108000}, {0x3d10a000}, {0x3d10c000}, {0x3d10e000},
- {0x3d110000}, {0x3d112000}, {0x3d114000}, {0x3d116000},
- {0x3d118000}, {0x3d11a000}, {0x3d11c000}, {0x3d11e000},
- {0x3d120000}, {0x3d122000}, {0x3d124000}, {0x3d126000},
- {0x3d128000}, {0x3d12a000}, {0x3d12c000}, {0x3d12e000},
- {0x3d130000}, {0x3d132000}, {0x3d134000}, {0x3d136000},
- {0x3d138000}, {0x3d13a000}, {0x3d13c000}, {0x3d13e000},
- {0x3d140000}, {0x3d142000}, {0x3d144000}, {0x3d146000},
- {0x3d148000}, {0x3d14a000}, {0x3d14c000}, {0x3d14e000},
- {0x3d150000}, {0x3d152000}, {0x3d154000}, {0x3d156000},
- {0x3d158000}, {0x3d15a000}, {0x3d15c000}, {0x3d15e000},
- {0x3d160000}, {0x3d162000}, {0x3d164000}, {0x3d166000},
- {0x3d168000}, {0x3d16a000}, {0x3d16c000}, {0x3d16e000},
- {0x3d170000}, {0x3d172000}, {0x3d174000}, {0x3d176000},
- {0x3d178000}, {0x3d17a000}, {0x3d17c000}, {0x3d17e000},
- {0x3d180000}, {0x3d182000}, {0x3d184000}, {0x3d186000},
- {0x3d188000}, {0x3d18a000}, {0x3d18c000}, {0x3d18e000},
- {0x3d190000}, {0x3d192000}, {0x3d194000}, {0x3d196000},
- {0x3d198000}, {0x3d19a000}, {0x3d19c000}, {0x3d19e000},
- {0x3d1a0000}, {0x3d1a2000}, {0x3d1a4000}, {0x3d1a6000},
- {0x3d1a8000}, {0x3d1aa000}, {0x3d1ac000}, {0x3d1ae000},
- {0x3d1b0000}, {0x3d1b2000}, {0x3d1b4000}, {0x3d1b6000},
- {0x3d1b8000}, {0x3d1ba000}, {0x3d1bc000}, {0x3d1be000},
- {0x3d1c0000}, {0x3d1c2000}, {0x3d1c4000}, {0x3d1c6000},
- {0x3d1c8000}, {0x3d1ca000}, {0x3d1cc000}, {0x3d1ce000},
- {0x3d1d0000}, {0x3d1d2000}, {0x3d1d4000}, {0x3d1d6000},
- {0x3d1d8000}, {0x3d1da000}, {0x3d1dc000}, {0x3d1de000},
- {0x3d1e0000}, {0x3d1e2000}, {0x3d1e4000}, {0x3d1e6000},
- {0x3d1e8000}, {0x3d1ea000}, {0x3d1ec000}, {0x3d1ee000},
- {0x3d1f0000}, {0x3d1f2000}, {0x3d1f4000}, {0x3d1f6000},
- {0x3d1f8000}, {0x3d1fa000}, {0x3d1fc000}, {0x3d1fe000},
- {0x3d200000}, {0x3d202000}, {0x3d204000}, {0x3d206000},
- {0x3d208000}, {0x3d20a000}, {0x3d20c000}, {0x3d20e000},
- {0x3d210000}, {0x3d212000}, {0x3d214000}, {0x3d216000},
- {0x3d218000}, {0x3d21a000}, {0x3d21c000}, {0x3d21e000},
- {0x3d220000}, {0x3d222000}, {0x3d224000}, {0x3d226000},
- {0x3d228000}, {0x3d22a000}, {0x3d22c000}, {0x3d22e000},
- {0x3d230000}, {0x3d232000}, {0x3d234000}, {0x3d236000},
- {0x3d238000}, {0x3d23a000}, {0x3d23c000}, {0x3d23e000},
- {0x3d240000}, {0x3d242000}, {0x3d244000}, {0x3d246000},
- {0x3d248000}, {0x3d24a000}, {0x3d24c000}, {0x3d24e000},
- {0x3d250000}, {0x3d252000}, {0x3d254000}, {0x3d256000},
- {0x3d258000}, {0x3d25a000}, {0x3d25c000}, {0x3d25e000},
- {0x3d260000}, {0x3d262000}, {0x3d264000}, {0x3d266000},
- {0x3d268000}, {0x3d26a000}, {0x3d26c000}, {0x3d26e000},
- {0x3d270000}, {0x3d272000}, {0x3d274000}, {0x3d276000},
- {0x3d278000}, {0x3d27a000}, {0x3d27c000}, {0x3d27e000},
- {0x3d280000}, {0x3d282000}, {0x3d284000}, {0x3d286000},
- {0x3d288000}, {0x3d28a000}, {0x3d28c000}, {0x3d28e000},
- {0x3d290000}, {0x3d292000}, {0x3d294000}, {0x3d296000},
- {0x3d298000}, {0x3d29a000}, {0x3d29c000}, {0x3d29e000},
- {0x3d2a0000}, {0x3d2a2000}, {0x3d2a4000}, {0x3d2a6000},
- {0x3d2a8000}, {0x3d2aa000}, {0x3d2ac000}, {0x3d2ae000},
- {0x3d2b0000}, {0x3d2b2000}, {0x3d2b4000}, {0x3d2b6000},
- {0x3d2b8000}, {0x3d2ba000}, {0x3d2bc000}, {0x3d2be000},
- {0x3d2c0000}, {0x3d2c2000}, {0x3d2c4000}, {0x3d2c6000},
- {0x3d2c8000}, {0x3d2ca000}, {0x3d2cc000}, {0x3d2ce000},
- {0x3d2d0000}, {0x3d2d2000}, {0x3d2d4000}, {0x3d2d6000},
- {0x3d2d8000}, {0x3d2da000}, {0x3d2dc000}, {0x3d2de000},
- {0x3d2e0000}, {0x3d2e2000}, {0x3d2e4000}, {0x3d2e6000},
- {0x3d2e8000}, {0x3d2ea000}, {0x3d2ec000}, {0x3d2ee000},
- {0x3d2f0000}, {0x3d2f2000}, {0x3d2f4000}, {0x3d2f6000},
- {0x3d2f8000}, {0x3d2fa000}, {0x3d2fc000}, {0x3d2fe000},
- {0x3d300000}, {0x3d302000}, {0x3d304000}, {0x3d306000},
- {0x3d308000}, {0x3d30a000}, {0x3d30c000}, {0x3d30e000},
- {0x3d310000}, {0x3d312000}, {0x3d314000}, {0x3d316000},
- {0x3d318000}, {0x3d31a000}, {0x3d31c000}, {0x3d31e000},
- {0x3d320000}, {0x3d322000}, {0x3d324000}, {0x3d326000},
- {0x3d328000}, {0x3d32a000}, {0x3d32c000}, {0x3d32e000},
- {0x3d330000}, {0x3d332000}, {0x3d334000}, {0x3d336000},
- {0x3d338000}, {0x3d33a000}, {0x3d33c000}, {0x3d33e000},
- {0x3d340000}, {0x3d342000}, {0x3d344000}, {0x3d346000},
- {0x3d348000}, {0x3d34a000}, {0x3d34c000}, {0x3d34e000},
- {0x3d350000}, {0x3d352000}, {0x3d354000}, {0x3d356000},
- {0x3d358000}, {0x3d35a000}, {0x3d35c000}, {0x3d35e000},
- {0x3d360000}, {0x3d362000}, {0x3d364000}, {0x3d366000},
- {0x3d368000}, {0x3d36a000}, {0x3d36c000}, {0x3d36e000},
- {0x3d370000}, {0x3d372000}, {0x3d374000}, {0x3d376000},
- {0x3d378000}, {0x3d37a000}, {0x3d37c000}, {0x3d37e000},
- {0x3d380000}, {0x3d382000}, {0x3d384000}, {0x3d386000},
- {0x3d388000}, {0x3d38a000}, {0x3d38c000}, {0x3d38e000},
- {0x3d390000}, {0x3d392000}, {0x3d394000}, {0x3d396000},
- {0x3d398000}, {0x3d39a000}, {0x3d39c000}, {0x3d39e000},
- {0x3d3a0000}, {0x3d3a2000}, {0x3d3a4000}, {0x3d3a6000},
- {0x3d3a8000}, {0x3d3aa000}, {0x3d3ac000}, {0x3d3ae000},
- {0x3d3b0000}, {0x3d3b2000}, {0x3d3b4000}, {0x3d3b6000},
- {0x3d3b8000}, {0x3d3ba000}, {0x3d3bc000}, {0x3d3be000},
- {0x3d3c0000}, {0x3d3c2000}, {0x3d3c4000}, {0x3d3c6000},
- {0x3d3c8000}, {0x3d3ca000}, {0x3d3cc000}, {0x3d3ce000},
- {0x3d3d0000}, {0x3d3d2000}, {0x3d3d4000}, {0x3d3d6000},
- {0x3d3d8000}, {0x3d3da000}, {0x3d3dc000}, {0x3d3de000},
- {0x3d3e0000}, {0x3d3e2000}, {0x3d3e4000}, {0x3d3e6000},
- {0x3d3e8000}, {0x3d3ea000}, {0x3d3ec000}, {0x3d3ee000},
- {0x3d3f0000}, {0x3d3f2000}, {0x3d3f4000}, {0x3d3f6000},
- {0x3d3f8000}, {0x3d3fa000}, {0x3d3fc000}, {0x3d3fe000},
- {0x3d400000}, {0x3d402000}, {0x3d404000}, {0x3d406000},
- {0x3d408000}, {0x3d40a000}, {0x3d40c000}, {0x3d40e000},
- {0x3d410000}, {0x3d412000}, {0x3d414000}, {0x3d416000},
- {0x3d418000}, {0x3d41a000}, {0x3d41c000}, {0x3d41e000},
- {0x3d420000}, {0x3d422000}, {0x3d424000}, {0x3d426000},
- {0x3d428000}, {0x3d42a000}, {0x3d42c000}, {0x3d42e000},
- {0x3d430000}, {0x3d432000}, {0x3d434000}, {0x3d436000},
- {0x3d438000}, {0x3d43a000}, {0x3d43c000}, {0x3d43e000},
- {0x3d440000}, {0x3d442000}, {0x3d444000}, {0x3d446000},
- {0x3d448000}, {0x3d44a000}, {0x3d44c000}, {0x3d44e000},
- {0x3d450000}, {0x3d452000}, {0x3d454000}, {0x3d456000},
- {0x3d458000}, {0x3d45a000}, {0x3d45c000}, {0x3d45e000},
- {0x3d460000}, {0x3d462000}, {0x3d464000}, {0x3d466000},
- {0x3d468000}, {0x3d46a000}, {0x3d46c000}, {0x3d46e000},
- {0x3d470000}, {0x3d472000}, {0x3d474000}, {0x3d476000},
- {0x3d478000}, {0x3d47a000}, {0x3d47c000}, {0x3d47e000},
- {0x3d480000}, {0x3d482000}, {0x3d484000}, {0x3d486000},
- {0x3d488000}, {0x3d48a000}, {0x3d48c000}, {0x3d48e000},
- {0x3d490000}, {0x3d492000}, {0x3d494000}, {0x3d496000},
- {0x3d498000}, {0x3d49a000}, {0x3d49c000}, {0x3d49e000},
- {0x3d4a0000}, {0x3d4a2000}, {0x3d4a4000}, {0x3d4a6000},
- {0x3d4a8000}, {0x3d4aa000}, {0x3d4ac000}, {0x3d4ae000},
- {0x3d4b0000}, {0x3d4b2000}, {0x3d4b4000}, {0x3d4b6000},
- {0x3d4b8000}, {0x3d4ba000}, {0x3d4bc000}, {0x3d4be000},
- {0x3d4c0000}, {0x3d4c2000}, {0x3d4c4000}, {0x3d4c6000},
- {0x3d4c8000}, {0x3d4ca000}, {0x3d4cc000}, {0x3d4ce000},
- {0x3d4d0000}, {0x3d4d2000}, {0x3d4d4000}, {0x3d4d6000},
- {0x3d4d8000}, {0x3d4da000}, {0x3d4dc000}, {0x3d4de000},
- {0x3d4e0000}, {0x3d4e2000}, {0x3d4e4000}, {0x3d4e6000},
- {0x3d4e8000}, {0x3d4ea000}, {0x3d4ec000}, {0x3d4ee000},
- {0x3d4f0000}, {0x3d4f2000}, {0x3d4f4000}, {0x3d4f6000},
- {0x3d4f8000}, {0x3d4fa000}, {0x3d4fc000}, {0x3d4fe000},
- {0x3d500000}, {0x3d502000}, {0x3d504000}, {0x3d506000},
- {0x3d508000}, {0x3d50a000}, {0x3d50c000}, {0x3d50e000},
- {0x3d510000}, {0x3d512000}, {0x3d514000}, {0x3d516000},
- {0x3d518000}, {0x3d51a000}, {0x3d51c000}, {0x3d51e000},
- {0x3d520000}, {0x3d522000}, {0x3d524000}, {0x3d526000},
- {0x3d528000}, {0x3d52a000}, {0x3d52c000}, {0x3d52e000},
- {0x3d530000}, {0x3d532000}, {0x3d534000}, {0x3d536000},
- {0x3d538000}, {0x3d53a000}, {0x3d53c000}, {0x3d53e000},
- {0x3d540000}, {0x3d542000}, {0x3d544000}, {0x3d546000},
- {0x3d548000}, {0x3d54a000}, {0x3d54c000}, {0x3d54e000},
- {0x3d550000}, {0x3d552000}, {0x3d554000}, {0x3d556000},
- {0x3d558000}, {0x3d55a000}, {0x3d55c000}, {0x3d55e000},
- {0x3d560000}, {0x3d562000}, {0x3d564000}, {0x3d566000},
- {0x3d568000}, {0x3d56a000}, {0x3d56c000}, {0x3d56e000},
- {0x3d570000}, {0x3d572000}, {0x3d574000}, {0x3d576000},
- {0x3d578000}, {0x3d57a000}, {0x3d57c000}, {0x3d57e000},
- {0x3d580000}, {0x3d582000}, {0x3d584000}, {0x3d586000},
- {0x3d588000}, {0x3d58a000}, {0x3d58c000}, {0x3d58e000},
- {0x3d590000}, {0x3d592000}, {0x3d594000}, {0x3d596000},
- {0x3d598000}, {0x3d59a000}, {0x3d59c000}, {0x3d59e000},
- {0x3d5a0000}, {0x3d5a2000}, {0x3d5a4000}, {0x3d5a6000},
- {0x3d5a8000}, {0x3d5aa000}, {0x3d5ac000}, {0x3d5ae000},
- {0x3d5b0000}, {0x3d5b2000}, {0x3d5b4000}, {0x3d5b6000},
- {0x3d5b8000}, {0x3d5ba000}, {0x3d5bc000}, {0x3d5be000},
- {0x3d5c0000}, {0x3d5c2000}, {0x3d5c4000}, {0x3d5c6000},
- {0x3d5c8000}, {0x3d5ca000}, {0x3d5cc000}, {0x3d5ce000},
- {0x3d5d0000}, {0x3d5d2000}, {0x3d5d4000}, {0x3d5d6000},
- {0x3d5d8000}, {0x3d5da000}, {0x3d5dc000}, {0x3d5de000},
- {0x3d5e0000}, {0x3d5e2000}, {0x3d5e4000}, {0x3d5e6000},
- {0x3d5e8000}, {0x3d5ea000}, {0x3d5ec000}, {0x3d5ee000},
- {0x3d5f0000}, {0x3d5f2000}, {0x3d5f4000}, {0x3d5f6000},
- {0x3d5f8000}, {0x3d5fa000}, {0x3d5fc000}, {0x3d5fe000},
- {0x3d600000}, {0x3d602000}, {0x3d604000}, {0x3d606000},
- {0x3d608000}, {0x3d60a000}, {0x3d60c000}, {0x3d60e000},
- {0x3d610000}, {0x3d612000}, {0x3d614000}, {0x3d616000},
- {0x3d618000}, {0x3d61a000}, {0x3d61c000}, {0x3d61e000},
- {0x3d620000}, {0x3d622000}, {0x3d624000}, {0x3d626000},
- {0x3d628000}, {0x3d62a000}, {0x3d62c000}, {0x3d62e000},
- {0x3d630000}, {0x3d632000}, {0x3d634000}, {0x3d636000},
- {0x3d638000}, {0x3d63a000}, {0x3d63c000}, {0x3d63e000},
- {0x3d640000}, {0x3d642000}, {0x3d644000}, {0x3d646000},
- {0x3d648000}, {0x3d64a000}, {0x3d64c000}, {0x3d64e000},
- {0x3d650000}, {0x3d652000}, {0x3d654000}, {0x3d656000},
- {0x3d658000}, {0x3d65a000}, {0x3d65c000}, {0x3d65e000},
- {0x3d660000}, {0x3d662000}, {0x3d664000}, {0x3d666000},
- {0x3d668000}, {0x3d66a000}, {0x3d66c000}, {0x3d66e000},
- {0x3d670000}, {0x3d672000}, {0x3d674000}, {0x3d676000},
- {0x3d678000}, {0x3d67a000}, {0x3d67c000}, {0x3d67e000},
- {0x3d680000}, {0x3d682000}, {0x3d684000}, {0x3d686000},
- {0x3d688000}, {0x3d68a000}, {0x3d68c000}, {0x3d68e000},
- {0x3d690000}, {0x3d692000}, {0x3d694000}, {0x3d696000},
- {0x3d698000}, {0x3d69a000}, {0x3d69c000}, {0x3d69e000},
- {0x3d6a0000}, {0x3d6a2000}, {0x3d6a4000}, {0x3d6a6000},
- {0x3d6a8000}, {0x3d6aa000}, {0x3d6ac000}, {0x3d6ae000},
- {0x3d6b0000}, {0x3d6b2000}, {0x3d6b4000}, {0x3d6b6000},
- {0x3d6b8000}, {0x3d6ba000}, {0x3d6bc000}, {0x3d6be000},
- {0x3d6c0000}, {0x3d6c2000}, {0x3d6c4000}, {0x3d6c6000},
- {0x3d6c8000}, {0x3d6ca000}, {0x3d6cc000}, {0x3d6ce000},
- {0x3d6d0000}, {0x3d6d2000}, {0x3d6d4000}, {0x3d6d6000},
- {0x3d6d8000}, {0x3d6da000}, {0x3d6dc000}, {0x3d6de000},
- {0x3d6e0000}, {0x3d6e2000}, {0x3d6e4000}, {0x3d6e6000},
- {0x3d6e8000}, {0x3d6ea000}, {0x3d6ec000}, {0x3d6ee000},
- {0x3d6f0000}, {0x3d6f2000}, {0x3d6f4000}, {0x3d6f6000},
- {0x3d6f8000}, {0x3d6fa000}, {0x3d6fc000}, {0x3d6fe000},
- {0x3d700000}, {0x3d702000}, {0x3d704000}, {0x3d706000},
- {0x3d708000}, {0x3d70a000}, {0x3d70c000}, {0x3d70e000},
- {0x3d710000}, {0x3d712000}, {0x3d714000}, {0x3d716000},
- {0x3d718000}, {0x3d71a000}, {0x3d71c000}, {0x3d71e000},
- {0x3d720000}, {0x3d722000}, {0x3d724000}, {0x3d726000},
- {0x3d728000}, {0x3d72a000}, {0x3d72c000}, {0x3d72e000},
- {0x3d730000}, {0x3d732000}, {0x3d734000}, {0x3d736000},
- {0x3d738000}, {0x3d73a000}, {0x3d73c000}, {0x3d73e000},
- {0x3d740000}, {0x3d742000}, {0x3d744000}, {0x3d746000},
- {0x3d748000}, {0x3d74a000}, {0x3d74c000}, {0x3d74e000},
- {0x3d750000}, {0x3d752000}, {0x3d754000}, {0x3d756000},
- {0x3d758000}, {0x3d75a000}, {0x3d75c000}, {0x3d75e000},
- {0x3d760000}, {0x3d762000}, {0x3d764000}, {0x3d766000},
- {0x3d768000}, {0x3d76a000}, {0x3d76c000}, {0x3d76e000},
- {0x3d770000}, {0x3d772000}, {0x3d774000}, {0x3d776000},
- {0x3d778000}, {0x3d77a000}, {0x3d77c000}, {0x3d77e000},
- {0x3d780000}, {0x3d782000}, {0x3d784000}, {0x3d786000},
- {0x3d788000}, {0x3d78a000}, {0x3d78c000}, {0x3d78e000},
- {0x3d790000}, {0x3d792000}, {0x3d794000}, {0x3d796000},
- {0x3d798000}, {0x3d79a000}, {0x3d79c000}, {0x3d79e000},
- {0x3d7a0000}, {0x3d7a2000}, {0x3d7a4000}, {0x3d7a6000},
- {0x3d7a8000}, {0x3d7aa000}, {0x3d7ac000}, {0x3d7ae000},
- {0x3d7b0000}, {0x3d7b2000}, {0x3d7b4000}, {0x3d7b6000},
- {0x3d7b8000}, {0x3d7ba000}, {0x3d7bc000}, {0x3d7be000},
- {0x3d7c0000}, {0x3d7c2000}, {0x3d7c4000}, {0x3d7c6000},
- {0x3d7c8000}, {0x3d7ca000}, {0x3d7cc000}, {0x3d7ce000},
- {0x3d7d0000}, {0x3d7d2000}, {0x3d7d4000}, {0x3d7d6000},
- {0x3d7d8000}, {0x3d7da000}, {0x3d7dc000}, {0x3d7de000},
- {0x3d7e0000}, {0x3d7e2000}, {0x3d7e4000}, {0x3d7e6000},
- {0x3d7e8000}, {0x3d7ea000}, {0x3d7ec000}, {0x3d7ee000},
- {0x3d7f0000}, {0x3d7f2000}, {0x3d7f4000}, {0x3d7f6000},
- {0x3d7f8000}, {0x3d7fa000}, {0x3d7fc000}, {0x3d7fe000},
- {0x3d800000}, {0x3d802000}, {0x3d804000}, {0x3d806000},
- {0x3d808000}, {0x3d80a000}, {0x3d80c000}, {0x3d80e000},
- {0x3d810000}, {0x3d812000}, {0x3d814000}, {0x3d816000},
- {0x3d818000}, {0x3d81a000}, {0x3d81c000}, {0x3d81e000},
- {0x3d820000}, {0x3d822000}, {0x3d824000}, {0x3d826000},
- {0x3d828000}, {0x3d82a000}, {0x3d82c000}, {0x3d82e000},
- {0x3d830000}, {0x3d832000}, {0x3d834000}, {0x3d836000},
- {0x3d838000}, {0x3d83a000}, {0x3d83c000}, {0x3d83e000},
- {0x3d840000}, {0x3d842000}, {0x3d844000}, {0x3d846000},
- {0x3d848000}, {0x3d84a000}, {0x3d84c000}, {0x3d84e000},
- {0x3d850000}, {0x3d852000}, {0x3d854000}, {0x3d856000},
- {0x3d858000}, {0x3d85a000}, {0x3d85c000}, {0x3d85e000},
- {0x3d860000}, {0x3d862000}, {0x3d864000}, {0x3d866000},
- {0x3d868000}, {0x3d86a000}, {0x3d86c000}, {0x3d86e000},
- {0x3d870000}, {0x3d872000}, {0x3d874000}, {0x3d876000},
- {0x3d878000}, {0x3d87a000}, {0x3d87c000}, {0x3d87e000},
- {0x3d880000}, {0x3d882000}, {0x3d884000}, {0x3d886000},
- {0x3d888000}, {0x3d88a000}, {0x3d88c000}, {0x3d88e000},
- {0x3d890000}, {0x3d892000}, {0x3d894000}, {0x3d896000},
- {0x3d898000}, {0x3d89a000}, {0x3d89c000}, {0x3d89e000},
- {0x3d8a0000}, {0x3d8a2000}, {0x3d8a4000}, {0x3d8a6000},
- {0x3d8a8000}, {0x3d8aa000}, {0x3d8ac000}, {0x3d8ae000},
- {0x3d8b0000}, {0x3d8b2000}, {0x3d8b4000}, {0x3d8b6000},
- {0x3d8b8000}, {0x3d8ba000}, {0x3d8bc000}, {0x3d8be000},
- {0x3d8c0000}, {0x3d8c2000}, {0x3d8c4000}, {0x3d8c6000},
- {0x3d8c8000}, {0x3d8ca000}, {0x3d8cc000}, {0x3d8ce000},
- {0x3d8d0000}, {0x3d8d2000}, {0x3d8d4000}, {0x3d8d6000},
- {0x3d8d8000}, {0x3d8da000}, {0x3d8dc000}, {0x3d8de000},
- {0x3d8e0000}, {0x3d8e2000}, {0x3d8e4000}, {0x3d8e6000},
- {0x3d8e8000}, {0x3d8ea000}, {0x3d8ec000}, {0x3d8ee000},
- {0x3d8f0000}, {0x3d8f2000}, {0x3d8f4000}, {0x3d8f6000},
- {0x3d8f8000}, {0x3d8fa000}, {0x3d8fc000}, {0x3d8fe000},
- {0x3d900000}, {0x3d902000}, {0x3d904000}, {0x3d906000},
- {0x3d908000}, {0x3d90a000}, {0x3d90c000}, {0x3d90e000},
- {0x3d910000}, {0x3d912000}, {0x3d914000}, {0x3d916000},
- {0x3d918000}, {0x3d91a000}, {0x3d91c000}, {0x3d91e000},
- {0x3d920000}, {0x3d922000}, {0x3d924000}, {0x3d926000},
- {0x3d928000}, {0x3d92a000}, {0x3d92c000}, {0x3d92e000},
- {0x3d930000}, {0x3d932000}, {0x3d934000}, {0x3d936000},
- {0x3d938000}, {0x3d93a000}, {0x3d93c000}, {0x3d93e000},
- {0x3d940000}, {0x3d942000}, {0x3d944000}, {0x3d946000},
- {0x3d948000}, {0x3d94a000}, {0x3d94c000}, {0x3d94e000},
- {0x3d950000}, {0x3d952000}, {0x3d954000}, {0x3d956000},
- {0x3d958000}, {0x3d95a000}, {0x3d95c000}, {0x3d95e000},
- {0x3d960000}, {0x3d962000}, {0x3d964000}, {0x3d966000},
- {0x3d968000}, {0x3d96a000}, {0x3d96c000}, {0x3d96e000},
- {0x3d970000}, {0x3d972000}, {0x3d974000}, {0x3d976000},
- {0x3d978000}, {0x3d97a000}, {0x3d97c000}, {0x3d97e000},
- {0x3d980000}, {0x3d982000}, {0x3d984000}, {0x3d986000},
- {0x3d988000}, {0x3d98a000}, {0x3d98c000}, {0x3d98e000},
- {0x3d990000}, {0x3d992000}, {0x3d994000}, {0x3d996000},
- {0x3d998000}, {0x3d99a000}, {0x3d99c000}, {0x3d99e000},
- {0x3d9a0000}, {0x3d9a2000}, {0x3d9a4000}, {0x3d9a6000},
- {0x3d9a8000}, {0x3d9aa000}, {0x3d9ac000}, {0x3d9ae000},
- {0x3d9b0000}, {0x3d9b2000}, {0x3d9b4000}, {0x3d9b6000},
- {0x3d9b8000}, {0x3d9ba000}, {0x3d9bc000}, {0x3d9be000},
- {0x3d9c0000}, {0x3d9c2000}, {0x3d9c4000}, {0x3d9c6000},
- {0x3d9c8000}, {0x3d9ca000}, {0x3d9cc000}, {0x3d9ce000},
- {0x3d9d0000}, {0x3d9d2000}, {0x3d9d4000}, {0x3d9d6000},
- {0x3d9d8000}, {0x3d9da000}, {0x3d9dc000}, {0x3d9de000},
- {0x3d9e0000}, {0x3d9e2000}, {0x3d9e4000}, {0x3d9e6000},
- {0x3d9e8000}, {0x3d9ea000}, {0x3d9ec000}, {0x3d9ee000},
- {0x3d9f0000}, {0x3d9f2000}, {0x3d9f4000}, {0x3d9f6000},
- {0x3d9f8000}, {0x3d9fa000}, {0x3d9fc000}, {0x3d9fe000},
- {0x3da00000}, {0x3da02000}, {0x3da04000}, {0x3da06000},
- {0x3da08000}, {0x3da0a000}, {0x3da0c000}, {0x3da0e000},
- {0x3da10000}, {0x3da12000}, {0x3da14000}, {0x3da16000},
- {0x3da18000}, {0x3da1a000}, {0x3da1c000}, {0x3da1e000},
- {0x3da20000}, {0x3da22000}, {0x3da24000}, {0x3da26000},
- {0x3da28000}, {0x3da2a000}, {0x3da2c000}, {0x3da2e000},
- {0x3da30000}, {0x3da32000}, {0x3da34000}, {0x3da36000},
- {0x3da38000}, {0x3da3a000}, {0x3da3c000}, {0x3da3e000},
- {0x3da40000}, {0x3da42000}, {0x3da44000}, {0x3da46000},
- {0x3da48000}, {0x3da4a000}, {0x3da4c000}, {0x3da4e000},
- {0x3da50000}, {0x3da52000}, {0x3da54000}, {0x3da56000},
- {0x3da58000}, {0x3da5a000}, {0x3da5c000}, {0x3da5e000},
- {0x3da60000}, {0x3da62000}, {0x3da64000}, {0x3da66000},
- {0x3da68000}, {0x3da6a000}, {0x3da6c000}, {0x3da6e000},
- {0x3da70000}, {0x3da72000}, {0x3da74000}, {0x3da76000},
- {0x3da78000}, {0x3da7a000}, {0x3da7c000}, {0x3da7e000},
- {0x3da80000}, {0x3da82000}, {0x3da84000}, {0x3da86000},
- {0x3da88000}, {0x3da8a000}, {0x3da8c000}, {0x3da8e000},
- {0x3da90000}, {0x3da92000}, {0x3da94000}, {0x3da96000},
- {0x3da98000}, {0x3da9a000}, {0x3da9c000}, {0x3da9e000},
- {0x3daa0000}, {0x3daa2000}, {0x3daa4000}, {0x3daa6000},
- {0x3daa8000}, {0x3daaa000}, {0x3daac000}, {0x3daae000},
- {0x3dab0000}, {0x3dab2000}, {0x3dab4000}, {0x3dab6000},
- {0x3dab8000}, {0x3daba000}, {0x3dabc000}, {0x3dabe000},
- {0x3dac0000}, {0x3dac2000}, {0x3dac4000}, {0x3dac6000},
- {0x3dac8000}, {0x3daca000}, {0x3dacc000}, {0x3dace000},
- {0x3dad0000}, {0x3dad2000}, {0x3dad4000}, {0x3dad6000},
- {0x3dad8000}, {0x3dada000}, {0x3dadc000}, {0x3dade000},
- {0x3dae0000}, {0x3dae2000}, {0x3dae4000}, {0x3dae6000},
- {0x3dae8000}, {0x3daea000}, {0x3daec000}, {0x3daee000},
- {0x3daf0000}, {0x3daf2000}, {0x3daf4000}, {0x3daf6000},
- {0x3daf8000}, {0x3dafa000}, {0x3dafc000}, {0x3dafe000},
- {0x3db00000}, {0x3db02000}, {0x3db04000}, {0x3db06000},
- {0x3db08000}, {0x3db0a000}, {0x3db0c000}, {0x3db0e000},
- {0x3db10000}, {0x3db12000}, {0x3db14000}, {0x3db16000},
- {0x3db18000}, {0x3db1a000}, {0x3db1c000}, {0x3db1e000},
- {0x3db20000}, {0x3db22000}, {0x3db24000}, {0x3db26000},
- {0x3db28000}, {0x3db2a000}, {0x3db2c000}, {0x3db2e000},
- {0x3db30000}, {0x3db32000}, {0x3db34000}, {0x3db36000},
- {0x3db38000}, {0x3db3a000}, {0x3db3c000}, {0x3db3e000},
- {0x3db40000}, {0x3db42000}, {0x3db44000}, {0x3db46000},
- {0x3db48000}, {0x3db4a000}, {0x3db4c000}, {0x3db4e000},
- {0x3db50000}, {0x3db52000}, {0x3db54000}, {0x3db56000},
- {0x3db58000}, {0x3db5a000}, {0x3db5c000}, {0x3db5e000},
- {0x3db60000}, {0x3db62000}, {0x3db64000}, {0x3db66000},
- {0x3db68000}, {0x3db6a000}, {0x3db6c000}, {0x3db6e000},
- {0x3db70000}, {0x3db72000}, {0x3db74000}, {0x3db76000},
- {0x3db78000}, {0x3db7a000}, {0x3db7c000}, {0x3db7e000},
- {0x3db80000}, {0x3db82000}, {0x3db84000}, {0x3db86000},
- {0x3db88000}, {0x3db8a000}, {0x3db8c000}, {0x3db8e000},
- {0x3db90000}, {0x3db92000}, {0x3db94000}, {0x3db96000},
- {0x3db98000}, {0x3db9a000}, {0x3db9c000}, {0x3db9e000},
- {0x3dba0000}, {0x3dba2000}, {0x3dba4000}, {0x3dba6000},
- {0x3dba8000}, {0x3dbaa000}, {0x3dbac000}, {0x3dbae000},
- {0x3dbb0000}, {0x3dbb2000}, {0x3dbb4000}, {0x3dbb6000},
- {0x3dbb8000}, {0x3dbba000}, {0x3dbbc000}, {0x3dbbe000},
- {0x3dbc0000}, {0x3dbc2000}, {0x3dbc4000}, {0x3dbc6000},
- {0x3dbc8000}, {0x3dbca000}, {0x3dbcc000}, {0x3dbce000},
- {0x3dbd0000}, {0x3dbd2000}, {0x3dbd4000}, {0x3dbd6000},
- {0x3dbd8000}, {0x3dbda000}, {0x3dbdc000}, {0x3dbde000},
- {0x3dbe0000}, {0x3dbe2000}, {0x3dbe4000}, {0x3dbe6000},
- {0x3dbe8000}, {0x3dbea000}, {0x3dbec000}, {0x3dbee000},
- {0x3dbf0000}, {0x3dbf2000}, {0x3dbf4000}, {0x3dbf6000},
- {0x3dbf8000}, {0x3dbfa000}, {0x3dbfc000}, {0x3dbfe000},
- {0x3dc00000}, {0x3dc02000}, {0x3dc04000}, {0x3dc06000},
- {0x3dc08000}, {0x3dc0a000}, {0x3dc0c000}, {0x3dc0e000},
- {0x3dc10000}, {0x3dc12000}, {0x3dc14000}, {0x3dc16000},
- {0x3dc18000}, {0x3dc1a000}, {0x3dc1c000}, {0x3dc1e000},
- {0x3dc20000}, {0x3dc22000}, {0x3dc24000}, {0x3dc26000},
- {0x3dc28000}, {0x3dc2a000}, {0x3dc2c000}, {0x3dc2e000},
- {0x3dc30000}, {0x3dc32000}, {0x3dc34000}, {0x3dc36000},
- {0x3dc38000}, {0x3dc3a000}, {0x3dc3c000}, {0x3dc3e000},
- {0x3dc40000}, {0x3dc42000}, {0x3dc44000}, {0x3dc46000},
- {0x3dc48000}, {0x3dc4a000}, {0x3dc4c000}, {0x3dc4e000},
- {0x3dc50000}, {0x3dc52000}, {0x3dc54000}, {0x3dc56000},
- {0x3dc58000}, {0x3dc5a000}, {0x3dc5c000}, {0x3dc5e000},
- {0x3dc60000}, {0x3dc62000}, {0x3dc64000}, {0x3dc66000},
- {0x3dc68000}, {0x3dc6a000}, {0x3dc6c000}, {0x3dc6e000},
- {0x3dc70000}, {0x3dc72000}, {0x3dc74000}, {0x3dc76000},
- {0x3dc78000}, {0x3dc7a000}, {0x3dc7c000}, {0x3dc7e000},
- {0x3dc80000}, {0x3dc82000}, {0x3dc84000}, {0x3dc86000},
- {0x3dc88000}, {0x3dc8a000}, {0x3dc8c000}, {0x3dc8e000},
- {0x3dc90000}, {0x3dc92000}, {0x3dc94000}, {0x3dc96000},
- {0x3dc98000}, {0x3dc9a000}, {0x3dc9c000}, {0x3dc9e000},
- {0x3dca0000}, {0x3dca2000}, {0x3dca4000}, {0x3dca6000},
- {0x3dca8000}, {0x3dcaa000}, {0x3dcac000}, {0x3dcae000},
- {0x3dcb0000}, {0x3dcb2000}, {0x3dcb4000}, {0x3dcb6000},
- {0x3dcb8000}, {0x3dcba000}, {0x3dcbc000}, {0x3dcbe000},
- {0x3dcc0000}, {0x3dcc2000}, {0x3dcc4000}, {0x3dcc6000},
- {0x3dcc8000}, {0x3dcca000}, {0x3dccc000}, {0x3dcce000},
- {0x3dcd0000}, {0x3dcd2000}, {0x3dcd4000}, {0x3dcd6000},
- {0x3dcd8000}, {0x3dcda000}, {0x3dcdc000}, {0x3dcde000},
- {0x3dce0000}, {0x3dce2000}, {0x3dce4000}, {0x3dce6000},
- {0x3dce8000}, {0x3dcea000}, {0x3dcec000}, {0x3dcee000},
- {0x3dcf0000}, {0x3dcf2000}, {0x3dcf4000}, {0x3dcf6000},
- {0x3dcf8000}, {0x3dcfa000}, {0x3dcfc000}, {0x3dcfe000},
- {0x3dd00000}, {0x3dd02000}, {0x3dd04000}, {0x3dd06000},
- {0x3dd08000}, {0x3dd0a000}, {0x3dd0c000}, {0x3dd0e000},
- {0x3dd10000}, {0x3dd12000}, {0x3dd14000}, {0x3dd16000},
- {0x3dd18000}, {0x3dd1a000}, {0x3dd1c000}, {0x3dd1e000},
- {0x3dd20000}, {0x3dd22000}, {0x3dd24000}, {0x3dd26000},
- {0x3dd28000}, {0x3dd2a000}, {0x3dd2c000}, {0x3dd2e000},
- {0x3dd30000}, {0x3dd32000}, {0x3dd34000}, {0x3dd36000},
- {0x3dd38000}, {0x3dd3a000}, {0x3dd3c000}, {0x3dd3e000},
- {0x3dd40000}, {0x3dd42000}, {0x3dd44000}, {0x3dd46000},
- {0x3dd48000}, {0x3dd4a000}, {0x3dd4c000}, {0x3dd4e000},
- {0x3dd50000}, {0x3dd52000}, {0x3dd54000}, {0x3dd56000},
- {0x3dd58000}, {0x3dd5a000}, {0x3dd5c000}, {0x3dd5e000},
- {0x3dd60000}, {0x3dd62000}, {0x3dd64000}, {0x3dd66000},
- {0x3dd68000}, {0x3dd6a000}, {0x3dd6c000}, {0x3dd6e000},
- {0x3dd70000}, {0x3dd72000}, {0x3dd74000}, {0x3dd76000},
- {0x3dd78000}, {0x3dd7a000}, {0x3dd7c000}, {0x3dd7e000},
- {0x3dd80000}, {0x3dd82000}, {0x3dd84000}, {0x3dd86000},
- {0x3dd88000}, {0x3dd8a000}, {0x3dd8c000}, {0x3dd8e000},
- {0x3dd90000}, {0x3dd92000}, {0x3dd94000}, {0x3dd96000},
- {0x3dd98000}, {0x3dd9a000}, {0x3dd9c000}, {0x3dd9e000},
- {0x3dda0000}, {0x3dda2000}, {0x3dda4000}, {0x3dda6000},
- {0x3dda8000}, {0x3ddaa000}, {0x3ddac000}, {0x3ddae000},
- {0x3ddb0000}, {0x3ddb2000}, {0x3ddb4000}, {0x3ddb6000},
- {0x3ddb8000}, {0x3ddba000}, {0x3ddbc000}, {0x3ddbe000},
- {0x3ddc0000}, {0x3ddc2000}, {0x3ddc4000}, {0x3ddc6000},
- {0x3ddc8000}, {0x3ddca000}, {0x3ddcc000}, {0x3ddce000},
- {0x3ddd0000}, {0x3ddd2000}, {0x3ddd4000}, {0x3ddd6000},
- {0x3ddd8000}, {0x3ddda000}, {0x3dddc000}, {0x3ddde000},
- {0x3dde0000}, {0x3dde2000}, {0x3dde4000}, {0x3dde6000},
- {0x3dde8000}, {0x3ddea000}, {0x3ddec000}, {0x3ddee000},
- {0x3ddf0000}, {0x3ddf2000}, {0x3ddf4000}, {0x3ddf6000},
- {0x3ddf8000}, {0x3ddfa000}, {0x3ddfc000}, {0x3ddfe000},
- {0x3de00000}, {0x3de02000}, {0x3de04000}, {0x3de06000},
- {0x3de08000}, {0x3de0a000}, {0x3de0c000}, {0x3de0e000},
- {0x3de10000}, {0x3de12000}, {0x3de14000}, {0x3de16000},
- {0x3de18000}, {0x3de1a000}, {0x3de1c000}, {0x3de1e000},
- {0x3de20000}, {0x3de22000}, {0x3de24000}, {0x3de26000},
- {0x3de28000}, {0x3de2a000}, {0x3de2c000}, {0x3de2e000},
- {0x3de30000}, {0x3de32000}, {0x3de34000}, {0x3de36000},
- {0x3de38000}, {0x3de3a000}, {0x3de3c000}, {0x3de3e000},
- {0x3de40000}, {0x3de42000}, {0x3de44000}, {0x3de46000},
- {0x3de48000}, {0x3de4a000}, {0x3de4c000}, {0x3de4e000},
- {0x3de50000}, {0x3de52000}, {0x3de54000}, {0x3de56000},
- {0x3de58000}, {0x3de5a000}, {0x3de5c000}, {0x3de5e000},
- {0x3de60000}, {0x3de62000}, {0x3de64000}, {0x3de66000},
- {0x3de68000}, {0x3de6a000}, {0x3de6c000}, {0x3de6e000},
- {0x3de70000}, {0x3de72000}, {0x3de74000}, {0x3de76000},
- {0x3de78000}, {0x3de7a000}, {0x3de7c000}, {0x3de7e000},
- {0x3de80000}, {0x3de82000}, {0x3de84000}, {0x3de86000},
- {0x3de88000}, {0x3de8a000}, {0x3de8c000}, {0x3de8e000},
- {0x3de90000}, {0x3de92000}, {0x3de94000}, {0x3de96000},
- {0x3de98000}, {0x3de9a000}, {0x3de9c000}, {0x3de9e000},
- {0x3dea0000}, {0x3dea2000}, {0x3dea4000}, {0x3dea6000},
- {0x3dea8000}, {0x3deaa000}, {0x3deac000}, {0x3deae000},
- {0x3deb0000}, {0x3deb2000}, {0x3deb4000}, {0x3deb6000},
- {0x3deb8000}, {0x3deba000}, {0x3debc000}, {0x3debe000},
- {0x3dec0000}, {0x3dec2000}, {0x3dec4000}, {0x3dec6000},
- {0x3dec8000}, {0x3deca000}, {0x3decc000}, {0x3dece000},
- {0x3ded0000}, {0x3ded2000}, {0x3ded4000}, {0x3ded6000},
- {0x3ded8000}, {0x3deda000}, {0x3dedc000}, {0x3dede000},
- {0x3dee0000}, {0x3dee2000}, {0x3dee4000}, {0x3dee6000},
- {0x3dee8000}, {0x3deea000}, {0x3deec000}, {0x3deee000},
- {0x3def0000}, {0x3def2000}, {0x3def4000}, {0x3def6000},
- {0x3def8000}, {0x3defa000}, {0x3defc000}, {0x3defe000},
- {0x3df00000}, {0x3df02000}, {0x3df04000}, {0x3df06000},
- {0x3df08000}, {0x3df0a000}, {0x3df0c000}, {0x3df0e000},
- {0x3df10000}, {0x3df12000}, {0x3df14000}, {0x3df16000},
- {0x3df18000}, {0x3df1a000}, {0x3df1c000}, {0x3df1e000},
- {0x3df20000}, {0x3df22000}, {0x3df24000}, {0x3df26000},
- {0x3df28000}, {0x3df2a000}, {0x3df2c000}, {0x3df2e000},
- {0x3df30000}, {0x3df32000}, {0x3df34000}, {0x3df36000},
- {0x3df38000}, {0x3df3a000}, {0x3df3c000}, {0x3df3e000},
- {0x3df40000}, {0x3df42000}, {0x3df44000}, {0x3df46000},
- {0x3df48000}, {0x3df4a000}, {0x3df4c000}, {0x3df4e000},
- {0x3df50000}, {0x3df52000}, {0x3df54000}, {0x3df56000},
- {0x3df58000}, {0x3df5a000}, {0x3df5c000}, {0x3df5e000},
- {0x3df60000}, {0x3df62000}, {0x3df64000}, {0x3df66000},
- {0x3df68000}, {0x3df6a000}, {0x3df6c000}, {0x3df6e000},
- {0x3df70000}, {0x3df72000}, {0x3df74000}, {0x3df76000},
- {0x3df78000}, {0x3df7a000}, {0x3df7c000}, {0x3df7e000},
- {0x3df80000}, {0x3df82000}, {0x3df84000}, {0x3df86000},
- {0x3df88000}, {0x3df8a000}, {0x3df8c000}, {0x3df8e000},
- {0x3df90000}, {0x3df92000}, {0x3df94000}, {0x3df96000},
- {0x3df98000}, {0x3df9a000}, {0x3df9c000}, {0x3df9e000},
- {0x3dfa0000}, {0x3dfa2000}, {0x3dfa4000}, {0x3dfa6000},
- {0x3dfa8000}, {0x3dfaa000}, {0x3dfac000}, {0x3dfae000},
- {0x3dfb0000}, {0x3dfb2000}, {0x3dfb4000}, {0x3dfb6000},
- {0x3dfb8000}, {0x3dfba000}, {0x3dfbc000}, {0x3dfbe000},
- {0x3dfc0000}, {0x3dfc2000}, {0x3dfc4000}, {0x3dfc6000},
- {0x3dfc8000}, {0x3dfca000}, {0x3dfcc000}, {0x3dfce000},
- {0x3dfd0000}, {0x3dfd2000}, {0x3dfd4000}, {0x3dfd6000},
- {0x3dfd8000}, {0x3dfda000}, {0x3dfdc000}, {0x3dfde000},
- {0x3dfe0000}, {0x3dfe2000}, {0x3dfe4000}, {0x3dfe6000},
- {0x3dfe8000}, {0x3dfea000}, {0x3dfec000}, {0x3dfee000},
- {0x3dff0000}, {0x3dff2000}, {0x3dff4000}, {0x3dff6000},
- {0x3dff8000}, {0x3dffa000}, {0x3dffc000}, {0x3dffe000},
- {0x3e000000}, {0x3e002000}, {0x3e004000}, {0x3e006000},
- {0x3e008000}, {0x3e00a000}, {0x3e00c000}, {0x3e00e000},
- {0x3e010000}, {0x3e012000}, {0x3e014000}, {0x3e016000},
- {0x3e018000}, {0x3e01a000}, {0x3e01c000}, {0x3e01e000},
- {0x3e020000}, {0x3e022000}, {0x3e024000}, {0x3e026000},
- {0x3e028000}, {0x3e02a000}, {0x3e02c000}, {0x3e02e000},
- {0x3e030000}, {0x3e032000}, {0x3e034000}, {0x3e036000},
- {0x3e038000}, {0x3e03a000}, {0x3e03c000}, {0x3e03e000},
- {0x3e040000}, {0x3e042000}, {0x3e044000}, {0x3e046000},
- {0x3e048000}, {0x3e04a000}, {0x3e04c000}, {0x3e04e000},
- {0x3e050000}, {0x3e052000}, {0x3e054000}, {0x3e056000},
- {0x3e058000}, {0x3e05a000}, {0x3e05c000}, {0x3e05e000},
- {0x3e060000}, {0x3e062000}, {0x3e064000}, {0x3e066000},
- {0x3e068000}, {0x3e06a000}, {0x3e06c000}, {0x3e06e000},
- {0x3e070000}, {0x3e072000}, {0x3e074000}, {0x3e076000},
- {0x3e078000}, {0x3e07a000}, {0x3e07c000}, {0x3e07e000},
- {0x3e080000}, {0x3e082000}, {0x3e084000}, {0x3e086000},
- {0x3e088000}, {0x3e08a000}, {0x3e08c000}, {0x3e08e000},
- {0x3e090000}, {0x3e092000}, {0x3e094000}, {0x3e096000},
- {0x3e098000}, {0x3e09a000}, {0x3e09c000}, {0x3e09e000},
- {0x3e0a0000}, {0x3e0a2000}, {0x3e0a4000}, {0x3e0a6000},
- {0x3e0a8000}, {0x3e0aa000}, {0x3e0ac000}, {0x3e0ae000},
- {0x3e0b0000}, {0x3e0b2000}, {0x3e0b4000}, {0x3e0b6000},
- {0x3e0b8000}, {0x3e0ba000}, {0x3e0bc000}, {0x3e0be000},
- {0x3e0c0000}, {0x3e0c2000}, {0x3e0c4000}, {0x3e0c6000},
- {0x3e0c8000}, {0x3e0ca000}, {0x3e0cc000}, {0x3e0ce000},
- {0x3e0d0000}, {0x3e0d2000}, {0x3e0d4000}, {0x3e0d6000},
- {0x3e0d8000}, {0x3e0da000}, {0x3e0dc000}, {0x3e0de000},
- {0x3e0e0000}, {0x3e0e2000}, {0x3e0e4000}, {0x3e0e6000},
- {0x3e0e8000}, {0x3e0ea000}, {0x3e0ec000}, {0x3e0ee000},
- {0x3e0f0000}, {0x3e0f2000}, {0x3e0f4000}, {0x3e0f6000},
- {0x3e0f8000}, {0x3e0fa000}, {0x3e0fc000}, {0x3e0fe000},
- {0x3e100000}, {0x3e102000}, {0x3e104000}, {0x3e106000},
- {0x3e108000}, {0x3e10a000}, {0x3e10c000}, {0x3e10e000},
- {0x3e110000}, {0x3e112000}, {0x3e114000}, {0x3e116000},
- {0x3e118000}, {0x3e11a000}, {0x3e11c000}, {0x3e11e000},
- {0x3e120000}, {0x3e122000}, {0x3e124000}, {0x3e126000},
- {0x3e128000}, {0x3e12a000}, {0x3e12c000}, {0x3e12e000},
- {0x3e130000}, {0x3e132000}, {0x3e134000}, {0x3e136000},
- {0x3e138000}, {0x3e13a000}, {0x3e13c000}, {0x3e13e000},
- {0x3e140000}, {0x3e142000}, {0x3e144000}, {0x3e146000},
- {0x3e148000}, {0x3e14a000}, {0x3e14c000}, {0x3e14e000},
- {0x3e150000}, {0x3e152000}, {0x3e154000}, {0x3e156000},
- {0x3e158000}, {0x3e15a000}, {0x3e15c000}, {0x3e15e000},
- {0x3e160000}, {0x3e162000}, {0x3e164000}, {0x3e166000},
- {0x3e168000}, {0x3e16a000}, {0x3e16c000}, {0x3e16e000},
- {0x3e170000}, {0x3e172000}, {0x3e174000}, {0x3e176000},
- {0x3e178000}, {0x3e17a000}, {0x3e17c000}, {0x3e17e000},
- {0x3e180000}, {0x3e182000}, {0x3e184000}, {0x3e186000},
- {0x3e188000}, {0x3e18a000}, {0x3e18c000}, {0x3e18e000},
- {0x3e190000}, {0x3e192000}, {0x3e194000}, {0x3e196000},
- {0x3e198000}, {0x3e19a000}, {0x3e19c000}, {0x3e19e000},
- {0x3e1a0000}, {0x3e1a2000}, {0x3e1a4000}, {0x3e1a6000},
- {0x3e1a8000}, {0x3e1aa000}, {0x3e1ac000}, {0x3e1ae000},
- {0x3e1b0000}, {0x3e1b2000}, {0x3e1b4000}, {0x3e1b6000},
- {0x3e1b8000}, {0x3e1ba000}, {0x3e1bc000}, {0x3e1be000},
- {0x3e1c0000}, {0x3e1c2000}, {0x3e1c4000}, {0x3e1c6000},
- {0x3e1c8000}, {0x3e1ca000}, {0x3e1cc000}, {0x3e1ce000},
- {0x3e1d0000}, {0x3e1d2000}, {0x3e1d4000}, {0x3e1d6000},
- {0x3e1d8000}, {0x3e1da000}, {0x3e1dc000}, {0x3e1de000},
- {0x3e1e0000}, {0x3e1e2000}, {0x3e1e4000}, {0x3e1e6000},
- {0x3e1e8000}, {0x3e1ea000}, {0x3e1ec000}, {0x3e1ee000},
- {0x3e1f0000}, {0x3e1f2000}, {0x3e1f4000}, {0x3e1f6000},
- {0x3e1f8000}, {0x3e1fa000}, {0x3e1fc000}, {0x3e1fe000},
- {0x3e200000}, {0x3e202000}, {0x3e204000}, {0x3e206000},
- {0x3e208000}, {0x3e20a000}, {0x3e20c000}, {0x3e20e000},
- {0x3e210000}, {0x3e212000}, {0x3e214000}, {0x3e216000},
- {0x3e218000}, {0x3e21a000}, {0x3e21c000}, {0x3e21e000},
- {0x3e220000}, {0x3e222000}, {0x3e224000}, {0x3e226000},
- {0x3e228000}, {0x3e22a000}, {0x3e22c000}, {0x3e22e000},
- {0x3e230000}, {0x3e232000}, {0x3e234000}, {0x3e236000},
- {0x3e238000}, {0x3e23a000}, {0x3e23c000}, {0x3e23e000},
- {0x3e240000}, {0x3e242000}, {0x3e244000}, {0x3e246000},
- {0x3e248000}, {0x3e24a000}, {0x3e24c000}, {0x3e24e000},
- {0x3e250000}, {0x3e252000}, {0x3e254000}, {0x3e256000},
- {0x3e258000}, {0x3e25a000}, {0x3e25c000}, {0x3e25e000},
- {0x3e260000}, {0x3e262000}, {0x3e264000}, {0x3e266000},
- {0x3e268000}, {0x3e26a000}, {0x3e26c000}, {0x3e26e000},
- {0x3e270000}, {0x3e272000}, {0x3e274000}, {0x3e276000},
- {0x3e278000}, {0x3e27a000}, {0x3e27c000}, {0x3e27e000},
- {0x3e280000}, {0x3e282000}, {0x3e284000}, {0x3e286000},
- {0x3e288000}, {0x3e28a000}, {0x3e28c000}, {0x3e28e000},
- {0x3e290000}, {0x3e292000}, {0x3e294000}, {0x3e296000},
- {0x3e298000}, {0x3e29a000}, {0x3e29c000}, {0x3e29e000},
- {0x3e2a0000}, {0x3e2a2000}, {0x3e2a4000}, {0x3e2a6000},
- {0x3e2a8000}, {0x3e2aa000}, {0x3e2ac000}, {0x3e2ae000},
- {0x3e2b0000}, {0x3e2b2000}, {0x3e2b4000}, {0x3e2b6000},
- {0x3e2b8000}, {0x3e2ba000}, {0x3e2bc000}, {0x3e2be000},
- {0x3e2c0000}, {0x3e2c2000}, {0x3e2c4000}, {0x3e2c6000},
- {0x3e2c8000}, {0x3e2ca000}, {0x3e2cc000}, {0x3e2ce000},
- {0x3e2d0000}, {0x3e2d2000}, {0x3e2d4000}, {0x3e2d6000},
- {0x3e2d8000}, {0x3e2da000}, {0x3e2dc000}, {0x3e2de000},
- {0x3e2e0000}, {0x3e2e2000}, {0x3e2e4000}, {0x3e2e6000},
- {0x3e2e8000}, {0x3e2ea000}, {0x3e2ec000}, {0x3e2ee000},
- {0x3e2f0000}, {0x3e2f2000}, {0x3e2f4000}, {0x3e2f6000},
- {0x3e2f8000}, {0x3e2fa000}, {0x3e2fc000}, {0x3e2fe000},
- {0x3e300000}, {0x3e302000}, {0x3e304000}, {0x3e306000},
- {0x3e308000}, {0x3e30a000}, {0x3e30c000}, {0x3e30e000},
- {0x3e310000}, {0x3e312000}, {0x3e314000}, {0x3e316000},
- {0x3e318000}, {0x3e31a000}, {0x3e31c000}, {0x3e31e000},
- {0x3e320000}, {0x3e322000}, {0x3e324000}, {0x3e326000},
- {0x3e328000}, {0x3e32a000}, {0x3e32c000}, {0x3e32e000},
- {0x3e330000}, {0x3e332000}, {0x3e334000}, {0x3e336000},
- {0x3e338000}, {0x3e33a000}, {0x3e33c000}, {0x3e33e000},
- {0x3e340000}, {0x3e342000}, {0x3e344000}, {0x3e346000},
- {0x3e348000}, {0x3e34a000}, {0x3e34c000}, {0x3e34e000},
- {0x3e350000}, {0x3e352000}, {0x3e354000}, {0x3e356000},
- {0x3e358000}, {0x3e35a000}, {0x3e35c000}, {0x3e35e000},
- {0x3e360000}, {0x3e362000}, {0x3e364000}, {0x3e366000},
- {0x3e368000}, {0x3e36a000}, {0x3e36c000}, {0x3e36e000},
- {0x3e370000}, {0x3e372000}, {0x3e374000}, {0x3e376000},
- {0x3e378000}, {0x3e37a000}, {0x3e37c000}, {0x3e37e000},
- {0x3e380000}, {0x3e382000}, {0x3e384000}, {0x3e386000},
- {0x3e388000}, {0x3e38a000}, {0x3e38c000}, {0x3e38e000},
- {0x3e390000}, {0x3e392000}, {0x3e394000}, {0x3e396000},
- {0x3e398000}, {0x3e39a000}, {0x3e39c000}, {0x3e39e000},
- {0x3e3a0000}, {0x3e3a2000}, {0x3e3a4000}, {0x3e3a6000},
- {0x3e3a8000}, {0x3e3aa000}, {0x3e3ac000}, {0x3e3ae000},
- {0x3e3b0000}, {0x3e3b2000}, {0x3e3b4000}, {0x3e3b6000},
- {0x3e3b8000}, {0x3e3ba000}, {0x3e3bc000}, {0x3e3be000},
- {0x3e3c0000}, {0x3e3c2000}, {0x3e3c4000}, {0x3e3c6000},
- {0x3e3c8000}, {0x3e3ca000}, {0x3e3cc000}, {0x3e3ce000},
- {0x3e3d0000}, {0x3e3d2000}, {0x3e3d4000}, {0x3e3d6000},
- {0x3e3d8000}, {0x3e3da000}, {0x3e3dc000}, {0x3e3de000},
- {0x3e3e0000}, {0x3e3e2000}, {0x3e3e4000}, {0x3e3e6000},
- {0x3e3e8000}, {0x3e3ea000}, {0x3e3ec000}, {0x3e3ee000},
- {0x3e3f0000}, {0x3e3f2000}, {0x3e3f4000}, {0x3e3f6000},
- {0x3e3f8000}, {0x3e3fa000}, {0x3e3fc000}, {0x3e3fe000},
- {0x3e400000}, {0x3e402000}, {0x3e404000}, {0x3e406000},
- {0x3e408000}, {0x3e40a000}, {0x3e40c000}, {0x3e40e000},
- {0x3e410000}, {0x3e412000}, {0x3e414000}, {0x3e416000},
- {0x3e418000}, {0x3e41a000}, {0x3e41c000}, {0x3e41e000},
- {0x3e420000}, {0x3e422000}, {0x3e424000}, {0x3e426000},
- {0x3e428000}, {0x3e42a000}, {0x3e42c000}, {0x3e42e000},
- {0x3e430000}, {0x3e432000}, {0x3e434000}, {0x3e436000},
- {0x3e438000}, {0x3e43a000}, {0x3e43c000}, {0x3e43e000},
- {0x3e440000}, {0x3e442000}, {0x3e444000}, {0x3e446000},
- {0x3e448000}, {0x3e44a000}, {0x3e44c000}, {0x3e44e000},
- {0x3e450000}, {0x3e452000}, {0x3e454000}, {0x3e456000},
- {0x3e458000}, {0x3e45a000}, {0x3e45c000}, {0x3e45e000},
- {0x3e460000}, {0x3e462000}, {0x3e464000}, {0x3e466000},
- {0x3e468000}, {0x3e46a000}, {0x3e46c000}, {0x3e46e000},
- {0x3e470000}, {0x3e472000}, {0x3e474000}, {0x3e476000},
- {0x3e478000}, {0x3e47a000}, {0x3e47c000}, {0x3e47e000},
- {0x3e480000}, {0x3e482000}, {0x3e484000}, {0x3e486000},
- {0x3e488000}, {0x3e48a000}, {0x3e48c000}, {0x3e48e000},
- {0x3e490000}, {0x3e492000}, {0x3e494000}, {0x3e496000},
- {0x3e498000}, {0x3e49a000}, {0x3e49c000}, {0x3e49e000},
- {0x3e4a0000}, {0x3e4a2000}, {0x3e4a4000}, {0x3e4a6000},
- {0x3e4a8000}, {0x3e4aa000}, {0x3e4ac000}, {0x3e4ae000},
- {0x3e4b0000}, {0x3e4b2000}, {0x3e4b4000}, {0x3e4b6000},
- {0x3e4b8000}, {0x3e4ba000}, {0x3e4bc000}, {0x3e4be000},
- {0x3e4c0000}, {0x3e4c2000}, {0x3e4c4000}, {0x3e4c6000},
- {0x3e4c8000}, {0x3e4ca000}, {0x3e4cc000}, {0x3e4ce000},
- {0x3e4d0000}, {0x3e4d2000}, {0x3e4d4000}, {0x3e4d6000},
- {0x3e4d8000}, {0x3e4da000}, {0x3e4dc000}, {0x3e4de000},
- {0x3e4e0000}, {0x3e4e2000}, {0x3e4e4000}, {0x3e4e6000},
- {0x3e4e8000}, {0x3e4ea000}, {0x3e4ec000}, {0x3e4ee000},
- {0x3e4f0000}, {0x3e4f2000}, {0x3e4f4000}, {0x3e4f6000},
- {0x3e4f8000}, {0x3e4fa000}, {0x3e4fc000}, {0x3e4fe000},
- {0x3e500000}, {0x3e502000}, {0x3e504000}, {0x3e506000},
- {0x3e508000}, {0x3e50a000}, {0x3e50c000}, {0x3e50e000},
- {0x3e510000}, {0x3e512000}, {0x3e514000}, {0x3e516000},
- {0x3e518000}, {0x3e51a000}, {0x3e51c000}, {0x3e51e000},
- {0x3e520000}, {0x3e522000}, {0x3e524000}, {0x3e526000},
- {0x3e528000}, {0x3e52a000}, {0x3e52c000}, {0x3e52e000},
- {0x3e530000}, {0x3e532000}, {0x3e534000}, {0x3e536000},
- {0x3e538000}, {0x3e53a000}, {0x3e53c000}, {0x3e53e000},
- {0x3e540000}, {0x3e542000}, {0x3e544000}, {0x3e546000},
- {0x3e548000}, {0x3e54a000}, {0x3e54c000}, {0x3e54e000},
- {0x3e550000}, {0x3e552000}, {0x3e554000}, {0x3e556000},
- {0x3e558000}, {0x3e55a000}, {0x3e55c000}, {0x3e55e000},
- {0x3e560000}, {0x3e562000}, {0x3e564000}, {0x3e566000},
- {0x3e568000}, {0x3e56a000}, {0x3e56c000}, {0x3e56e000},
- {0x3e570000}, {0x3e572000}, {0x3e574000}, {0x3e576000},
- {0x3e578000}, {0x3e57a000}, {0x3e57c000}, {0x3e57e000},
- {0x3e580000}, {0x3e582000}, {0x3e584000}, {0x3e586000},
- {0x3e588000}, {0x3e58a000}, {0x3e58c000}, {0x3e58e000},
- {0x3e590000}, {0x3e592000}, {0x3e594000}, {0x3e596000},
- {0x3e598000}, {0x3e59a000}, {0x3e59c000}, {0x3e59e000},
- {0x3e5a0000}, {0x3e5a2000}, {0x3e5a4000}, {0x3e5a6000},
- {0x3e5a8000}, {0x3e5aa000}, {0x3e5ac000}, {0x3e5ae000},
- {0x3e5b0000}, {0x3e5b2000}, {0x3e5b4000}, {0x3e5b6000},
- {0x3e5b8000}, {0x3e5ba000}, {0x3e5bc000}, {0x3e5be000},
- {0x3e5c0000}, {0x3e5c2000}, {0x3e5c4000}, {0x3e5c6000},
- {0x3e5c8000}, {0x3e5ca000}, {0x3e5cc000}, {0x3e5ce000},
- {0x3e5d0000}, {0x3e5d2000}, {0x3e5d4000}, {0x3e5d6000},
- {0x3e5d8000}, {0x3e5da000}, {0x3e5dc000}, {0x3e5de000},
- {0x3e5e0000}, {0x3e5e2000}, {0x3e5e4000}, {0x3e5e6000},
- {0x3e5e8000}, {0x3e5ea000}, {0x3e5ec000}, {0x3e5ee000},
- {0x3e5f0000}, {0x3e5f2000}, {0x3e5f4000}, {0x3e5f6000},
- {0x3e5f8000}, {0x3e5fa000}, {0x3e5fc000}, {0x3e5fe000},
- {0x3e600000}, {0x3e602000}, {0x3e604000}, {0x3e606000},
- {0x3e608000}, {0x3e60a000}, {0x3e60c000}, {0x3e60e000},
- {0x3e610000}, {0x3e612000}, {0x3e614000}, {0x3e616000},
- {0x3e618000}, {0x3e61a000}, {0x3e61c000}, {0x3e61e000},
- {0x3e620000}, {0x3e622000}, {0x3e624000}, {0x3e626000},
- {0x3e628000}, {0x3e62a000}, {0x3e62c000}, {0x3e62e000},
- {0x3e630000}, {0x3e632000}, {0x3e634000}, {0x3e636000},
- {0x3e638000}, {0x3e63a000}, {0x3e63c000}, {0x3e63e000},
- {0x3e640000}, {0x3e642000}, {0x3e644000}, {0x3e646000},
- {0x3e648000}, {0x3e64a000}, {0x3e64c000}, {0x3e64e000},
- {0x3e650000}, {0x3e652000}, {0x3e654000}, {0x3e656000},
- {0x3e658000}, {0x3e65a000}, {0x3e65c000}, {0x3e65e000},
- {0x3e660000}, {0x3e662000}, {0x3e664000}, {0x3e666000},
- {0x3e668000}, {0x3e66a000}, {0x3e66c000}, {0x3e66e000},
- {0x3e670000}, {0x3e672000}, {0x3e674000}, {0x3e676000},
- {0x3e678000}, {0x3e67a000}, {0x3e67c000}, {0x3e67e000},
- {0x3e680000}, {0x3e682000}, {0x3e684000}, {0x3e686000},
- {0x3e688000}, {0x3e68a000}, {0x3e68c000}, {0x3e68e000},
- {0x3e690000}, {0x3e692000}, {0x3e694000}, {0x3e696000},
- {0x3e698000}, {0x3e69a000}, {0x3e69c000}, {0x3e69e000},
- {0x3e6a0000}, {0x3e6a2000}, {0x3e6a4000}, {0x3e6a6000},
- {0x3e6a8000}, {0x3e6aa000}, {0x3e6ac000}, {0x3e6ae000},
- {0x3e6b0000}, {0x3e6b2000}, {0x3e6b4000}, {0x3e6b6000},
- {0x3e6b8000}, {0x3e6ba000}, {0x3e6bc000}, {0x3e6be000},
- {0x3e6c0000}, {0x3e6c2000}, {0x3e6c4000}, {0x3e6c6000},
- {0x3e6c8000}, {0x3e6ca000}, {0x3e6cc000}, {0x3e6ce000},
- {0x3e6d0000}, {0x3e6d2000}, {0x3e6d4000}, {0x3e6d6000},
- {0x3e6d8000}, {0x3e6da000}, {0x3e6dc000}, {0x3e6de000},
- {0x3e6e0000}, {0x3e6e2000}, {0x3e6e4000}, {0x3e6e6000},
- {0x3e6e8000}, {0x3e6ea000}, {0x3e6ec000}, {0x3e6ee000},
- {0x3e6f0000}, {0x3e6f2000}, {0x3e6f4000}, {0x3e6f6000},
- {0x3e6f8000}, {0x3e6fa000}, {0x3e6fc000}, {0x3e6fe000},
- {0x3e700000}, {0x3e702000}, {0x3e704000}, {0x3e706000},
- {0x3e708000}, {0x3e70a000}, {0x3e70c000}, {0x3e70e000},
- {0x3e710000}, {0x3e712000}, {0x3e714000}, {0x3e716000},
- {0x3e718000}, {0x3e71a000}, {0x3e71c000}, {0x3e71e000},
- {0x3e720000}, {0x3e722000}, {0x3e724000}, {0x3e726000},
- {0x3e728000}, {0x3e72a000}, {0x3e72c000}, {0x3e72e000},
- {0x3e730000}, {0x3e732000}, {0x3e734000}, {0x3e736000},
- {0x3e738000}, {0x3e73a000}, {0x3e73c000}, {0x3e73e000},
- {0x3e740000}, {0x3e742000}, {0x3e744000}, {0x3e746000},
- {0x3e748000}, {0x3e74a000}, {0x3e74c000}, {0x3e74e000},
- {0x3e750000}, {0x3e752000}, {0x3e754000}, {0x3e756000},
- {0x3e758000}, {0x3e75a000}, {0x3e75c000}, {0x3e75e000},
- {0x3e760000}, {0x3e762000}, {0x3e764000}, {0x3e766000},
- {0x3e768000}, {0x3e76a000}, {0x3e76c000}, {0x3e76e000},
- {0x3e770000}, {0x3e772000}, {0x3e774000}, {0x3e776000},
- {0x3e778000}, {0x3e77a000}, {0x3e77c000}, {0x3e77e000},
- {0x3e780000}, {0x3e782000}, {0x3e784000}, {0x3e786000},
- {0x3e788000}, {0x3e78a000}, {0x3e78c000}, {0x3e78e000},
- {0x3e790000}, {0x3e792000}, {0x3e794000}, {0x3e796000},
- {0x3e798000}, {0x3e79a000}, {0x3e79c000}, {0x3e79e000},
- {0x3e7a0000}, {0x3e7a2000}, {0x3e7a4000}, {0x3e7a6000},
- {0x3e7a8000}, {0x3e7aa000}, {0x3e7ac000}, {0x3e7ae000},
- {0x3e7b0000}, {0x3e7b2000}, {0x3e7b4000}, {0x3e7b6000},
- {0x3e7b8000}, {0x3e7ba000}, {0x3e7bc000}, {0x3e7be000},
- {0x3e7c0000}, {0x3e7c2000}, {0x3e7c4000}, {0x3e7c6000},
- {0x3e7c8000}, {0x3e7ca000}, {0x3e7cc000}, {0x3e7ce000},
- {0x3e7d0000}, {0x3e7d2000}, {0x3e7d4000}, {0x3e7d6000},
- {0x3e7d8000}, {0x3e7da000}, {0x3e7dc000}, {0x3e7de000},
- {0x3e7e0000}, {0x3e7e2000}, {0x3e7e4000}, {0x3e7e6000},
- {0x3e7e8000}, {0x3e7ea000}, {0x3e7ec000}, {0x3e7ee000},
- {0x3e7f0000}, {0x3e7f2000}, {0x3e7f4000}, {0x3e7f6000},
- {0x3e7f8000}, {0x3e7fa000}, {0x3e7fc000}, {0x3e7fe000},
- {0x3e800000}, {0x3e802000}, {0x3e804000}, {0x3e806000},
- {0x3e808000}, {0x3e80a000}, {0x3e80c000}, {0x3e80e000},
- {0x3e810000}, {0x3e812000}, {0x3e814000}, {0x3e816000},
- {0x3e818000}, {0x3e81a000}, {0x3e81c000}, {0x3e81e000},
- {0x3e820000}, {0x3e822000}, {0x3e824000}, {0x3e826000},
- {0x3e828000}, {0x3e82a000}, {0x3e82c000}, {0x3e82e000},
- {0x3e830000}, {0x3e832000}, {0x3e834000}, {0x3e836000},
- {0x3e838000}, {0x3e83a000}, {0x3e83c000}, {0x3e83e000},
- {0x3e840000}, {0x3e842000}, {0x3e844000}, {0x3e846000},
- {0x3e848000}, {0x3e84a000}, {0x3e84c000}, {0x3e84e000},
- {0x3e850000}, {0x3e852000}, {0x3e854000}, {0x3e856000},
- {0x3e858000}, {0x3e85a000}, {0x3e85c000}, {0x3e85e000},
- {0x3e860000}, {0x3e862000}, {0x3e864000}, {0x3e866000},
- {0x3e868000}, {0x3e86a000}, {0x3e86c000}, {0x3e86e000},
- {0x3e870000}, {0x3e872000}, {0x3e874000}, {0x3e876000},
- {0x3e878000}, {0x3e87a000}, {0x3e87c000}, {0x3e87e000},
- {0x3e880000}, {0x3e882000}, {0x3e884000}, {0x3e886000},
- {0x3e888000}, {0x3e88a000}, {0x3e88c000}, {0x3e88e000},
- {0x3e890000}, {0x3e892000}, {0x3e894000}, {0x3e896000},
- {0x3e898000}, {0x3e89a000}, {0x3e89c000}, {0x3e89e000},
- {0x3e8a0000}, {0x3e8a2000}, {0x3e8a4000}, {0x3e8a6000},
- {0x3e8a8000}, {0x3e8aa000}, {0x3e8ac000}, {0x3e8ae000},
- {0x3e8b0000}, {0x3e8b2000}, {0x3e8b4000}, {0x3e8b6000},
- {0x3e8b8000}, {0x3e8ba000}, {0x3e8bc000}, {0x3e8be000},
- {0x3e8c0000}, {0x3e8c2000}, {0x3e8c4000}, {0x3e8c6000},
- {0x3e8c8000}, {0x3e8ca000}, {0x3e8cc000}, {0x3e8ce000},
- {0x3e8d0000}, {0x3e8d2000}, {0x3e8d4000}, {0x3e8d6000},
- {0x3e8d8000}, {0x3e8da000}, {0x3e8dc000}, {0x3e8de000},
- {0x3e8e0000}, {0x3e8e2000}, {0x3e8e4000}, {0x3e8e6000},
- {0x3e8e8000}, {0x3e8ea000}, {0x3e8ec000}, {0x3e8ee000},
- {0x3e8f0000}, {0x3e8f2000}, {0x3e8f4000}, {0x3e8f6000},
- {0x3e8f8000}, {0x3e8fa000}, {0x3e8fc000}, {0x3e8fe000},
- {0x3e900000}, {0x3e902000}, {0x3e904000}, {0x3e906000},
- {0x3e908000}, {0x3e90a000}, {0x3e90c000}, {0x3e90e000},
- {0x3e910000}, {0x3e912000}, {0x3e914000}, {0x3e916000},
- {0x3e918000}, {0x3e91a000}, {0x3e91c000}, {0x3e91e000},
- {0x3e920000}, {0x3e922000}, {0x3e924000}, {0x3e926000},
- {0x3e928000}, {0x3e92a000}, {0x3e92c000}, {0x3e92e000},
- {0x3e930000}, {0x3e932000}, {0x3e934000}, {0x3e936000},
- {0x3e938000}, {0x3e93a000}, {0x3e93c000}, {0x3e93e000},
- {0x3e940000}, {0x3e942000}, {0x3e944000}, {0x3e946000},
- {0x3e948000}, {0x3e94a000}, {0x3e94c000}, {0x3e94e000},
- {0x3e950000}, {0x3e952000}, {0x3e954000}, {0x3e956000},
- {0x3e958000}, {0x3e95a000}, {0x3e95c000}, {0x3e95e000},
- {0x3e960000}, {0x3e962000}, {0x3e964000}, {0x3e966000},
- {0x3e968000}, {0x3e96a000}, {0x3e96c000}, {0x3e96e000},
- {0x3e970000}, {0x3e972000}, {0x3e974000}, {0x3e976000},
- {0x3e978000}, {0x3e97a000}, {0x3e97c000}, {0x3e97e000},
- {0x3e980000}, {0x3e982000}, {0x3e984000}, {0x3e986000},
- {0x3e988000}, {0x3e98a000}, {0x3e98c000}, {0x3e98e000},
- {0x3e990000}, {0x3e992000}, {0x3e994000}, {0x3e996000},
- {0x3e998000}, {0x3e99a000}, {0x3e99c000}, {0x3e99e000},
- {0x3e9a0000}, {0x3e9a2000}, {0x3e9a4000}, {0x3e9a6000},
- {0x3e9a8000}, {0x3e9aa000}, {0x3e9ac000}, {0x3e9ae000},
- {0x3e9b0000}, {0x3e9b2000}, {0x3e9b4000}, {0x3e9b6000},
- {0x3e9b8000}, {0x3e9ba000}, {0x3e9bc000}, {0x3e9be000},
- {0x3e9c0000}, {0x3e9c2000}, {0x3e9c4000}, {0x3e9c6000},
- {0x3e9c8000}, {0x3e9ca000}, {0x3e9cc000}, {0x3e9ce000},
- {0x3e9d0000}, {0x3e9d2000}, {0x3e9d4000}, {0x3e9d6000},
- {0x3e9d8000}, {0x3e9da000}, {0x3e9dc000}, {0x3e9de000},
- {0x3e9e0000}, {0x3e9e2000}, {0x3e9e4000}, {0x3e9e6000},
- {0x3e9e8000}, {0x3e9ea000}, {0x3e9ec000}, {0x3e9ee000},
- {0x3e9f0000}, {0x3e9f2000}, {0x3e9f4000}, {0x3e9f6000},
- {0x3e9f8000}, {0x3e9fa000}, {0x3e9fc000}, {0x3e9fe000},
- {0x3ea00000}, {0x3ea02000}, {0x3ea04000}, {0x3ea06000},
- {0x3ea08000}, {0x3ea0a000}, {0x3ea0c000}, {0x3ea0e000},
- {0x3ea10000}, {0x3ea12000}, {0x3ea14000}, {0x3ea16000},
- {0x3ea18000}, {0x3ea1a000}, {0x3ea1c000}, {0x3ea1e000},
- {0x3ea20000}, {0x3ea22000}, {0x3ea24000}, {0x3ea26000},
- {0x3ea28000}, {0x3ea2a000}, {0x3ea2c000}, {0x3ea2e000},
- {0x3ea30000}, {0x3ea32000}, {0x3ea34000}, {0x3ea36000},
- {0x3ea38000}, {0x3ea3a000}, {0x3ea3c000}, {0x3ea3e000},
- {0x3ea40000}, {0x3ea42000}, {0x3ea44000}, {0x3ea46000},
- {0x3ea48000}, {0x3ea4a000}, {0x3ea4c000}, {0x3ea4e000},
- {0x3ea50000}, {0x3ea52000}, {0x3ea54000}, {0x3ea56000},
- {0x3ea58000}, {0x3ea5a000}, {0x3ea5c000}, {0x3ea5e000},
- {0x3ea60000}, {0x3ea62000}, {0x3ea64000}, {0x3ea66000},
- {0x3ea68000}, {0x3ea6a000}, {0x3ea6c000}, {0x3ea6e000},
- {0x3ea70000}, {0x3ea72000}, {0x3ea74000}, {0x3ea76000},
- {0x3ea78000}, {0x3ea7a000}, {0x3ea7c000}, {0x3ea7e000},
- {0x3ea80000}, {0x3ea82000}, {0x3ea84000}, {0x3ea86000},
- {0x3ea88000}, {0x3ea8a000}, {0x3ea8c000}, {0x3ea8e000},
- {0x3ea90000}, {0x3ea92000}, {0x3ea94000}, {0x3ea96000},
- {0x3ea98000}, {0x3ea9a000}, {0x3ea9c000}, {0x3ea9e000},
- {0x3eaa0000}, {0x3eaa2000}, {0x3eaa4000}, {0x3eaa6000},
- {0x3eaa8000}, {0x3eaaa000}, {0x3eaac000}, {0x3eaae000},
- {0x3eab0000}, {0x3eab2000}, {0x3eab4000}, {0x3eab6000},
- {0x3eab8000}, {0x3eaba000}, {0x3eabc000}, {0x3eabe000},
- {0x3eac0000}, {0x3eac2000}, {0x3eac4000}, {0x3eac6000},
- {0x3eac8000}, {0x3eaca000}, {0x3eacc000}, {0x3eace000},
- {0x3ead0000}, {0x3ead2000}, {0x3ead4000}, {0x3ead6000},
- {0x3ead8000}, {0x3eada000}, {0x3eadc000}, {0x3eade000},
- {0x3eae0000}, {0x3eae2000}, {0x3eae4000}, {0x3eae6000},
- {0x3eae8000}, {0x3eaea000}, {0x3eaec000}, {0x3eaee000},
- {0x3eaf0000}, {0x3eaf2000}, {0x3eaf4000}, {0x3eaf6000},
- {0x3eaf8000}, {0x3eafa000}, {0x3eafc000}, {0x3eafe000},
- {0x3eb00000}, {0x3eb02000}, {0x3eb04000}, {0x3eb06000},
- {0x3eb08000}, {0x3eb0a000}, {0x3eb0c000}, {0x3eb0e000},
- {0x3eb10000}, {0x3eb12000}, {0x3eb14000}, {0x3eb16000},
- {0x3eb18000}, {0x3eb1a000}, {0x3eb1c000}, {0x3eb1e000},
- {0x3eb20000}, {0x3eb22000}, {0x3eb24000}, {0x3eb26000},
- {0x3eb28000}, {0x3eb2a000}, {0x3eb2c000}, {0x3eb2e000},
- {0x3eb30000}, {0x3eb32000}, {0x3eb34000}, {0x3eb36000},
- {0x3eb38000}, {0x3eb3a000}, {0x3eb3c000}, {0x3eb3e000},
- {0x3eb40000}, {0x3eb42000}, {0x3eb44000}, {0x3eb46000},
- {0x3eb48000}, {0x3eb4a000}, {0x3eb4c000}, {0x3eb4e000},
- {0x3eb50000}, {0x3eb52000}, {0x3eb54000}, {0x3eb56000},
- {0x3eb58000}, {0x3eb5a000}, {0x3eb5c000}, {0x3eb5e000},
- {0x3eb60000}, {0x3eb62000}, {0x3eb64000}, {0x3eb66000},
- {0x3eb68000}, {0x3eb6a000}, {0x3eb6c000}, {0x3eb6e000},
- {0x3eb70000}, {0x3eb72000}, {0x3eb74000}, {0x3eb76000},
- {0x3eb78000}, {0x3eb7a000}, {0x3eb7c000}, {0x3eb7e000},
- {0x3eb80000}, {0x3eb82000}, {0x3eb84000}, {0x3eb86000},
- {0x3eb88000}, {0x3eb8a000}, {0x3eb8c000}, {0x3eb8e000},
- {0x3eb90000}, {0x3eb92000}, {0x3eb94000}, {0x3eb96000},
- {0x3eb98000}, {0x3eb9a000}, {0x3eb9c000}, {0x3eb9e000},
- {0x3eba0000}, {0x3eba2000}, {0x3eba4000}, {0x3eba6000},
- {0x3eba8000}, {0x3ebaa000}, {0x3ebac000}, {0x3ebae000},
- {0x3ebb0000}, {0x3ebb2000}, {0x3ebb4000}, {0x3ebb6000},
- {0x3ebb8000}, {0x3ebba000}, {0x3ebbc000}, {0x3ebbe000},
- {0x3ebc0000}, {0x3ebc2000}, {0x3ebc4000}, {0x3ebc6000},
- {0x3ebc8000}, {0x3ebca000}, {0x3ebcc000}, {0x3ebce000},
- {0x3ebd0000}, {0x3ebd2000}, {0x3ebd4000}, {0x3ebd6000},
- {0x3ebd8000}, {0x3ebda000}, {0x3ebdc000}, {0x3ebde000},
- {0x3ebe0000}, {0x3ebe2000}, {0x3ebe4000}, {0x3ebe6000},
- {0x3ebe8000}, {0x3ebea000}, {0x3ebec000}, {0x3ebee000},
- {0x3ebf0000}, {0x3ebf2000}, {0x3ebf4000}, {0x3ebf6000},
- {0x3ebf8000}, {0x3ebfa000}, {0x3ebfc000}, {0x3ebfe000},
- {0x3ec00000}, {0x3ec02000}, {0x3ec04000}, {0x3ec06000},
- {0x3ec08000}, {0x3ec0a000}, {0x3ec0c000}, {0x3ec0e000},
- {0x3ec10000}, {0x3ec12000}, {0x3ec14000}, {0x3ec16000},
- {0x3ec18000}, {0x3ec1a000}, {0x3ec1c000}, {0x3ec1e000},
- {0x3ec20000}, {0x3ec22000}, {0x3ec24000}, {0x3ec26000},
- {0x3ec28000}, {0x3ec2a000}, {0x3ec2c000}, {0x3ec2e000},
- {0x3ec30000}, {0x3ec32000}, {0x3ec34000}, {0x3ec36000},
- {0x3ec38000}, {0x3ec3a000}, {0x3ec3c000}, {0x3ec3e000},
- {0x3ec40000}, {0x3ec42000}, {0x3ec44000}, {0x3ec46000},
- {0x3ec48000}, {0x3ec4a000}, {0x3ec4c000}, {0x3ec4e000},
- {0x3ec50000}, {0x3ec52000}, {0x3ec54000}, {0x3ec56000},
- {0x3ec58000}, {0x3ec5a000}, {0x3ec5c000}, {0x3ec5e000},
- {0x3ec60000}, {0x3ec62000}, {0x3ec64000}, {0x3ec66000},
- {0x3ec68000}, {0x3ec6a000}, {0x3ec6c000}, {0x3ec6e000},
- {0x3ec70000}, {0x3ec72000}, {0x3ec74000}, {0x3ec76000},
- {0x3ec78000}, {0x3ec7a000}, {0x3ec7c000}, {0x3ec7e000},
- {0x3ec80000}, {0x3ec82000}, {0x3ec84000}, {0x3ec86000},
- {0x3ec88000}, {0x3ec8a000}, {0x3ec8c000}, {0x3ec8e000},
- {0x3ec90000}, {0x3ec92000}, {0x3ec94000}, {0x3ec96000},
- {0x3ec98000}, {0x3ec9a000}, {0x3ec9c000}, {0x3ec9e000},
- {0x3eca0000}, {0x3eca2000}, {0x3eca4000}, {0x3eca6000},
- {0x3eca8000}, {0x3ecaa000}, {0x3ecac000}, {0x3ecae000},
- {0x3ecb0000}, {0x3ecb2000}, {0x3ecb4000}, {0x3ecb6000},
- {0x3ecb8000}, {0x3ecba000}, {0x3ecbc000}, {0x3ecbe000},
- {0x3ecc0000}, {0x3ecc2000}, {0x3ecc4000}, {0x3ecc6000},
- {0x3ecc8000}, {0x3ecca000}, {0x3eccc000}, {0x3ecce000},
- {0x3ecd0000}, {0x3ecd2000}, {0x3ecd4000}, {0x3ecd6000},
- {0x3ecd8000}, {0x3ecda000}, {0x3ecdc000}, {0x3ecde000},
- {0x3ece0000}, {0x3ece2000}, {0x3ece4000}, {0x3ece6000},
- {0x3ece8000}, {0x3ecea000}, {0x3ecec000}, {0x3ecee000},
- {0x3ecf0000}, {0x3ecf2000}, {0x3ecf4000}, {0x3ecf6000},
- {0x3ecf8000}, {0x3ecfa000}, {0x3ecfc000}, {0x3ecfe000},
- {0x3ed00000}, {0x3ed02000}, {0x3ed04000}, {0x3ed06000},
- {0x3ed08000}, {0x3ed0a000}, {0x3ed0c000}, {0x3ed0e000},
- {0x3ed10000}, {0x3ed12000}, {0x3ed14000}, {0x3ed16000},
- {0x3ed18000}, {0x3ed1a000}, {0x3ed1c000}, {0x3ed1e000},
- {0x3ed20000}, {0x3ed22000}, {0x3ed24000}, {0x3ed26000},
- {0x3ed28000}, {0x3ed2a000}, {0x3ed2c000}, {0x3ed2e000},
- {0x3ed30000}, {0x3ed32000}, {0x3ed34000}, {0x3ed36000},
- {0x3ed38000}, {0x3ed3a000}, {0x3ed3c000}, {0x3ed3e000},
- {0x3ed40000}, {0x3ed42000}, {0x3ed44000}, {0x3ed46000},
- {0x3ed48000}, {0x3ed4a000}, {0x3ed4c000}, {0x3ed4e000},
- {0x3ed50000}, {0x3ed52000}, {0x3ed54000}, {0x3ed56000},
- {0x3ed58000}, {0x3ed5a000}, {0x3ed5c000}, {0x3ed5e000},
- {0x3ed60000}, {0x3ed62000}, {0x3ed64000}, {0x3ed66000},
- {0x3ed68000}, {0x3ed6a000}, {0x3ed6c000}, {0x3ed6e000},
- {0x3ed70000}, {0x3ed72000}, {0x3ed74000}, {0x3ed76000},
- {0x3ed78000}, {0x3ed7a000}, {0x3ed7c000}, {0x3ed7e000},
- {0x3ed80000}, {0x3ed82000}, {0x3ed84000}, {0x3ed86000},
- {0x3ed88000}, {0x3ed8a000}, {0x3ed8c000}, {0x3ed8e000},
- {0x3ed90000}, {0x3ed92000}, {0x3ed94000}, {0x3ed96000},
- {0x3ed98000}, {0x3ed9a000}, {0x3ed9c000}, {0x3ed9e000},
- {0x3eda0000}, {0x3eda2000}, {0x3eda4000}, {0x3eda6000},
- {0x3eda8000}, {0x3edaa000}, {0x3edac000}, {0x3edae000},
- {0x3edb0000}, {0x3edb2000}, {0x3edb4000}, {0x3edb6000},
- {0x3edb8000}, {0x3edba000}, {0x3edbc000}, {0x3edbe000},
- {0x3edc0000}, {0x3edc2000}, {0x3edc4000}, {0x3edc6000},
- {0x3edc8000}, {0x3edca000}, {0x3edcc000}, {0x3edce000},
- {0x3edd0000}, {0x3edd2000}, {0x3edd4000}, {0x3edd6000},
- {0x3edd8000}, {0x3edda000}, {0x3eddc000}, {0x3edde000},
- {0x3ede0000}, {0x3ede2000}, {0x3ede4000}, {0x3ede6000},
- {0x3ede8000}, {0x3edea000}, {0x3edec000}, {0x3edee000},
- {0x3edf0000}, {0x3edf2000}, {0x3edf4000}, {0x3edf6000},
- {0x3edf8000}, {0x3edfa000}, {0x3edfc000}, {0x3edfe000},
- {0x3ee00000}, {0x3ee02000}, {0x3ee04000}, {0x3ee06000},
- {0x3ee08000}, {0x3ee0a000}, {0x3ee0c000}, {0x3ee0e000},
- {0x3ee10000}, {0x3ee12000}, {0x3ee14000}, {0x3ee16000},
- {0x3ee18000}, {0x3ee1a000}, {0x3ee1c000}, {0x3ee1e000},
- {0x3ee20000}, {0x3ee22000}, {0x3ee24000}, {0x3ee26000},
- {0x3ee28000}, {0x3ee2a000}, {0x3ee2c000}, {0x3ee2e000},
- {0x3ee30000}, {0x3ee32000}, {0x3ee34000}, {0x3ee36000},
- {0x3ee38000}, {0x3ee3a000}, {0x3ee3c000}, {0x3ee3e000},
- {0x3ee40000}, {0x3ee42000}, {0x3ee44000}, {0x3ee46000},
- {0x3ee48000}, {0x3ee4a000}, {0x3ee4c000}, {0x3ee4e000},
- {0x3ee50000}, {0x3ee52000}, {0x3ee54000}, {0x3ee56000},
- {0x3ee58000}, {0x3ee5a000}, {0x3ee5c000}, {0x3ee5e000},
- {0x3ee60000}, {0x3ee62000}, {0x3ee64000}, {0x3ee66000},
- {0x3ee68000}, {0x3ee6a000}, {0x3ee6c000}, {0x3ee6e000},
- {0x3ee70000}, {0x3ee72000}, {0x3ee74000}, {0x3ee76000},
- {0x3ee78000}, {0x3ee7a000}, {0x3ee7c000}, {0x3ee7e000},
- {0x3ee80000}, {0x3ee82000}, {0x3ee84000}, {0x3ee86000},
- {0x3ee88000}, {0x3ee8a000}, {0x3ee8c000}, {0x3ee8e000},
- {0x3ee90000}, {0x3ee92000}, {0x3ee94000}, {0x3ee96000},
- {0x3ee98000}, {0x3ee9a000}, {0x3ee9c000}, {0x3ee9e000},
- {0x3eea0000}, {0x3eea2000}, {0x3eea4000}, {0x3eea6000},
- {0x3eea8000}, {0x3eeaa000}, {0x3eeac000}, {0x3eeae000},
- {0x3eeb0000}, {0x3eeb2000}, {0x3eeb4000}, {0x3eeb6000},
- {0x3eeb8000}, {0x3eeba000}, {0x3eebc000}, {0x3eebe000},
- {0x3eec0000}, {0x3eec2000}, {0x3eec4000}, {0x3eec6000},
- {0x3eec8000}, {0x3eeca000}, {0x3eecc000}, {0x3eece000},
- {0x3eed0000}, {0x3eed2000}, {0x3eed4000}, {0x3eed6000},
- {0x3eed8000}, {0x3eeda000}, {0x3eedc000}, {0x3eede000},
- {0x3eee0000}, {0x3eee2000}, {0x3eee4000}, {0x3eee6000},
- {0x3eee8000}, {0x3eeea000}, {0x3eeec000}, {0x3eeee000},
- {0x3eef0000}, {0x3eef2000}, {0x3eef4000}, {0x3eef6000},
- {0x3eef8000}, {0x3eefa000}, {0x3eefc000}, {0x3eefe000},
- {0x3ef00000}, {0x3ef02000}, {0x3ef04000}, {0x3ef06000},
- {0x3ef08000}, {0x3ef0a000}, {0x3ef0c000}, {0x3ef0e000},
- {0x3ef10000}, {0x3ef12000}, {0x3ef14000}, {0x3ef16000},
- {0x3ef18000}, {0x3ef1a000}, {0x3ef1c000}, {0x3ef1e000},
- {0x3ef20000}, {0x3ef22000}, {0x3ef24000}, {0x3ef26000},
- {0x3ef28000}, {0x3ef2a000}, {0x3ef2c000}, {0x3ef2e000},
- {0x3ef30000}, {0x3ef32000}, {0x3ef34000}, {0x3ef36000},
- {0x3ef38000}, {0x3ef3a000}, {0x3ef3c000}, {0x3ef3e000},
- {0x3ef40000}, {0x3ef42000}, {0x3ef44000}, {0x3ef46000},
- {0x3ef48000}, {0x3ef4a000}, {0x3ef4c000}, {0x3ef4e000},
- {0x3ef50000}, {0x3ef52000}, {0x3ef54000}, {0x3ef56000},
- {0x3ef58000}, {0x3ef5a000}, {0x3ef5c000}, {0x3ef5e000},
- {0x3ef60000}, {0x3ef62000}, {0x3ef64000}, {0x3ef66000},
- {0x3ef68000}, {0x3ef6a000}, {0x3ef6c000}, {0x3ef6e000},
- {0x3ef70000}, {0x3ef72000}, {0x3ef74000}, {0x3ef76000},
- {0x3ef78000}, {0x3ef7a000}, {0x3ef7c000}, {0x3ef7e000},
- {0x3ef80000}, {0x3ef82000}, {0x3ef84000}, {0x3ef86000},
- {0x3ef88000}, {0x3ef8a000}, {0x3ef8c000}, {0x3ef8e000},
- {0x3ef90000}, {0x3ef92000}, {0x3ef94000}, {0x3ef96000},
- {0x3ef98000}, {0x3ef9a000}, {0x3ef9c000}, {0x3ef9e000},
- {0x3efa0000}, {0x3efa2000}, {0x3efa4000}, {0x3efa6000},
- {0x3efa8000}, {0x3efaa000}, {0x3efac000}, {0x3efae000},
- {0x3efb0000}, {0x3efb2000}, {0x3efb4000}, {0x3efb6000},
- {0x3efb8000}, {0x3efba000}, {0x3efbc000}, {0x3efbe000},
- {0x3efc0000}, {0x3efc2000}, {0x3efc4000}, {0x3efc6000},
- {0x3efc8000}, {0x3efca000}, {0x3efcc000}, {0x3efce000},
- {0x3efd0000}, {0x3efd2000}, {0x3efd4000}, {0x3efd6000},
- {0x3efd8000}, {0x3efda000}, {0x3efdc000}, {0x3efde000},
- {0x3efe0000}, {0x3efe2000}, {0x3efe4000}, {0x3efe6000},
- {0x3efe8000}, {0x3efea000}, {0x3efec000}, {0x3efee000},
- {0x3eff0000}, {0x3eff2000}, {0x3eff4000}, {0x3eff6000},
- {0x3eff8000}, {0x3effa000}, {0x3effc000}, {0x3effe000},
- {0x3f000000}, {0x3f002000}, {0x3f004000}, {0x3f006000},
- {0x3f008000}, {0x3f00a000}, {0x3f00c000}, {0x3f00e000},
- {0x3f010000}, {0x3f012000}, {0x3f014000}, {0x3f016000},
- {0x3f018000}, {0x3f01a000}, {0x3f01c000}, {0x3f01e000},
- {0x3f020000}, {0x3f022000}, {0x3f024000}, {0x3f026000},
- {0x3f028000}, {0x3f02a000}, {0x3f02c000}, {0x3f02e000},
- {0x3f030000}, {0x3f032000}, {0x3f034000}, {0x3f036000},
- {0x3f038000}, {0x3f03a000}, {0x3f03c000}, {0x3f03e000},
- {0x3f040000}, {0x3f042000}, {0x3f044000}, {0x3f046000},
- {0x3f048000}, {0x3f04a000}, {0x3f04c000}, {0x3f04e000},
- {0x3f050000}, {0x3f052000}, {0x3f054000}, {0x3f056000},
- {0x3f058000}, {0x3f05a000}, {0x3f05c000}, {0x3f05e000},
- {0x3f060000}, {0x3f062000}, {0x3f064000}, {0x3f066000},
- {0x3f068000}, {0x3f06a000}, {0x3f06c000}, {0x3f06e000},
- {0x3f070000}, {0x3f072000}, {0x3f074000}, {0x3f076000},
- {0x3f078000}, {0x3f07a000}, {0x3f07c000}, {0x3f07e000},
- {0x3f080000}, {0x3f082000}, {0x3f084000}, {0x3f086000},
- {0x3f088000}, {0x3f08a000}, {0x3f08c000}, {0x3f08e000},
- {0x3f090000}, {0x3f092000}, {0x3f094000}, {0x3f096000},
- {0x3f098000}, {0x3f09a000}, {0x3f09c000}, {0x3f09e000},
- {0x3f0a0000}, {0x3f0a2000}, {0x3f0a4000}, {0x3f0a6000},
- {0x3f0a8000}, {0x3f0aa000}, {0x3f0ac000}, {0x3f0ae000},
- {0x3f0b0000}, {0x3f0b2000}, {0x3f0b4000}, {0x3f0b6000},
- {0x3f0b8000}, {0x3f0ba000}, {0x3f0bc000}, {0x3f0be000},
- {0x3f0c0000}, {0x3f0c2000}, {0x3f0c4000}, {0x3f0c6000},
- {0x3f0c8000}, {0x3f0ca000}, {0x3f0cc000}, {0x3f0ce000},
- {0x3f0d0000}, {0x3f0d2000}, {0x3f0d4000}, {0x3f0d6000},
- {0x3f0d8000}, {0x3f0da000}, {0x3f0dc000}, {0x3f0de000},
- {0x3f0e0000}, {0x3f0e2000}, {0x3f0e4000}, {0x3f0e6000},
- {0x3f0e8000}, {0x3f0ea000}, {0x3f0ec000}, {0x3f0ee000},
- {0x3f0f0000}, {0x3f0f2000}, {0x3f0f4000}, {0x3f0f6000},
- {0x3f0f8000}, {0x3f0fa000}, {0x3f0fc000}, {0x3f0fe000},
- {0x3f100000}, {0x3f102000}, {0x3f104000}, {0x3f106000},
- {0x3f108000}, {0x3f10a000}, {0x3f10c000}, {0x3f10e000},
- {0x3f110000}, {0x3f112000}, {0x3f114000}, {0x3f116000},
- {0x3f118000}, {0x3f11a000}, {0x3f11c000}, {0x3f11e000},
- {0x3f120000}, {0x3f122000}, {0x3f124000}, {0x3f126000},
- {0x3f128000}, {0x3f12a000}, {0x3f12c000}, {0x3f12e000},
- {0x3f130000}, {0x3f132000}, {0x3f134000}, {0x3f136000},
- {0x3f138000}, {0x3f13a000}, {0x3f13c000}, {0x3f13e000},
- {0x3f140000}, {0x3f142000}, {0x3f144000}, {0x3f146000},
- {0x3f148000}, {0x3f14a000}, {0x3f14c000}, {0x3f14e000},
- {0x3f150000}, {0x3f152000}, {0x3f154000}, {0x3f156000},
- {0x3f158000}, {0x3f15a000}, {0x3f15c000}, {0x3f15e000},
- {0x3f160000}, {0x3f162000}, {0x3f164000}, {0x3f166000},
- {0x3f168000}, {0x3f16a000}, {0x3f16c000}, {0x3f16e000},
- {0x3f170000}, {0x3f172000}, {0x3f174000}, {0x3f176000},
- {0x3f178000}, {0x3f17a000}, {0x3f17c000}, {0x3f17e000},
- {0x3f180000}, {0x3f182000}, {0x3f184000}, {0x3f186000},
- {0x3f188000}, {0x3f18a000}, {0x3f18c000}, {0x3f18e000},
- {0x3f190000}, {0x3f192000}, {0x3f194000}, {0x3f196000},
- {0x3f198000}, {0x3f19a000}, {0x3f19c000}, {0x3f19e000},
- {0x3f1a0000}, {0x3f1a2000}, {0x3f1a4000}, {0x3f1a6000},
- {0x3f1a8000}, {0x3f1aa000}, {0x3f1ac000}, {0x3f1ae000},
- {0x3f1b0000}, {0x3f1b2000}, {0x3f1b4000}, {0x3f1b6000},
- {0x3f1b8000}, {0x3f1ba000}, {0x3f1bc000}, {0x3f1be000},
- {0x3f1c0000}, {0x3f1c2000}, {0x3f1c4000}, {0x3f1c6000},
- {0x3f1c8000}, {0x3f1ca000}, {0x3f1cc000}, {0x3f1ce000},
- {0x3f1d0000}, {0x3f1d2000}, {0x3f1d4000}, {0x3f1d6000},
- {0x3f1d8000}, {0x3f1da000}, {0x3f1dc000}, {0x3f1de000},
- {0x3f1e0000}, {0x3f1e2000}, {0x3f1e4000}, {0x3f1e6000},
- {0x3f1e8000}, {0x3f1ea000}, {0x3f1ec000}, {0x3f1ee000},
- {0x3f1f0000}, {0x3f1f2000}, {0x3f1f4000}, {0x3f1f6000},
- {0x3f1f8000}, {0x3f1fa000}, {0x3f1fc000}, {0x3f1fe000},
- {0x3f200000}, {0x3f202000}, {0x3f204000}, {0x3f206000},
- {0x3f208000}, {0x3f20a000}, {0x3f20c000}, {0x3f20e000},
- {0x3f210000}, {0x3f212000}, {0x3f214000}, {0x3f216000},
- {0x3f218000}, {0x3f21a000}, {0x3f21c000}, {0x3f21e000},
- {0x3f220000}, {0x3f222000}, {0x3f224000}, {0x3f226000},
- {0x3f228000}, {0x3f22a000}, {0x3f22c000}, {0x3f22e000},
- {0x3f230000}, {0x3f232000}, {0x3f234000}, {0x3f236000},
- {0x3f238000}, {0x3f23a000}, {0x3f23c000}, {0x3f23e000},
- {0x3f240000}, {0x3f242000}, {0x3f244000}, {0x3f246000},
- {0x3f248000}, {0x3f24a000}, {0x3f24c000}, {0x3f24e000},
- {0x3f250000}, {0x3f252000}, {0x3f254000}, {0x3f256000},
- {0x3f258000}, {0x3f25a000}, {0x3f25c000}, {0x3f25e000},
- {0x3f260000}, {0x3f262000}, {0x3f264000}, {0x3f266000},
- {0x3f268000}, {0x3f26a000}, {0x3f26c000}, {0x3f26e000},
- {0x3f270000}, {0x3f272000}, {0x3f274000}, {0x3f276000},
- {0x3f278000}, {0x3f27a000}, {0x3f27c000}, {0x3f27e000},
- {0x3f280000}, {0x3f282000}, {0x3f284000}, {0x3f286000},
- {0x3f288000}, {0x3f28a000}, {0x3f28c000}, {0x3f28e000},
- {0x3f290000}, {0x3f292000}, {0x3f294000}, {0x3f296000},
- {0x3f298000}, {0x3f29a000}, {0x3f29c000}, {0x3f29e000},
- {0x3f2a0000}, {0x3f2a2000}, {0x3f2a4000}, {0x3f2a6000},
- {0x3f2a8000}, {0x3f2aa000}, {0x3f2ac000}, {0x3f2ae000},
- {0x3f2b0000}, {0x3f2b2000}, {0x3f2b4000}, {0x3f2b6000},
- {0x3f2b8000}, {0x3f2ba000}, {0x3f2bc000}, {0x3f2be000},
- {0x3f2c0000}, {0x3f2c2000}, {0x3f2c4000}, {0x3f2c6000},
- {0x3f2c8000}, {0x3f2ca000}, {0x3f2cc000}, {0x3f2ce000},
- {0x3f2d0000}, {0x3f2d2000}, {0x3f2d4000}, {0x3f2d6000},
- {0x3f2d8000}, {0x3f2da000}, {0x3f2dc000}, {0x3f2de000},
- {0x3f2e0000}, {0x3f2e2000}, {0x3f2e4000}, {0x3f2e6000},
- {0x3f2e8000}, {0x3f2ea000}, {0x3f2ec000}, {0x3f2ee000},
- {0x3f2f0000}, {0x3f2f2000}, {0x3f2f4000}, {0x3f2f6000},
- {0x3f2f8000}, {0x3f2fa000}, {0x3f2fc000}, {0x3f2fe000},
- {0x3f300000}, {0x3f302000}, {0x3f304000}, {0x3f306000},
- {0x3f308000}, {0x3f30a000}, {0x3f30c000}, {0x3f30e000},
- {0x3f310000}, {0x3f312000}, {0x3f314000}, {0x3f316000},
- {0x3f318000}, {0x3f31a000}, {0x3f31c000}, {0x3f31e000},
- {0x3f320000}, {0x3f322000}, {0x3f324000}, {0x3f326000},
- {0x3f328000}, {0x3f32a000}, {0x3f32c000}, {0x3f32e000},
- {0x3f330000}, {0x3f332000}, {0x3f334000}, {0x3f336000},
- {0x3f338000}, {0x3f33a000}, {0x3f33c000}, {0x3f33e000},
- {0x3f340000}, {0x3f342000}, {0x3f344000}, {0x3f346000},
- {0x3f348000}, {0x3f34a000}, {0x3f34c000}, {0x3f34e000},
- {0x3f350000}, {0x3f352000}, {0x3f354000}, {0x3f356000},
- {0x3f358000}, {0x3f35a000}, {0x3f35c000}, {0x3f35e000},
- {0x3f360000}, {0x3f362000}, {0x3f364000}, {0x3f366000},
- {0x3f368000}, {0x3f36a000}, {0x3f36c000}, {0x3f36e000},
- {0x3f370000}, {0x3f372000}, {0x3f374000}, {0x3f376000},
- {0x3f378000}, {0x3f37a000}, {0x3f37c000}, {0x3f37e000},
- {0x3f380000}, {0x3f382000}, {0x3f384000}, {0x3f386000},
- {0x3f388000}, {0x3f38a000}, {0x3f38c000}, {0x3f38e000},
- {0x3f390000}, {0x3f392000}, {0x3f394000}, {0x3f396000},
- {0x3f398000}, {0x3f39a000}, {0x3f39c000}, {0x3f39e000},
- {0x3f3a0000}, {0x3f3a2000}, {0x3f3a4000}, {0x3f3a6000},
- {0x3f3a8000}, {0x3f3aa000}, {0x3f3ac000}, {0x3f3ae000},
- {0x3f3b0000}, {0x3f3b2000}, {0x3f3b4000}, {0x3f3b6000},
- {0x3f3b8000}, {0x3f3ba000}, {0x3f3bc000}, {0x3f3be000},
- {0x3f3c0000}, {0x3f3c2000}, {0x3f3c4000}, {0x3f3c6000},
- {0x3f3c8000}, {0x3f3ca000}, {0x3f3cc000}, {0x3f3ce000},
- {0x3f3d0000}, {0x3f3d2000}, {0x3f3d4000}, {0x3f3d6000},
- {0x3f3d8000}, {0x3f3da000}, {0x3f3dc000}, {0x3f3de000},
- {0x3f3e0000}, {0x3f3e2000}, {0x3f3e4000}, {0x3f3e6000},
- {0x3f3e8000}, {0x3f3ea000}, {0x3f3ec000}, {0x3f3ee000},
- {0x3f3f0000}, {0x3f3f2000}, {0x3f3f4000}, {0x3f3f6000},
- {0x3f3f8000}, {0x3f3fa000}, {0x3f3fc000}, {0x3f3fe000},
- {0x3f400000}, {0x3f402000}, {0x3f404000}, {0x3f406000},
- {0x3f408000}, {0x3f40a000}, {0x3f40c000}, {0x3f40e000},
- {0x3f410000}, {0x3f412000}, {0x3f414000}, {0x3f416000},
- {0x3f418000}, {0x3f41a000}, {0x3f41c000}, {0x3f41e000},
- {0x3f420000}, {0x3f422000}, {0x3f424000}, {0x3f426000},
- {0x3f428000}, {0x3f42a000}, {0x3f42c000}, {0x3f42e000},
- {0x3f430000}, {0x3f432000}, {0x3f434000}, {0x3f436000},
- {0x3f438000}, {0x3f43a000}, {0x3f43c000}, {0x3f43e000},
- {0x3f440000}, {0x3f442000}, {0x3f444000}, {0x3f446000},
- {0x3f448000}, {0x3f44a000}, {0x3f44c000}, {0x3f44e000},
- {0x3f450000}, {0x3f452000}, {0x3f454000}, {0x3f456000},
- {0x3f458000}, {0x3f45a000}, {0x3f45c000}, {0x3f45e000},
- {0x3f460000}, {0x3f462000}, {0x3f464000}, {0x3f466000},
- {0x3f468000}, {0x3f46a000}, {0x3f46c000}, {0x3f46e000},
- {0x3f470000}, {0x3f472000}, {0x3f474000}, {0x3f476000},
- {0x3f478000}, {0x3f47a000}, {0x3f47c000}, {0x3f47e000},
- {0x3f480000}, {0x3f482000}, {0x3f484000}, {0x3f486000},
- {0x3f488000}, {0x3f48a000}, {0x3f48c000}, {0x3f48e000},
- {0x3f490000}, {0x3f492000}, {0x3f494000}, {0x3f496000},
- {0x3f498000}, {0x3f49a000}, {0x3f49c000}, {0x3f49e000},
- {0x3f4a0000}, {0x3f4a2000}, {0x3f4a4000}, {0x3f4a6000},
- {0x3f4a8000}, {0x3f4aa000}, {0x3f4ac000}, {0x3f4ae000},
- {0x3f4b0000}, {0x3f4b2000}, {0x3f4b4000}, {0x3f4b6000},
- {0x3f4b8000}, {0x3f4ba000}, {0x3f4bc000}, {0x3f4be000},
- {0x3f4c0000}, {0x3f4c2000}, {0x3f4c4000}, {0x3f4c6000},
- {0x3f4c8000}, {0x3f4ca000}, {0x3f4cc000}, {0x3f4ce000},
- {0x3f4d0000}, {0x3f4d2000}, {0x3f4d4000}, {0x3f4d6000},
- {0x3f4d8000}, {0x3f4da000}, {0x3f4dc000}, {0x3f4de000},
- {0x3f4e0000}, {0x3f4e2000}, {0x3f4e4000}, {0x3f4e6000},
- {0x3f4e8000}, {0x3f4ea000}, {0x3f4ec000}, {0x3f4ee000},
- {0x3f4f0000}, {0x3f4f2000}, {0x3f4f4000}, {0x3f4f6000},
- {0x3f4f8000}, {0x3f4fa000}, {0x3f4fc000}, {0x3f4fe000},
- {0x3f500000}, {0x3f502000}, {0x3f504000}, {0x3f506000},
- {0x3f508000}, {0x3f50a000}, {0x3f50c000}, {0x3f50e000},
- {0x3f510000}, {0x3f512000}, {0x3f514000}, {0x3f516000},
- {0x3f518000}, {0x3f51a000}, {0x3f51c000}, {0x3f51e000},
- {0x3f520000}, {0x3f522000}, {0x3f524000}, {0x3f526000},
- {0x3f528000}, {0x3f52a000}, {0x3f52c000}, {0x3f52e000},
- {0x3f530000}, {0x3f532000}, {0x3f534000}, {0x3f536000},
- {0x3f538000}, {0x3f53a000}, {0x3f53c000}, {0x3f53e000},
- {0x3f540000}, {0x3f542000}, {0x3f544000}, {0x3f546000},
- {0x3f548000}, {0x3f54a000}, {0x3f54c000}, {0x3f54e000},
- {0x3f550000}, {0x3f552000}, {0x3f554000}, {0x3f556000},
- {0x3f558000}, {0x3f55a000}, {0x3f55c000}, {0x3f55e000},
- {0x3f560000}, {0x3f562000}, {0x3f564000}, {0x3f566000},
- {0x3f568000}, {0x3f56a000}, {0x3f56c000}, {0x3f56e000},
- {0x3f570000}, {0x3f572000}, {0x3f574000}, {0x3f576000},
- {0x3f578000}, {0x3f57a000}, {0x3f57c000}, {0x3f57e000},
- {0x3f580000}, {0x3f582000}, {0x3f584000}, {0x3f586000},
- {0x3f588000}, {0x3f58a000}, {0x3f58c000}, {0x3f58e000},
- {0x3f590000}, {0x3f592000}, {0x3f594000}, {0x3f596000},
- {0x3f598000}, {0x3f59a000}, {0x3f59c000}, {0x3f59e000},
- {0x3f5a0000}, {0x3f5a2000}, {0x3f5a4000}, {0x3f5a6000},
- {0x3f5a8000}, {0x3f5aa000}, {0x3f5ac000}, {0x3f5ae000},
- {0x3f5b0000}, {0x3f5b2000}, {0x3f5b4000}, {0x3f5b6000},
- {0x3f5b8000}, {0x3f5ba000}, {0x3f5bc000}, {0x3f5be000},
- {0x3f5c0000}, {0x3f5c2000}, {0x3f5c4000}, {0x3f5c6000},
- {0x3f5c8000}, {0x3f5ca000}, {0x3f5cc000}, {0x3f5ce000},
- {0x3f5d0000}, {0x3f5d2000}, {0x3f5d4000}, {0x3f5d6000},
- {0x3f5d8000}, {0x3f5da000}, {0x3f5dc000}, {0x3f5de000},
- {0x3f5e0000}, {0x3f5e2000}, {0x3f5e4000}, {0x3f5e6000},
- {0x3f5e8000}, {0x3f5ea000}, {0x3f5ec000}, {0x3f5ee000},
- {0x3f5f0000}, {0x3f5f2000}, {0x3f5f4000}, {0x3f5f6000},
- {0x3f5f8000}, {0x3f5fa000}, {0x3f5fc000}, {0x3f5fe000},
- {0x3f600000}, {0x3f602000}, {0x3f604000}, {0x3f606000},
- {0x3f608000}, {0x3f60a000}, {0x3f60c000}, {0x3f60e000},
- {0x3f610000}, {0x3f612000}, {0x3f614000}, {0x3f616000},
- {0x3f618000}, {0x3f61a000}, {0x3f61c000}, {0x3f61e000},
- {0x3f620000}, {0x3f622000}, {0x3f624000}, {0x3f626000},
- {0x3f628000}, {0x3f62a000}, {0x3f62c000}, {0x3f62e000},
- {0x3f630000}, {0x3f632000}, {0x3f634000}, {0x3f636000},
- {0x3f638000}, {0x3f63a000}, {0x3f63c000}, {0x3f63e000},
- {0x3f640000}, {0x3f642000}, {0x3f644000}, {0x3f646000},
- {0x3f648000}, {0x3f64a000}, {0x3f64c000}, {0x3f64e000},
- {0x3f650000}, {0x3f652000}, {0x3f654000}, {0x3f656000},
- {0x3f658000}, {0x3f65a000}, {0x3f65c000}, {0x3f65e000},
- {0x3f660000}, {0x3f662000}, {0x3f664000}, {0x3f666000},
- {0x3f668000}, {0x3f66a000}, {0x3f66c000}, {0x3f66e000},
- {0x3f670000}, {0x3f672000}, {0x3f674000}, {0x3f676000},
- {0x3f678000}, {0x3f67a000}, {0x3f67c000}, {0x3f67e000},
- {0x3f680000}, {0x3f682000}, {0x3f684000}, {0x3f686000},
- {0x3f688000}, {0x3f68a000}, {0x3f68c000}, {0x3f68e000},
- {0x3f690000}, {0x3f692000}, {0x3f694000}, {0x3f696000},
- {0x3f698000}, {0x3f69a000}, {0x3f69c000}, {0x3f69e000},
- {0x3f6a0000}, {0x3f6a2000}, {0x3f6a4000}, {0x3f6a6000},
- {0x3f6a8000}, {0x3f6aa000}, {0x3f6ac000}, {0x3f6ae000},
- {0x3f6b0000}, {0x3f6b2000}, {0x3f6b4000}, {0x3f6b6000},
- {0x3f6b8000}, {0x3f6ba000}, {0x3f6bc000}, {0x3f6be000},
- {0x3f6c0000}, {0x3f6c2000}, {0x3f6c4000}, {0x3f6c6000},
- {0x3f6c8000}, {0x3f6ca000}, {0x3f6cc000}, {0x3f6ce000},
- {0x3f6d0000}, {0x3f6d2000}, {0x3f6d4000}, {0x3f6d6000},
- {0x3f6d8000}, {0x3f6da000}, {0x3f6dc000}, {0x3f6de000},
- {0x3f6e0000}, {0x3f6e2000}, {0x3f6e4000}, {0x3f6e6000},
- {0x3f6e8000}, {0x3f6ea000}, {0x3f6ec000}, {0x3f6ee000},
- {0x3f6f0000}, {0x3f6f2000}, {0x3f6f4000}, {0x3f6f6000},
- {0x3f6f8000}, {0x3f6fa000}, {0x3f6fc000}, {0x3f6fe000},
- {0x3f700000}, {0x3f702000}, {0x3f704000}, {0x3f706000},
- {0x3f708000}, {0x3f70a000}, {0x3f70c000}, {0x3f70e000},
- {0x3f710000}, {0x3f712000}, {0x3f714000}, {0x3f716000},
- {0x3f718000}, {0x3f71a000}, {0x3f71c000}, {0x3f71e000},
- {0x3f720000}, {0x3f722000}, {0x3f724000}, {0x3f726000},
- {0x3f728000}, {0x3f72a000}, {0x3f72c000}, {0x3f72e000},
- {0x3f730000}, {0x3f732000}, {0x3f734000}, {0x3f736000},
- {0x3f738000}, {0x3f73a000}, {0x3f73c000}, {0x3f73e000},
- {0x3f740000}, {0x3f742000}, {0x3f744000}, {0x3f746000},
- {0x3f748000}, {0x3f74a000}, {0x3f74c000}, {0x3f74e000},
- {0x3f750000}, {0x3f752000}, {0x3f754000}, {0x3f756000},
- {0x3f758000}, {0x3f75a000}, {0x3f75c000}, {0x3f75e000},
- {0x3f760000}, {0x3f762000}, {0x3f764000}, {0x3f766000},
- {0x3f768000}, {0x3f76a000}, {0x3f76c000}, {0x3f76e000},
- {0x3f770000}, {0x3f772000}, {0x3f774000}, {0x3f776000},
- {0x3f778000}, {0x3f77a000}, {0x3f77c000}, {0x3f77e000},
- {0x3f780000}, {0x3f782000}, {0x3f784000}, {0x3f786000},
- {0x3f788000}, {0x3f78a000}, {0x3f78c000}, {0x3f78e000},
- {0x3f790000}, {0x3f792000}, {0x3f794000}, {0x3f796000},
- {0x3f798000}, {0x3f79a000}, {0x3f79c000}, {0x3f79e000},
- {0x3f7a0000}, {0x3f7a2000}, {0x3f7a4000}, {0x3f7a6000},
- {0x3f7a8000}, {0x3f7aa000}, {0x3f7ac000}, {0x3f7ae000},
- {0x3f7b0000}, {0x3f7b2000}, {0x3f7b4000}, {0x3f7b6000},
- {0x3f7b8000}, {0x3f7ba000}, {0x3f7bc000}, {0x3f7be000},
- {0x3f7c0000}, {0x3f7c2000}, {0x3f7c4000}, {0x3f7c6000},
- {0x3f7c8000}, {0x3f7ca000}, {0x3f7cc000}, {0x3f7ce000},
- {0x3f7d0000}, {0x3f7d2000}, {0x3f7d4000}, {0x3f7d6000},
- {0x3f7d8000}, {0x3f7da000}, {0x3f7dc000}, {0x3f7de000},
- {0x3f7e0000}, {0x3f7e2000}, {0x3f7e4000}, {0x3f7e6000},
- {0x3f7e8000}, {0x3f7ea000}, {0x3f7ec000}, {0x3f7ee000},
- {0x3f7f0000}, {0x3f7f2000}, {0x3f7f4000}, {0x3f7f6000},
- {0x3f7f8000}, {0x3f7fa000}, {0x3f7fc000}, {0x3f7fe000},
- {0x3f800000}, {0x3f802000}, {0x3f804000}, {0x3f806000},
- {0x3f808000}, {0x3f80a000}, {0x3f80c000}, {0x3f80e000},
- {0x3f810000}, {0x3f812000}, {0x3f814000}, {0x3f816000},
- {0x3f818000}, {0x3f81a000}, {0x3f81c000}, {0x3f81e000},
- {0x3f820000}, {0x3f822000}, {0x3f824000}, {0x3f826000},
- {0x3f828000}, {0x3f82a000}, {0x3f82c000}, {0x3f82e000},
- {0x3f830000}, {0x3f832000}, {0x3f834000}, {0x3f836000},
- {0x3f838000}, {0x3f83a000}, {0x3f83c000}, {0x3f83e000},
- {0x3f840000}, {0x3f842000}, {0x3f844000}, {0x3f846000},
- {0x3f848000}, {0x3f84a000}, {0x3f84c000}, {0x3f84e000},
- {0x3f850000}, {0x3f852000}, {0x3f854000}, {0x3f856000},
- {0x3f858000}, {0x3f85a000}, {0x3f85c000}, {0x3f85e000},
- {0x3f860000}, {0x3f862000}, {0x3f864000}, {0x3f866000},
- {0x3f868000}, {0x3f86a000}, {0x3f86c000}, {0x3f86e000},
- {0x3f870000}, {0x3f872000}, {0x3f874000}, {0x3f876000},
- {0x3f878000}, {0x3f87a000}, {0x3f87c000}, {0x3f87e000},
- {0x3f880000}, {0x3f882000}, {0x3f884000}, {0x3f886000},
- {0x3f888000}, {0x3f88a000}, {0x3f88c000}, {0x3f88e000},
- {0x3f890000}, {0x3f892000}, {0x3f894000}, {0x3f896000},
- {0x3f898000}, {0x3f89a000}, {0x3f89c000}, {0x3f89e000},
- {0x3f8a0000}, {0x3f8a2000}, {0x3f8a4000}, {0x3f8a6000},
- {0x3f8a8000}, {0x3f8aa000}, {0x3f8ac000}, {0x3f8ae000},
- {0x3f8b0000}, {0x3f8b2000}, {0x3f8b4000}, {0x3f8b6000},
- {0x3f8b8000}, {0x3f8ba000}, {0x3f8bc000}, {0x3f8be000},
- {0x3f8c0000}, {0x3f8c2000}, {0x3f8c4000}, {0x3f8c6000},
- {0x3f8c8000}, {0x3f8ca000}, {0x3f8cc000}, {0x3f8ce000},
- {0x3f8d0000}, {0x3f8d2000}, {0x3f8d4000}, {0x3f8d6000},
- {0x3f8d8000}, {0x3f8da000}, {0x3f8dc000}, {0x3f8de000},
- {0x3f8e0000}, {0x3f8e2000}, {0x3f8e4000}, {0x3f8e6000},
- {0x3f8e8000}, {0x3f8ea000}, {0x3f8ec000}, {0x3f8ee000},
- {0x3f8f0000}, {0x3f8f2000}, {0x3f8f4000}, {0x3f8f6000},
- {0x3f8f8000}, {0x3f8fa000}, {0x3f8fc000}, {0x3f8fe000},
- {0x3f900000}, {0x3f902000}, {0x3f904000}, {0x3f906000},
- {0x3f908000}, {0x3f90a000}, {0x3f90c000}, {0x3f90e000},
- {0x3f910000}, {0x3f912000}, {0x3f914000}, {0x3f916000},
- {0x3f918000}, {0x3f91a000}, {0x3f91c000}, {0x3f91e000},
- {0x3f920000}, {0x3f922000}, {0x3f924000}, {0x3f926000},
- {0x3f928000}, {0x3f92a000}, {0x3f92c000}, {0x3f92e000},
- {0x3f930000}, {0x3f932000}, {0x3f934000}, {0x3f936000},
- {0x3f938000}, {0x3f93a000}, {0x3f93c000}, {0x3f93e000},
- {0x3f940000}, {0x3f942000}, {0x3f944000}, {0x3f946000},
- {0x3f948000}, {0x3f94a000}, {0x3f94c000}, {0x3f94e000},
- {0x3f950000}, {0x3f952000}, {0x3f954000}, {0x3f956000},
- {0x3f958000}, {0x3f95a000}, {0x3f95c000}, {0x3f95e000},
- {0x3f960000}, {0x3f962000}, {0x3f964000}, {0x3f966000},
- {0x3f968000}, {0x3f96a000}, {0x3f96c000}, {0x3f96e000},
- {0x3f970000}, {0x3f972000}, {0x3f974000}, {0x3f976000},
- {0x3f978000}, {0x3f97a000}, {0x3f97c000}, {0x3f97e000},
- {0x3f980000}, {0x3f982000}, {0x3f984000}, {0x3f986000},
- {0x3f988000}, {0x3f98a000}, {0x3f98c000}, {0x3f98e000},
- {0x3f990000}, {0x3f992000}, {0x3f994000}, {0x3f996000},
- {0x3f998000}, {0x3f99a000}, {0x3f99c000}, {0x3f99e000},
- {0x3f9a0000}, {0x3f9a2000}, {0x3f9a4000}, {0x3f9a6000},
- {0x3f9a8000}, {0x3f9aa000}, {0x3f9ac000}, {0x3f9ae000},
- {0x3f9b0000}, {0x3f9b2000}, {0x3f9b4000}, {0x3f9b6000},
- {0x3f9b8000}, {0x3f9ba000}, {0x3f9bc000}, {0x3f9be000},
- {0x3f9c0000}, {0x3f9c2000}, {0x3f9c4000}, {0x3f9c6000},
- {0x3f9c8000}, {0x3f9ca000}, {0x3f9cc000}, {0x3f9ce000},
- {0x3f9d0000}, {0x3f9d2000}, {0x3f9d4000}, {0x3f9d6000},
- {0x3f9d8000}, {0x3f9da000}, {0x3f9dc000}, {0x3f9de000},
- {0x3f9e0000}, {0x3f9e2000}, {0x3f9e4000}, {0x3f9e6000},
- {0x3f9e8000}, {0x3f9ea000}, {0x3f9ec000}, {0x3f9ee000},
- {0x3f9f0000}, {0x3f9f2000}, {0x3f9f4000}, {0x3f9f6000},
- {0x3f9f8000}, {0x3f9fa000}, {0x3f9fc000}, {0x3f9fe000},
- {0x3fa00000}, {0x3fa02000}, {0x3fa04000}, {0x3fa06000},
- {0x3fa08000}, {0x3fa0a000}, {0x3fa0c000}, {0x3fa0e000},
- {0x3fa10000}, {0x3fa12000}, {0x3fa14000}, {0x3fa16000},
- {0x3fa18000}, {0x3fa1a000}, {0x3fa1c000}, {0x3fa1e000},
- {0x3fa20000}, {0x3fa22000}, {0x3fa24000}, {0x3fa26000},
- {0x3fa28000}, {0x3fa2a000}, {0x3fa2c000}, {0x3fa2e000},
- {0x3fa30000}, {0x3fa32000}, {0x3fa34000}, {0x3fa36000},
- {0x3fa38000}, {0x3fa3a000}, {0x3fa3c000}, {0x3fa3e000},
- {0x3fa40000}, {0x3fa42000}, {0x3fa44000}, {0x3fa46000},
- {0x3fa48000}, {0x3fa4a000}, {0x3fa4c000}, {0x3fa4e000},
- {0x3fa50000}, {0x3fa52000}, {0x3fa54000}, {0x3fa56000},
- {0x3fa58000}, {0x3fa5a000}, {0x3fa5c000}, {0x3fa5e000},
- {0x3fa60000}, {0x3fa62000}, {0x3fa64000}, {0x3fa66000},
- {0x3fa68000}, {0x3fa6a000}, {0x3fa6c000}, {0x3fa6e000},
- {0x3fa70000}, {0x3fa72000}, {0x3fa74000}, {0x3fa76000},
- {0x3fa78000}, {0x3fa7a000}, {0x3fa7c000}, {0x3fa7e000},
- {0x3fa80000}, {0x3fa82000}, {0x3fa84000}, {0x3fa86000},
- {0x3fa88000}, {0x3fa8a000}, {0x3fa8c000}, {0x3fa8e000},
- {0x3fa90000}, {0x3fa92000}, {0x3fa94000}, {0x3fa96000},
- {0x3fa98000}, {0x3fa9a000}, {0x3fa9c000}, {0x3fa9e000},
- {0x3faa0000}, {0x3faa2000}, {0x3faa4000}, {0x3faa6000},
- {0x3faa8000}, {0x3faaa000}, {0x3faac000}, {0x3faae000},
- {0x3fab0000}, {0x3fab2000}, {0x3fab4000}, {0x3fab6000},
- {0x3fab8000}, {0x3faba000}, {0x3fabc000}, {0x3fabe000},
- {0x3fac0000}, {0x3fac2000}, {0x3fac4000}, {0x3fac6000},
- {0x3fac8000}, {0x3faca000}, {0x3facc000}, {0x3face000},
- {0x3fad0000}, {0x3fad2000}, {0x3fad4000}, {0x3fad6000},
- {0x3fad8000}, {0x3fada000}, {0x3fadc000}, {0x3fade000},
- {0x3fae0000}, {0x3fae2000}, {0x3fae4000}, {0x3fae6000},
- {0x3fae8000}, {0x3faea000}, {0x3faec000}, {0x3faee000},
- {0x3faf0000}, {0x3faf2000}, {0x3faf4000}, {0x3faf6000},
- {0x3faf8000}, {0x3fafa000}, {0x3fafc000}, {0x3fafe000},
- {0x3fb00000}, {0x3fb02000}, {0x3fb04000}, {0x3fb06000},
- {0x3fb08000}, {0x3fb0a000}, {0x3fb0c000}, {0x3fb0e000},
- {0x3fb10000}, {0x3fb12000}, {0x3fb14000}, {0x3fb16000},
- {0x3fb18000}, {0x3fb1a000}, {0x3fb1c000}, {0x3fb1e000},
- {0x3fb20000}, {0x3fb22000}, {0x3fb24000}, {0x3fb26000},
- {0x3fb28000}, {0x3fb2a000}, {0x3fb2c000}, {0x3fb2e000},
- {0x3fb30000}, {0x3fb32000}, {0x3fb34000}, {0x3fb36000},
- {0x3fb38000}, {0x3fb3a000}, {0x3fb3c000}, {0x3fb3e000},
- {0x3fb40000}, {0x3fb42000}, {0x3fb44000}, {0x3fb46000},
- {0x3fb48000}, {0x3fb4a000}, {0x3fb4c000}, {0x3fb4e000},
- {0x3fb50000}, {0x3fb52000}, {0x3fb54000}, {0x3fb56000},
- {0x3fb58000}, {0x3fb5a000}, {0x3fb5c000}, {0x3fb5e000},
- {0x3fb60000}, {0x3fb62000}, {0x3fb64000}, {0x3fb66000},
- {0x3fb68000}, {0x3fb6a000}, {0x3fb6c000}, {0x3fb6e000},
- {0x3fb70000}, {0x3fb72000}, {0x3fb74000}, {0x3fb76000},
- {0x3fb78000}, {0x3fb7a000}, {0x3fb7c000}, {0x3fb7e000},
- {0x3fb80000}, {0x3fb82000}, {0x3fb84000}, {0x3fb86000},
- {0x3fb88000}, {0x3fb8a000}, {0x3fb8c000}, {0x3fb8e000},
- {0x3fb90000}, {0x3fb92000}, {0x3fb94000}, {0x3fb96000},
- {0x3fb98000}, {0x3fb9a000}, {0x3fb9c000}, {0x3fb9e000},
- {0x3fba0000}, {0x3fba2000}, {0x3fba4000}, {0x3fba6000},
- {0x3fba8000}, {0x3fbaa000}, {0x3fbac000}, {0x3fbae000},
- {0x3fbb0000}, {0x3fbb2000}, {0x3fbb4000}, {0x3fbb6000},
- {0x3fbb8000}, {0x3fbba000}, {0x3fbbc000}, {0x3fbbe000},
- {0x3fbc0000}, {0x3fbc2000}, {0x3fbc4000}, {0x3fbc6000},
- {0x3fbc8000}, {0x3fbca000}, {0x3fbcc000}, {0x3fbce000},
- {0x3fbd0000}, {0x3fbd2000}, {0x3fbd4000}, {0x3fbd6000},
- {0x3fbd8000}, {0x3fbda000}, {0x3fbdc000}, {0x3fbde000},
- {0x3fbe0000}, {0x3fbe2000}, {0x3fbe4000}, {0x3fbe6000},
- {0x3fbe8000}, {0x3fbea000}, {0x3fbec000}, {0x3fbee000},
- {0x3fbf0000}, {0x3fbf2000}, {0x3fbf4000}, {0x3fbf6000},
- {0x3fbf8000}, {0x3fbfa000}, {0x3fbfc000}, {0x3fbfe000},
- {0x3fc00000}, {0x3fc02000}, {0x3fc04000}, {0x3fc06000},
- {0x3fc08000}, {0x3fc0a000}, {0x3fc0c000}, {0x3fc0e000},
- {0x3fc10000}, {0x3fc12000}, {0x3fc14000}, {0x3fc16000},
- {0x3fc18000}, {0x3fc1a000}, {0x3fc1c000}, {0x3fc1e000},
- {0x3fc20000}, {0x3fc22000}, {0x3fc24000}, {0x3fc26000},
- {0x3fc28000}, {0x3fc2a000}, {0x3fc2c000}, {0x3fc2e000},
- {0x3fc30000}, {0x3fc32000}, {0x3fc34000}, {0x3fc36000},
- {0x3fc38000}, {0x3fc3a000}, {0x3fc3c000}, {0x3fc3e000},
- {0x3fc40000}, {0x3fc42000}, {0x3fc44000}, {0x3fc46000},
- {0x3fc48000}, {0x3fc4a000}, {0x3fc4c000}, {0x3fc4e000},
- {0x3fc50000}, {0x3fc52000}, {0x3fc54000}, {0x3fc56000},
- {0x3fc58000}, {0x3fc5a000}, {0x3fc5c000}, {0x3fc5e000},
- {0x3fc60000}, {0x3fc62000}, {0x3fc64000}, {0x3fc66000},
- {0x3fc68000}, {0x3fc6a000}, {0x3fc6c000}, {0x3fc6e000},
- {0x3fc70000}, {0x3fc72000}, {0x3fc74000}, {0x3fc76000},
- {0x3fc78000}, {0x3fc7a000}, {0x3fc7c000}, {0x3fc7e000},
- {0x3fc80000}, {0x3fc82000}, {0x3fc84000}, {0x3fc86000},
- {0x3fc88000}, {0x3fc8a000}, {0x3fc8c000}, {0x3fc8e000},
- {0x3fc90000}, {0x3fc92000}, {0x3fc94000}, {0x3fc96000},
- {0x3fc98000}, {0x3fc9a000}, {0x3fc9c000}, {0x3fc9e000},
- {0x3fca0000}, {0x3fca2000}, {0x3fca4000}, {0x3fca6000},
- {0x3fca8000}, {0x3fcaa000}, {0x3fcac000}, {0x3fcae000},
- {0x3fcb0000}, {0x3fcb2000}, {0x3fcb4000}, {0x3fcb6000},
- {0x3fcb8000}, {0x3fcba000}, {0x3fcbc000}, {0x3fcbe000},
- {0x3fcc0000}, {0x3fcc2000}, {0x3fcc4000}, {0x3fcc6000},
- {0x3fcc8000}, {0x3fcca000}, {0x3fccc000}, {0x3fcce000},
- {0x3fcd0000}, {0x3fcd2000}, {0x3fcd4000}, {0x3fcd6000},
- {0x3fcd8000}, {0x3fcda000}, {0x3fcdc000}, {0x3fcde000},
- {0x3fce0000}, {0x3fce2000}, {0x3fce4000}, {0x3fce6000},
- {0x3fce8000}, {0x3fcea000}, {0x3fcec000}, {0x3fcee000},
- {0x3fcf0000}, {0x3fcf2000}, {0x3fcf4000}, {0x3fcf6000},
- {0x3fcf8000}, {0x3fcfa000}, {0x3fcfc000}, {0x3fcfe000},
- {0x3fd00000}, {0x3fd02000}, {0x3fd04000}, {0x3fd06000},
- {0x3fd08000}, {0x3fd0a000}, {0x3fd0c000}, {0x3fd0e000},
- {0x3fd10000}, {0x3fd12000}, {0x3fd14000}, {0x3fd16000},
- {0x3fd18000}, {0x3fd1a000}, {0x3fd1c000}, {0x3fd1e000},
- {0x3fd20000}, {0x3fd22000}, {0x3fd24000}, {0x3fd26000},
- {0x3fd28000}, {0x3fd2a000}, {0x3fd2c000}, {0x3fd2e000},
- {0x3fd30000}, {0x3fd32000}, {0x3fd34000}, {0x3fd36000},
- {0x3fd38000}, {0x3fd3a000}, {0x3fd3c000}, {0x3fd3e000},
- {0x3fd40000}, {0x3fd42000}, {0x3fd44000}, {0x3fd46000},
- {0x3fd48000}, {0x3fd4a000}, {0x3fd4c000}, {0x3fd4e000},
- {0x3fd50000}, {0x3fd52000}, {0x3fd54000}, {0x3fd56000},
- {0x3fd58000}, {0x3fd5a000}, {0x3fd5c000}, {0x3fd5e000},
- {0x3fd60000}, {0x3fd62000}, {0x3fd64000}, {0x3fd66000},
- {0x3fd68000}, {0x3fd6a000}, {0x3fd6c000}, {0x3fd6e000},
- {0x3fd70000}, {0x3fd72000}, {0x3fd74000}, {0x3fd76000},
- {0x3fd78000}, {0x3fd7a000}, {0x3fd7c000}, {0x3fd7e000},
- {0x3fd80000}, {0x3fd82000}, {0x3fd84000}, {0x3fd86000},
- {0x3fd88000}, {0x3fd8a000}, {0x3fd8c000}, {0x3fd8e000},
- {0x3fd90000}, {0x3fd92000}, {0x3fd94000}, {0x3fd96000},
- {0x3fd98000}, {0x3fd9a000}, {0x3fd9c000}, {0x3fd9e000},
- {0x3fda0000}, {0x3fda2000}, {0x3fda4000}, {0x3fda6000},
- {0x3fda8000}, {0x3fdaa000}, {0x3fdac000}, {0x3fdae000},
- {0x3fdb0000}, {0x3fdb2000}, {0x3fdb4000}, {0x3fdb6000},
- {0x3fdb8000}, {0x3fdba000}, {0x3fdbc000}, {0x3fdbe000},
- {0x3fdc0000}, {0x3fdc2000}, {0x3fdc4000}, {0x3fdc6000},
- {0x3fdc8000}, {0x3fdca000}, {0x3fdcc000}, {0x3fdce000},
- {0x3fdd0000}, {0x3fdd2000}, {0x3fdd4000}, {0x3fdd6000},
- {0x3fdd8000}, {0x3fdda000}, {0x3fddc000}, {0x3fdde000},
- {0x3fde0000}, {0x3fde2000}, {0x3fde4000}, {0x3fde6000},
- {0x3fde8000}, {0x3fdea000}, {0x3fdec000}, {0x3fdee000},
- {0x3fdf0000}, {0x3fdf2000}, {0x3fdf4000}, {0x3fdf6000},
- {0x3fdf8000}, {0x3fdfa000}, {0x3fdfc000}, {0x3fdfe000},
- {0x3fe00000}, {0x3fe02000}, {0x3fe04000}, {0x3fe06000},
- {0x3fe08000}, {0x3fe0a000}, {0x3fe0c000}, {0x3fe0e000},
- {0x3fe10000}, {0x3fe12000}, {0x3fe14000}, {0x3fe16000},
- {0x3fe18000}, {0x3fe1a000}, {0x3fe1c000}, {0x3fe1e000},
- {0x3fe20000}, {0x3fe22000}, {0x3fe24000}, {0x3fe26000},
- {0x3fe28000}, {0x3fe2a000}, {0x3fe2c000}, {0x3fe2e000},
- {0x3fe30000}, {0x3fe32000}, {0x3fe34000}, {0x3fe36000},
- {0x3fe38000}, {0x3fe3a000}, {0x3fe3c000}, {0x3fe3e000},
- {0x3fe40000}, {0x3fe42000}, {0x3fe44000}, {0x3fe46000},
- {0x3fe48000}, {0x3fe4a000}, {0x3fe4c000}, {0x3fe4e000},
- {0x3fe50000}, {0x3fe52000}, {0x3fe54000}, {0x3fe56000},
- {0x3fe58000}, {0x3fe5a000}, {0x3fe5c000}, {0x3fe5e000},
- {0x3fe60000}, {0x3fe62000}, {0x3fe64000}, {0x3fe66000},
- {0x3fe68000}, {0x3fe6a000}, {0x3fe6c000}, {0x3fe6e000},
- {0x3fe70000}, {0x3fe72000}, {0x3fe74000}, {0x3fe76000},
- {0x3fe78000}, {0x3fe7a000}, {0x3fe7c000}, {0x3fe7e000},
- {0x3fe80000}, {0x3fe82000}, {0x3fe84000}, {0x3fe86000},
- {0x3fe88000}, {0x3fe8a000}, {0x3fe8c000}, {0x3fe8e000},
- {0x3fe90000}, {0x3fe92000}, {0x3fe94000}, {0x3fe96000},
- {0x3fe98000}, {0x3fe9a000}, {0x3fe9c000}, {0x3fe9e000},
- {0x3fea0000}, {0x3fea2000}, {0x3fea4000}, {0x3fea6000},
- {0x3fea8000}, {0x3feaa000}, {0x3feac000}, {0x3feae000},
- {0x3feb0000}, {0x3feb2000}, {0x3feb4000}, {0x3feb6000},
- {0x3feb8000}, {0x3feba000}, {0x3febc000}, {0x3febe000},
- {0x3fec0000}, {0x3fec2000}, {0x3fec4000}, {0x3fec6000},
- {0x3fec8000}, {0x3feca000}, {0x3fecc000}, {0x3fece000},
- {0x3fed0000}, {0x3fed2000}, {0x3fed4000}, {0x3fed6000},
- {0x3fed8000}, {0x3feda000}, {0x3fedc000}, {0x3fede000},
- {0x3fee0000}, {0x3fee2000}, {0x3fee4000}, {0x3fee6000},
- {0x3fee8000}, {0x3feea000}, {0x3feec000}, {0x3feee000},
- {0x3fef0000}, {0x3fef2000}, {0x3fef4000}, {0x3fef6000},
- {0x3fef8000}, {0x3fefa000}, {0x3fefc000}, {0x3fefe000},
- {0x3ff00000}, {0x3ff02000}, {0x3ff04000}, {0x3ff06000},
- {0x3ff08000}, {0x3ff0a000}, {0x3ff0c000}, {0x3ff0e000},
- {0x3ff10000}, {0x3ff12000}, {0x3ff14000}, {0x3ff16000},
- {0x3ff18000}, {0x3ff1a000}, {0x3ff1c000}, {0x3ff1e000},
- {0x3ff20000}, {0x3ff22000}, {0x3ff24000}, {0x3ff26000},
- {0x3ff28000}, {0x3ff2a000}, {0x3ff2c000}, {0x3ff2e000},
- {0x3ff30000}, {0x3ff32000}, {0x3ff34000}, {0x3ff36000},
- {0x3ff38000}, {0x3ff3a000}, {0x3ff3c000}, {0x3ff3e000},
- {0x3ff40000}, {0x3ff42000}, {0x3ff44000}, {0x3ff46000},
- {0x3ff48000}, {0x3ff4a000}, {0x3ff4c000}, {0x3ff4e000},
- {0x3ff50000}, {0x3ff52000}, {0x3ff54000}, {0x3ff56000},
- {0x3ff58000}, {0x3ff5a000}, {0x3ff5c000}, {0x3ff5e000},
- {0x3ff60000}, {0x3ff62000}, {0x3ff64000}, {0x3ff66000},
- {0x3ff68000}, {0x3ff6a000}, {0x3ff6c000}, {0x3ff6e000},
- {0x3ff70000}, {0x3ff72000}, {0x3ff74000}, {0x3ff76000},
- {0x3ff78000}, {0x3ff7a000}, {0x3ff7c000}, {0x3ff7e000},
- {0x3ff80000}, {0x3ff82000}, {0x3ff84000}, {0x3ff86000},
- {0x3ff88000}, {0x3ff8a000}, {0x3ff8c000}, {0x3ff8e000},
- {0x3ff90000}, {0x3ff92000}, {0x3ff94000}, {0x3ff96000},
- {0x3ff98000}, {0x3ff9a000}, {0x3ff9c000}, {0x3ff9e000},
- {0x3ffa0000}, {0x3ffa2000}, {0x3ffa4000}, {0x3ffa6000},
- {0x3ffa8000}, {0x3ffaa000}, {0x3ffac000}, {0x3ffae000},
- {0x3ffb0000}, {0x3ffb2000}, {0x3ffb4000}, {0x3ffb6000},
- {0x3ffb8000}, {0x3ffba000}, {0x3ffbc000}, {0x3ffbe000},
- {0x3ffc0000}, {0x3ffc2000}, {0x3ffc4000}, {0x3ffc6000},
- {0x3ffc8000}, {0x3ffca000}, {0x3ffcc000}, {0x3ffce000},
- {0x3ffd0000}, {0x3ffd2000}, {0x3ffd4000}, {0x3ffd6000},
- {0x3ffd8000}, {0x3ffda000}, {0x3ffdc000}, {0x3ffde000},
- {0x3ffe0000}, {0x3ffe2000}, {0x3ffe4000}, {0x3ffe6000},
- {0x3ffe8000}, {0x3ffea000}, {0x3ffec000}, {0x3ffee000},
- {0x3fff0000}, {0x3fff2000}, {0x3fff4000}, {0x3fff6000},
- {0x3fff8000}, {0x3fffa000}, {0x3fffc000}, {0x3fffe000},
- {0x40000000}, {0x40002000}, {0x40004000}, {0x40006000},
- {0x40008000}, {0x4000a000}, {0x4000c000}, {0x4000e000},
- {0x40010000}, {0x40012000}, {0x40014000}, {0x40016000},
- {0x40018000}, {0x4001a000}, {0x4001c000}, {0x4001e000},
- {0x40020000}, {0x40022000}, {0x40024000}, {0x40026000},
- {0x40028000}, {0x4002a000}, {0x4002c000}, {0x4002e000},
- {0x40030000}, {0x40032000}, {0x40034000}, {0x40036000},
- {0x40038000}, {0x4003a000}, {0x4003c000}, {0x4003e000},
- {0x40040000}, {0x40042000}, {0x40044000}, {0x40046000},
- {0x40048000}, {0x4004a000}, {0x4004c000}, {0x4004e000},
- {0x40050000}, {0x40052000}, {0x40054000}, {0x40056000},
- {0x40058000}, {0x4005a000}, {0x4005c000}, {0x4005e000},
- {0x40060000}, {0x40062000}, {0x40064000}, {0x40066000},
- {0x40068000}, {0x4006a000}, {0x4006c000}, {0x4006e000},
- {0x40070000}, {0x40072000}, {0x40074000}, {0x40076000},
- {0x40078000}, {0x4007a000}, {0x4007c000}, {0x4007e000},
- {0x40080000}, {0x40082000}, {0x40084000}, {0x40086000},
- {0x40088000}, {0x4008a000}, {0x4008c000}, {0x4008e000},
- {0x40090000}, {0x40092000}, {0x40094000}, {0x40096000},
- {0x40098000}, {0x4009a000}, {0x4009c000}, {0x4009e000},
- {0x400a0000}, {0x400a2000}, {0x400a4000}, {0x400a6000},
- {0x400a8000}, {0x400aa000}, {0x400ac000}, {0x400ae000},
- {0x400b0000}, {0x400b2000}, {0x400b4000}, {0x400b6000},
- {0x400b8000}, {0x400ba000}, {0x400bc000}, {0x400be000},
- {0x400c0000}, {0x400c2000}, {0x400c4000}, {0x400c6000},
- {0x400c8000}, {0x400ca000}, {0x400cc000}, {0x400ce000},
- {0x400d0000}, {0x400d2000}, {0x400d4000}, {0x400d6000},
- {0x400d8000}, {0x400da000}, {0x400dc000}, {0x400de000},
- {0x400e0000}, {0x400e2000}, {0x400e4000}, {0x400e6000},
- {0x400e8000}, {0x400ea000}, {0x400ec000}, {0x400ee000},
- {0x400f0000}, {0x400f2000}, {0x400f4000}, {0x400f6000},
- {0x400f8000}, {0x400fa000}, {0x400fc000}, {0x400fe000},
- {0x40100000}, {0x40102000}, {0x40104000}, {0x40106000},
- {0x40108000}, {0x4010a000}, {0x4010c000}, {0x4010e000},
- {0x40110000}, {0x40112000}, {0x40114000}, {0x40116000},
- {0x40118000}, {0x4011a000}, {0x4011c000}, {0x4011e000},
- {0x40120000}, {0x40122000}, {0x40124000}, {0x40126000},
- {0x40128000}, {0x4012a000}, {0x4012c000}, {0x4012e000},
- {0x40130000}, {0x40132000}, {0x40134000}, {0x40136000},
- {0x40138000}, {0x4013a000}, {0x4013c000}, {0x4013e000},
- {0x40140000}, {0x40142000}, {0x40144000}, {0x40146000},
- {0x40148000}, {0x4014a000}, {0x4014c000}, {0x4014e000},
- {0x40150000}, {0x40152000}, {0x40154000}, {0x40156000},
- {0x40158000}, {0x4015a000}, {0x4015c000}, {0x4015e000},
- {0x40160000}, {0x40162000}, {0x40164000}, {0x40166000},
- {0x40168000}, {0x4016a000}, {0x4016c000}, {0x4016e000},
- {0x40170000}, {0x40172000}, {0x40174000}, {0x40176000},
- {0x40178000}, {0x4017a000}, {0x4017c000}, {0x4017e000},
- {0x40180000}, {0x40182000}, {0x40184000}, {0x40186000},
- {0x40188000}, {0x4018a000}, {0x4018c000}, {0x4018e000},
- {0x40190000}, {0x40192000}, {0x40194000}, {0x40196000},
- {0x40198000}, {0x4019a000}, {0x4019c000}, {0x4019e000},
- {0x401a0000}, {0x401a2000}, {0x401a4000}, {0x401a6000},
- {0x401a8000}, {0x401aa000}, {0x401ac000}, {0x401ae000},
- {0x401b0000}, {0x401b2000}, {0x401b4000}, {0x401b6000},
- {0x401b8000}, {0x401ba000}, {0x401bc000}, {0x401be000},
- {0x401c0000}, {0x401c2000}, {0x401c4000}, {0x401c6000},
- {0x401c8000}, {0x401ca000}, {0x401cc000}, {0x401ce000},
- {0x401d0000}, {0x401d2000}, {0x401d4000}, {0x401d6000},
- {0x401d8000}, {0x401da000}, {0x401dc000}, {0x401de000},
- {0x401e0000}, {0x401e2000}, {0x401e4000}, {0x401e6000},
- {0x401e8000}, {0x401ea000}, {0x401ec000}, {0x401ee000},
- {0x401f0000}, {0x401f2000}, {0x401f4000}, {0x401f6000},
- {0x401f8000}, {0x401fa000}, {0x401fc000}, {0x401fe000},
- {0x40200000}, {0x40202000}, {0x40204000}, {0x40206000},
- {0x40208000}, {0x4020a000}, {0x4020c000}, {0x4020e000},
- {0x40210000}, {0x40212000}, {0x40214000}, {0x40216000},
- {0x40218000}, {0x4021a000}, {0x4021c000}, {0x4021e000},
- {0x40220000}, {0x40222000}, {0x40224000}, {0x40226000},
- {0x40228000}, {0x4022a000}, {0x4022c000}, {0x4022e000},
- {0x40230000}, {0x40232000}, {0x40234000}, {0x40236000},
- {0x40238000}, {0x4023a000}, {0x4023c000}, {0x4023e000},
- {0x40240000}, {0x40242000}, {0x40244000}, {0x40246000},
- {0x40248000}, {0x4024a000}, {0x4024c000}, {0x4024e000},
- {0x40250000}, {0x40252000}, {0x40254000}, {0x40256000},
- {0x40258000}, {0x4025a000}, {0x4025c000}, {0x4025e000},
- {0x40260000}, {0x40262000}, {0x40264000}, {0x40266000},
- {0x40268000}, {0x4026a000}, {0x4026c000}, {0x4026e000},
- {0x40270000}, {0x40272000}, {0x40274000}, {0x40276000},
- {0x40278000}, {0x4027a000}, {0x4027c000}, {0x4027e000},
- {0x40280000}, {0x40282000}, {0x40284000}, {0x40286000},
- {0x40288000}, {0x4028a000}, {0x4028c000}, {0x4028e000},
- {0x40290000}, {0x40292000}, {0x40294000}, {0x40296000},
- {0x40298000}, {0x4029a000}, {0x4029c000}, {0x4029e000},
- {0x402a0000}, {0x402a2000}, {0x402a4000}, {0x402a6000},
- {0x402a8000}, {0x402aa000}, {0x402ac000}, {0x402ae000},
- {0x402b0000}, {0x402b2000}, {0x402b4000}, {0x402b6000},
- {0x402b8000}, {0x402ba000}, {0x402bc000}, {0x402be000},
- {0x402c0000}, {0x402c2000}, {0x402c4000}, {0x402c6000},
- {0x402c8000}, {0x402ca000}, {0x402cc000}, {0x402ce000},
- {0x402d0000}, {0x402d2000}, {0x402d4000}, {0x402d6000},
- {0x402d8000}, {0x402da000}, {0x402dc000}, {0x402de000},
- {0x402e0000}, {0x402e2000}, {0x402e4000}, {0x402e6000},
- {0x402e8000}, {0x402ea000}, {0x402ec000}, {0x402ee000},
- {0x402f0000}, {0x402f2000}, {0x402f4000}, {0x402f6000},
- {0x402f8000}, {0x402fa000}, {0x402fc000}, {0x402fe000},
- {0x40300000}, {0x40302000}, {0x40304000}, {0x40306000},
- {0x40308000}, {0x4030a000}, {0x4030c000}, {0x4030e000},
- {0x40310000}, {0x40312000}, {0x40314000}, {0x40316000},
- {0x40318000}, {0x4031a000}, {0x4031c000}, {0x4031e000},
- {0x40320000}, {0x40322000}, {0x40324000}, {0x40326000},
- {0x40328000}, {0x4032a000}, {0x4032c000}, {0x4032e000},
- {0x40330000}, {0x40332000}, {0x40334000}, {0x40336000},
- {0x40338000}, {0x4033a000}, {0x4033c000}, {0x4033e000},
- {0x40340000}, {0x40342000}, {0x40344000}, {0x40346000},
- {0x40348000}, {0x4034a000}, {0x4034c000}, {0x4034e000},
- {0x40350000}, {0x40352000}, {0x40354000}, {0x40356000},
- {0x40358000}, {0x4035a000}, {0x4035c000}, {0x4035e000},
- {0x40360000}, {0x40362000}, {0x40364000}, {0x40366000},
- {0x40368000}, {0x4036a000}, {0x4036c000}, {0x4036e000},
- {0x40370000}, {0x40372000}, {0x40374000}, {0x40376000},
- {0x40378000}, {0x4037a000}, {0x4037c000}, {0x4037e000},
- {0x40380000}, {0x40382000}, {0x40384000}, {0x40386000},
- {0x40388000}, {0x4038a000}, {0x4038c000}, {0x4038e000},
- {0x40390000}, {0x40392000}, {0x40394000}, {0x40396000},
- {0x40398000}, {0x4039a000}, {0x4039c000}, {0x4039e000},
- {0x403a0000}, {0x403a2000}, {0x403a4000}, {0x403a6000},
- {0x403a8000}, {0x403aa000}, {0x403ac000}, {0x403ae000},
- {0x403b0000}, {0x403b2000}, {0x403b4000}, {0x403b6000},
- {0x403b8000}, {0x403ba000}, {0x403bc000}, {0x403be000},
- {0x403c0000}, {0x403c2000}, {0x403c4000}, {0x403c6000},
- {0x403c8000}, {0x403ca000}, {0x403cc000}, {0x403ce000},
- {0x403d0000}, {0x403d2000}, {0x403d4000}, {0x403d6000},
- {0x403d8000}, {0x403da000}, {0x403dc000}, {0x403de000},
- {0x403e0000}, {0x403e2000}, {0x403e4000}, {0x403e6000},
- {0x403e8000}, {0x403ea000}, {0x403ec000}, {0x403ee000},
- {0x403f0000}, {0x403f2000}, {0x403f4000}, {0x403f6000},
- {0x403f8000}, {0x403fa000}, {0x403fc000}, {0x403fe000},
- {0x40400000}, {0x40402000}, {0x40404000}, {0x40406000},
- {0x40408000}, {0x4040a000}, {0x4040c000}, {0x4040e000},
- {0x40410000}, {0x40412000}, {0x40414000}, {0x40416000},
- {0x40418000}, {0x4041a000}, {0x4041c000}, {0x4041e000},
- {0x40420000}, {0x40422000}, {0x40424000}, {0x40426000},
- {0x40428000}, {0x4042a000}, {0x4042c000}, {0x4042e000},
- {0x40430000}, {0x40432000}, {0x40434000}, {0x40436000},
- {0x40438000}, {0x4043a000}, {0x4043c000}, {0x4043e000},
- {0x40440000}, {0x40442000}, {0x40444000}, {0x40446000},
- {0x40448000}, {0x4044a000}, {0x4044c000}, {0x4044e000},
- {0x40450000}, {0x40452000}, {0x40454000}, {0x40456000},
- {0x40458000}, {0x4045a000}, {0x4045c000}, {0x4045e000},
- {0x40460000}, {0x40462000}, {0x40464000}, {0x40466000},
- {0x40468000}, {0x4046a000}, {0x4046c000}, {0x4046e000},
- {0x40470000}, {0x40472000}, {0x40474000}, {0x40476000},
- {0x40478000}, {0x4047a000}, {0x4047c000}, {0x4047e000},
- {0x40480000}, {0x40482000}, {0x40484000}, {0x40486000},
- {0x40488000}, {0x4048a000}, {0x4048c000}, {0x4048e000},
- {0x40490000}, {0x40492000}, {0x40494000}, {0x40496000},
- {0x40498000}, {0x4049a000}, {0x4049c000}, {0x4049e000},
- {0x404a0000}, {0x404a2000}, {0x404a4000}, {0x404a6000},
- {0x404a8000}, {0x404aa000}, {0x404ac000}, {0x404ae000},
- {0x404b0000}, {0x404b2000}, {0x404b4000}, {0x404b6000},
- {0x404b8000}, {0x404ba000}, {0x404bc000}, {0x404be000},
- {0x404c0000}, {0x404c2000}, {0x404c4000}, {0x404c6000},
- {0x404c8000}, {0x404ca000}, {0x404cc000}, {0x404ce000},
- {0x404d0000}, {0x404d2000}, {0x404d4000}, {0x404d6000},
- {0x404d8000}, {0x404da000}, {0x404dc000}, {0x404de000},
- {0x404e0000}, {0x404e2000}, {0x404e4000}, {0x404e6000},
- {0x404e8000}, {0x404ea000}, {0x404ec000}, {0x404ee000},
- {0x404f0000}, {0x404f2000}, {0x404f4000}, {0x404f6000},
- {0x404f8000}, {0x404fa000}, {0x404fc000}, {0x404fe000},
- {0x40500000}, {0x40502000}, {0x40504000}, {0x40506000},
- {0x40508000}, {0x4050a000}, {0x4050c000}, {0x4050e000},
- {0x40510000}, {0x40512000}, {0x40514000}, {0x40516000},
- {0x40518000}, {0x4051a000}, {0x4051c000}, {0x4051e000},
- {0x40520000}, {0x40522000}, {0x40524000}, {0x40526000},
- {0x40528000}, {0x4052a000}, {0x4052c000}, {0x4052e000},
- {0x40530000}, {0x40532000}, {0x40534000}, {0x40536000},
- {0x40538000}, {0x4053a000}, {0x4053c000}, {0x4053e000},
- {0x40540000}, {0x40542000}, {0x40544000}, {0x40546000},
- {0x40548000}, {0x4054a000}, {0x4054c000}, {0x4054e000},
- {0x40550000}, {0x40552000}, {0x40554000}, {0x40556000},
- {0x40558000}, {0x4055a000}, {0x4055c000}, {0x4055e000},
- {0x40560000}, {0x40562000}, {0x40564000}, {0x40566000},
- {0x40568000}, {0x4056a000}, {0x4056c000}, {0x4056e000},
- {0x40570000}, {0x40572000}, {0x40574000}, {0x40576000},
- {0x40578000}, {0x4057a000}, {0x4057c000}, {0x4057e000},
- {0x40580000}, {0x40582000}, {0x40584000}, {0x40586000},
- {0x40588000}, {0x4058a000}, {0x4058c000}, {0x4058e000},
- {0x40590000}, {0x40592000}, {0x40594000}, {0x40596000},
- {0x40598000}, {0x4059a000}, {0x4059c000}, {0x4059e000},
- {0x405a0000}, {0x405a2000}, {0x405a4000}, {0x405a6000},
- {0x405a8000}, {0x405aa000}, {0x405ac000}, {0x405ae000},
- {0x405b0000}, {0x405b2000}, {0x405b4000}, {0x405b6000},
- {0x405b8000}, {0x405ba000}, {0x405bc000}, {0x405be000},
- {0x405c0000}, {0x405c2000}, {0x405c4000}, {0x405c6000},
- {0x405c8000}, {0x405ca000}, {0x405cc000}, {0x405ce000},
- {0x405d0000}, {0x405d2000}, {0x405d4000}, {0x405d6000},
- {0x405d8000}, {0x405da000}, {0x405dc000}, {0x405de000},
- {0x405e0000}, {0x405e2000}, {0x405e4000}, {0x405e6000},
- {0x405e8000}, {0x405ea000}, {0x405ec000}, {0x405ee000},
- {0x405f0000}, {0x405f2000}, {0x405f4000}, {0x405f6000},
- {0x405f8000}, {0x405fa000}, {0x405fc000}, {0x405fe000},
- {0x40600000}, {0x40602000}, {0x40604000}, {0x40606000},
- {0x40608000}, {0x4060a000}, {0x4060c000}, {0x4060e000},
- {0x40610000}, {0x40612000}, {0x40614000}, {0x40616000},
- {0x40618000}, {0x4061a000}, {0x4061c000}, {0x4061e000},
- {0x40620000}, {0x40622000}, {0x40624000}, {0x40626000},
- {0x40628000}, {0x4062a000}, {0x4062c000}, {0x4062e000},
- {0x40630000}, {0x40632000}, {0x40634000}, {0x40636000},
- {0x40638000}, {0x4063a000}, {0x4063c000}, {0x4063e000},
- {0x40640000}, {0x40642000}, {0x40644000}, {0x40646000},
- {0x40648000}, {0x4064a000}, {0x4064c000}, {0x4064e000},
- {0x40650000}, {0x40652000}, {0x40654000}, {0x40656000},
- {0x40658000}, {0x4065a000}, {0x4065c000}, {0x4065e000},
- {0x40660000}, {0x40662000}, {0x40664000}, {0x40666000},
- {0x40668000}, {0x4066a000}, {0x4066c000}, {0x4066e000},
- {0x40670000}, {0x40672000}, {0x40674000}, {0x40676000},
- {0x40678000}, {0x4067a000}, {0x4067c000}, {0x4067e000},
- {0x40680000}, {0x40682000}, {0x40684000}, {0x40686000},
- {0x40688000}, {0x4068a000}, {0x4068c000}, {0x4068e000},
- {0x40690000}, {0x40692000}, {0x40694000}, {0x40696000},
- {0x40698000}, {0x4069a000}, {0x4069c000}, {0x4069e000},
- {0x406a0000}, {0x406a2000}, {0x406a4000}, {0x406a6000},
- {0x406a8000}, {0x406aa000}, {0x406ac000}, {0x406ae000},
- {0x406b0000}, {0x406b2000}, {0x406b4000}, {0x406b6000},
- {0x406b8000}, {0x406ba000}, {0x406bc000}, {0x406be000},
- {0x406c0000}, {0x406c2000}, {0x406c4000}, {0x406c6000},
- {0x406c8000}, {0x406ca000}, {0x406cc000}, {0x406ce000},
- {0x406d0000}, {0x406d2000}, {0x406d4000}, {0x406d6000},
- {0x406d8000}, {0x406da000}, {0x406dc000}, {0x406de000},
- {0x406e0000}, {0x406e2000}, {0x406e4000}, {0x406e6000},
- {0x406e8000}, {0x406ea000}, {0x406ec000}, {0x406ee000},
- {0x406f0000}, {0x406f2000}, {0x406f4000}, {0x406f6000},
- {0x406f8000}, {0x406fa000}, {0x406fc000}, {0x406fe000},
- {0x40700000}, {0x40702000}, {0x40704000}, {0x40706000},
- {0x40708000}, {0x4070a000}, {0x4070c000}, {0x4070e000},
- {0x40710000}, {0x40712000}, {0x40714000}, {0x40716000},
- {0x40718000}, {0x4071a000}, {0x4071c000}, {0x4071e000},
- {0x40720000}, {0x40722000}, {0x40724000}, {0x40726000},
- {0x40728000}, {0x4072a000}, {0x4072c000}, {0x4072e000},
- {0x40730000}, {0x40732000}, {0x40734000}, {0x40736000},
- {0x40738000}, {0x4073a000}, {0x4073c000}, {0x4073e000},
- {0x40740000}, {0x40742000}, {0x40744000}, {0x40746000},
- {0x40748000}, {0x4074a000}, {0x4074c000}, {0x4074e000},
- {0x40750000}, {0x40752000}, {0x40754000}, {0x40756000},
- {0x40758000}, {0x4075a000}, {0x4075c000}, {0x4075e000},
- {0x40760000}, {0x40762000}, {0x40764000}, {0x40766000},
- {0x40768000}, {0x4076a000}, {0x4076c000}, {0x4076e000},
- {0x40770000}, {0x40772000}, {0x40774000}, {0x40776000},
- {0x40778000}, {0x4077a000}, {0x4077c000}, {0x4077e000},
- {0x40780000}, {0x40782000}, {0x40784000}, {0x40786000},
- {0x40788000}, {0x4078a000}, {0x4078c000}, {0x4078e000},
- {0x40790000}, {0x40792000}, {0x40794000}, {0x40796000},
- {0x40798000}, {0x4079a000}, {0x4079c000}, {0x4079e000},
- {0x407a0000}, {0x407a2000}, {0x407a4000}, {0x407a6000},
- {0x407a8000}, {0x407aa000}, {0x407ac000}, {0x407ae000},
- {0x407b0000}, {0x407b2000}, {0x407b4000}, {0x407b6000},
- {0x407b8000}, {0x407ba000}, {0x407bc000}, {0x407be000},
- {0x407c0000}, {0x407c2000}, {0x407c4000}, {0x407c6000},
- {0x407c8000}, {0x407ca000}, {0x407cc000}, {0x407ce000},
- {0x407d0000}, {0x407d2000}, {0x407d4000}, {0x407d6000},
- {0x407d8000}, {0x407da000}, {0x407dc000}, {0x407de000},
- {0x407e0000}, {0x407e2000}, {0x407e4000}, {0x407e6000},
- {0x407e8000}, {0x407ea000}, {0x407ec000}, {0x407ee000},
- {0x407f0000}, {0x407f2000}, {0x407f4000}, {0x407f6000},
- {0x407f8000}, {0x407fa000}, {0x407fc000}, {0x407fe000},
- {0x40800000}, {0x40802000}, {0x40804000}, {0x40806000},
- {0x40808000}, {0x4080a000}, {0x4080c000}, {0x4080e000},
- {0x40810000}, {0x40812000}, {0x40814000}, {0x40816000},
- {0x40818000}, {0x4081a000}, {0x4081c000}, {0x4081e000},
- {0x40820000}, {0x40822000}, {0x40824000}, {0x40826000},
- {0x40828000}, {0x4082a000}, {0x4082c000}, {0x4082e000},
- {0x40830000}, {0x40832000}, {0x40834000}, {0x40836000},
- {0x40838000}, {0x4083a000}, {0x4083c000}, {0x4083e000},
- {0x40840000}, {0x40842000}, {0x40844000}, {0x40846000},
- {0x40848000}, {0x4084a000}, {0x4084c000}, {0x4084e000},
- {0x40850000}, {0x40852000}, {0x40854000}, {0x40856000},
- {0x40858000}, {0x4085a000}, {0x4085c000}, {0x4085e000},
- {0x40860000}, {0x40862000}, {0x40864000}, {0x40866000},
- {0x40868000}, {0x4086a000}, {0x4086c000}, {0x4086e000},
- {0x40870000}, {0x40872000}, {0x40874000}, {0x40876000},
- {0x40878000}, {0x4087a000}, {0x4087c000}, {0x4087e000},
- {0x40880000}, {0x40882000}, {0x40884000}, {0x40886000},
- {0x40888000}, {0x4088a000}, {0x4088c000}, {0x4088e000},
- {0x40890000}, {0x40892000}, {0x40894000}, {0x40896000},
- {0x40898000}, {0x4089a000}, {0x4089c000}, {0x4089e000},
- {0x408a0000}, {0x408a2000}, {0x408a4000}, {0x408a6000},
- {0x408a8000}, {0x408aa000}, {0x408ac000}, {0x408ae000},
- {0x408b0000}, {0x408b2000}, {0x408b4000}, {0x408b6000},
- {0x408b8000}, {0x408ba000}, {0x408bc000}, {0x408be000},
- {0x408c0000}, {0x408c2000}, {0x408c4000}, {0x408c6000},
- {0x408c8000}, {0x408ca000}, {0x408cc000}, {0x408ce000},
- {0x408d0000}, {0x408d2000}, {0x408d4000}, {0x408d6000},
- {0x408d8000}, {0x408da000}, {0x408dc000}, {0x408de000},
- {0x408e0000}, {0x408e2000}, {0x408e4000}, {0x408e6000},
- {0x408e8000}, {0x408ea000}, {0x408ec000}, {0x408ee000},
- {0x408f0000}, {0x408f2000}, {0x408f4000}, {0x408f6000},
- {0x408f8000}, {0x408fa000}, {0x408fc000}, {0x408fe000},
- {0x40900000}, {0x40902000}, {0x40904000}, {0x40906000},
- {0x40908000}, {0x4090a000}, {0x4090c000}, {0x4090e000},
- {0x40910000}, {0x40912000}, {0x40914000}, {0x40916000},
- {0x40918000}, {0x4091a000}, {0x4091c000}, {0x4091e000},
- {0x40920000}, {0x40922000}, {0x40924000}, {0x40926000},
- {0x40928000}, {0x4092a000}, {0x4092c000}, {0x4092e000},
- {0x40930000}, {0x40932000}, {0x40934000}, {0x40936000},
- {0x40938000}, {0x4093a000}, {0x4093c000}, {0x4093e000},
- {0x40940000}, {0x40942000}, {0x40944000}, {0x40946000},
- {0x40948000}, {0x4094a000}, {0x4094c000}, {0x4094e000},
- {0x40950000}, {0x40952000}, {0x40954000}, {0x40956000},
- {0x40958000}, {0x4095a000}, {0x4095c000}, {0x4095e000},
- {0x40960000}, {0x40962000}, {0x40964000}, {0x40966000},
- {0x40968000}, {0x4096a000}, {0x4096c000}, {0x4096e000},
- {0x40970000}, {0x40972000}, {0x40974000}, {0x40976000},
- {0x40978000}, {0x4097a000}, {0x4097c000}, {0x4097e000},
- {0x40980000}, {0x40982000}, {0x40984000}, {0x40986000},
- {0x40988000}, {0x4098a000}, {0x4098c000}, {0x4098e000},
- {0x40990000}, {0x40992000}, {0x40994000}, {0x40996000},
- {0x40998000}, {0x4099a000}, {0x4099c000}, {0x4099e000},
- {0x409a0000}, {0x409a2000}, {0x409a4000}, {0x409a6000},
- {0x409a8000}, {0x409aa000}, {0x409ac000}, {0x409ae000},
- {0x409b0000}, {0x409b2000}, {0x409b4000}, {0x409b6000},
- {0x409b8000}, {0x409ba000}, {0x409bc000}, {0x409be000},
- {0x409c0000}, {0x409c2000}, {0x409c4000}, {0x409c6000},
- {0x409c8000}, {0x409ca000}, {0x409cc000}, {0x409ce000},
- {0x409d0000}, {0x409d2000}, {0x409d4000}, {0x409d6000},
- {0x409d8000}, {0x409da000}, {0x409dc000}, {0x409de000},
- {0x409e0000}, {0x409e2000}, {0x409e4000}, {0x409e6000},
- {0x409e8000}, {0x409ea000}, {0x409ec000}, {0x409ee000},
- {0x409f0000}, {0x409f2000}, {0x409f4000}, {0x409f6000},
- {0x409f8000}, {0x409fa000}, {0x409fc000}, {0x409fe000},
- {0x40a00000}, {0x40a02000}, {0x40a04000}, {0x40a06000},
- {0x40a08000}, {0x40a0a000}, {0x40a0c000}, {0x40a0e000},
- {0x40a10000}, {0x40a12000}, {0x40a14000}, {0x40a16000},
- {0x40a18000}, {0x40a1a000}, {0x40a1c000}, {0x40a1e000},
- {0x40a20000}, {0x40a22000}, {0x40a24000}, {0x40a26000},
- {0x40a28000}, {0x40a2a000}, {0x40a2c000}, {0x40a2e000},
- {0x40a30000}, {0x40a32000}, {0x40a34000}, {0x40a36000},
- {0x40a38000}, {0x40a3a000}, {0x40a3c000}, {0x40a3e000},
- {0x40a40000}, {0x40a42000}, {0x40a44000}, {0x40a46000},
- {0x40a48000}, {0x40a4a000}, {0x40a4c000}, {0x40a4e000},
- {0x40a50000}, {0x40a52000}, {0x40a54000}, {0x40a56000},
- {0x40a58000}, {0x40a5a000}, {0x40a5c000}, {0x40a5e000},
- {0x40a60000}, {0x40a62000}, {0x40a64000}, {0x40a66000},
- {0x40a68000}, {0x40a6a000}, {0x40a6c000}, {0x40a6e000},
- {0x40a70000}, {0x40a72000}, {0x40a74000}, {0x40a76000},
- {0x40a78000}, {0x40a7a000}, {0x40a7c000}, {0x40a7e000},
- {0x40a80000}, {0x40a82000}, {0x40a84000}, {0x40a86000},
- {0x40a88000}, {0x40a8a000}, {0x40a8c000}, {0x40a8e000},
- {0x40a90000}, {0x40a92000}, {0x40a94000}, {0x40a96000},
- {0x40a98000}, {0x40a9a000}, {0x40a9c000}, {0x40a9e000},
- {0x40aa0000}, {0x40aa2000}, {0x40aa4000}, {0x40aa6000},
- {0x40aa8000}, {0x40aaa000}, {0x40aac000}, {0x40aae000},
- {0x40ab0000}, {0x40ab2000}, {0x40ab4000}, {0x40ab6000},
- {0x40ab8000}, {0x40aba000}, {0x40abc000}, {0x40abe000},
- {0x40ac0000}, {0x40ac2000}, {0x40ac4000}, {0x40ac6000},
- {0x40ac8000}, {0x40aca000}, {0x40acc000}, {0x40ace000},
- {0x40ad0000}, {0x40ad2000}, {0x40ad4000}, {0x40ad6000},
- {0x40ad8000}, {0x40ada000}, {0x40adc000}, {0x40ade000},
- {0x40ae0000}, {0x40ae2000}, {0x40ae4000}, {0x40ae6000},
- {0x40ae8000}, {0x40aea000}, {0x40aec000}, {0x40aee000},
- {0x40af0000}, {0x40af2000}, {0x40af4000}, {0x40af6000},
- {0x40af8000}, {0x40afa000}, {0x40afc000}, {0x40afe000},
- {0x40b00000}, {0x40b02000}, {0x40b04000}, {0x40b06000},
- {0x40b08000}, {0x40b0a000}, {0x40b0c000}, {0x40b0e000},
- {0x40b10000}, {0x40b12000}, {0x40b14000}, {0x40b16000},
- {0x40b18000}, {0x40b1a000}, {0x40b1c000}, {0x40b1e000},
- {0x40b20000}, {0x40b22000}, {0x40b24000}, {0x40b26000},
- {0x40b28000}, {0x40b2a000}, {0x40b2c000}, {0x40b2e000},
- {0x40b30000}, {0x40b32000}, {0x40b34000}, {0x40b36000},
- {0x40b38000}, {0x40b3a000}, {0x40b3c000}, {0x40b3e000},
- {0x40b40000}, {0x40b42000}, {0x40b44000}, {0x40b46000},
- {0x40b48000}, {0x40b4a000}, {0x40b4c000}, {0x40b4e000},
- {0x40b50000}, {0x40b52000}, {0x40b54000}, {0x40b56000},
- {0x40b58000}, {0x40b5a000}, {0x40b5c000}, {0x40b5e000},
- {0x40b60000}, {0x40b62000}, {0x40b64000}, {0x40b66000},
- {0x40b68000}, {0x40b6a000}, {0x40b6c000}, {0x40b6e000},
- {0x40b70000}, {0x40b72000}, {0x40b74000}, {0x40b76000},
- {0x40b78000}, {0x40b7a000}, {0x40b7c000}, {0x40b7e000},
- {0x40b80000}, {0x40b82000}, {0x40b84000}, {0x40b86000},
- {0x40b88000}, {0x40b8a000}, {0x40b8c000}, {0x40b8e000},
- {0x40b90000}, {0x40b92000}, {0x40b94000}, {0x40b96000},
- {0x40b98000}, {0x40b9a000}, {0x40b9c000}, {0x40b9e000},
- {0x40ba0000}, {0x40ba2000}, {0x40ba4000}, {0x40ba6000},
- {0x40ba8000}, {0x40baa000}, {0x40bac000}, {0x40bae000},
- {0x40bb0000}, {0x40bb2000}, {0x40bb4000}, {0x40bb6000},
- {0x40bb8000}, {0x40bba000}, {0x40bbc000}, {0x40bbe000},
- {0x40bc0000}, {0x40bc2000}, {0x40bc4000}, {0x40bc6000},
- {0x40bc8000}, {0x40bca000}, {0x40bcc000}, {0x40bce000},
- {0x40bd0000}, {0x40bd2000}, {0x40bd4000}, {0x40bd6000},
- {0x40bd8000}, {0x40bda000}, {0x40bdc000}, {0x40bde000},
- {0x40be0000}, {0x40be2000}, {0x40be4000}, {0x40be6000},
- {0x40be8000}, {0x40bea000}, {0x40bec000}, {0x40bee000},
- {0x40bf0000}, {0x40bf2000}, {0x40bf4000}, {0x40bf6000},
- {0x40bf8000}, {0x40bfa000}, {0x40bfc000}, {0x40bfe000},
- {0x40c00000}, {0x40c02000}, {0x40c04000}, {0x40c06000},
- {0x40c08000}, {0x40c0a000}, {0x40c0c000}, {0x40c0e000},
- {0x40c10000}, {0x40c12000}, {0x40c14000}, {0x40c16000},
- {0x40c18000}, {0x40c1a000}, {0x40c1c000}, {0x40c1e000},
- {0x40c20000}, {0x40c22000}, {0x40c24000}, {0x40c26000},
- {0x40c28000}, {0x40c2a000}, {0x40c2c000}, {0x40c2e000},
- {0x40c30000}, {0x40c32000}, {0x40c34000}, {0x40c36000},
- {0x40c38000}, {0x40c3a000}, {0x40c3c000}, {0x40c3e000},
- {0x40c40000}, {0x40c42000}, {0x40c44000}, {0x40c46000},
- {0x40c48000}, {0x40c4a000}, {0x40c4c000}, {0x40c4e000},
- {0x40c50000}, {0x40c52000}, {0x40c54000}, {0x40c56000},
- {0x40c58000}, {0x40c5a000}, {0x40c5c000}, {0x40c5e000},
- {0x40c60000}, {0x40c62000}, {0x40c64000}, {0x40c66000},
- {0x40c68000}, {0x40c6a000}, {0x40c6c000}, {0x40c6e000},
- {0x40c70000}, {0x40c72000}, {0x40c74000}, {0x40c76000},
- {0x40c78000}, {0x40c7a000}, {0x40c7c000}, {0x40c7e000},
- {0x40c80000}, {0x40c82000}, {0x40c84000}, {0x40c86000},
- {0x40c88000}, {0x40c8a000}, {0x40c8c000}, {0x40c8e000},
- {0x40c90000}, {0x40c92000}, {0x40c94000}, {0x40c96000},
- {0x40c98000}, {0x40c9a000}, {0x40c9c000}, {0x40c9e000},
- {0x40ca0000}, {0x40ca2000}, {0x40ca4000}, {0x40ca6000},
- {0x40ca8000}, {0x40caa000}, {0x40cac000}, {0x40cae000},
- {0x40cb0000}, {0x40cb2000}, {0x40cb4000}, {0x40cb6000},
- {0x40cb8000}, {0x40cba000}, {0x40cbc000}, {0x40cbe000},
- {0x40cc0000}, {0x40cc2000}, {0x40cc4000}, {0x40cc6000},
- {0x40cc8000}, {0x40cca000}, {0x40ccc000}, {0x40cce000},
- {0x40cd0000}, {0x40cd2000}, {0x40cd4000}, {0x40cd6000},
- {0x40cd8000}, {0x40cda000}, {0x40cdc000}, {0x40cde000},
- {0x40ce0000}, {0x40ce2000}, {0x40ce4000}, {0x40ce6000},
- {0x40ce8000}, {0x40cea000}, {0x40cec000}, {0x40cee000},
- {0x40cf0000}, {0x40cf2000}, {0x40cf4000}, {0x40cf6000},
- {0x40cf8000}, {0x40cfa000}, {0x40cfc000}, {0x40cfe000},
- {0x40d00000}, {0x40d02000}, {0x40d04000}, {0x40d06000},
- {0x40d08000}, {0x40d0a000}, {0x40d0c000}, {0x40d0e000},
- {0x40d10000}, {0x40d12000}, {0x40d14000}, {0x40d16000},
- {0x40d18000}, {0x40d1a000}, {0x40d1c000}, {0x40d1e000},
- {0x40d20000}, {0x40d22000}, {0x40d24000}, {0x40d26000},
- {0x40d28000}, {0x40d2a000}, {0x40d2c000}, {0x40d2e000},
- {0x40d30000}, {0x40d32000}, {0x40d34000}, {0x40d36000},
- {0x40d38000}, {0x40d3a000}, {0x40d3c000}, {0x40d3e000},
- {0x40d40000}, {0x40d42000}, {0x40d44000}, {0x40d46000},
- {0x40d48000}, {0x40d4a000}, {0x40d4c000}, {0x40d4e000},
- {0x40d50000}, {0x40d52000}, {0x40d54000}, {0x40d56000},
- {0x40d58000}, {0x40d5a000}, {0x40d5c000}, {0x40d5e000},
- {0x40d60000}, {0x40d62000}, {0x40d64000}, {0x40d66000},
- {0x40d68000}, {0x40d6a000}, {0x40d6c000}, {0x40d6e000},
- {0x40d70000}, {0x40d72000}, {0x40d74000}, {0x40d76000},
- {0x40d78000}, {0x40d7a000}, {0x40d7c000}, {0x40d7e000},
- {0x40d80000}, {0x40d82000}, {0x40d84000}, {0x40d86000},
- {0x40d88000}, {0x40d8a000}, {0x40d8c000}, {0x40d8e000},
- {0x40d90000}, {0x40d92000}, {0x40d94000}, {0x40d96000},
- {0x40d98000}, {0x40d9a000}, {0x40d9c000}, {0x40d9e000},
- {0x40da0000}, {0x40da2000}, {0x40da4000}, {0x40da6000},
- {0x40da8000}, {0x40daa000}, {0x40dac000}, {0x40dae000},
- {0x40db0000}, {0x40db2000}, {0x40db4000}, {0x40db6000},
- {0x40db8000}, {0x40dba000}, {0x40dbc000}, {0x40dbe000},
- {0x40dc0000}, {0x40dc2000}, {0x40dc4000}, {0x40dc6000},
- {0x40dc8000}, {0x40dca000}, {0x40dcc000}, {0x40dce000},
- {0x40dd0000}, {0x40dd2000}, {0x40dd4000}, {0x40dd6000},
- {0x40dd8000}, {0x40dda000}, {0x40ddc000}, {0x40dde000},
- {0x40de0000}, {0x40de2000}, {0x40de4000}, {0x40de6000},
- {0x40de8000}, {0x40dea000}, {0x40dec000}, {0x40dee000},
- {0x40df0000}, {0x40df2000}, {0x40df4000}, {0x40df6000},
- {0x40df8000}, {0x40dfa000}, {0x40dfc000}, {0x40dfe000},
- {0x40e00000}, {0x40e02000}, {0x40e04000}, {0x40e06000},
- {0x40e08000}, {0x40e0a000}, {0x40e0c000}, {0x40e0e000},
- {0x40e10000}, {0x40e12000}, {0x40e14000}, {0x40e16000},
- {0x40e18000}, {0x40e1a000}, {0x40e1c000}, {0x40e1e000},
- {0x40e20000}, {0x40e22000}, {0x40e24000}, {0x40e26000},
- {0x40e28000}, {0x40e2a000}, {0x40e2c000}, {0x40e2e000},
- {0x40e30000}, {0x40e32000}, {0x40e34000}, {0x40e36000},
- {0x40e38000}, {0x40e3a000}, {0x40e3c000}, {0x40e3e000},
- {0x40e40000}, {0x40e42000}, {0x40e44000}, {0x40e46000},
- {0x40e48000}, {0x40e4a000}, {0x40e4c000}, {0x40e4e000},
- {0x40e50000}, {0x40e52000}, {0x40e54000}, {0x40e56000},
- {0x40e58000}, {0x40e5a000}, {0x40e5c000}, {0x40e5e000},
- {0x40e60000}, {0x40e62000}, {0x40e64000}, {0x40e66000},
- {0x40e68000}, {0x40e6a000}, {0x40e6c000}, {0x40e6e000},
- {0x40e70000}, {0x40e72000}, {0x40e74000}, {0x40e76000},
- {0x40e78000}, {0x40e7a000}, {0x40e7c000}, {0x40e7e000},
- {0x40e80000}, {0x40e82000}, {0x40e84000}, {0x40e86000},
- {0x40e88000}, {0x40e8a000}, {0x40e8c000}, {0x40e8e000},
- {0x40e90000}, {0x40e92000}, {0x40e94000}, {0x40e96000},
- {0x40e98000}, {0x40e9a000}, {0x40e9c000}, {0x40e9e000},
- {0x40ea0000}, {0x40ea2000}, {0x40ea4000}, {0x40ea6000},
- {0x40ea8000}, {0x40eaa000}, {0x40eac000}, {0x40eae000},
- {0x40eb0000}, {0x40eb2000}, {0x40eb4000}, {0x40eb6000},
- {0x40eb8000}, {0x40eba000}, {0x40ebc000}, {0x40ebe000},
- {0x40ec0000}, {0x40ec2000}, {0x40ec4000}, {0x40ec6000},
- {0x40ec8000}, {0x40eca000}, {0x40ecc000}, {0x40ece000},
- {0x40ed0000}, {0x40ed2000}, {0x40ed4000}, {0x40ed6000},
- {0x40ed8000}, {0x40eda000}, {0x40edc000}, {0x40ede000},
- {0x40ee0000}, {0x40ee2000}, {0x40ee4000}, {0x40ee6000},
- {0x40ee8000}, {0x40eea000}, {0x40eec000}, {0x40eee000},
- {0x40ef0000}, {0x40ef2000}, {0x40ef4000}, {0x40ef6000},
- {0x40ef8000}, {0x40efa000}, {0x40efc000}, {0x40efe000},
- {0x40f00000}, {0x40f02000}, {0x40f04000}, {0x40f06000},
- {0x40f08000}, {0x40f0a000}, {0x40f0c000}, {0x40f0e000},
- {0x40f10000}, {0x40f12000}, {0x40f14000}, {0x40f16000},
- {0x40f18000}, {0x40f1a000}, {0x40f1c000}, {0x40f1e000},
- {0x40f20000}, {0x40f22000}, {0x40f24000}, {0x40f26000},
- {0x40f28000}, {0x40f2a000}, {0x40f2c000}, {0x40f2e000},
- {0x40f30000}, {0x40f32000}, {0x40f34000}, {0x40f36000},
- {0x40f38000}, {0x40f3a000}, {0x40f3c000}, {0x40f3e000},
- {0x40f40000}, {0x40f42000}, {0x40f44000}, {0x40f46000},
- {0x40f48000}, {0x40f4a000}, {0x40f4c000}, {0x40f4e000},
- {0x40f50000}, {0x40f52000}, {0x40f54000}, {0x40f56000},
- {0x40f58000}, {0x40f5a000}, {0x40f5c000}, {0x40f5e000},
- {0x40f60000}, {0x40f62000}, {0x40f64000}, {0x40f66000},
- {0x40f68000}, {0x40f6a000}, {0x40f6c000}, {0x40f6e000},
- {0x40f70000}, {0x40f72000}, {0x40f74000}, {0x40f76000},
- {0x40f78000}, {0x40f7a000}, {0x40f7c000}, {0x40f7e000},
- {0x40f80000}, {0x40f82000}, {0x40f84000}, {0x40f86000},
- {0x40f88000}, {0x40f8a000}, {0x40f8c000}, {0x40f8e000},
- {0x40f90000}, {0x40f92000}, {0x40f94000}, {0x40f96000},
- {0x40f98000}, {0x40f9a000}, {0x40f9c000}, {0x40f9e000},
- {0x40fa0000}, {0x40fa2000}, {0x40fa4000}, {0x40fa6000},
- {0x40fa8000}, {0x40faa000}, {0x40fac000}, {0x40fae000},
- {0x40fb0000}, {0x40fb2000}, {0x40fb4000}, {0x40fb6000},
- {0x40fb8000}, {0x40fba000}, {0x40fbc000}, {0x40fbe000},
- {0x40fc0000}, {0x40fc2000}, {0x40fc4000}, {0x40fc6000},
- {0x40fc8000}, {0x40fca000}, {0x40fcc000}, {0x40fce000},
- {0x40fd0000}, {0x40fd2000}, {0x40fd4000}, {0x40fd6000},
- {0x40fd8000}, {0x40fda000}, {0x40fdc000}, {0x40fde000},
- {0x40fe0000}, {0x40fe2000}, {0x40fe4000}, {0x40fe6000},
- {0x40fe8000}, {0x40fea000}, {0x40fec000}, {0x40fee000},
- {0x40ff0000}, {0x40ff2000}, {0x40ff4000}, {0x40ff6000},
- {0x40ff8000}, {0x40ffa000}, {0x40ffc000}, {0x40ffe000},
- {0x41000000}, {0x41002000}, {0x41004000}, {0x41006000},
- {0x41008000}, {0x4100a000}, {0x4100c000}, {0x4100e000},
- {0x41010000}, {0x41012000}, {0x41014000}, {0x41016000},
- {0x41018000}, {0x4101a000}, {0x4101c000}, {0x4101e000},
- {0x41020000}, {0x41022000}, {0x41024000}, {0x41026000},
- {0x41028000}, {0x4102a000}, {0x4102c000}, {0x4102e000},
- {0x41030000}, {0x41032000}, {0x41034000}, {0x41036000},
- {0x41038000}, {0x4103a000}, {0x4103c000}, {0x4103e000},
- {0x41040000}, {0x41042000}, {0x41044000}, {0x41046000},
- {0x41048000}, {0x4104a000}, {0x4104c000}, {0x4104e000},
- {0x41050000}, {0x41052000}, {0x41054000}, {0x41056000},
- {0x41058000}, {0x4105a000}, {0x4105c000}, {0x4105e000},
- {0x41060000}, {0x41062000}, {0x41064000}, {0x41066000},
- {0x41068000}, {0x4106a000}, {0x4106c000}, {0x4106e000},
- {0x41070000}, {0x41072000}, {0x41074000}, {0x41076000},
- {0x41078000}, {0x4107a000}, {0x4107c000}, {0x4107e000},
- {0x41080000}, {0x41082000}, {0x41084000}, {0x41086000},
- {0x41088000}, {0x4108a000}, {0x4108c000}, {0x4108e000},
- {0x41090000}, {0x41092000}, {0x41094000}, {0x41096000},
- {0x41098000}, {0x4109a000}, {0x4109c000}, {0x4109e000},
- {0x410a0000}, {0x410a2000}, {0x410a4000}, {0x410a6000},
- {0x410a8000}, {0x410aa000}, {0x410ac000}, {0x410ae000},
- {0x410b0000}, {0x410b2000}, {0x410b4000}, {0x410b6000},
- {0x410b8000}, {0x410ba000}, {0x410bc000}, {0x410be000},
- {0x410c0000}, {0x410c2000}, {0x410c4000}, {0x410c6000},
- {0x410c8000}, {0x410ca000}, {0x410cc000}, {0x410ce000},
- {0x410d0000}, {0x410d2000}, {0x410d4000}, {0x410d6000},
- {0x410d8000}, {0x410da000}, {0x410dc000}, {0x410de000},
- {0x410e0000}, {0x410e2000}, {0x410e4000}, {0x410e6000},
- {0x410e8000}, {0x410ea000}, {0x410ec000}, {0x410ee000},
- {0x410f0000}, {0x410f2000}, {0x410f4000}, {0x410f6000},
- {0x410f8000}, {0x410fa000}, {0x410fc000}, {0x410fe000},
- {0x41100000}, {0x41102000}, {0x41104000}, {0x41106000},
- {0x41108000}, {0x4110a000}, {0x4110c000}, {0x4110e000},
- {0x41110000}, {0x41112000}, {0x41114000}, {0x41116000},
- {0x41118000}, {0x4111a000}, {0x4111c000}, {0x4111e000},
- {0x41120000}, {0x41122000}, {0x41124000}, {0x41126000},
- {0x41128000}, {0x4112a000}, {0x4112c000}, {0x4112e000},
- {0x41130000}, {0x41132000}, {0x41134000}, {0x41136000},
- {0x41138000}, {0x4113a000}, {0x4113c000}, {0x4113e000},
- {0x41140000}, {0x41142000}, {0x41144000}, {0x41146000},
- {0x41148000}, {0x4114a000}, {0x4114c000}, {0x4114e000},
- {0x41150000}, {0x41152000}, {0x41154000}, {0x41156000},
- {0x41158000}, {0x4115a000}, {0x4115c000}, {0x4115e000},
- {0x41160000}, {0x41162000}, {0x41164000}, {0x41166000},
- {0x41168000}, {0x4116a000}, {0x4116c000}, {0x4116e000},
- {0x41170000}, {0x41172000}, {0x41174000}, {0x41176000},
- {0x41178000}, {0x4117a000}, {0x4117c000}, {0x4117e000},
- {0x41180000}, {0x41182000}, {0x41184000}, {0x41186000},
- {0x41188000}, {0x4118a000}, {0x4118c000}, {0x4118e000},
- {0x41190000}, {0x41192000}, {0x41194000}, {0x41196000},
- {0x41198000}, {0x4119a000}, {0x4119c000}, {0x4119e000},
- {0x411a0000}, {0x411a2000}, {0x411a4000}, {0x411a6000},
- {0x411a8000}, {0x411aa000}, {0x411ac000}, {0x411ae000},
- {0x411b0000}, {0x411b2000}, {0x411b4000}, {0x411b6000},
- {0x411b8000}, {0x411ba000}, {0x411bc000}, {0x411be000},
- {0x411c0000}, {0x411c2000}, {0x411c4000}, {0x411c6000},
- {0x411c8000}, {0x411ca000}, {0x411cc000}, {0x411ce000},
- {0x411d0000}, {0x411d2000}, {0x411d4000}, {0x411d6000},
- {0x411d8000}, {0x411da000}, {0x411dc000}, {0x411de000},
- {0x411e0000}, {0x411e2000}, {0x411e4000}, {0x411e6000},
- {0x411e8000}, {0x411ea000}, {0x411ec000}, {0x411ee000},
- {0x411f0000}, {0x411f2000}, {0x411f4000}, {0x411f6000},
- {0x411f8000}, {0x411fa000}, {0x411fc000}, {0x411fe000},
- {0x41200000}, {0x41202000}, {0x41204000}, {0x41206000},
- {0x41208000}, {0x4120a000}, {0x4120c000}, {0x4120e000},
- {0x41210000}, {0x41212000}, {0x41214000}, {0x41216000},
- {0x41218000}, {0x4121a000}, {0x4121c000}, {0x4121e000},
- {0x41220000}, {0x41222000}, {0x41224000}, {0x41226000},
- {0x41228000}, {0x4122a000}, {0x4122c000}, {0x4122e000},
- {0x41230000}, {0x41232000}, {0x41234000}, {0x41236000},
- {0x41238000}, {0x4123a000}, {0x4123c000}, {0x4123e000},
- {0x41240000}, {0x41242000}, {0x41244000}, {0x41246000},
- {0x41248000}, {0x4124a000}, {0x4124c000}, {0x4124e000},
- {0x41250000}, {0x41252000}, {0x41254000}, {0x41256000},
- {0x41258000}, {0x4125a000}, {0x4125c000}, {0x4125e000},
- {0x41260000}, {0x41262000}, {0x41264000}, {0x41266000},
- {0x41268000}, {0x4126a000}, {0x4126c000}, {0x4126e000},
- {0x41270000}, {0x41272000}, {0x41274000}, {0x41276000},
- {0x41278000}, {0x4127a000}, {0x4127c000}, {0x4127e000},
- {0x41280000}, {0x41282000}, {0x41284000}, {0x41286000},
- {0x41288000}, {0x4128a000}, {0x4128c000}, {0x4128e000},
- {0x41290000}, {0x41292000}, {0x41294000}, {0x41296000},
- {0x41298000}, {0x4129a000}, {0x4129c000}, {0x4129e000},
- {0x412a0000}, {0x412a2000}, {0x412a4000}, {0x412a6000},
- {0x412a8000}, {0x412aa000}, {0x412ac000}, {0x412ae000},
- {0x412b0000}, {0x412b2000}, {0x412b4000}, {0x412b6000},
- {0x412b8000}, {0x412ba000}, {0x412bc000}, {0x412be000},
- {0x412c0000}, {0x412c2000}, {0x412c4000}, {0x412c6000},
- {0x412c8000}, {0x412ca000}, {0x412cc000}, {0x412ce000},
- {0x412d0000}, {0x412d2000}, {0x412d4000}, {0x412d6000},
- {0x412d8000}, {0x412da000}, {0x412dc000}, {0x412de000},
- {0x412e0000}, {0x412e2000}, {0x412e4000}, {0x412e6000},
- {0x412e8000}, {0x412ea000}, {0x412ec000}, {0x412ee000},
- {0x412f0000}, {0x412f2000}, {0x412f4000}, {0x412f6000},
- {0x412f8000}, {0x412fa000}, {0x412fc000}, {0x412fe000},
- {0x41300000}, {0x41302000}, {0x41304000}, {0x41306000},
- {0x41308000}, {0x4130a000}, {0x4130c000}, {0x4130e000},
- {0x41310000}, {0x41312000}, {0x41314000}, {0x41316000},
- {0x41318000}, {0x4131a000}, {0x4131c000}, {0x4131e000},
- {0x41320000}, {0x41322000}, {0x41324000}, {0x41326000},
- {0x41328000}, {0x4132a000}, {0x4132c000}, {0x4132e000},
- {0x41330000}, {0x41332000}, {0x41334000}, {0x41336000},
- {0x41338000}, {0x4133a000}, {0x4133c000}, {0x4133e000},
- {0x41340000}, {0x41342000}, {0x41344000}, {0x41346000},
- {0x41348000}, {0x4134a000}, {0x4134c000}, {0x4134e000},
- {0x41350000}, {0x41352000}, {0x41354000}, {0x41356000},
- {0x41358000}, {0x4135a000}, {0x4135c000}, {0x4135e000},
- {0x41360000}, {0x41362000}, {0x41364000}, {0x41366000},
- {0x41368000}, {0x4136a000}, {0x4136c000}, {0x4136e000},
- {0x41370000}, {0x41372000}, {0x41374000}, {0x41376000},
- {0x41378000}, {0x4137a000}, {0x4137c000}, {0x4137e000},
- {0x41380000}, {0x41382000}, {0x41384000}, {0x41386000},
- {0x41388000}, {0x4138a000}, {0x4138c000}, {0x4138e000},
- {0x41390000}, {0x41392000}, {0x41394000}, {0x41396000},
- {0x41398000}, {0x4139a000}, {0x4139c000}, {0x4139e000},
- {0x413a0000}, {0x413a2000}, {0x413a4000}, {0x413a6000},
- {0x413a8000}, {0x413aa000}, {0x413ac000}, {0x413ae000},
- {0x413b0000}, {0x413b2000}, {0x413b4000}, {0x413b6000},
- {0x413b8000}, {0x413ba000}, {0x413bc000}, {0x413be000},
- {0x413c0000}, {0x413c2000}, {0x413c4000}, {0x413c6000},
- {0x413c8000}, {0x413ca000}, {0x413cc000}, {0x413ce000},
- {0x413d0000}, {0x413d2000}, {0x413d4000}, {0x413d6000},
- {0x413d8000}, {0x413da000}, {0x413dc000}, {0x413de000},
- {0x413e0000}, {0x413e2000}, {0x413e4000}, {0x413e6000},
- {0x413e8000}, {0x413ea000}, {0x413ec000}, {0x413ee000},
- {0x413f0000}, {0x413f2000}, {0x413f4000}, {0x413f6000},
- {0x413f8000}, {0x413fa000}, {0x413fc000}, {0x413fe000},
- {0x41400000}, {0x41402000}, {0x41404000}, {0x41406000},
- {0x41408000}, {0x4140a000}, {0x4140c000}, {0x4140e000},
- {0x41410000}, {0x41412000}, {0x41414000}, {0x41416000},
- {0x41418000}, {0x4141a000}, {0x4141c000}, {0x4141e000},
- {0x41420000}, {0x41422000}, {0x41424000}, {0x41426000},
- {0x41428000}, {0x4142a000}, {0x4142c000}, {0x4142e000},
- {0x41430000}, {0x41432000}, {0x41434000}, {0x41436000},
- {0x41438000}, {0x4143a000}, {0x4143c000}, {0x4143e000},
- {0x41440000}, {0x41442000}, {0x41444000}, {0x41446000},
- {0x41448000}, {0x4144a000}, {0x4144c000}, {0x4144e000},
- {0x41450000}, {0x41452000}, {0x41454000}, {0x41456000},
- {0x41458000}, {0x4145a000}, {0x4145c000}, {0x4145e000},
- {0x41460000}, {0x41462000}, {0x41464000}, {0x41466000},
- {0x41468000}, {0x4146a000}, {0x4146c000}, {0x4146e000},
- {0x41470000}, {0x41472000}, {0x41474000}, {0x41476000},
- {0x41478000}, {0x4147a000}, {0x4147c000}, {0x4147e000},
- {0x41480000}, {0x41482000}, {0x41484000}, {0x41486000},
- {0x41488000}, {0x4148a000}, {0x4148c000}, {0x4148e000},
- {0x41490000}, {0x41492000}, {0x41494000}, {0x41496000},
- {0x41498000}, {0x4149a000}, {0x4149c000}, {0x4149e000},
- {0x414a0000}, {0x414a2000}, {0x414a4000}, {0x414a6000},
- {0x414a8000}, {0x414aa000}, {0x414ac000}, {0x414ae000},
- {0x414b0000}, {0x414b2000}, {0x414b4000}, {0x414b6000},
- {0x414b8000}, {0x414ba000}, {0x414bc000}, {0x414be000},
- {0x414c0000}, {0x414c2000}, {0x414c4000}, {0x414c6000},
- {0x414c8000}, {0x414ca000}, {0x414cc000}, {0x414ce000},
- {0x414d0000}, {0x414d2000}, {0x414d4000}, {0x414d6000},
- {0x414d8000}, {0x414da000}, {0x414dc000}, {0x414de000},
- {0x414e0000}, {0x414e2000}, {0x414e4000}, {0x414e6000},
- {0x414e8000}, {0x414ea000}, {0x414ec000}, {0x414ee000},
- {0x414f0000}, {0x414f2000}, {0x414f4000}, {0x414f6000},
- {0x414f8000}, {0x414fa000}, {0x414fc000}, {0x414fe000},
- {0x41500000}, {0x41502000}, {0x41504000}, {0x41506000},
- {0x41508000}, {0x4150a000}, {0x4150c000}, {0x4150e000},
- {0x41510000}, {0x41512000}, {0x41514000}, {0x41516000},
- {0x41518000}, {0x4151a000}, {0x4151c000}, {0x4151e000},
- {0x41520000}, {0x41522000}, {0x41524000}, {0x41526000},
- {0x41528000}, {0x4152a000}, {0x4152c000}, {0x4152e000},
- {0x41530000}, {0x41532000}, {0x41534000}, {0x41536000},
- {0x41538000}, {0x4153a000}, {0x4153c000}, {0x4153e000},
- {0x41540000}, {0x41542000}, {0x41544000}, {0x41546000},
- {0x41548000}, {0x4154a000}, {0x4154c000}, {0x4154e000},
- {0x41550000}, {0x41552000}, {0x41554000}, {0x41556000},
- {0x41558000}, {0x4155a000}, {0x4155c000}, {0x4155e000},
- {0x41560000}, {0x41562000}, {0x41564000}, {0x41566000},
- {0x41568000}, {0x4156a000}, {0x4156c000}, {0x4156e000},
- {0x41570000}, {0x41572000}, {0x41574000}, {0x41576000},
- {0x41578000}, {0x4157a000}, {0x4157c000}, {0x4157e000},
- {0x41580000}, {0x41582000}, {0x41584000}, {0x41586000},
- {0x41588000}, {0x4158a000}, {0x4158c000}, {0x4158e000},
- {0x41590000}, {0x41592000}, {0x41594000}, {0x41596000},
- {0x41598000}, {0x4159a000}, {0x4159c000}, {0x4159e000},
- {0x415a0000}, {0x415a2000}, {0x415a4000}, {0x415a6000},
- {0x415a8000}, {0x415aa000}, {0x415ac000}, {0x415ae000},
- {0x415b0000}, {0x415b2000}, {0x415b4000}, {0x415b6000},
- {0x415b8000}, {0x415ba000}, {0x415bc000}, {0x415be000},
- {0x415c0000}, {0x415c2000}, {0x415c4000}, {0x415c6000},
- {0x415c8000}, {0x415ca000}, {0x415cc000}, {0x415ce000},
- {0x415d0000}, {0x415d2000}, {0x415d4000}, {0x415d6000},
- {0x415d8000}, {0x415da000}, {0x415dc000}, {0x415de000},
- {0x415e0000}, {0x415e2000}, {0x415e4000}, {0x415e6000},
- {0x415e8000}, {0x415ea000}, {0x415ec000}, {0x415ee000},
- {0x415f0000}, {0x415f2000}, {0x415f4000}, {0x415f6000},
- {0x415f8000}, {0x415fa000}, {0x415fc000}, {0x415fe000},
- {0x41600000}, {0x41602000}, {0x41604000}, {0x41606000},
- {0x41608000}, {0x4160a000}, {0x4160c000}, {0x4160e000},
- {0x41610000}, {0x41612000}, {0x41614000}, {0x41616000},
- {0x41618000}, {0x4161a000}, {0x4161c000}, {0x4161e000},
- {0x41620000}, {0x41622000}, {0x41624000}, {0x41626000},
- {0x41628000}, {0x4162a000}, {0x4162c000}, {0x4162e000},
- {0x41630000}, {0x41632000}, {0x41634000}, {0x41636000},
- {0x41638000}, {0x4163a000}, {0x4163c000}, {0x4163e000},
- {0x41640000}, {0x41642000}, {0x41644000}, {0x41646000},
- {0x41648000}, {0x4164a000}, {0x4164c000}, {0x4164e000},
- {0x41650000}, {0x41652000}, {0x41654000}, {0x41656000},
- {0x41658000}, {0x4165a000}, {0x4165c000}, {0x4165e000},
- {0x41660000}, {0x41662000}, {0x41664000}, {0x41666000},
- {0x41668000}, {0x4166a000}, {0x4166c000}, {0x4166e000},
- {0x41670000}, {0x41672000}, {0x41674000}, {0x41676000},
- {0x41678000}, {0x4167a000}, {0x4167c000}, {0x4167e000},
- {0x41680000}, {0x41682000}, {0x41684000}, {0x41686000},
- {0x41688000}, {0x4168a000}, {0x4168c000}, {0x4168e000},
- {0x41690000}, {0x41692000}, {0x41694000}, {0x41696000},
- {0x41698000}, {0x4169a000}, {0x4169c000}, {0x4169e000},
- {0x416a0000}, {0x416a2000}, {0x416a4000}, {0x416a6000},
- {0x416a8000}, {0x416aa000}, {0x416ac000}, {0x416ae000},
- {0x416b0000}, {0x416b2000}, {0x416b4000}, {0x416b6000},
- {0x416b8000}, {0x416ba000}, {0x416bc000}, {0x416be000},
- {0x416c0000}, {0x416c2000}, {0x416c4000}, {0x416c6000},
- {0x416c8000}, {0x416ca000}, {0x416cc000}, {0x416ce000},
- {0x416d0000}, {0x416d2000}, {0x416d4000}, {0x416d6000},
- {0x416d8000}, {0x416da000}, {0x416dc000}, {0x416de000},
- {0x416e0000}, {0x416e2000}, {0x416e4000}, {0x416e6000},
- {0x416e8000}, {0x416ea000}, {0x416ec000}, {0x416ee000},
- {0x416f0000}, {0x416f2000}, {0x416f4000}, {0x416f6000},
- {0x416f8000}, {0x416fa000}, {0x416fc000}, {0x416fe000},
- {0x41700000}, {0x41702000}, {0x41704000}, {0x41706000},
- {0x41708000}, {0x4170a000}, {0x4170c000}, {0x4170e000},
- {0x41710000}, {0x41712000}, {0x41714000}, {0x41716000},
- {0x41718000}, {0x4171a000}, {0x4171c000}, {0x4171e000},
- {0x41720000}, {0x41722000}, {0x41724000}, {0x41726000},
- {0x41728000}, {0x4172a000}, {0x4172c000}, {0x4172e000},
- {0x41730000}, {0x41732000}, {0x41734000}, {0x41736000},
- {0x41738000}, {0x4173a000}, {0x4173c000}, {0x4173e000},
- {0x41740000}, {0x41742000}, {0x41744000}, {0x41746000},
- {0x41748000}, {0x4174a000}, {0x4174c000}, {0x4174e000},
- {0x41750000}, {0x41752000}, {0x41754000}, {0x41756000},
- {0x41758000}, {0x4175a000}, {0x4175c000}, {0x4175e000},
- {0x41760000}, {0x41762000}, {0x41764000}, {0x41766000},
- {0x41768000}, {0x4176a000}, {0x4176c000}, {0x4176e000},
- {0x41770000}, {0x41772000}, {0x41774000}, {0x41776000},
- {0x41778000}, {0x4177a000}, {0x4177c000}, {0x4177e000},
- {0x41780000}, {0x41782000}, {0x41784000}, {0x41786000},
- {0x41788000}, {0x4178a000}, {0x4178c000}, {0x4178e000},
- {0x41790000}, {0x41792000}, {0x41794000}, {0x41796000},
- {0x41798000}, {0x4179a000}, {0x4179c000}, {0x4179e000},
- {0x417a0000}, {0x417a2000}, {0x417a4000}, {0x417a6000},
- {0x417a8000}, {0x417aa000}, {0x417ac000}, {0x417ae000},
- {0x417b0000}, {0x417b2000}, {0x417b4000}, {0x417b6000},
- {0x417b8000}, {0x417ba000}, {0x417bc000}, {0x417be000},
- {0x417c0000}, {0x417c2000}, {0x417c4000}, {0x417c6000},
- {0x417c8000}, {0x417ca000}, {0x417cc000}, {0x417ce000},
- {0x417d0000}, {0x417d2000}, {0x417d4000}, {0x417d6000},
- {0x417d8000}, {0x417da000}, {0x417dc000}, {0x417de000},
- {0x417e0000}, {0x417e2000}, {0x417e4000}, {0x417e6000},
- {0x417e8000}, {0x417ea000}, {0x417ec000}, {0x417ee000},
- {0x417f0000}, {0x417f2000}, {0x417f4000}, {0x417f6000},
- {0x417f8000}, {0x417fa000}, {0x417fc000}, {0x417fe000},
- {0x41800000}, {0x41802000}, {0x41804000}, {0x41806000},
- {0x41808000}, {0x4180a000}, {0x4180c000}, {0x4180e000},
- {0x41810000}, {0x41812000}, {0x41814000}, {0x41816000},
- {0x41818000}, {0x4181a000}, {0x4181c000}, {0x4181e000},
- {0x41820000}, {0x41822000}, {0x41824000}, {0x41826000},
- {0x41828000}, {0x4182a000}, {0x4182c000}, {0x4182e000},
- {0x41830000}, {0x41832000}, {0x41834000}, {0x41836000},
- {0x41838000}, {0x4183a000}, {0x4183c000}, {0x4183e000},
- {0x41840000}, {0x41842000}, {0x41844000}, {0x41846000},
- {0x41848000}, {0x4184a000}, {0x4184c000}, {0x4184e000},
- {0x41850000}, {0x41852000}, {0x41854000}, {0x41856000},
- {0x41858000}, {0x4185a000}, {0x4185c000}, {0x4185e000},
- {0x41860000}, {0x41862000}, {0x41864000}, {0x41866000},
- {0x41868000}, {0x4186a000}, {0x4186c000}, {0x4186e000},
- {0x41870000}, {0x41872000}, {0x41874000}, {0x41876000},
- {0x41878000}, {0x4187a000}, {0x4187c000}, {0x4187e000},
- {0x41880000}, {0x41882000}, {0x41884000}, {0x41886000},
- {0x41888000}, {0x4188a000}, {0x4188c000}, {0x4188e000},
- {0x41890000}, {0x41892000}, {0x41894000}, {0x41896000},
- {0x41898000}, {0x4189a000}, {0x4189c000}, {0x4189e000},
- {0x418a0000}, {0x418a2000}, {0x418a4000}, {0x418a6000},
- {0x418a8000}, {0x418aa000}, {0x418ac000}, {0x418ae000},
- {0x418b0000}, {0x418b2000}, {0x418b4000}, {0x418b6000},
- {0x418b8000}, {0x418ba000}, {0x418bc000}, {0x418be000},
- {0x418c0000}, {0x418c2000}, {0x418c4000}, {0x418c6000},
- {0x418c8000}, {0x418ca000}, {0x418cc000}, {0x418ce000},
- {0x418d0000}, {0x418d2000}, {0x418d4000}, {0x418d6000},
- {0x418d8000}, {0x418da000}, {0x418dc000}, {0x418de000},
- {0x418e0000}, {0x418e2000}, {0x418e4000}, {0x418e6000},
- {0x418e8000}, {0x418ea000}, {0x418ec000}, {0x418ee000},
- {0x418f0000}, {0x418f2000}, {0x418f4000}, {0x418f6000},
- {0x418f8000}, {0x418fa000}, {0x418fc000}, {0x418fe000},
- {0x41900000}, {0x41902000}, {0x41904000}, {0x41906000},
- {0x41908000}, {0x4190a000}, {0x4190c000}, {0x4190e000},
- {0x41910000}, {0x41912000}, {0x41914000}, {0x41916000},
- {0x41918000}, {0x4191a000}, {0x4191c000}, {0x4191e000},
- {0x41920000}, {0x41922000}, {0x41924000}, {0x41926000},
- {0x41928000}, {0x4192a000}, {0x4192c000}, {0x4192e000},
- {0x41930000}, {0x41932000}, {0x41934000}, {0x41936000},
- {0x41938000}, {0x4193a000}, {0x4193c000}, {0x4193e000},
- {0x41940000}, {0x41942000}, {0x41944000}, {0x41946000},
- {0x41948000}, {0x4194a000}, {0x4194c000}, {0x4194e000},
- {0x41950000}, {0x41952000}, {0x41954000}, {0x41956000},
- {0x41958000}, {0x4195a000}, {0x4195c000}, {0x4195e000},
- {0x41960000}, {0x41962000}, {0x41964000}, {0x41966000},
- {0x41968000}, {0x4196a000}, {0x4196c000}, {0x4196e000},
- {0x41970000}, {0x41972000}, {0x41974000}, {0x41976000},
- {0x41978000}, {0x4197a000}, {0x4197c000}, {0x4197e000},
- {0x41980000}, {0x41982000}, {0x41984000}, {0x41986000},
- {0x41988000}, {0x4198a000}, {0x4198c000}, {0x4198e000},
- {0x41990000}, {0x41992000}, {0x41994000}, {0x41996000},
- {0x41998000}, {0x4199a000}, {0x4199c000}, {0x4199e000},
- {0x419a0000}, {0x419a2000}, {0x419a4000}, {0x419a6000},
- {0x419a8000}, {0x419aa000}, {0x419ac000}, {0x419ae000},
- {0x419b0000}, {0x419b2000}, {0x419b4000}, {0x419b6000},
- {0x419b8000}, {0x419ba000}, {0x419bc000}, {0x419be000},
- {0x419c0000}, {0x419c2000}, {0x419c4000}, {0x419c6000},
- {0x419c8000}, {0x419ca000}, {0x419cc000}, {0x419ce000},
- {0x419d0000}, {0x419d2000}, {0x419d4000}, {0x419d6000},
- {0x419d8000}, {0x419da000}, {0x419dc000}, {0x419de000},
- {0x419e0000}, {0x419e2000}, {0x419e4000}, {0x419e6000},
- {0x419e8000}, {0x419ea000}, {0x419ec000}, {0x419ee000},
- {0x419f0000}, {0x419f2000}, {0x419f4000}, {0x419f6000},
- {0x419f8000}, {0x419fa000}, {0x419fc000}, {0x419fe000},
- {0x41a00000}, {0x41a02000}, {0x41a04000}, {0x41a06000},
- {0x41a08000}, {0x41a0a000}, {0x41a0c000}, {0x41a0e000},
- {0x41a10000}, {0x41a12000}, {0x41a14000}, {0x41a16000},
- {0x41a18000}, {0x41a1a000}, {0x41a1c000}, {0x41a1e000},
- {0x41a20000}, {0x41a22000}, {0x41a24000}, {0x41a26000},
- {0x41a28000}, {0x41a2a000}, {0x41a2c000}, {0x41a2e000},
- {0x41a30000}, {0x41a32000}, {0x41a34000}, {0x41a36000},
- {0x41a38000}, {0x41a3a000}, {0x41a3c000}, {0x41a3e000},
- {0x41a40000}, {0x41a42000}, {0x41a44000}, {0x41a46000},
- {0x41a48000}, {0x41a4a000}, {0x41a4c000}, {0x41a4e000},
- {0x41a50000}, {0x41a52000}, {0x41a54000}, {0x41a56000},
- {0x41a58000}, {0x41a5a000}, {0x41a5c000}, {0x41a5e000},
- {0x41a60000}, {0x41a62000}, {0x41a64000}, {0x41a66000},
- {0x41a68000}, {0x41a6a000}, {0x41a6c000}, {0x41a6e000},
- {0x41a70000}, {0x41a72000}, {0x41a74000}, {0x41a76000},
- {0x41a78000}, {0x41a7a000}, {0x41a7c000}, {0x41a7e000},
- {0x41a80000}, {0x41a82000}, {0x41a84000}, {0x41a86000},
- {0x41a88000}, {0x41a8a000}, {0x41a8c000}, {0x41a8e000},
- {0x41a90000}, {0x41a92000}, {0x41a94000}, {0x41a96000},
- {0x41a98000}, {0x41a9a000}, {0x41a9c000}, {0x41a9e000},
- {0x41aa0000}, {0x41aa2000}, {0x41aa4000}, {0x41aa6000},
- {0x41aa8000}, {0x41aaa000}, {0x41aac000}, {0x41aae000},
- {0x41ab0000}, {0x41ab2000}, {0x41ab4000}, {0x41ab6000},
- {0x41ab8000}, {0x41aba000}, {0x41abc000}, {0x41abe000},
- {0x41ac0000}, {0x41ac2000}, {0x41ac4000}, {0x41ac6000},
- {0x41ac8000}, {0x41aca000}, {0x41acc000}, {0x41ace000},
- {0x41ad0000}, {0x41ad2000}, {0x41ad4000}, {0x41ad6000},
- {0x41ad8000}, {0x41ada000}, {0x41adc000}, {0x41ade000},
- {0x41ae0000}, {0x41ae2000}, {0x41ae4000}, {0x41ae6000},
- {0x41ae8000}, {0x41aea000}, {0x41aec000}, {0x41aee000},
- {0x41af0000}, {0x41af2000}, {0x41af4000}, {0x41af6000},
- {0x41af8000}, {0x41afa000}, {0x41afc000}, {0x41afe000},
- {0x41b00000}, {0x41b02000}, {0x41b04000}, {0x41b06000},
- {0x41b08000}, {0x41b0a000}, {0x41b0c000}, {0x41b0e000},
- {0x41b10000}, {0x41b12000}, {0x41b14000}, {0x41b16000},
- {0x41b18000}, {0x41b1a000}, {0x41b1c000}, {0x41b1e000},
- {0x41b20000}, {0x41b22000}, {0x41b24000}, {0x41b26000},
- {0x41b28000}, {0x41b2a000}, {0x41b2c000}, {0x41b2e000},
- {0x41b30000}, {0x41b32000}, {0x41b34000}, {0x41b36000},
- {0x41b38000}, {0x41b3a000}, {0x41b3c000}, {0x41b3e000},
- {0x41b40000}, {0x41b42000}, {0x41b44000}, {0x41b46000},
- {0x41b48000}, {0x41b4a000}, {0x41b4c000}, {0x41b4e000},
- {0x41b50000}, {0x41b52000}, {0x41b54000}, {0x41b56000},
- {0x41b58000}, {0x41b5a000}, {0x41b5c000}, {0x41b5e000},
- {0x41b60000}, {0x41b62000}, {0x41b64000}, {0x41b66000},
- {0x41b68000}, {0x41b6a000}, {0x41b6c000}, {0x41b6e000},
- {0x41b70000}, {0x41b72000}, {0x41b74000}, {0x41b76000},
- {0x41b78000}, {0x41b7a000}, {0x41b7c000}, {0x41b7e000},
- {0x41b80000}, {0x41b82000}, {0x41b84000}, {0x41b86000},
- {0x41b88000}, {0x41b8a000}, {0x41b8c000}, {0x41b8e000},
- {0x41b90000}, {0x41b92000}, {0x41b94000}, {0x41b96000},
- {0x41b98000}, {0x41b9a000}, {0x41b9c000}, {0x41b9e000},
- {0x41ba0000}, {0x41ba2000}, {0x41ba4000}, {0x41ba6000},
- {0x41ba8000}, {0x41baa000}, {0x41bac000}, {0x41bae000},
- {0x41bb0000}, {0x41bb2000}, {0x41bb4000}, {0x41bb6000},
- {0x41bb8000}, {0x41bba000}, {0x41bbc000}, {0x41bbe000},
- {0x41bc0000}, {0x41bc2000}, {0x41bc4000}, {0x41bc6000},
- {0x41bc8000}, {0x41bca000}, {0x41bcc000}, {0x41bce000},
- {0x41bd0000}, {0x41bd2000}, {0x41bd4000}, {0x41bd6000},
- {0x41bd8000}, {0x41bda000}, {0x41bdc000}, {0x41bde000},
- {0x41be0000}, {0x41be2000}, {0x41be4000}, {0x41be6000},
- {0x41be8000}, {0x41bea000}, {0x41bec000}, {0x41bee000},
- {0x41bf0000}, {0x41bf2000}, {0x41bf4000}, {0x41bf6000},
- {0x41bf8000}, {0x41bfa000}, {0x41bfc000}, {0x41bfe000},
- {0x41c00000}, {0x41c02000}, {0x41c04000}, {0x41c06000},
- {0x41c08000}, {0x41c0a000}, {0x41c0c000}, {0x41c0e000},
- {0x41c10000}, {0x41c12000}, {0x41c14000}, {0x41c16000},
- {0x41c18000}, {0x41c1a000}, {0x41c1c000}, {0x41c1e000},
- {0x41c20000}, {0x41c22000}, {0x41c24000}, {0x41c26000},
- {0x41c28000}, {0x41c2a000}, {0x41c2c000}, {0x41c2e000},
- {0x41c30000}, {0x41c32000}, {0x41c34000}, {0x41c36000},
- {0x41c38000}, {0x41c3a000}, {0x41c3c000}, {0x41c3e000},
- {0x41c40000}, {0x41c42000}, {0x41c44000}, {0x41c46000},
- {0x41c48000}, {0x41c4a000}, {0x41c4c000}, {0x41c4e000},
- {0x41c50000}, {0x41c52000}, {0x41c54000}, {0x41c56000},
- {0x41c58000}, {0x41c5a000}, {0x41c5c000}, {0x41c5e000},
- {0x41c60000}, {0x41c62000}, {0x41c64000}, {0x41c66000},
- {0x41c68000}, {0x41c6a000}, {0x41c6c000}, {0x41c6e000},
- {0x41c70000}, {0x41c72000}, {0x41c74000}, {0x41c76000},
- {0x41c78000}, {0x41c7a000}, {0x41c7c000}, {0x41c7e000},
- {0x41c80000}, {0x41c82000}, {0x41c84000}, {0x41c86000},
- {0x41c88000}, {0x41c8a000}, {0x41c8c000}, {0x41c8e000},
- {0x41c90000}, {0x41c92000}, {0x41c94000}, {0x41c96000},
- {0x41c98000}, {0x41c9a000}, {0x41c9c000}, {0x41c9e000},
- {0x41ca0000}, {0x41ca2000}, {0x41ca4000}, {0x41ca6000},
- {0x41ca8000}, {0x41caa000}, {0x41cac000}, {0x41cae000},
- {0x41cb0000}, {0x41cb2000}, {0x41cb4000}, {0x41cb6000},
- {0x41cb8000}, {0x41cba000}, {0x41cbc000}, {0x41cbe000},
- {0x41cc0000}, {0x41cc2000}, {0x41cc4000}, {0x41cc6000},
- {0x41cc8000}, {0x41cca000}, {0x41ccc000}, {0x41cce000},
- {0x41cd0000}, {0x41cd2000}, {0x41cd4000}, {0x41cd6000},
- {0x41cd8000}, {0x41cda000}, {0x41cdc000}, {0x41cde000},
- {0x41ce0000}, {0x41ce2000}, {0x41ce4000}, {0x41ce6000},
- {0x41ce8000}, {0x41cea000}, {0x41cec000}, {0x41cee000},
- {0x41cf0000}, {0x41cf2000}, {0x41cf4000}, {0x41cf6000},
- {0x41cf8000}, {0x41cfa000}, {0x41cfc000}, {0x41cfe000},
- {0x41d00000}, {0x41d02000}, {0x41d04000}, {0x41d06000},
- {0x41d08000}, {0x41d0a000}, {0x41d0c000}, {0x41d0e000},
- {0x41d10000}, {0x41d12000}, {0x41d14000}, {0x41d16000},
- {0x41d18000}, {0x41d1a000}, {0x41d1c000}, {0x41d1e000},
- {0x41d20000}, {0x41d22000}, {0x41d24000}, {0x41d26000},
- {0x41d28000}, {0x41d2a000}, {0x41d2c000}, {0x41d2e000},
- {0x41d30000}, {0x41d32000}, {0x41d34000}, {0x41d36000},
- {0x41d38000}, {0x41d3a000}, {0x41d3c000}, {0x41d3e000},
- {0x41d40000}, {0x41d42000}, {0x41d44000}, {0x41d46000},
- {0x41d48000}, {0x41d4a000}, {0x41d4c000}, {0x41d4e000},
- {0x41d50000}, {0x41d52000}, {0x41d54000}, {0x41d56000},
- {0x41d58000}, {0x41d5a000}, {0x41d5c000}, {0x41d5e000},
- {0x41d60000}, {0x41d62000}, {0x41d64000}, {0x41d66000},
- {0x41d68000}, {0x41d6a000}, {0x41d6c000}, {0x41d6e000},
- {0x41d70000}, {0x41d72000}, {0x41d74000}, {0x41d76000},
- {0x41d78000}, {0x41d7a000}, {0x41d7c000}, {0x41d7e000},
- {0x41d80000}, {0x41d82000}, {0x41d84000}, {0x41d86000},
- {0x41d88000}, {0x41d8a000}, {0x41d8c000}, {0x41d8e000},
- {0x41d90000}, {0x41d92000}, {0x41d94000}, {0x41d96000},
- {0x41d98000}, {0x41d9a000}, {0x41d9c000}, {0x41d9e000},
- {0x41da0000}, {0x41da2000}, {0x41da4000}, {0x41da6000},
- {0x41da8000}, {0x41daa000}, {0x41dac000}, {0x41dae000},
- {0x41db0000}, {0x41db2000}, {0x41db4000}, {0x41db6000},
- {0x41db8000}, {0x41dba000}, {0x41dbc000}, {0x41dbe000},
- {0x41dc0000}, {0x41dc2000}, {0x41dc4000}, {0x41dc6000},
- {0x41dc8000}, {0x41dca000}, {0x41dcc000}, {0x41dce000},
- {0x41dd0000}, {0x41dd2000}, {0x41dd4000}, {0x41dd6000},
- {0x41dd8000}, {0x41dda000}, {0x41ddc000}, {0x41dde000},
- {0x41de0000}, {0x41de2000}, {0x41de4000}, {0x41de6000},
- {0x41de8000}, {0x41dea000}, {0x41dec000}, {0x41dee000},
- {0x41df0000}, {0x41df2000}, {0x41df4000}, {0x41df6000},
- {0x41df8000}, {0x41dfa000}, {0x41dfc000}, {0x41dfe000},
- {0x41e00000}, {0x41e02000}, {0x41e04000}, {0x41e06000},
- {0x41e08000}, {0x41e0a000}, {0x41e0c000}, {0x41e0e000},
- {0x41e10000}, {0x41e12000}, {0x41e14000}, {0x41e16000},
- {0x41e18000}, {0x41e1a000}, {0x41e1c000}, {0x41e1e000},
- {0x41e20000}, {0x41e22000}, {0x41e24000}, {0x41e26000},
- {0x41e28000}, {0x41e2a000}, {0x41e2c000}, {0x41e2e000},
- {0x41e30000}, {0x41e32000}, {0x41e34000}, {0x41e36000},
- {0x41e38000}, {0x41e3a000}, {0x41e3c000}, {0x41e3e000},
- {0x41e40000}, {0x41e42000}, {0x41e44000}, {0x41e46000},
- {0x41e48000}, {0x41e4a000}, {0x41e4c000}, {0x41e4e000},
- {0x41e50000}, {0x41e52000}, {0x41e54000}, {0x41e56000},
- {0x41e58000}, {0x41e5a000}, {0x41e5c000}, {0x41e5e000},
- {0x41e60000}, {0x41e62000}, {0x41e64000}, {0x41e66000},
- {0x41e68000}, {0x41e6a000}, {0x41e6c000}, {0x41e6e000},
- {0x41e70000}, {0x41e72000}, {0x41e74000}, {0x41e76000},
- {0x41e78000}, {0x41e7a000}, {0x41e7c000}, {0x41e7e000},
- {0x41e80000}, {0x41e82000}, {0x41e84000}, {0x41e86000},
- {0x41e88000}, {0x41e8a000}, {0x41e8c000}, {0x41e8e000},
- {0x41e90000}, {0x41e92000}, {0x41e94000}, {0x41e96000},
- {0x41e98000}, {0x41e9a000}, {0x41e9c000}, {0x41e9e000},
- {0x41ea0000}, {0x41ea2000}, {0x41ea4000}, {0x41ea6000},
- {0x41ea8000}, {0x41eaa000}, {0x41eac000}, {0x41eae000},
- {0x41eb0000}, {0x41eb2000}, {0x41eb4000}, {0x41eb6000},
- {0x41eb8000}, {0x41eba000}, {0x41ebc000}, {0x41ebe000},
- {0x41ec0000}, {0x41ec2000}, {0x41ec4000}, {0x41ec6000},
- {0x41ec8000}, {0x41eca000}, {0x41ecc000}, {0x41ece000},
- {0x41ed0000}, {0x41ed2000}, {0x41ed4000}, {0x41ed6000},
- {0x41ed8000}, {0x41eda000}, {0x41edc000}, {0x41ede000},
- {0x41ee0000}, {0x41ee2000}, {0x41ee4000}, {0x41ee6000},
- {0x41ee8000}, {0x41eea000}, {0x41eec000}, {0x41eee000},
- {0x41ef0000}, {0x41ef2000}, {0x41ef4000}, {0x41ef6000},
- {0x41ef8000}, {0x41efa000}, {0x41efc000}, {0x41efe000},
- {0x41f00000}, {0x41f02000}, {0x41f04000}, {0x41f06000},
- {0x41f08000}, {0x41f0a000}, {0x41f0c000}, {0x41f0e000},
- {0x41f10000}, {0x41f12000}, {0x41f14000}, {0x41f16000},
- {0x41f18000}, {0x41f1a000}, {0x41f1c000}, {0x41f1e000},
- {0x41f20000}, {0x41f22000}, {0x41f24000}, {0x41f26000},
- {0x41f28000}, {0x41f2a000}, {0x41f2c000}, {0x41f2e000},
- {0x41f30000}, {0x41f32000}, {0x41f34000}, {0x41f36000},
- {0x41f38000}, {0x41f3a000}, {0x41f3c000}, {0x41f3e000},
- {0x41f40000}, {0x41f42000}, {0x41f44000}, {0x41f46000},
- {0x41f48000}, {0x41f4a000}, {0x41f4c000}, {0x41f4e000},
- {0x41f50000}, {0x41f52000}, {0x41f54000}, {0x41f56000},
- {0x41f58000}, {0x41f5a000}, {0x41f5c000}, {0x41f5e000},
- {0x41f60000}, {0x41f62000}, {0x41f64000}, {0x41f66000},
- {0x41f68000}, {0x41f6a000}, {0x41f6c000}, {0x41f6e000},
- {0x41f70000}, {0x41f72000}, {0x41f74000}, {0x41f76000},
- {0x41f78000}, {0x41f7a000}, {0x41f7c000}, {0x41f7e000},
- {0x41f80000}, {0x41f82000}, {0x41f84000}, {0x41f86000},
- {0x41f88000}, {0x41f8a000}, {0x41f8c000}, {0x41f8e000},
- {0x41f90000}, {0x41f92000}, {0x41f94000}, {0x41f96000},
- {0x41f98000}, {0x41f9a000}, {0x41f9c000}, {0x41f9e000},
- {0x41fa0000}, {0x41fa2000}, {0x41fa4000}, {0x41fa6000},
- {0x41fa8000}, {0x41faa000}, {0x41fac000}, {0x41fae000},
- {0x41fb0000}, {0x41fb2000}, {0x41fb4000}, {0x41fb6000},
- {0x41fb8000}, {0x41fba000}, {0x41fbc000}, {0x41fbe000},
- {0x41fc0000}, {0x41fc2000}, {0x41fc4000}, {0x41fc6000},
- {0x41fc8000}, {0x41fca000}, {0x41fcc000}, {0x41fce000},
- {0x41fd0000}, {0x41fd2000}, {0x41fd4000}, {0x41fd6000},
- {0x41fd8000}, {0x41fda000}, {0x41fdc000}, {0x41fde000},
- {0x41fe0000}, {0x41fe2000}, {0x41fe4000}, {0x41fe6000},
- {0x41fe8000}, {0x41fea000}, {0x41fec000}, {0x41fee000},
- {0x41ff0000}, {0x41ff2000}, {0x41ff4000}, {0x41ff6000},
- {0x41ff8000}, {0x41ffa000}, {0x41ffc000}, {0x41ffe000},
- {0x42000000}, {0x42002000}, {0x42004000}, {0x42006000},
- {0x42008000}, {0x4200a000}, {0x4200c000}, {0x4200e000},
- {0x42010000}, {0x42012000}, {0x42014000}, {0x42016000},
- {0x42018000}, {0x4201a000}, {0x4201c000}, {0x4201e000},
- {0x42020000}, {0x42022000}, {0x42024000}, {0x42026000},
- {0x42028000}, {0x4202a000}, {0x4202c000}, {0x4202e000},
- {0x42030000}, {0x42032000}, {0x42034000}, {0x42036000},
- {0x42038000}, {0x4203a000}, {0x4203c000}, {0x4203e000},
- {0x42040000}, {0x42042000}, {0x42044000}, {0x42046000},
- {0x42048000}, {0x4204a000}, {0x4204c000}, {0x4204e000},
- {0x42050000}, {0x42052000}, {0x42054000}, {0x42056000},
- {0x42058000}, {0x4205a000}, {0x4205c000}, {0x4205e000},
- {0x42060000}, {0x42062000}, {0x42064000}, {0x42066000},
- {0x42068000}, {0x4206a000}, {0x4206c000}, {0x4206e000},
- {0x42070000}, {0x42072000}, {0x42074000}, {0x42076000},
- {0x42078000}, {0x4207a000}, {0x4207c000}, {0x4207e000},
- {0x42080000}, {0x42082000}, {0x42084000}, {0x42086000},
- {0x42088000}, {0x4208a000}, {0x4208c000}, {0x4208e000},
- {0x42090000}, {0x42092000}, {0x42094000}, {0x42096000},
- {0x42098000}, {0x4209a000}, {0x4209c000}, {0x4209e000},
- {0x420a0000}, {0x420a2000}, {0x420a4000}, {0x420a6000},
- {0x420a8000}, {0x420aa000}, {0x420ac000}, {0x420ae000},
- {0x420b0000}, {0x420b2000}, {0x420b4000}, {0x420b6000},
- {0x420b8000}, {0x420ba000}, {0x420bc000}, {0x420be000},
- {0x420c0000}, {0x420c2000}, {0x420c4000}, {0x420c6000},
- {0x420c8000}, {0x420ca000}, {0x420cc000}, {0x420ce000},
- {0x420d0000}, {0x420d2000}, {0x420d4000}, {0x420d6000},
- {0x420d8000}, {0x420da000}, {0x420dc000}, {0x420de000},
- {0x420e0000}, {0x420e2000}, {0x420e4000}, {0x420e6000},
- {0x420e8000}, {0x420ea000}, {0x420ec000}, {0x420ee000},
- {0x420f0000}, {0x420f2000}, {0x420f4000}, {0x420f6000},
- {0x420f8000}, {0x420fa000}, {0x420fc000}, {0x420fe000},
- {0x42100000}, {0x42102000}, {0x42104000}, {0x42106000},
- {0x42108000}, {0x4210a000}, {0x4210c000}, {0x4210e000},
- {0x42110000}, {0x42112000}, {0x42114000}, {0x42116000},
- {0x42118000}, {0x4211a000}, {0x4211c000}, {0x4211e000},
- {0x42120000}, {0x42122000}, {0x42124000}, {0x42126000},
- {0x42128000}, {0x4212a000}, {0x4212c000}, {0x4212e000},
- {0x42130000}, {0x42132000}, {0x42134000}, {0x42136000},
- {0x42138000}, {0x4213a000}, {0x4213c000}, {0x4213e000},
- {0x42140000}, {0x42142000}, {0x42144000}, {0x42146000},
- {0x42148000}, {0x4214a000}, {0x4214c000}, {0x4214e000},
- {0x42150000}, {0x42152000}, {0x42154000}, {0x42156000},
- {0x42158000}, {0x4215a000}, {0x4215c000}, {0x4215e000},
- {0x42160000}, {0x42162000}, {0x42164000}, {0x42166000},
- {0x42168000}, {0x4216a000}, {0x4216c000}, {0x4216e000},
- {0x42170000}, {0x42172000}, {0x42174000}, {0x42176000},
- {0x42178000}, {0x4217a000}, {0x4217c000}, {0x4217e000},
- {0x42180000}, {0x42182000}, {0x42184000}, {0x42186000},
- {0x42188000}, {0x4218a000}, {0x4218c000}, {0x4218e000},
- {0x42190000}, {0x42192000}, {0x42194000}, {0x42196000},
- {0x42198000}, {0x4219a000}, {0x4219c000}, {0x4219e000},
- {0x421a0000}, {0x421a2000}, {0x421a4000}, {0x421a6000},
- {0x421a8000}, {0x421aa000}, {0x421ac000}, {0x421ae000},
- {0x421b0000}, {0x421b2000}, {0x421b4000}, {0x421b6000},
- {0x421b8000}, {0x421ba000}, {0x421bc000}, {0x421be000},
- {0x421c0000}, {0x421c2000}, {0x421c4000}, {0x421c6000},
- {0x421c8000}, {0x421ca000}, {0x421cc000}, {0x421ce000},
- {0x421d0000}, {0x421d2000}, {0x421d4000}, {0x421d6000},
- {0x421d8000}, {0x421da000}, {0x421dc000}, {0x421de000},
- {0x421e0000}, {0x421e2000}, {0x421e4000}, {0x421e6000},
- {0x421e8000}, {0x421ea000}, {0x421ec000}, {0x421ee000},
- {0x421f0000}, {0x421f2000}, {0x421f4000}, {0x421f6000},
- {0x421f8000}, {0x421fa000}, {0x421fc000}, {0x421fe000},
- {0x42200000}, {0x42202000}, {0x42204000}, {0x42206000},
- {0x42208000}, {0x4220a000}, {0x4220c000}, {0x4220e000},
- {0x42210000}, {0x42212000}, {0x42214000}, {0x42216000},
- {0x42218000}, {0x4221a000}, {0x4221c000}, {0x4221e000},
- {0x42220000}, {0x42222000}, {0x42224000}, {0x42226000},
- {0x42228000}, {0x4222a000}, {0x4222c000}, {0x4222e000},
- {0x42230000}, {0x42232000}, {0x42234000}, {0x42236000},
- {0x42238000}, {0x4223a000}, {0x4223c000}, {0x4223e000},
- {0x42240000}, {0x42242000}, {0x42244000}, {0x42246000},
- {0x42248000}, {0x4224a000}, {0x4224c000}, {0x4224e000},
- {0x42250000}, {0x42252000}, {0x42254000}, {0x42256000},
- {0x42258000}, {0x4225a000}, {0x4225c000}, {0x4225e000},
- {0x42260000}, {0x42262000}, {0x42264000}, {0x42266000},
- {0x42268000}, {0x4226a000}, {0x4226c000}, {0x4226e000},
- {0x42270000}, {0x42272000}, {0x42274000}, {0x42276000},
- {0x42278000}, {0x4227a000}, {0x4227c000}, {0x4227e000},
- {0x42280000}, {0x42282000}, {0x42284000}, {0x42286000},
- {0x42288000}, {0x4228a000}, {0x4228c000}, {0x4228e000},
- {0x42290000}, {0x42292000}, {0x42294000}, {0x42296000},
- {0x42298000}, {0x4229a000}, {0x4229c000}, {0x4229e000},
- {0x422a0000}, {0x422a2000}, {0x422a4000}, {0x422a6000},
- {0x422a8000}, {0x422aa000}, {0x422ac000}, {0x422ae000},
- {0x422b0000}, {0x422b2000}, {0x422b4000}, {0x422b6000},
- {0x422b8000}, {0x422ba000}, {0x422bc000}, {0x422be000},
- {0x422c0000}, {0x422c2000}, {0x422c4000}, {0x422c6000},
- {0x422c8000}, {0x422ca000}, {0x422cc000}, {0x422ce000},
- {0x422d0000}, {0x422d2000}, {0x422d4000}, {0x422d6000},
- {0x422d8000}, {0x422da000}, {0x422dc000}, {0x422de000},
- {0x422e0000}, {0x422e2000}, {0x422e4000}, {0x422e6000},
- {0x422e8000}, {0x422ea000}, {0x422ec000}, {0x422ee000},
- {0x422f0000}, {0x422f2000}, {0x422f4000}, {0x422f6000},
- {0x422f8000}, {0x422fa000}, {0x422fc000}, {0x422fe000},
- {0x42300000}, {0x42302000}, {0x42304000}, {0x42306000},
- {0x42308000}, {0x4230a000}, {0x4230c000}, {0x4230e000},
- {0x42310000}, {0x42312000}, {0x42314000}, {0x42316000},
- {0x42318000}, {0x4231a000}, {0x4231c000}, {0x4231e000},
- {0x42320000}, {0x42322000}, {0x42324000}, {0x42326000},
- {0x42328000}, {0x4232a000}, {0x4232c000}, {0x4232e000},
- {0x42330000}, {0x42332000}, {0x42334000}, {0x42336000},
- {0x42338000}, {0x4233a000}, {0x4233c000}, {0x4233e000},
- {0x42340000}, {0x42342000}, {0x42344000}, {0x42346000},
- {0x42348000}, {0x4234a000}, {0x4234c000}, {0x4234e000},
- {0x42350000}, {0x42352000}, {0x42354000}, {0x42356000},
- {0x42358000}, {0x4235a000}, {0x4235c000}, {0x4235e000},
- {0x42360000}, {0x42362000}, {0x42364000}, {0x42366000},
- {0x42368000}, {0x4236a000}, {0x4236c000}, {0x4236e000},
- {0x42370000}, {0x42372000}, {0x42374000}, {0x42376000},
- {0x42378000}, {0x4237a000}, {0x4237c000}, {0x4237e000},
- {0x42380000}, {0x42382000}, {0x42384000}, {0x42386000},
- {0x42388000}, {0x4238a000}, {0x4238c000}, {0x4238e000},
- {0x42390000}, {0x42392000}, {0x42394000}, {0x42396000},
- {0x42398000}, {0x4239a000}, {0x4239c000}, {0x4239e000},
- {0x423a0000}, {0x423a2000}, {0x423a4000}, {0x423a6000},
- {0x423a8000}, {0x423aa000}, {0x423ac000}, {0x423ae000},
- {0x423b0000}, {0x423b2000}, {0x423b4000}, {0x423b6000},
- {0x423b8000}, {0x423ba000}, {0x423bc000}, {0x423be000},
- {0x423c0000}, {0x423c2000}, {0x423c4000}, {0x423c6000},
- {0x423c8000}, {0x423ca000}, {0x423cc000}, {0x423ce000},
- {0x423d0000}, {0x423d2000}, {0x423d4000}, {0x423d6000},
- {0x423d8000}, {0x423da000}, {0x423dc000}, {0x423de000},
- {0x423e0000}, {0x423e2000}, {0x423e4000}, {0x423e6000},
- {0x423e8000}, {0x423ea000}, {0x423ec000}, {0x423ee000},
- {0x423f0000}, {0x423f2000}, {0x423f4000}, {0x423f6000},
- {0x423f8000}, {0x423fa000}, {0x423fc000}, {0x423fe000},
- {0x42400000}, {0x42402000}, {0x42404000}, {0x42406000},
- {0x42408000}, {0x4240a000}, {0x4240c000}, {0x4240e000},
- {0x42410000}, {0x42412000}, {0x42414000}, {0x42416000},
- {0x42418000}, {0x4241a000}, {0x4241c000}, {0x4241e000},
- {0x42420000}, {0x42422000}, {0x42424000}, {0x42426000},
- {0x42428000}, {0x4242a000}, {0x4242c000}, {0x4242e000},
- {0x42430000}, {0x42432000}, {0x42434000}, {0x42436000},
- {0x42438000}, {0x4243a000}, {0x4243c000}, {0x4243e000},
- {0x42440000}, {0x42442000}, {0x42444000}, {0x42446000},
- {0x42448000}, {0x4244a000}, {0x4244c000}, {0x4244e000},
- {0x42450000}, {0x42452000}, {0x42454000}, {0x42456000},
- {0x42458000}, {0x4245a000}, {0x4245c000}, {0x4245e000},
- {0x42460000}, {0x42462000}, {0x42464000}, {0x42466000},
- {0x42468000}, {0x4246a000}, {0x4246c000}, {0x4246e000},
- {0x42470000}, {0x42472000}, {0x42474000}, {0x42476000},
- {0x42478000}, {0x4247a000}, {0x4247c000}, {0x4247e000},
- {0x42480000}, {0x42482000}, {0x42484000}, {0x42486000},
- {0x42488000}, {0x4248a000}, {0x4248c000}, {0x4248e000},
- {0x42490000}, {0x42492000}, {0x42494000}, {0x42496000},
- {0x42498000}, {0x4249a000}, {0x4249c000}, {0x4249e000},
- {0x424a0000}, {0x424a2000}, {0x424a4000}, {0x424a6000},
- {0x424a8000}, {0x424aa000}, {0x424ac000}, {0x424ae000},
- {0x424b0000}, {0x424b2000}, {0x424b4000}, {0x424b6000},
- {0x424b8000}, {0x424ba000}, {0x424bc000}, {0x424be000},
- {0x424c0000}, {0x424c2000}, {0x424c4000}, {0x424c6000},
- {0x424c8000}, {0x424ca000}, {0x424cc000}, {0x424ce000},
- {0x424d0000}, {0x424d2000}, {0x424d4000}, {0x424d6000},
- {0x424d8000}, {0x424da000}, {0x424dc000}, {0x424de000},
- {0x424e0000}, {0x424e2000}, {0x424e4000}, {0x424e6000},
- {0x424e8000}, {0x424ea000}, {0x424ec000}, {0x424ee000},
- {0x424f0000}, {0x424f2000}, {0x424f4000}, {0x424f6000},
- {0x424f8000}, {0x424fa000}, {0x424fc000}, {0x424fe000},
- {0x42500000}, {0x42502000}, {0x42504000}, {0x42506000},
- {0x42508000}, {0x4250a000}, {0x4250c000}, {0x4250e000},
- {0x42510000}, {0x42512000}, {0x42514000}, {0x42516000},
- {0x42518000}, {0x4251a000}, {0x4251c000}, {0x4251e000},
- {0x42520000}, {0x42522000}, {0x42524000}, {0x42526000},
- {0x42528000}, {0x4252a000}, {0x4252c000}, {0x4252e000},
- {0x42530000}, {0x42532000}, {0x42534000}, {0x42536000},
- {0x42538000}, {0x4253a000}, {0x4253c000}, {0x4253e000},
- {0x42540000}, {0x42542000}, {0x42544000}, {0x42546000},
- {0x42548000}, {0x4254a000}, {0x4254c000}, {0x4254e000},
- {0x42550000}, {0x42552000}, {0x42554000}, {0x42556000},
- {0x42558000}, {0x4255a000}, {0x4255c000}, {0x4255e000},
- {0x42560000}, {0x42562000}, {0x42564000}, {0x42566000},
- {0x42568000}, {0x4256a000}, {0x4256c000}, {0x4256e000},
- {0x42570000}, {0x42572000}, {0x42574000}, {0x42576000},
- {0x42578000}, {0x4257a000}, {0x4257c000}, {0x4257e000},
- {0x42580000}, {0x42582000}, {0x42584000}, {0x42586000},
- {0x42588000}, {0x4258a000}, {0x4258c000}, {0x4258e000},
- {0x42590000}, {0x42592000}, {0x42594000}, {0x42596000},
- {0x42598000}, {0x4259a000}, {0x4259c000}, {0x4259e000},
- {0x425a0000}, {0x425a2000}, {0x425a4000}, {0x425a6000},
- {0x425a8000}, {0x425aa000}, {0x425ac000}, {0x425ae000},
- {0x425b0000}, {0x425b2000}, {0x425b4000}, {0x425b6000},
- {0x425b8000}, {0x425ba000}, {0x425bc000}, {0x425be000},
- {0x425c0000}, {0x425c2000}, {0x425c4000}, {0x425c6000},
- {0x425c8000}, {0x425ca000}, {0x425cc000}, {0x425ce000},
- {0x425d0000}, {0x425d2000}, {0x425d4000}, {0x425d6000},
- {0x425d8000}, {0x425da000}, {0x425dc000}, {0x425de000},
- {0x425e0000}, {0x425e2000}, {0x425e4000}, {0x425e6000},
- {0x425e8000}, {0x425ea000}, {0x425ec000}, {0x425ee000},
- {0x425f0000}, {0x425f2000}, {0x425f4000}, {0x425f6000},
- {0x425f8000}, {0x425fa000}, {0x425fc000}, {0x425fe000},
- {0x42600000}, {0x42602000}, {0x42604000}, {0x42606000},
- {0x42608000}, {0x4260a000}, {0x4260c000}, {0x4260e000},
- {0x42610000}, {0x42612000}, {0x42614000}, {0x42616000},
- {0x42618000}, {0x4261a000}, {0x4261c000}, {0x4261e000},
- {0x42620000}, {0x42622000}, {0x42624000}, {0x42626000},
- {0x42628000}, {0x4262a000}, {0x4262c000}, {0x4262e000},
- {0x42630000}, {0x42632000}, {0x42634000}, {0x42636000},
- {0x42638000}, {0x4263a000}, {0x4263c000}, {0x4263e000},
- {0x42640000}, {0x42642000}, {0x42644000}, {0x42646000},
- {0x42648000}, {0x4264a000}, {0x4264c000}, {0x4264e000},
- {0x42650000}, {0x42652000}, {0x42654000}, {0x42656000},
- {0x42658000}, {0x4265a000}, {0x4265c000}, {0x4265e000},
- {0x42660000}, {0x42662000}, {0x42664000}, {0x42666000},
- {0x42668000}, {0x4266a000}, {0x4266c000}, {0x4266e000},
- {0x42670000}, {0x42672000}, {0x42674000}, {0x42676000},
- {0x42678000}, {0x4267a000}, {0x4267c000}, {0x4267e000},
- {0x42680000}, {0x42682000}, {0x42684000}, {0x42686000},
- {0x42688000}, {0x4268a000}, {0x4268c000}, {0x4268e000},
- {0x42690000}, {0x42692000}, {0x42694000}, {0x42696000},
- {0x42698000}, {0x4269a000}, {0x4269c000}, {0x4269e000},
- {0x426a0000}, {0x426a2000}, {0x426a4000}, {0x426a6000},
- {0x426a8000}, {0x426aa000}, {0x426ac000}, {0x426ae000},
- {0x426b0000}, {0x426b2000}, {0x426b4000}, {0x426b6000},
- {0x426b8000}, {0x426ba000}, {0x426bc000}, {0x426be000},
- {0x426c0000}, {0x426c2000}, {0x426c4000}, {0x426c6000},
- {0x426c8000}, {0x426ca000}, {0x426cc000}, {0x426ce000},
- {0x426d0000}, {0x426d2000}, {0x426d4000}, {0x426d6000},
- {0x426d8000}, {0x426da000}, {0x426dc000}, {0x426de000},
- {0x426e0000}, {0x426e2000}, {0x426e4000}, {0x426e6000},
- {0x426e8000}, {0x426ea000}, {0x426ec000}, {0x426ee000},
- {0x426f0000}, {0x426f2000}, {0x426f4000}, {0x426f6000},
- {0x426f8000}, {0x426fa000}, {0x426fc000}, {0x426fe000},
- {0x42700000}, {0x42702000}, {0x42704000}, {0x42706000},
- {0x42708000}, {0x4270a000}, {0x4270c000}, {0x4270e000},
- {0x42710000}, {0x42712000}, {0x42714000}, {0x42716000},
- {0x42718000}, {0x4271a000}, {0x4271c000}, {0x4271e000},
- {0x42720000}, {0x42722000}, {0x42724000}, {0x42726000},
- {0x42728000}, {0x4272a000}, {0x4272c000}, {0x4272e000},
- {0x42730000}, {0x42732000}, {0x42734000}, {0x42736000},
- {0x42738000}, {0x4273a000}, {0x4273c000}, {0x4273e000},
- {0x42740000}, {0x42742000}, {0x42744000}, {0x42746000},
- {0x42748000}, {0x4274a000}, {0x4274c000}, {0x4274e000},
- {0x42750000}, {0x42752000}, {0x42754000}, {0x42756000},
- {0x42758000}, {0x4275a000}, {0x4275c000}, {0x4275e000},
- {0x42760000}, {0x42762000}, {0x42764000}, {0x42766000},
- {0x42768000}, {0x4276a000}, {0x4276c000}, {0x4276e000},
- {0x42770000}, {0x42772000}, {0x42774000}, {0x42776000},
- {0x42778000}, {0x4277a000}, {0x4277c000}, {0x4277e000},
- {0x42780000}, {0x42782000}, {0x42784000}, {0x42786000},
- {0x42788000}, {0x4278a000}, {0x4278c000}, {0x4278e000},
- {0x42790000}, {0x42792000}, {0x42794000}, {0x42796000},
- {0x42798000}, {0x4279a000}, {0x4279c000}, {0x4279e000},
- {0x427a0000}, {0x427a2000}, {0x427a4000}, {0x427a6000},
- {0x427a8000}, {0x427aa000}, {0x427ac000}, {0x427ae000},
- {0x427b0000}, {0x427b2000}, {0x427b4000}, {0x427b6000},
- {0x427b8000}, {0x427ba000}, {0x427bc000}, {0x427be000},
- {0x427c0000}, {0x427c2000}, {0x427c4000}, {0x427c6000},
- {0x427c8000}, {0x427ca000}, {0x427cc000}, {0x427ce000},
- {0x427d0000}, {0x427d2000}, {0x427d4000}, {0x427d6000},
- {0x427d8000}, {0x427da000}, {0x427dc000}, {0x427de000},
- {0x427e0000}, {0x427e2000}, {0x427e4000}, {0x427e6000},
- {0x427e8000}, {0x427ea000}, {0x427ec000}, {0x427ee000},
- {0x427f0000}, {0x427f2000}, {0x427f4000}, {0x427f6000},
- {0x427f8000}, {0x427fa000}, {0x427fc000}, {0x427fe000},
- {0x42800000}, {0x42802000}, {0x42804000}, {0x42806000},
- {0x42808000}, {0x4280a000}, {0x4280c000}, {0x4280e000},
- {0x42810000}, {0x42812000}, {0x42814000}, {0x42816000},
- {0x42818000}, {0x4281a000}, {0x4281c000}, {0x4281e000},
- {0x42820000}, {0x42822000}, {0x42824000}, {0x42826000},
- {0x42828000}, {0x4282a000}, {0x4282c000}, {0x4282e000},
- {0x42830000}, {0x42832000}, {0x42834000}, {0x42836000},
- {0x42838000}, {0x4283a000}, {0x4283c000}, {0x4283e000},
- {0x42840000}, {0x42842000}, {0x42844000}, {0x42846000},
- {0x42848000}, {0x4284a000}, {0x4284c000}, {0x4284e000},
- {0x42850000}, {0x42852000}, {0x42854000}, {0x42856000},
- {0x42858000}, {0x4285a000}, {0x4285c000}, {0x4285e000},
- {0x42860000}, {0x42862000}, {0x42864000}, {0x42866000},
- {0x42868000}, {0x4286a000}, {0x4286c000}, {0x4286e000},
- {0x42870000}, {0x42872000}, {0x42874000}, {0x42876000},
- {0x42878000}, {0x4287a000}, {0x4287c000}, {0x4287e000},
- {0x42880000}, {0x42882000}, {0x42884000}, {0x42886000},
- {0x42888000}, {0x4288a000}, {0x4288c000}, {0x4288e000},
- {0x42890000}, {0x42892000}, {0x42894000}, {0x42896000},
- {0x42898000}, {0x4289a000}, {0x4289c000}, {0x4289e000},
- {0x428a0000}, {0x428a2000}, {0x428a4000}, {0x428a6000},
- {0x428a8000}, {0x428aa000}, {0x428ac000}, {0x428ae000},
- {0x428b0000}, {0x428b2000}, {0x428b4000}, {0x428b6000},
- {0x428b8000}, {0x428ba000}, {0x428bc000}, {0x428be000},
- {0x428c0000}, {0x428c2000}, {0x428c4000}, {0x428c6000},
- {0x428c8000}, {0x428ca000}, {0x428cc000}, {0x428ce000},
- {0x428d0000}, {0x428d2000}, {0x428d4000}, {0x428d6000},
- {0x428d8000}, {0x428da000}, {0x428dc000}, {0x428de000},
- {0x428e0000}, {0x428e2000}, {0x428e4000}, {0x428e6000},
- {0x428e8000}, {0x428ea000}, {0x428ec000}, {0x428ee000},
- {0x428f0000}, {0x428f2000}, {0x428f4000}, {0x428f6000},
- {0x428f8000}, {0x428fa000}, {0x428fc000}, {0x428fe000},
- {0x42900000}, {0x42902000}, {0x42904000}, {0x42906000},
- {0x42908000}, {0x4290a000}, {0x4290c000}, {0x4290e000},
- {0x42910000}, {0x42912000}, {0x42914000}, {0x42916000},
- {0x42918000}, {0x4291a000}, {0x4291c000}, {0x4291e000},
- {0x42920000}, {0x42922000}, {0x42924000}, {0x42926000},
- {0x42928000}, {0x4292a000}, {0x4292c000}, {0x4292e000},
- {0x42930000}, {0x42932000}, {0x42934000}, {0x42936000},
- {0x42938000}, {0x4293a000}, {0x4293c000}, {0x4293e000},
- {0x42940000}, {0x42942000}, {0x42944000}, {0x42946000},
- {0x42948000}, {0x4294a000}, {0x4294c000}, {0x4294e000},
- {0x42950000}, {0x42952000}, {0x42954000}, {0x42956000},
- {0x42958000}, {0x4295a000}, {0x4295c000}, {0x4295e000},
- {0x42960000}, {0x42962000}, {0x42964000}, {0x42966000},
- {0x42968000}, {0x4296a000}, {0x4296c000}, {0x4296e000},
- {0x42970000}, {0x42972000}, {0x42974000}, {0x42976000},
- {0x42978000}, {0x4297a000}, {0x4297c000}, {0x4297e000},
- {0x42980000}, {0x42982000}, {0x42984000}, {0x42986000},
- {0x42988000}, {0x4298a000}, {0x4298c000}, {0x4298e000},
- {0x42990000}, {0x42992000}, {0x42994000}, {0x42996000},
- {0x42998000}, {0x4299a000}, {0x4299c000}, {0x4299e000},
- {0x429a0000}, {0x429a2000}, {0x429a4000}, {0x429a6000},
- {0x429a8000}, {0x429aa000}, {0x429ac000}, {0x429ae000},
- {0x429b0000}, {0x429b2000}, {0x429b4000}, {0x429b6000},
- {0x429b8000}, {0x429ba000}, {0x429bc000}, {0x429be000},
- {0x429c0000}, {0x429c2000}, {0x429c4000}, {0x429c6000},
- {0x429c8000}, {0x429ca000}, {0x429cc000}, {0x429ce000},
- {0x429d0000}, {0x429d2000}, {0x429d4000}, {0x429d6000},
- {0x429d8000}, {0x429da000}, {0x429dc000}, {0x429de000},
- {0x429e0000}, {0x429e2000}, {0x429e4000}, {0x429e6000},
- {0x429e8000}, {0x429ea000}, {0x429ec000}, {0x429ee000},
- {0x429f0000}, {0x429f2000}, {0x429f4000}, {0x429f6000},
- {0x429f8000}, {0x429fa000}, {0x429fc000}, {0x429fe000},
- {0x42a00000}, {0x42a02000}, {0x42a04000}, {0x42a06000},
- {0x42a08000}, {0x42a0a000}, {0x42a0c000}, {0x42a0e000},
- {0x42a10000}, {0x42a12000}, {0x42a14000}, {0x42a16000},
- {0x42a18000}, {0x42a1a000}, {0x42a1c000}, {0x42a1e000},
- {0x42a20000}, {0x42a22000}, {0x42a24000}, {0x42a26000},
- {0x42a28000}, {0x42a2a000}, {0x42a2c000}, {0x42a2e000},
- {0x42a30000}, {0x42a32000}, {0x42a34000}, {0x42a36000},
- {0x42a38000}, {0x42a3a000}, {0x42a3c000}, {0x42a3e000},
- {0x42a40000}, {0x42a42000}, {0x42a44000}, {0x42a46000},
- {0x42a48000}, {0x42a4a000}, {0x42a4c000}, {0x42a4e000},
- {0x42a50000}, {0x42a52000}, {0x42a54000}, {0x42a56000},
- {0x42a58000}, {0x42a5a000}, {0x42a5c000}, {0x42a5e000},
- {0x42a60000}, {0x42a62000}, {0x42a64000}, {0x42a66000},
- {0x42a68000}, {0x42a6a000}, {0x42a6c000}, {0x42a6e000},
- {0x42a70000}, {0x42a72000}, {0x42a74000}, {0x42a76000},
- {0x42a78000}, {0x42a7a000}, {0x42a7c000}, {0x42a7e000},
- {0x42a80000}, {0x42a82000}, {0x42a84000}, {0x42a86000},
- {0x42a88000}, {0x42a8a000}, {0x42a8c000}, {0x42a8e000},
- {0x42a90000}, {0x42a92000}, {0x42a94000}, {0x42a96000},
- {0x42a98000}, {0x42a9a000}, {0x42a9c000}, {0x42a9e000},
- {0x42aa0000}, {0x42aa2000}, {0x42aa4000}, {0x42aa6000},
- {0x42aa8000}, {0x42aaa000}, {0x42aac000}, {0x42aae000},
- {0x42ab0000}, {0x42ab2000}, {0x42ab4000}, {0x42ab6000},
- {0x42ab8000}, {0x42aba000}, {0x42abc000}, {0x42abe000},
- {0x42ac0000}, {0x42ac2000}, {0x42ac4000}, {0x42ac6000},
- {0x42ac8000}, {0x42aca000}, {0x42acc000}, {0x42ace000},
- {0x42ad0000}, {0x42ad2000}, {0x42ad4000}, {0x42ad6000},
- {0x42ad8000}, {0x42ada000}, {0x42adc000}, {0x42ade000},
- {0x42ae0000}, {0x42ae2000}, {0x42ae4000}, {0x42ae6000},
- {0x42ae8000}, {0x42aea000}, {0x42aec000}, {0x42aee000},
- {0x42af0000}, {0x42af2000}, {0x42af4000}, {0x42af6000},
- {0x42af8000}, {0x42afa000}, {0x42afc000}, {0x42afe000},
- {0x42b00000}, {0x42b02000}, {0x42b04000}, {0x42b06000},
- {0x42b08000}, {0x42b0a000}, {0x42b0c000}, {0x42b0e000},
- {0x42b10000}, {0x42b12000}, {0x42b14000}, {0x42b16000},
- {0x42b18000}, {0x42b1a000}, {0x42b1c000}, {0x42b1e000},
- {0x42b20000}, {0x42b22000}, {0x42b24000}, {0x42b26000},
- {0x42b28000}, {0x42b2a000}, {0x42b2c000}, {0x42b2e000},
- {0x42b30000}, {0x42b32000}, {0x42b34000}, {0x42b36000},
- {0x42b38000}, {0x42b3a000}, {0x42b3c000}, {0x42b3e000},
- {0x42b40000}, {0x42b42000}, {0x42b44000}, {0x42b46000},
- {0x42b48000}, {0x42b4a000}, {0x42b4c000}, {0x42b4e000},
- {0x42b50000}, {0x42b52000}, {0x42b54000}, {0x42b56000},
- {0x42b58000}, {0x42b5a000}, {0x42b5c000}, {0x42b5e000},
- {0x42b60000}, {0x42b62000}, {0x42b64000}, {0x42b66000},
- {0x42b68000}, {0x42b6a000}, {0x42b6c000}, {0x42b6e000},
- {0x42b70000}, {0x42b72000}, {0x42b74000}, {0x42b76000},
- {0x42b78000}, {0x42b7a000}, {0x42b7c000}, {0x42b7e000},
- {0x42b80000}, {0x42b82000}, {0x42b84000}, {0x42b86000},
- {0x42b88000}, {0x42b8a000}, {0x42b8c000}, {0x42b8e000},
- {0x42b90000}, {0x42b92000}, {0x42b94000}, {0x42b96000},
- {0x42b98000}, {0x42b9a000}, {0x42b9c000}, {0x42b9e000},
- {0x42ba0000}, {0x42ba2000}, {0x42ba4000}, {0x42ba6000},
- {0x42ba8000}, {0x42baa000}, {0x42bac000}, {0x42bae000},
- {0x42bb0000}, {0x42bb2000}, {0x42bb4000}, {0x42bb6000},
- {0x42bb8000}, {0x42bba000}, {0x42bbc000}, {0x42bbe000},
- {0x42bc0000}, {0x42bc2000}, {0x42bc4000}, {0x42bc6000},
- {0x42bc8000}, {0x42bca000}, {0x42bcc000}, {0x42bce000},
- {0x42bd0000}, {0x42bd2000}, {0x42bd4000}, {0x42bd6000},
- {0x42bd8000}, {0x42bda000}, {0x42bdc000}, {0x42bde000},
- {0x42be0000}, {0x42be2000}, {0x42be4000}, {0x42be6000},
- {0x42be8000}, {0x42bea000}, {0x42bec000}, {0x42bee000},
- {0x42bf0000}, {0x42bf2000}, {0x42bf4000}, {0x42bf6000},
- {0x42bf8000}, {0x42bfa000}, {0x42bfc000}, {0x42bfe000},
- {0x42c00000}, {0x42c02000}, {0x42c04000}, {0x42c06000},
- {0x42c08000}, {0x42c0a000}, {0x42c0c000}, {0x42c0e000},
- {0x42c10000}, {0x42c12000}, {0x42c14000}, {0x42c16000},
- {0x42c18000}, {0x42c1a000}, {0x42c1c000}, {0x42c1e000},
- {0x42c20000}, {0x42c22000}, {0x42c24000}, {0x42c26000},
- {0x42c28000}, {0x42c2a000}, {0x42c2c000}, {0x42c2e000},
- {0x42c30000}, {0x42c32000}, {0x42c34000}, {0x42c36000},
- {0x42c38000}, {0x42c3a000}, {0x42c3c000}, {0x42c3e000},
- {0x42c40000}, {0x42c42000}, {0x42c44000}, {0x42c46000},
- {0x42c48000}, {0x42c4a000}, {0x42c4c000}, {0x42c4e000},
- {0x42c50000}, {0x42c52000}, {0x42c54000}, {0x42c56000},
- {0x42c58000}, {0x42c5a000}, {0x42c5c000}, {0x42c5e000},
- {0x42c60000}, {0x42c62000}, {0x42c64000}, {0x42c66000},
- {0x42c68000}, {0x42c6a000}, {0x42c6c000}, {0x42c6e000},
- {0x42c70000}, {0x42c72000}, {0x42c74000}, {0x42c76000},
- {0x42c78000}, {0x42c7a000}, {0x42c7c000}, {0x42c7e000},
- {0x42c80000}, {0x42c82000}, {0x42c84000}, {0x42c86000},
- {0x42c88000}, {0x42c8a000}, {0x42c8c000}, {0x42c8e000},
- {0x42c90000}, {0x42c92000}, {0x42c94000}, {0x42c96000},
- {0x42c98000}, {0x42c9a000}, {0x42c9c000}, {0x42c9e000},
- {0x42ca0000}, {0x42ca2000}, {0x42ca4000}, {0x42ca6000},
- {0x42ca8000}, {0x42caa000}, {0x42cac000}, {0x42cae000},
- {0x42cb0000}, {0x42cb2000}, {0x42cb4000}, {0x42cb6000},
- {0x42cb8000}, {0x42cba000}, {0x42cbc000}, {0x42cbe000},
- {0x42cc0000}, {0x42cc2000}, {0x42cc4000}, {0x42cc6000},
- {0x42cc8000}, {0x42cca000}, {0x42ccc000}, {0x42cce000},
- {0x42cd0000}, {0x42cd2000}, {0x42cd4000}, {0x42cd6000},
- {0x42cd8000}, {0x42cda000}, {0x42cdc000}, {0x42cde000},
- {0x42ce0000}, {0x42ce2000}, {0x42ce4000}, {0x42ce6000},
- {0x42ce8000}, {0x42cea000}, {0x42cec000}, {0x42cee000},
- {0x42cf0000}, {0x42cf2000}, {0x42cf4000}, {0x42cf6000},
- {0x42cf8000}, {0x42cfa000}, {0x42cfc000}, {0x42cfe000},
- {0x42d00000}, {0x42d02000}, {0x42d04000}, {0x42d06000},
- {0x42d08000}, {0x42d0a000}, {0x42d0c000}, {0x42d0e000},
- {0x42d10000}, {0x42d12000}, {0x42d14000}, {0x42d16000},
- {0x42d18000}, {0x42d1a000}, {0x42d1c000}, {0x42d1e000},
- {0x42d20000}, {0x42d22000}, {0x42d24000}, {0x42d26000},
- {0x42d28000}, {0x42d2a000}, {0x42d2c000}, {0x42d2e000},
- {0x42d30000}, {0x42d32000}, {0x42d34000}, {0x42d36000},
- {0x42d38000}, {0x42d3a000}, {0x42d3c000}, {0x42d3e000},
- {0x42d40000}, {0x42d42000}, {0x42d44000}, {0x42d46000},
- {0x42d48000}, {0x42d4a000}, {0x42d4c000}, {0x42d4e000},
- {0x42d50000}, {0x42d52000}, {0x42d54000}, {0x42d56000},
- {0x42d58000}, {0x42d5a000}, {0x42d5c000}, {0x42d5e000},
- {0x42d60000}, {0x42d62000}, {0x42d64000}, {0x42d66000},
- {0x42d68000}, {0x42d6a000}, {0x42d6c000}, {0x42d6e000},
- {0x42d70000}, {0x42d72000}, {0x42d74000}, {0x42d76000},
- {0x42d78000}, {0x42d7a000}, {0x42d7c000}, {0x42d7e000},
- {0x42d80000}, {0x42d82000}, {0x42d84000}, {0x42d86000},
- {0x42d88000}, {0x42d8a000}, {0x42d8c000}, {0x42d8e000},
- {0x42d90000}, {0x42d92000}, {0x42d94000}, {0x42d96000},
- {0x42d98000}, {0x42d9a000}, {0x42d9c000}, {0x42d9e000},
- {0x42da0000}, {0x42da2000}, {0x42da4000}, {0x42da6000},
- {0x42da8000}, {0x42daa000}, {0x42dac000}, {0x42dae000},
- {0x42db0000}, {0x42db2000}, {0x42db4000}, {0x42db6000},
- {0x42db8000}, {0x42dba000}, {0x42dbc000}, {0x42dbe000},
- {0x42dc0000}, {0x42dc2000}, {0x42dc4000}, {0x42dc6000},
- {0x42dc8000}, {0x42dca000}, {0x42dcc000}, {0x42dce000},
- {0x42dd0000}, {0x42dd2000}, {0x42dd4000}, {0x42dd6000},
- {0x42dd8000}, {0x42dda000}, {0x42ddc000}, {0x42dde000},
- {0x42de0000}, {0x42de2000}, {0x42de4000}, {0x42de6000},
- {0x42de8000}, {0x42dea000}, {0x42dec000}, {0x42dee000},
- {0x42df0000}, {0x42df2000}, {0x42df4000}, {0x42df6000},
- {0x42df8000}, {0x42dfa000}, {0x42dfc000}, {0x42dfe000},
- {0x42e00000}, {0x42e02000}, {0x42e04000}, {0x42e06000},
- {0x42e08000}, {0x42e0a000}, {0x42e0c000}, {0x42e0e000},
- {0x42e10000}, {0x42e12000}, {0x42e14000}, {0x42e16000},
- {0x42e18000}, {0x42e1a000}, {0x42e1c000}, {0x42e1e000},
- {0x42e20000}, {0x42e22000}, {0x42e24000}, {0x42e26000},
- {0x42e28000}, {0x42e2a000}, {0x42e2c000}, {0x42e2e000},
- {0x42e30000}, {0x42e32000}, {0x42e34000}, {0x42e36000},
- {0x42e38000}, {0x42e3a000}, {0x42e3c000}, {0x42e3e000},
- {0x42e40000}, {0x42e42000}, {0x42e44000}, {0x42e46000},
- {0x42e48000}, {0x42e4a000}, {0x42e4c000}, {0x42e4e000},
- {0x42e50000}, {0x42e52000}, {0x42e54000}, {0x42e56000},
- {0x42e58000}, {0x42e5a000}, {0x42e5c000}, {0x42e5e000},
- {0x42e60000}, {0x42e62000}, {0x42e64000}, {0x42e66000},
- {0x42e68000}, {0x42e6a000}, {0x42e6c000}, {0x42e6e000},
- {0x42e70000}, {0x42e72000}, {0x42e74000}, {0x42e76000},
- {0x42e78000}, {0x42e7a000}, {0x42e7c000}, {0x42e7e000},
- {0x42e80000}, {0x42e82000}, {0x42e84000}, {0x42e86000},
- {0x42e88000}, {0x42e8a000}, {0x42e8c000}, {0x42e8e000},
- {0x42e90000}, {0x42e92000}, {0x42e94000}, {0x42e96000},
- {0x42e98000}, {0x42e9a000}, {0x42e9c000}, {0x42e9e000},
- {0x42ea0000}, {0x42ea2000}, {0x42ea4000}, {0x42ea6000},
- {0x42ea8000}, {0x42eaa000}, {0x42eac000}, {0x42eae000},
- {0x42eb0000}, {0x42eb2000}, {0x42eb4000}, {0x42eb6000},
- {0x42eb8000}, {0x42eba000}, {0x42ebc000}, {0x42ebe000},
- {0x42ec0000}, {0x42ec2000}, {0x42ec4000}, {0x42ec6000},
- {0x42ec8000}, {0x42eca000}, {0x42ecc000}, {0x42ece000},
- {0x42ed0000}, {0x42ed2000}, {0x42ed4000}, {0x42ed6000},
- {0x42ed8000}, {0x42eda000}, {0x42edc000}, {0x42ede000},
- {0x42ee0000}, {0x42ee2000}, {0x42ee4000}, {0x42ee6000},
- {0x42ee8000}, {0x42eea000}, {0x42eec000}, {0x42eee000},
- {0x42ef0000}, {0x42ef2000}, {0x42ef4000}, {0x42ef6000},
- {0x42ef8000}, {0x42efa000}, {0x42efc000}, {0x42efe000},
- {0x42f00000}, {0x42f02000}, {0x42f04000}, {0x42f06000},
- {0x42f08000}, {0x42f0a000}, {0x42f0c000}, {0x42f0e000},
- {0x42f10000}, {0x42f12000}, {0x42f14000}, {0x42f16000},
- {0x42f18000}, {0x42f1a000}, {0x42f1c000}, {0x42f1e000},
- {0x42f20000}, {0x42f22000}, {0x42f24000}, {0x42f26000},
- {0x42f28000}, {0x42f2a000}, {0x42f2c000}, {0x42f2e000},
- {0x42f30000}, {0x42f32000}, {0x42f34000}, {0x42f36000},
- {0x42f38000}, {0x42f3a000}, {0x42f3c000}, {0x42f3e000},
- {0x42f40000}, {0x42f42000}, {0x42f44000}, {0x42f46000},
- {0x42f48000}, {0x42f4a000}, {0x42f4c000}, {0x42f4e000},
- {0x42f50000}, {0x42f52000}, {0x42f54000}, {0x42f56000},
- {0x42f58000}, {0x42f5a000}, {0x42f5c000}, {0x42f5e000},
- {0x42f60000}, {0x42f62000}, {0x42f64000}, {0x42f66000},
- {0x42f68000}, {0x42f6a000}, {0x42f6c000}, {0x42f6e000},
- {0x42f70000}, {0x42f72000}, {0x42f74000}, {0x42f76000},
- {0x42f78000}, {0x42f7a000}, {0x42f7c000}, {0x42f7e000},
- {0x42f80000}, {0x42f82000}, {0x42f84000}, {0x42f86000},
- {0x42f88000}, {0x42f8a000}, {0x42f8c000}, {0x42f8e000},
- {0x42f90000}, {0x42f92000}, {0x42f94000}, {0x42f96000},
- {0x42f98000}, {0x42f9a000}, {0x42f9c000}, {0x42f9e000},
- {0x42fa0000}, {0x42fa2000}, {0x42fa4000}, {0x42fa6000},
- {0x42fa8000}, {0x42faa000}, {0x42fac000}, {0x42fae000},
- {0x42fb0000}, {0x42fb2000}, {0x42fb4000}, {0x42fb6000},
- {0x42fb8000}, {0x42fba000}, {0x42fbc000}, {0x42fbe000},
- {0x42fc0000}, {0x42fc2000}, {0x42fc4000}, {0x42fc6000},
- {0x42fc8000}, {0x42fca000}, {0x42fcc000}, {0x42fce000},
- {0x42fd0000}, {0x42fd2000}, {0x42fd4000}, {0x42fd6000},
- {0x42fd8000}, {0x42fda000}, {0x42fdc000}, {0x42fde000},
- {0x42fe0000}, {0x42fe2000}, {0x42fe4000}, {0x42fe6000},
- {0x42fe8000}, {0x42fea000}, {0x42fec000}, {0x42fee000},
- {0x42ff0000}, {0x42ff2000}, {0x42ff4000}, {0x42ff6000},
- {0x42ff8000}, {0x42ffa000}, {0x42ffc000}, {0x42ffe000},
- {0x43000000}, {0x43002000}, {0x43004000}, {0x43006000},
- {0x43008000}, {0x4300a000}, {0x4300c000}, {0x4300e000},
- {0x43010000}, {0x43012000}, {0x43014000}, {0x43016000},
- {0x43018000}, {0x4301a000}, {0x4301c000}, {0x4301e000},
- {0x43020000}, {0x43022000}, {0x43024000}, {0x43026000},
- {0x43028000}, {0x4302a000}, {0x4302c000}, {0x4302e000},
- {0x43030000}, {0x43032000}, {0x43034000}, {0x43036000},
- {0x43038000}, {0x4303a000}, {0x4303c000}, {0x4303e000},
- {0x43040000}, {0x43042000}, {0x43044000}, {0x43046000},
- {0x43048000}, {0x4304a000}, {0x4304c000}, {0x4304e000},
- {0x43050000}, {0x43052000}, {0x43054000}, {0x43056000},
- {0x43058000}, {0x4305a000}, {0x4305c000}, {0x4305e000},
- {0x43060000}, {0x43062000}, {0x43064000}, {0x43066000},
- {0x43068000}, {0x4306a000}, {0x4306c000}, {0x4306e000},
- {0x43070000}, {0x43072000}, {0x43074000}, {0x43076000},
- {0x43078000}, {0x4307a000}, {0x4307c000}, {0x4307e000},
- {0x43080000}, {0x43082000}, {0x43084000}, {0x43086000},
- {0x43088000}, {0x4308a000}, {0x4308c000}, {0x4308e000},
- {0x43090000}, {0x43092000}, {0x43094000}, {0x43096000},
- {0x43098000}, {0x4309a000}, {0x4309c000}, {0x4309e000},
- {0x430a0000}, {0x430a2000}, {0x430a4000}, {0x430a6000},
- {0x430a8000}, {0x430aa000}, {0x430ac000}, {0x430ae000},
- {0x430b0000}, {0x430b2000}, {0x430b4000}, {0x430b6000},
- {0x430b8000}, {0x430ba000}, {0x430bc000}, {0x430be000},
- {0x430c0000}, {0x430c2000}, {0x430c4000}, {0x430c6000},
- {0x430c8000}, {0x430ca000}, {0x430cc000}, {0x430ce000},
- {0x430d0000}, {0x430d2000}, {0x430d4000}, {0x430d6000},
- {0x430d8000}, {0x430da000}, {0x430dc000}, {0x430de000},
- {0x430e0000}, {0x430e2000}, {0x430e4000}, {0x430e6000},
- {0x430e8000}, {0x430ea000}, {0x430ec000}, {0x430ee000},
- {0x430f0000}, {0x430f2000}, {0x430f4000}, {0x430f6000},
- {0x430f8000}, {0x430fa000}, {0x430fc000}, {0x430fe000},
- {0x43100000}, {0x43102000}, {0x43104000}, {0x43106000},
- {0x43108000}, {0x4310a000}, {0x4310c000}, {0x4310e000},
- {0x43110000}, {0x43112000}, {0x43114000}, {0x43116000},
- {0x43118000}, {0x4311a000}, {0x4311c000}, {0x4311e000},
- {0x43120000}, {0x43122000}, {0x43124000}, {0x43126000},
- {0x43128000}, {0x4312a000}, {0x4312c000}, {0x4312e000},
- {0x43130000}, {0x43132000}, {0x43134000}, {0x43136000},
- {0x43138000}, {0x4313a000}, {0x4313c000}, {0x4313e000},
- {0x43140000}, {0x43142000}, {0x43144000}, {0x43146000},
- {0x43148000}, {0x4314a000}, {0x4314c000}, {0x4314e000},
- {0x43150000}, {0x43152000}, {0x43154000}, {0x43156000},
- {0x43158000}, {0x4315a000}, {0x4315c000}, {0x4315e000},
- {0x43160000}, {0x43162000}, {0x43164000}, {0x43166000},
- {0x43168000}, {0x4316a000}, {0x4316c000}, {0x4316e000},
- {0x43170000}, {0x43172000}, {0x43174000}, {0x43176000},
- {0x43178000}, {0x4317a000}, {0x4317c000}, {0x4317e000},
- {0x43180000}, {0x43182000}, {0x43184000}, {0x43186000},
- {0x43188000}, {0x4318a000}, {0x4318c000}, {0x4318e000},
- {0x43190000}, {0x43192000}, {0x43194000}, {0x43196000},
- {0x43198000}, {0x4319a000}, {0x4319c000}, {0x4319e000},
- {0x431a0000}, {0x431a2000}, {0x431a4000}, {0x431a6000},
- {0x431a8000}, {0x431aa000}, {0x431ac000}, {0x431ae000},
- {0x431b0000}, {0x431b2000}, {0x431b4000}, {0x431b6000},
- {0x431b8000}, {0x431ba000}, {0x431bc000}, {0x431be000},
- {0x431c0000}, {0x431c2000}, {0x431c4000}, {0x431c6000},
- {0x431c8000}, {0x431ca000}, {0x431cc000}, {0x431ce000},
- {0x431d0000}, {0x431d2000}, {0x431d4000}, {0x431d6000},
- {0x431d8000}, {0x431da000}, {0x431dc000}, {0x431de000},
- {0x431e0000}, {0x431e2000}, {0x431e4000}, {0x431e6000},
- {0x431e8000}, {0x431ea000}, {0x431ec000}, {0x431ee000},
- {0x431f0000}, {0x431f2000}, {0x431f4000}, {0x431f6000},
- {0x431f8000}, {0x431fa000}, {0x431fc000}, {0x431fe000},
- {0x43200000}, {0x43202000}, {0x43204000}, {0x43206000},
- {0x43208000}, {0x4320a000}, {0x4320c000}, {0x4320e000},
- {0x43210000}, {0x43212000}, {0x43214000}, {0x43216000},
- {0x43218000}, {0x4321a000}, {0x4321c000}, {0x4321e000},
- {0x43220000}, {0x43222000}, {0x43224000}, {0x43226000},
- {0x43228000}, {0x4322a000}, {0x4322c000}, {0x4322e000},
- {0x43230000}, {0x43232000}, {0x43234000}, {0x43236000},
- {0x43238000}, {0x4323a000}, {0x4323c000}, {0x4323e000},
- {0x43240000}, {0x43242000}, {0x43244000}, {0x43246000},
- {0x43248000}, {0x4324a000}, {0x4324c000}, {0x4324e000},
- {0x43250000}, {0x43252000}, {0x43254000}, {0x43256000},
- {0x43258000}, {0x4325a000}, {0x4325c000}, {0x4325e000},
- {0x43260000}, {0x43262000}, {0x43264000}, {0x43266000},
- {0x43268000}, {0x4326a000}, {0x4326c000}, {0x4326e000},
- {0x43270000}, {0x43272000}, {0x43274000}, {0x43276000},
- {0x43278000}, {0x4327a000}, {0x4327c000}, {0x4327e000},
- {0x43280000}, {0x43282000}, {0x43284000}, {0x43286000},
- {0x43288000}, {0x4328a000}, {0x4328c000}, {0x4328e000},
- {0x43290000}, {0x43292000}, {0x43294000}, {0x43296000},
- {0x43298000}, {0x4329a000}, {0x4329c000}, {0x4329e000},
- {0x432a0000}, {0x432a2000}, {0x432a4000}, {0x432a6000},
- {0x432a8000}, {0x432aa000}, {0x432ac000}, {0x432ae000},
- {0x432b0000}, {0x432b2000}, {0x432b4000}, {0x432b6000},
- {0x432b8000}, {0x432ba000}, {0x432bc000}, {0x432be000},
- {0x432c0000}, {0x432c2000}, {0x432c4000}, {0x432c6000},
- {0x432c8000}, {0x432ca000}, {0x432cc000}, {0x432ce000},
- {0x432d0000}, {0x432d2000}, {0x432d4000}, {0x432d6000},
- {0x432d8000}, {0x432da000}, {0x432dc000}, {0x432de000},
- {0x432e0000}, {0x432e2000}, {0x432e4000}, {0x432e6000},
- {0x432e8000}, {0x432ea000}, {0x432ec000}, {0x432ee000},
- {0x432f0000}, {0x432f2000}, {0x432f4000}, {0x432f6000},
- {0x432f8000}, {0x432fa000}, {0x432fc000}, {0x432fe000},
- {0x43300000}, {0x43302000}, {0x43304000}, {0x43306000},
- {0x43308000}, {0x4330a000}, {0x4330c000}, {0x4330e000},
- {0x43310000}, {0x43312000}, {0x43314000}, {0x43316000},
- {0x43318000}, {0x4331a000}, {0x4331c000}, {0x4331e000},
- {0x43320000}, {0x43322000}, {0x43324000}, {0x43326000},
- {0x43328000}, {0x4332a000}, {0x4332c000}, {0x4332e000},
- {0x43330000}, {0x43332000}, {0x43334000}, {0x43336000},
- {0x43338000}, {0x4333a000}, {0x4333c000}, {0x4333e000},
- {0x43340000}, {0x43342000}, {0x43344000}, {0x43346000},
- {0x43348000}, {0x4334a000}, {0x4334c000}, {0x4334e000},
- {0x43350000}, {0x43352000}, {0x43354000}, {0x43356000},
- {0x43358000}, {0x4335a000}, {0x4335c000}, {0x4335e000},
- {0x43360000}, {0x43362000}, {0x43364000}, {0x43366000},
- {0x43368000}, {0x4336a000}, {0x4336c000}, {0x4336e000},
- {0x43370000}, {0x43372000}, {0x43374000}, {0x43376000},
- {0x43378000}, {0x4337a000}, {0x4337c000}, {0x4337e000},
- {0x43380000}, {0x43382000}, {0x43384000}, {0x43386000},
- {0x43388000}, {0x4338a000}, {0x4338c000}, {0x4338e000},
- {0x43390000}, {0x43392000}, {0x43394000}, {0x43396000},
- {0x43398000}, {0x4339a000}, {0x4339c000}, {0x4339e000},
- {0x433a0000}, {0x433a2000}, {0x433a4000}, {0x433a6000},
- {0x433a8000}, {0x433aa000}, {0x433ac000}, {0x433ae000},
- {0x433b0000}, {0x433b2000}, {0x433b4000}, {0x433b6000},
- {0x433b8000}, {0x433ba000}, {0x433bc000}, {0x433be000},
- {0x433c0000}, {0x433c2000}, {0x433c4000}, {0x433c6000},
- {0x433c8000}, {0x433ca000}, {0x433cc000}, {0x433ce000},
- {0x433d0000}, {0x433d2000}, {0x433d4000}, {0x433d6000},
- {0x433d8000}, {0x433da000}, {0x433dc000}, {0x433de000},
- {0x433e0000}, {0x433e2000}, {0x433e4000}, {0x433e6000},
- {0x433e8000}, {0x433ea000}, {0x433ec000}, {0x433ee000},
- {0x433f0000}, {0x433f2000}, {0x433f4000}, {0x433f6000},
- {0x433f8000}, {0x433fa000}, {0x433fc000}, {0x433fe000},
- {0x43400000}, {0x43402000}, {0x43404000}, {0x43406000},
- {0x43408000}, {0x4340a000}, {0x4340c000}, {0x4340e000},
- {0x43410000}, {0x43412000}, {0x43414000}, {0x43416000},
- {0x43418000}, {0x4341a000}, {0x4341c000}, {0x4341e000},
- {0x43420000}, {0x43422000}, {0x43424000}, {0x43426000},
- {0x43428000}, {0x4342a000}, {0x4342c000}, {0x4342e000},
- {0x43430000}, {0x43432000}, {0x43434000}, {0x43436000},
- {0x43438000}, {0x4343a000}, {0x4343c000}, {0x4343e000},
- {0x43440000}, {0x43442000}, {0x43444000}, {0x43446000},
- {0x43448000}, {0x4344a000}, {0x4344c000}, {0x4344e000},
- {0x43450000}, {0x43452000}, {0x43454000}, {0x43456000},
- {0x43458000}, {0x4345a000}, {0x4345c000}, {0x4345e000},
- {0x43460000}, {0x43462000}, {0x43464000}, {0x43466000},
- {0x43468000}, {0x4346a000}, {0x4346c000}, {0x4346e000},
- {0x43470000}, {0x43472000}, {0x43474000}, {0x43476000},
- {0x43478000}, {0x4347a000}, {0x4347c000}, {0x4347e000},
- {0x43480000}, {0x43482000}, {0x43484000}, {0x43486000},
- {0x43488000}, {0x4348a000}, {0x4348c000}, {0x4348e000},
- {0x43490000}, {0x43492000}, {0x43494000}, {0x43496000},
- {0x43498000}, {0x4349a000}, {0x4349c000}, {0x4349e000},
- {0x434a0000}, {0x434a2000}, {0x434a4000}, {0x434a6000},
- {0x434a8000}, {0x434aa000}, {0x434ac000}, {0x434ae000},
- {0x434b0000}, {0x434b2000}, {0x434b4000}, {0x434b6000},
- {0x434b8000}, {0x434ba000}, {0x434bc000}, {0x434be000},
- {0x434c0000}, {0x434c2000}, {0x434c4000}, {0x434c6000},
- {0x434c8000}, {0x434ca000}, {0x434cc000}, {0x434ce000},
- {0x434d0000}, {0x434d2000}, {0x434d4000}, {0x434d6000},
- {0x434d8000}, {0x434da000}, {0x434dc000}, {0x434de000},
- {0x434e0000}, {0x434e2000}, {0x434e4000}, {0x434e6000},
- {0x434e8000}, {0x434ea000}, {0x434ec000}, {0x434ee000},
- {0x434f0000}, {0x434f2000}, {0x434f4000}, {0x434f6000},
- {0x434f8000}, {0x434fa000}, {0x434fc000}, {0x434fe000},
- {0x43500000}, {0x43502000}, {0x43504000}, {0x43506000},
- {0x43508000}, {0x4350a000}, {0x4350c000}, {0x4350e000},
- {0x43510000}, {0x43512000}, {0x43514000}, {0x43516000},
- {0x43518000}, {0x4351a000}, {0x4351c000}, {0x4351e000},
- {0x43520000}, {0x43522000}, {0x43524000}, {0x43526000},
- {0x43528000}, {0x4352a000}, {0x4352c000}, {0x4352e000},
- {0x43530000}, {0x43532000}, {0x43534000}, {0x43536000},
- {0x43538000}, {0x4353a000}, {0x4353c000}, {0x4353e000},
- {0x43540000}, {0x43542000}, {0x43544000}, {0x43546000},
- {0x43548000}, {0x4354a000}, {0x4354c000}, {0x4354e000},
- {0x43550000}, {0x43552000}, {0x43554000}, {0x43556000},
- {0x43558000}, {0x4355a000}, {0x4355c000}, {0x4355e000},
- {0x43560000}, {0x43562000}, {0x43564000}, {0x43566000},
- {0x43568000}, {0x4356a000}, {0x4356c000}, {0x4356e000},
- {0x43570000}, {0x43572000}, {0x43574000}, {0x43576000},
- {0x43578000}, {0x4357a000}, {0x4357c000}, {0x4357e000},
- {0x43580000}, {0x43582000}, {0x43584000}, {0x43586000},
- {0x43588000}, {0x4358a000}, {0x4358c000}, {0x4358e000},
- {0x43590000}, {0x43592000}, {0x43594000}, {0x43596000},
- {0x43598000}, {0x4359a000}, {0x4359c000}, {0x4359e000},
- {0x435a0000}, {0x435a2000}, {0x435a4000}, {0x435a6000},
- {0x435a8000}, {0x435aa000}, {0x435ac000}, {0x435ae000},
- {0x435b0000}, {0x435b2000}, {0x435b4000}, {0x435b6000},
- {0x435b8000}, {0x435ba000}, {0x435bc000}, {0x435be000},
- {0x435c0000}, {0x435c2000}, {0x435c4000}, {0x435c6000},
- {0x435c8000}, {0x435ca000}, {0x435cc000}, {0x435ce000},
- {0x435d0000}, {0x435d2000}, {0x435d4000}, {0x435d6000},
- {0x435d8000}, {0x435da000}, {0x435dc000}, {0x435de000},
- {0x435e0000}, {0x435e2000}, {0x435e4000}, {0x435e6000},
- {0x435e8000}, {0x435ea000}, {0x435ec000}, {0x435ee000},
- {0x435f0000}, {0x435f2000}, {0x435f4000}, {0x435f6000},
- {0x435f8000}, {0x435fa000}, {0x435fc000}, {0x435fe000},
- {0x43600000}, {0x43602000}, {0x43604000}, {0x43606000},
- {0x43608000}, {0x4360a000}, {0x4360c000}, {0x4360e000},
- {0x43610000}, {0x43612000}, {0x43614000}, {0x43616000},
- {0x43618000}, {0x4361a000}, {0x4361c000}, {0x4361e000},
- {0x43620000}, {0x43622000}, {0x43624000}, {0x43626000},
- {0x43628000}, {0x4362a000}, {0x4362c000}, {0x4362e000},
- {0x43630000}, {0x43632000}, {0x43634000}, {0x43636000},
- {0x43638000}, {0x4363a000}, {0x4363c000}, {0x4363e000},
- {0x43640000}, {0x43642000}, {0x43644000}, {0x43646000},
- {0x43648000}, {0x4364a000}, {0x4364c000}, {0x4364e000},
- {0x43650000}, {0x43652000}, {0x43654000}, {0x43656000},
- {0x43658000}, {0x4365a000}, {0x4365c000}, {0x4365e000},
- {0x43660000}, {0x43662000}, {0x43664000}, {0x43666000},
- {0x43668000}, {0x4366a000}, {0x4366c000}, {0x4366e000},
- {0x43670000}, {0x43672000}, {0x43674000}, {0x43676000},
- {0x43678000}, {0x4367a000}, {0x4367c000}, {0x4367e000},
- {0x43680000}, {0x43682000}, {0x43684000}, {0x43686000},
- {0x43688000}, {0x4368a000}, {0x4368c000}, {0x4368e000},
- {0x43690000}, {0x43692000}, {0x43694000}, {0x43696000},
- {0x43698000}, {0x4369a000}, {0x4369c000}, {0x4369e000},
- {0x436a0000}, {0x436a2000}, {0x436a4000}, {0x436a6000},
- {0x436a8000}, {0x436aa000}, {0x436ac000}, {0x436ae000},
- {0x436b0000}, {0x436b2000}, {0x436b4000}, {0x436b6000},
- {0x436b8000}, {0x436ba000}, {0x436bc000}, {0x436be000},
- {0x436c0000}, {0x436c2000}, {0x436c4000}, {0x436c6000},
- {0x436c8000}, {0x436ca000}, {0x436cc000}, {0x436ce000},
- {0x436d0000}, {0x436d2000}, {0x436d4000}, {0x436d6000},
- {0x436d8000}, {0x436da000}, {0x436dc000}, {0x436de000},
- {0x436e0000}, {0x436e2000}, {0x436e4000}, {0x436e6000},
- {0x436e8000}, {0x436ea000}, {0x436ec000}, {0x436ee000},
- {0x436f0000}, {0x436f2000}, {0x436f4000}, {0x436f6000},
- {0x436f8000}, {0x436fa000}, {0x436fc000}, {0x436fe000},
- {0x43700000}, {0x43702000}, {0x43704000}, {0x43706000},
- {0x43708000}, {0x4370a000}, {0x4370c000}, {0x4370e000},
- {0x43710000}, {0x43712000}, {0x43714000}, {0x43716000},
- {0x43718000}, {0x4371a000}, {0x4371c000}, {0x4371e000},
- {0x43720000}, {0x43722000}, {0x43724000}, {0x43726000},
- {0x43728000}, {0x4372a000}, {0x4372c000}, {0x4372e000},
- {0x43730000}, {0x43732000}, {0x43734000}, {0x43736000},
- {0x43738000}, {0x4373a000}, {0x4373c000}, {0x4373e000},
- {0x43740000}, {0x43742000}, {0x43744000}, {0x43746000},
- {0x43748000}, {0x4374a000}, {0x4374c000}, {0x4374e000},
- {0x43750000}, {0x43752000}, {0x43754000}, {0x43756000},
- {0x43758000}, {0x4375a000}, {0x4375c000}, {0x4375e000},
- {0x43760000}, {0x43762000}, {0x43764000}, {0x43766000},
- {0x43768000}, {0x4376a000}, {0x4376c000}, {0x4376e000},
- {0x43770000}, {0x43772000}, {0x43774000}, {0x43776000},
- {0x43778000}, {0x4377a000}, {0x4377c000}, {0x4377e000},
- {0x43780000}, {0x43782000}, {0x43784000}, {0x43786000},
- {0x43788000}, {0x4378a000}, {0x4378c000}, {0x4378e000},
- {0x43790000}, {0x43792000}, {0x43794000}, {0x43796000},
- {0x43798000}, {0x4379a000}, {0x4379c000}, {0x4379e000},
- {0x437a0000}, {0x437a2000}, {0x437a4000}, {0x437a6000},
- {0x437a8000}, {0x437aa000}, {0x437ac000}, {0x437ae000},
- {0x437b0000}, {0x437b2000}, {0x437b4000}, {0x437b6000},
- {0x437b8000}, {0x437ba000}, {0x437bc000}, {0x437be000},
- {0x437c0000}, {0x437c2000}, {0x437c4000}, {0x437c6000},
- {0x437c8000}, {0x437ca000}, {0x437cc000}, {0x437ce000},
- {0x437d0000}, {0x437d2000}, {0x437d4000}, {0x437d6000},
- {0x437d8000}, {0x437da000}, {0x437dc000}, {0x437de000},
- {0x437e0000}, {0x437e2000}, {0x437e4000}, {0x437e6000},
- {0x437e8000}, {0x437ea000}, {0x437ec000}, {0x437ee000},
- {0x437f0000}, {0x437f2000}, {0x437f4000}, {0x437f6000},
- {0x437f8000}, {0x437fa000}, {0x437fc000}, {0x437fe000},
- {0x43800000}, {0x43802000}, {0x43804000}, {0x43806000},
- {0x43808000}, {0x4380a000}, {0x4380c000}, {0x4380e000},
- {0x43810000}, {0x43812000}, {0x43814000}, {0x43816000},
- {0x43818000}, {0x4381a000}, {0x4381c000}, {0x4381e000},
- {0x43820000}, {0x43822000}, {0x43824000}, {0x43826000},
- {0x43828000}, {0x4382a000}, {0x4382c000}, {0x4382e000},
- {0x43830000}, {0x43832000}, {0x43834000}, {0x43836000},
- {0x43838000}, {0x4383a000}, {0x4383c000}, {0x4383e000},
- {0x43840000}, {0x43842000}, {0x43844000}, {0x43846000},
- {0x43848000}, {0x4384a000}, {0x4384c000}, {0x4384e000},
- {0x43850000}, {0x43852000}, {0x43854000}, {0x43856000},
- {0x43858000}, {0x4385a000}, {0x4385c000}, {0x4385e000},
- {0x43860000}, {0x43862000}, {0x43864000}, {0x43866000},
- {0x43868000}, {0x4386a000}, {0x4386c000}, {0x4386e000},
- {0x43870000}, {0x43872000}, {0x43874000}, {0x43876000},
- {0x43878000}, {0x4387a000}, {0x4387c000}, {0x4387e000},
- {0x43880000}, {0x43882000}, {0x43884000}, {0x43886000},
- {0x43888000}, {0x4388a000}, {0x4388c000}, {0x4388e000},
- {0x43890000}, {0x43892000}, {0x43894000}, {0x43896000},
- {0x43898000}, {0x4389a000}, {0x4389c000}, {0x4389e000},
- {0x438a0000}, {0x438a2000}, {0x438a4000}, {0x438a6000},
- {0x438a8000}, {0x438aa000}, {0x438ac000}, {0x438ae000},
- {0x438b0000}, {0x438b2000}, {0x438b4000}, {0x438b6000},
- {0x438b8000}, {0x438ba000}, {0x438bc000}, {0x438be000},
- {0x438c0000}, {0x438c2000}, {0x438c4000}, {0x438c6000},
- {0x438c8000}, {0x438ca000}, {0x438cc000}, {0x438ce000},
- {0x438d0000}, {0x438d2000}, {0x438d4000}, {0x438d6000},
- {0x438d8000}, {0x438da000}, {0x438dc000}, {0x438de000},
- {0x438e0000}, {0x438e2000}, {0x438e4000}, {0x438e6000},
- {0x438e8000}, {0x438ea000}, {0x438ec000}, {0x438ee000},
- {0x438f0000}, {0x438f2000}, {0x438f4000}, {0x438f6000},
- {0x438f8000}, {0x438fa000}, {0x438fc000}, {0x438fe000},
- {0x43900000}, {0x43902000}, {0x43904000}, {0x43906000},
- {0x43908000}, {0x4390a000}, {0x4390c000}, {0x4390e000},
- {0x43910000}, {0x43912000}, {0x43914000}, {0x43916000},
- {0x43918000}, {0x4391a000}, {0x4391c000}, {0x4391e000},
- {0x43920000}, {0x43922000}, {0x43924000}, {0x43926000},
- {0x43928000}, {0x4392a000}, {0x4392c000}, {0x4392e000},
- {0x43930000}, {0x43932000}, {0x43934000}, {0x43936000},
- {0x43938000}, {0x4393a000}, {0x4393c000}, {0x4393e000},
- {0x43940000}, {0x43942000}, {0x43944000}, {0x43946000},
- {0x43948000}, {0x4394a000}, {0x4394c000}, {0x4394e000},
- {0x43950000}, {0x43952000}, {0x43954000}, {0x43956000},
- {0x43958000}, {0x4395a000}, {0x4395c000}, {0x4395e000},
- {0x43960000}, {0x43962000}, {0x43964000}, {0x43966000},
- {0x43968000}, {0x4396a000}, {0x4396c000}, {0x4396e000},
- {0x43970000}, {0x43972000}, {0x43974000}, {0x43976000},
- {0x43978000}, {0x4397a000}, {0x4397c000}, {0x4397e000},
- {0x43980000}, {0x43982000}, {0x43984000}, {0x43986000},
- {0x43988000}, {0x4398a000}, {0x4398c000}, {0x4398e000},
- {0x43990000}, {0x43992000}, {0x43994000}, {0x43996000},
- {0x43998000}, {0x4399a000}, {0x4399c000}, {0x4399e000},
- {0x439a0000}, {0x439a2000}, {0x439a4000}, {0x439a6000},
- {0x439a8000}, {0x439aa000}, {0x439ac000}, {0x439ae000},
- {0x439b0000}, {0x439b2000}, {0x439b4000}, {0x439b6000},
- {0x439b8000}, {0x439ba000}, {0x439bc000}, {0x439be000},
- {0x439c0000}, {0x439c2000}, {0x439c4000}, {0x439c6000},
- {0x439c8000}, {0x439ca000}, {0x439cc000}, {0x439ce000},
- {0x439d0000}, {0x439d2000}, {0x439d4000}, {0x439d6000},
- {0x439d8000}, {0x439da000}, {0x439dc000}, {0x439de000},
- {0x439e0000}, {0x439e2000}, {0x439e4000}, {0x439e6000},
- {0x439e8000}, {0x439ea000}, {0x439ec000}, {0x439ee000},
- {0x439f0000}, {0x439f2000}, {0x439f4000}, {0x439f6000},
- {0x439f8000}, {0x439fa000}, {0x439fc000}, {0x439fe000},
- {0x43a00000}, {0x43a02000}, {0x43a04000}, {0x43a06000},
- {0x43a08000}, {0x43a0a000}, {0x43a0c000}, {0x43a0e000},
- {0x43a10000}, {0x43a12000}, {0x43a14000}, {0x43a16000},
- {0x43a18000}, {0x43a1a000}, {0x43a1c000}, {0x43a1e000},
- {0x43a20000}, {0x43a22000}, {0x43a24000}, {0x43a26000},
- {0x43a28000}, {0x43a2a000}, {0x43a2c000}, {0x43a2e000},
- {0x43a30000}, {0x43a32000}, {0x43a34000}, {0x43a36000},
- {0x43a38000}, {0x43a3a000}, {0x43a3c000}, {0x43a3e000},
- {0x43a40000}, {0x43a42000}, {0x43a44000}, {0x43a46000},
- {0x43a48000}, {0x43a4a000}, {0x43a4c000}, {0x43a4e000},
- {0x43a50000}, {0x43a52000}, {0x43a54000}, {0x43a56000},
- {0x43a58000}, {0x43a5a000}, {0x43a5c000}, {0x43a5e000},
- {0x43a60000}, {0x43a62000}, {0x43a64000}, {0x43a66000},
- {0x43a68000}, {0x43a6a000}, {0x43a6c000}, {0x43a6e000},
- {0x43a70000}, {0x43a72000}, {0x43a74000}, {0x43a76000},
- {0x43a78000}, {0x43a7a000}, {0x43a7c000}, {0x43a7e000},
- {0x43a80000}, {0x43a82000}, {0x43a84000}, {0x43a86000},
- {0x43a88000}, {0x43a8a000}, {0x43a8c000}, {0x43a8e000},
- {0x43a90000}, {0x43a92000}, {0x43a94000}, {0x43a96000},
- {0x43a98000}, {0x43a9a000}, {0x43a9c000}, {0x43a9e000},
- {0x43aa0000}, {0x43aa2000}, {0x43aa4000}, {0x43aa6000},
- {0x43aa8000}, {0x43aaa000}, {0x43aac000}, {0x43aae000},
- {0x43ab0000}, {0x43ab2000}, {0x43ab4000}, {0x43ab6000},
- {0x43ab8000}, {0x43aba000}, {0x43abc000}, {0x43abe000},
- {0x43ac0000}, {0x43ac2000}, {0x43ac4000}, {0x43ac6000},
- {0x43ac8000}, {0x43aca000}, {0x43acc000}, {0x43ace000},
- {0x43ad0000}, {0x43ad2000}, {0x43ad4000}, {0x43ad6000},
- {0x43ad8000}, {0x43ada000}, {0x43adc000}, {0x43ade000},
- {0x43ae0000}, {0x43ae2000}, {0x43ae4000}, {0x43ae6000},
- {0x43ae8000}, {0x43aea000}, {0x43aec000}, {0x43aee000},
- {0x43af0000}, {0x43af2000}, {0x43af4000}, {0x43af6000},
- {0x43af8000}, {0x43afa000}, {0x43afc000}, {0x43afe000},
- {0x43b00000}, {0x43b02000}, {0x43b04000}, {0x43b06000},
- {0x43b08000}, {0x43b0a000}, {0x43b0c000}, {0x43b0e000},
- {0x43b10000}, {0x43b12000}, {0x43b14000}, {0x43b16000},
- {0x43b18000}, {0x43b1a000}, {0x43b1c000}, {0x43b1e000},
- {0x43b20000}, {0x43b22000}, {0x43b24000}, {0x43b26000},
- {0x43b28000}, {0x43b2a000}, {0x43b2c000}, {0x43b2e000},
- {0x43b30000}, {0x43b32000}, {0x43b34000}, {0x43b36000},
- {0x43b38000}, {0x43b3a000}, {0x43b3c000}, {0x43b3e000},
- {0x43b40000}, {0x43b42000}, {0x43b44000}, {0x43b46000},
- {0x43b48000}, {0x43b4a000}, {0x43b4c000}, {0x43b4e000},
- {0x43b50000}, {0x43b52000}, {0x43b54000}, {0x43b56000},
- {0x43b58000}, {0x43b5a000}, {0x43b5c000}, {0x43b5e000},
- {0x43b60000}, {0x43b62000}, {0x43b64000}, {0x43b66000},
- {0x43b68000}, {0x43b6a000}, {0x43b6c000}, {0x43b6e000},
- {0x43b70000}, {0x43b72000}, {0x43b74000}, {0x43b76000},
- {0x43b78000}, {0x43b7a000}, {0x43b7c000}, {0x43b7e000},
- {0x43b80000}, {0x43b82000}, {0x43b84000}, {0x43b86000},
- {0x43b88000}, {0x43b8a000}, {0x43b8c000}, {0x43b8e000},
- {0x43b90000}, {0x43b92000}, {0x43b94000}, {0x43b96000},
- {0x43b98000}, {0x43b9a000}, {0x43b9c000}, {0x43b9e000},
- {0x43ba0000}, {0x43ba2000}, {0x43ba4000}, {0x43ba6000},
- {0x43ba8000}, {0x43baa000}, {0x43bac000}, {0x43bae000},
- {0x43bb0000}, {0x43bb2000}, {0x43bb4000}, {0x43bb6000},
- {0x43bb8000}, {0x43bba000}, {0x43bbc000}, {0x43bbe000},
- {0x43bc0000}, {0x43bc2000}, {0x43bc4000}, {0x43bc6000},
- {0x43bc8000}, {0x43bca000}, {0x43bcc000}, {0x43bce000},
- {0x43bd0000}, {0x43bd2000}, {0x43bd4000}, {0x43bd6000},
- {0x43bd8000}, {0x43bda000}, {0x43bdc000}, {0x43bde000},
- {0x43be0000}, {0x43be2000}, {0x43be4000}, {0x43be6000},
- {0x43be8000}, {0x43bea000}, {0x43bec000}, {0x43bee000},
- {0x43bf0000}, {0x43bf2000}, {0x43bf4000}, {0x43bf6000},
- {0x43bf8000}, {0x43bfa000}, {0x43bfc000}, {0x43bfe000},
- {0x43c00000}, {0x43c02000}, {0x43c04000}, {0x43c06000},
- {0x43c08000}, {0x43c0a000}, {0x43c0c000}, {0x43c0e000},
- {0x43c10000}, {0x43c12000}, {0x43c14000}, {0x43c16000},
- {0x43c18000}, {0x43c1a000}, {0x43c1c000}, {0x43c1e000},
- {0x43c20000}, {0x43c22000}, {0x43c24000}, {0x43c26000},
- {0x43c28000}, {0x43c2a000}, {0x43c2c000}, {0x43c2e000},
- {0x43c30000}, {0x43c32000}, {0x43c34000}, {0x43c36000},
- {0x43c38000}, {0x43c3a000}, {0x43c3c000}, {0x43c3e000},
- {0x43c40000}, {0x43c42000}, {0x43c44000}, {0x43c46000},
- {0x43c48000}, {0x43c4a000}, {0x43c4c000}, {0x43c4e000},
- {0x43c50000}, {0x43c52000}, {0x43c54000}, {0x43c56000},
- {0x43c58000}, {0x43c5a000}, {0x43c5c000}, {0x43c5e000},
- {0x43c60000}, {0x43c62000}, {0x43c64000}, {0x43c66000},
- {0x43c68000}, {0x43c6a000}, {0x43c6c000}, {0x43c6e000},
- {0x43c70000}, {0x43c72000}, {0x43c74000}, {0x43c76000},
- {0x43c78000}, {0x43c7a000}, {0x43c7c000}, {0x43c7e000},
- {0x43c80000}, {0x43c82000}, {0x43c84000}, {0x43c86000},
- {0x43c88000}, {0x43c8a000}, {0x43c8c000}, {0x43c8e000},
- {0x43c90000}, {0x43c92000}, {0x43c94000}, {0x43c96000},
- {0x43c98000}, {0x43c9a000}, {0x43c9c000}, {0x43c9e000},
- {0x43ca0000}, {0x43ca2000}, {0x43ca4000}, {0x43ca6000},
- {0x43ca8000}, {0x43caa000}, {0x43cac000}, {0x43cae000},
- {0x43cb0000}, {0x43cb2000}, {0x43cb4000}, {0x43cb6000},
- {0x43cb8000}, {0x43cba000}, {0x43cbc000}, {0x43cbe000},
- {0x43cc0000}, {0x43cc2000}, {0x43cc4000}, {0x43cc6000},
- {0x43cc8000}, {0x43cca000}, {0x43ccc000}, {0x43cce000},
- {0x43cd0000}, {0x43cd2000}, {0x43cd4000}, {0x43cd6000},
- {0x43cd8000}, {0x43cda000}, {0x43cdc000}, {0x43cde000},
- {0x43ce0000}, {0x43ce2000}, {0x43ce4000}, {0x43ce6000},
- {0x43ce8000}, {0x43cea000}, {0x43cec000}, {0x43cee000},
- {0x43cf0000}, {0x43cf2000}, {0x43cf4000}, {0x43cf6000},
- {0x43cf8000}, {0x43cfa000}, {0x43cfc000}, {0x43cfe000},
- {0x43d00000}, {0x43d02000}, {0x43d04000}, {0x43d06000},
- {0x43d08000}, {0x43d0a000}, {0x43d0c000}, {0x43d0e000},
- {0x43d10000}, {0x43d12000}, {0x43d14000}, {0x43d16000},
- {0x43d18000}, {0x43d1a000}, {0x43d1c000}, {0x43d1e000},
- {0x43d20000}, {0x43d22000}, {0x43d24000}, {0x43d26000},
- {0x43d28000}, {0x43d2a000}, {0x43d2c000}, {0x43d2e000},
- {0x43d30000}, {0x43d32000}, {0x43d34000}, {0x43d36000},
- {0x43d38000}, {0x43d3a000}, {0x43d3c000}, {0x43d3e000},
- {0x43d40000}, {0x43d42000}, {0x43d44000}, {0x43d46000},
- {0x43d48000}, {0x43d4a000}, {0x43d4c000}, {0x43d4e000},
- {0x43d50000}, {0x43d52000}, {0x43d54000}, {0x43d56000},
- {0x43d58000}, {0x43d5a000}, {0x43d5c000}, {0x43d5e000},
- {0x43d60000}, {0x43d62000}, {0x43d64000}, {0x43d66000},
- {0x43d68000}, {0x43d6a000}, {0x43d6c000}, {0x43d6e000},
- {0x43d70000}, {0x43d72000}, {0x43d74000}, {0x43d76000},
- {0x43d78000}, {0x43d7a000}, {0x43d7c000}, {0x43d7e000},
- {0x43d80000}, {0x43d82000}, {0x43d84000}, {0x43d86000},
- {0x43d88000}, {0x43d8a000}, {0x43d8c000}, {0x43d8e000},
- {0x43d90000}, {0x43d92000}, {0x43d94000}, {0x43d96000},
- {0x43d98000}, {0x43d9a000}, {0x43d9c000}, {0x43d9e000},
- {0x43da0000}, {0x43da2000}, {0x43da4000}, {0x43da6000},
- {0x43da8000}, {0x43daa000}, {0x43dac000}, {0x43dae000},
- {0x43db0000}, {0x43db2000}, {0x43db4000}, {0x43db6000},
- {0x43db8000}, {0x43dba000}, {0x43dbc000}, {0x43dbe000},
- {0x43dc0000}, {0x43dc2000}, {0x43dc4000}, {0x43dc6000},
- {0x43dc8000}, {0x43dca000}, {0x43dcc000}, {0x43dce000},
- {0x43dd0000}, {0x43dd2000}, {0x43dd4000}, {0x43dd6000},
- {0x43dd8000}, {0x43dda000}, {0x43ddc000}, {0x43dde000},
- {0x43de0000}, {0x43de2000}, {0x43de4000}, {0x43de6000},
- {0x43de8000}, {0x43dea000}, {0x43dec000}, {0x43dee000},
- {0x43df0000}, {0x43df2000}, {0x43df4000}, {0x43df6000},
- {0x43df8000}, {0x43dfa000}, {0x43dfc000}, {0x43dfe000},
- {0x43e00000}, {0x43e02000}, {0x43e04000}, {0x43e06000},
- {0x43e08000}, {0x43e0a000}, {0x43e0c000}, {0x43e0e000},
- {0x43e10000}, {0x43e12000}, {0x43e14000}, {0x43e16000},
- {0x43e18000}, {0x43e1a000}, {0x43e1c000}, {0x43e1e000},
- {0x43e20000}, {0x43e22000}, {0x43e24000}, {0x43e26000},
- {0x43e28000}, {0x43e2a000}, {0x43e2c000}, {0x43e2e000},
- {0x43e30000}, {0x43e32000}, {0x43e34000}, {0x43e36000},
- {0x43e38000}, {0x43e3a000}, {0x43e3c000}, {0x43e3e000},
- {0x43e40000}, {0x43e42000}, {0x43e44000}, {0x43e46000},
- {0x43e48000}, {0x43e4a000}, {0x43e4c000}, {0x43e4e000},
- {0x43e50000}, {0x43e52000}, {0x43e54000}, {0x43e56000},
- {0x43e58000}, {0x43e5a000}, {0x43e5c000}, {0x43e5e000},
- {0x43e60000}, {0x43e62000}, {0x43e64000}, {0x43e66000},
- {0x43e68000}, {0x43e6a000}, {0x43e6c000}, {0x43e6e000},
- {0x43e70000}, {0x43e72000}, {0x43e74000}, {0x43e76000},
- {0x43e78000}, {0x43e7a000}, {0x43e7c000}, {0x43e7e000},
- {0x43e80000}, {0x43e82000}, {0x43e84000}, {0x43e86000},
- {0x43e88000}, {0x43e8a000}, {0x43e8c000}, {0x43e8e000},
- {0x43e90000}, {0x43e92000}, {0x43e94000}, {0x43e96000},
- {0x43e98000}, {0x43e9a000}, {0x43e9c000}, {0x43e9e000},
- {0x43ea0000}, {0x43ea2000}, {0x43ea4000}, {0x43ea6000},
- {0x43ea8000}, {0x43eaa000}, {0x43eac000}, {0x43eae000},
- {0x43eb0000}, {0x43eb2000}, {0x43eb4000}, {0x43eb6000},
- {0x43eb8000}, {0x43eba000}, {0x43ebc000}, {0x43ebe000},
- {0x43ec0000}, {0x43ec2000}, {0x43ec4000}, {0x43ec6000},
- {0x43ec8000}, {0x43eca000}, {0x43ecc000}, {0x43ece000},
- {0x43ed0000}, {0x43ed2000}, {0x43ed4000}, {0x43ed6000},
- {0x43ed8000}, {0x43eda000}, {0x43edc000}, {0x43ede000},
- {0x43ee0000}, {0x43ee2000}, {0x43ee4000}, {0x43ee6000},
- {0x43ee8000}, {0x43eea000}, {0x43eec000}, {0x43eee000},
- {0x43ef0000}, {0x43ef2000}, {0x43ef4000}, {0x43ef6000},
- {0x43ef8000}, {0x43efa000}, {0x43efc000}, {0x43efe000},
- {0x43f00000}, {0x43f02000}, {0x43f04000}, {0x43f06000},
- {0x43f08000}, {0x43f0a000}, {0x43f0c000}, {0x43f0e000},
- {0x43f10000}, {0x43f12000}, {0x43f14000}, {0x43f16000},
- {0x43f18000}, {0x43f1a000}, {0x43f1c000}, {0x43f1e000},
- {0x43f20000}, {0x43f22000}, {0x43f24000}, {0x43f26000},
- {0x43f28000}, {0x43f2a000}, {0x43f2c000}, {0x43f2e000},
- {0x43f30000}, {0x43f32000}, {0x43f34000}, {0x43f36000},
- {0x43f38000}, {0x43f3a000}, {0x43f3c000}, {0x43f3e000},
- {0x43f40000}, {0x43f42000}, {0x43f44000}, {0x43f46000},
- {0x43f48000}, {0x43f4a000}, {0x43f4c000}, {0x43f4e000},
- {0x43f50000}, {0x43f52000}, {0x43f54000}, {0x43f56000},
- {0x43f58000}, {0x43f5a000}, {0x43f5c000}, {0x43f5e000},
- {0x43f60000}, {0x43f62000}, {0x43f64000}, {0x43f66000},
- {0x43f68000}, {0x43f6a000}, {0x43f6c000}, {0x43f6e000},
- {0x43f70000}, {0x43f72000}, {0x43f74000}, {0x43f76000},
- {0x43f78000}, {0x43f7a000}, {0x43f7c000}, {0x43f7e000},
- {0x43f80000}, {0x43f82000}, {0x43f84000}, {0x43f86000},
- {0x43f88000}, {0x43f8a000}, {0x43f8c000}, {0x43f8e000},
- {0x43f90000}, {0x43f92000}, {0x43f94000}, {0x43f96000},
- {0x43f98000}, {0x43f9a000}, {0x43f9c000}, {0x43f9e000},
- {0x43fa0000}, {0x43fa2000}, {0x43fa4000}, {0x43fa6000},
- {0x43fa8000}, {0x43faa000}, {0x43fac000}, {0x43fae000},
- {0x43fb0000}, {0x43fb2000}, {0x43fb4000}, {0x43fb6000},
- {0x43fb8000}, {0x43fba000}, {0x43fbc000}, {0x43fbe000},
- {0x43fc0000}, {0x43fc2000}, {0x43fc4000}, {0x43fc6000},
- {0x43fc8000}, {0x43fca000}, {0x43fcc000}, {0x43fce000},
- {0x43fd0000}, {0x43fd2000}, {0x43fd4000}, {0x43fd6000},
- {0x43fd8000}, {0x43fda000}, {0x43fdc000}, {0x43fde000},
- {0x43fe0000}, {0x43fe2000}, {0x43fe4000}, {0x43fe6000},
- {0x43fe8000}, {0x43fea000}, {0x43fec000}, {0x43fee000},
- {0x43ff0000}, {0x43ff2000}, {0x43ff4000}, {0x43ff6000},
- {0x43ff8000}, {0x43ffa000}, {0x43ffc000}, {0x43ffe000},
- {0x44000000}, {0x44002000}, {0x44004000}, {0x44006000},
- {0x44008000}, {0x4400a000}, {0x4400c000}, {0x4400e000},
- {0x44010000}, {0x44012000}, {0x44014000}, {0x44016000},
- {0x44018000}, {0x4401a000}, {0x4401c000}, {0x4401e000},
- {0x44020000}, {0x44022000}, {0x44024000}, {0x44026000},
- {0x44028000}, {0x4402a000}, {0x4402c000}, {0x4402e000},
- {0x44030000}, {0x44032000}, {0x44034000}, {0x44036000},
- {0x44038000}, {0x4403a000}, {0x4403c000}, {0x4403e000},
- {0x44040000}, {0x44042000}, {0x44044000}, {0x44046000},
- {0x44048000}, {0x4404a000}, {0x4404c000}, {0x4404e000},
- {0x44050000}, {0x44052000}, {0x44054000}, {0x44056000},
- {0x44058000}, {0x4405a000}, {0x4405c000}, {0x4405e000},
- {0x44060000}, {0x44062000}, {0x44064000}, {0x44066000},
- {0x44068000}, {0x4406a000}, {0x4406c000}, {0x4406e000},
- {0x44070000}, {0x44072000}, {0x44074000}, {0x44076000},
- {0x44078000}, {0x4407a000}, {0x4407c000}, {0x4407e000},
- {0x44080000}, {0x44082000}, {0x44084000}, {0x44086000},
- {0x44088000}, {0x4408a000}, {0x4408c000}, {0x4408e000},
- {0x44090000}, {0x44092000}, {0x44094000}, {0x44096000},
- {0x44098000}, {0x4409a000}, {0x4409c000}, {0x4409e000},
- {0x440a0000}, {0x440a2000}, {0x440a4000}, {0x440a6000},
- {0x440a8000}, {0x440aa000}, {0x440ac000}, {0x440ae000},
- {0x440b0000}, {0x440b2000}, {0x440b4000}, {0x440b6000},
- {0x440b8000}, {0x440ba000}, {0x440bc000}, {0x440be000},
- {0x440c0000}, {0x440c2000}, {0x440c4000}, {0x440c6000},
- {0x440c8000}, {0x440ca000}, {0x440cc000}, {0x440ce000},
- {0x440d0000}, {0x440d2000}, {0x440d4000}, {0x440d6000},
- {0x440d8000}, {0x440da000}, {0x440dc000}, {0x440de000},
- {0x440e0000}, {0x440e2000}, {0x440e4000}, {0x440e6000},
- {0x440e8000}, {0x440ea000}, {0x440ec000}, {0x440ee000},
- {0x440f0000}, {0x440f2000}, {0x440f4000}, {0x440f6000},
- {0x440f8000}, {0x440fa000}, {0x440fc000}, {0x440fe000},
- {0x44100000}, {0x44102000}, {0x44104000}, {0x44106000},
- {0x44108000}, {0x4410a000}, {0x4410c000}, {0x4410e000},
- {0x44110000}, {0x44112000}, {0x44114000}, {0x44116000},
- {0x44118000}, {0x4411a000}, {0x4411c000}, {0x4411e000},
- {0x44120000}, {0x44122000}, {0x44124000}, {0x44126000},
- {0x44128000}, {0x4412a000}, {0x4412c000}, {0x4412e000},
- {0x44130000}, {0x44132000}, {0x44134000}, {0x44136000},
- {0x44138000}, {0x4413a000}, {0x4413c000}, {0x4413e000},
- {0x44140000}, {0x44142000}, {0x44144000}, {0x44146000},
- {0x44148000}, {0x4414a000}, {0x4414c000}, {0x4414e000},
- {0x44150000}, {0x44152000}, {0x44154000}, {0x44156000},
- {0x44158000}, {0x4415a000}, {0x4415c000}, {0x4415e000},
- {0x44160000}, {0x44162000}, {0x44164000}, {0x44166000},
- {0x44168000}, {0x4416a000}, {0x4416c000}, {0x4416e000},
- {0x44170000}, {0x44172000}, {0x44174000}, {0x44176000},
- {0x44178000}, {0x4417a000}, {0x4417c000}, {0x4417e000},
- {0x44180000}, {0x44182000}, {0x44184000}, {0x44186000},
- {0x44188000}, {0x4418a000}, {0x4418c000}, {0x4418e000},
- {0x44190000}, {0x44192000}, {0x44194000}, {0x44196000},
- {0x44198000}, {0x4419a000}, {0x4419c000}, {0x4419e000},
- {0x441a0000}, {0x441a2000}, {0x441a4000}, {0x441a6000},
- {0x441a8000}, {0x441aa000}, {0x441ac000}, {0x441ae000},
- {0x441b0000}, {0x441b2000}, {0x441b4000}, {0x441b6000},
- {0x441b8000}, {0x441ba000}, {0x441bc000}, {0x441be000},
- {0x441c0000}, {0x441c2000}, {0x441c4000}, {0x441c6000},
- {0x441c8000}, {0x441ca000}, {0x441cc000}, {0x441ce000},
- {0x441d0000}, {0x441d2000}, {0x441d4000}, {0x441d6000},
- {0x441d8000}, {0x441da000}, {0x441dc000}, {0x441de000},
- {0x441e0000}, {0x441e2000}, {0x441e4000}, {0x441e6000},
- {0x441e8000}, {0x441ea000}, {0x441ec000}, {0x441ee000},
- {0x441f0000}, {0x441f2000}, {0x441f4000}, {0x441f6000},
- {0x441f8000}, {0x441fa000}, {0x441fc000}, {0x441fe000},
- {0x44200000}, {0x44202000}, {0x44204000}, {0x44206000},
- {0x44208000}, {0x4420a000}, {0x4420c000}, {0x4420e000},
- {0x44210000}, {0x44212000}, {0x44214000}, {0x44216000},
- {0x44218000}, {0x4421a000}, {0x4421c000}, {0x4421e000},
- {0x44220000}, {0x44222000}, {0x44224000}, {0x44226000},
- {0x44228000}, {0x4422a000}, {0x4422c000}, {0x4422e000},
- {0x44230000}, {0x44232000}, {0x44234000}, {0x44236000},
- {0x44238000}, {0x4423a000}, {0x4423c000}, {0x4423e000},
- {0x44240000}, {0x44242000}, {0x44244000}, {0x44246000},
- {0x44248000}, {0x4424a000}, {0x4424c000}, {0x4424e000},
- {0x44250000}, {0x44252000}, {0x44254000}, {0x44256000},
- {0x44258000}, {0x4425a000}, {0x4425c000}, {0x4425e000},
- {0x44260000}, {0x44262000}, {0x44264000}, {0x44266000},
- {0x44268000}, {0x4426a000}, {0x4426c000}, {0x4426e000},
- {0x44270000}, {0x44272000}, {0x44274000}, {0x44276000},
- {0x44278000}, {0x4427a000}, {0x4427c000}, {0x4427e000},
- {0x44280000}, {0x44282000}, {0x44284000}, {0x44286000},
- {0x44288000}, {0x4428a000}, {0x4428c000}, {0x4428e000},
- {0x44290000}, {0x44292000}, {0x44294000}, {0x44296000},
- {0x44298000}, {0x4429a000}, {0x4429c000}, {0x4429e000},
- {0x442a0000}, {0x442a2000}, {0x442a4000}, {0x442a6000},
- {0x442a8000}, {0x442aa000}, {0x442ac000}, {0x442ae000},
- {0x442b0000}, {0x442b2000}, {0x442b4000}, {0x442b6000},
- {0x442b8000}, {0x442ba000}, {0x442bc000}, {0x442be000},
- {0x442c0000}, {0x442c2000}, {0x442c4000}, {0x442c6000},
- {0x442c8000}, {0x442ca000}, {0x442cc000}, {0x442ce000},
- {0x442d0000}, {0x442d2000}, {0x442d4000}, {0x442d6000},
- {0x442d8000}, {0x442da000}, {0x442dc000}, {0x442de000},
- {0x442e0000}, {0x442e2000}, {0x442e4000}, {0x442e6000},
- {0x442e8000}, {0x442ea000}, {0x442ec000}, {0x442ee000},
- {0x442f0000}, {0x442f2000}, {0x442f4000}, {0x442f6000},
- {0x442f8000}, {0x442fa000}, {0x442fc000}, {0x442fe000},
- {0x44300000}, {0x44302000}, {0x44304000}, {0x44306000},
- {0x44308000}, {0x4430a000}, {0x4430c000}, {0x4430e000},
- {0x44310000}, {0x44312000}, {0x44314000}, {0x44316000},
- {0x44318000}, {0x4431a000}, {0x4431c000}, {0x4431e000},
- {0x44320000}, {0x44322000}, {0x44324000}, {0x44326000},
- {0x44328000}, {0x4432a000}, {0x4432c000}, {0x4432e000},
- {0x44330000}, {0x44332000}, {0x44334000}, {0x44336000},
- {0x44338000}, {0x4433a000}, {0x4433c000}, {0x4433e000},
- {0x44340000}, {0x44342000}, {0x44344000}, {0x44346000},
- {0x44348000}, {0x4434a000}, {0x4434c000}, {0x4434e000},
- {0x44350000}, {0x44352000}, {0x44354000}, {0x44356000},
- {0x44358000}, {0x4435a000}, {0x4435c000}, {0x4435e000},
- {0x44360000}, {0x44362000}, {0x44364000}, {0x44366000},
- {0x44368000}, {0x4436a000}, {0x4436c000}, {0x4436e000},
- {0x44370000}, {0x44372000}, {0x44374000}, {0x44376000},
- {0x44378000}, {0x4437a000}, {0x4437c000}, {0x4437e000},
- {0x44380000}, {0x44382000}, {0x44384000}, {0x44386000},
- {0x44388000}, {0x4438a000}, {0x4438c000}, {0x4438e000},
- {0x44390000}, {0x44392000}, {0x44394000}, {0x44396000},
- {0x44398000}, {0x4439a000}, {0x4439c000}, {0x4439e000},
- {0x443a0000}, {0x443a2000}, {0x443a4000}, {0x443a6000},
- {0x443a8000}, {0x443aa000}, {0x443ac000}, {0x443ae000},
- {0x443b0000}, {0x443b2000}, {0x443b4000}, {0x443b6000},
- {0x443b8000}, {0x443ba000}, {0x443bc000}, {0x443be000},
- {0x443c0000}, {0x443c2000}, {0x443c4000}, {0x443c6000},
- {0x443c8000}, {0x443ca000}, {0x443cc000}, {0x443ce000},
- {0x443d0000}, {0x443d2000}, {0x443d4000}, {0x443d6000},
- {0x443d8000}, {0x443da000}, {0x443dc000}, {0x443de000},
- {0x443e0000}, {0x443e2000}, {0x443e4000}, {0x443e6000},
- {0x443e8000}, {0x443ea000}, {0x443ec000}, {0x443ee000},
- {0x443f0000}, {0x443f2000}, {0x443f4000}, {0x443f6000},
- {0x443f8000}, {0x443fa000}, {0x443fc000}, {0x443fe000},
- {0x44400000}, {0x44402000}, {0x44404000}, {0x44406000},
- {0x44408000}, {0x4440a000}, {0x4440c000}, {0x4440e000},
- {0x44410000}, {0x44412000}, {0x44414000}, {0x44416000},
- {0x44418000}, {0x4441a000}, {0x4441c000}, {0x4441e000},
- {0x44420000}, {0x44422000}, {0x44424000}, {0x44426000},
- {0x44428000}, {0x4442a000}, {0x4442c000}, {0x4442e000},
- {0x44430000}, {0x44432000}, {0x44434000}, {0x44436000},
- {0x44438000}, {0x4443a000}, {0x4443c000}, {0x4443e000},
- {0x44440000}, {0x44442000}, {0x44444000}, {0x44446000},
- {0x44448000}, {0x4444a000}, {0x4444c000}, {0x4444e000},
- {0x44450000}, {0x44452000}, {0x44454000}, {0x44456000},
- {0x44458000}, {0x4445a000}, {0x4445c000}, {0x4445e000},
- {0x44460000}, {0x44462000}, {0x44464000}, {0x44466000},
- {0x44468000}, {0x4446a000}, {0x4446c000}, {0x4446e000},
- {0x44470000}, {0x44472000}, {0x44474000}, {0x44476000},
- {0x44478000}, {0x4447a000}, {0x4447c000}, {0x4447e000},
- {0x44480000}, {0x44482000}, {0x44484000}, {0x44486000},
- {0x44488000}, {0x4448a000}, {0x4448c000}, {0x4448e000},
- {0x44490000}, {0x44492000}, {0x44494000}, {0x44496000},
- {0x44498000}, {0x4449a000}, {0x4449c000}, {0x4449e000},
- {0x444a0000}, {0x444a2000}, {0x444a4000}, {0x444a6000},
- {0x444a8000}, {0x444aa000}, {0x444ac000}, {0x444ae000},
- {0x444b0000}, {0x444b2000}, {0x444b4000}, {0x444b6000},
- {0x444b8000}, {0x444ba000}, {0x444bc000}, {0x444be000},
- {0x444c0000}, {0x444c2000}, {0x444c4000}, {0x444c6000},
- {0x444c8000}, {0x444ca000}, {0x444cc000}, {0x444ce000},
- {0x444d0000}, {0x444d2000}, {0x444d4000}, {0x444d6000},
- {0x444d8000}, {0x444da000}, {0x444dc000}, {0x444de000},
- {0x444e0000}, {0x444e2000}, {0x444e4000}, {0x444e6000},
- {0x444e8000}, {0x444ea000}, {0x444ec000}, {0x444ee000},
- {0x444f0000}, {0x444f2000}, {0x444f4000}, {0x444f6000},
- {0x444f8000}, {0x444fa000}, {0x444fc000}, {0x444fe000},
- {0x44500000}, {0x44502000}, {0x44504000}, {0x44506000},
- {0x44508000}, {0x4450a000}, {0x4450c000}, {0x4450e000},
- {0x44510000}, {0x44512000}, {0x44514000}, {0x44516000},
- {0x44518000}, {0x4451a000}, {0x4451c000}, {0x4451e000},
- {0x44520000}, {0x44522000}, {0x44524000}, {0x44526000},
- {0x44528000}, {0x4452a000}, {0x4452c000}, {0x4452e000},
- {0x44530000}, {0x44532000}, {0x44534000}, {0x44536000},
- {0x44538000}, {0x4453a000}, {0x4453c000}, {0x4453e000},
- {0x44540000}, {0x44542000}, {0x44544000}, {0x44546000},
- {0x44548000}, {0x4454a000}, {0x4454c000}, {0x4454e000},
- {0x44550000}, {0x44552000}, {0x44554000}, {0x44556000},
- {0x44558000}, {0x4455a000}, {0x4455c000}, {0x4455e000},
- {0x44560000}, {0x44562000}, {0x44564000}, {0x44566000},
- {0x44568000}, {0x4456a000}, {0x4456c000}, {0x4456e000},
- {0x44570000}, {0x44572000}, {0x44574000}, {0x44576000},
- {0x44578000}, {0x4457a000}, {0x4457c000}, {0x4457e000},
- {0x44580000}, {0x44582000}, {0x44584000}, {0x44586000},
- {0x44588000}, {0x4458a000}, {0x4458c000}, {0x4458e000},
- {0x44590000}, {0x44592000}, {0x44594000}, {0x44596000},
- {0x44598000}, {0x4459a000}, {0x4459c000}, {0x4459e000},
- {0x445a0000}, {0x445a2000}, {0x445a4000}, {0x445a6000},
- {0x445a8000}, {0x445aa000}, {0x445ac000}, {0x445ae000},
- {0x445b0000}, {0x445b2000}, {0x445b4000}, {0x445b6000},
- {0x445b8000}, {0x445ba000}, {0x445bc000}, {0x445be000},
- {0x445c0000}, {0x445c2000}, {0x445c4000}, {0x445c6000},
- {0x445c8000}, {0x445ca000}, {0x445cc000}, {0x445ce000},
- {0x445d0000}, {0x445d2000}, {0x445d4000}, {0x445d6000},
- {0x445d8000}, {0x445da000}, {0x445dc000}, {0x445de000},
- {0x445e0000}, {0x445e2000}, {0x445e4000}, {0x445e6000},
- {0x445e8000}, {0x445ea000}, {0x445ec000}, {0x445ee000},
- {0x445f0000}, {0x445f2000}, {0x445f4000}, {0x445f6000},
- {0x445f8000}, {0x445fa000}, {0x445fc000}, {0x445fe000},
- {0x44600000}, {0x44602000}, {0x44604000}, {0x44606000},
- {0x44608000}, {0x4460a000}, {0x4460c000}, {0x4460e000},
- {0x44610000}, {0x44612000}, {0x44614000}, {0x44616000},
- {0x44618000}, {0x4461a000}, {0x4461c000}, {0x4461e000},
- {0x44620000}, {0x44622000}, {0x44624000}, {0x44626000},
- {0x44628000}, {0x4462a000}, {0x4462c000}, {0x4462e000},
- {0x44630000}, {0x44632000}, {0x44634000}, {0x44636000},
- {0x44638000}, {0x4463a000}, {0x4463c000}, {0x4463e000},
- {0x44640000}, {0x44642000}, {0x44644000}, {0x44646000},
- {0x44648000}, {0x4464a000}, {0x4464c000}, {0x4464e000},
- {0x44650000}, {0x44652000}, {0x44654000}, {0x44656000},
- {0x44658000}, {0x4465a000}, {0x4465c000}, {0x4465e000},
- {0x44660000}, {0x44662000}, {0x44664000}, {0x44666000},
- {0x44668000}, {0x4466a000}, {0x4466c000}, {0x4466e000},
- {0x44670000}, {0x44672000}, {0x44674000}, {0x44676000},
- {0x44678000}, {0x4467a000}, {0x4467c000}, {0x4467e000},
- {0x44680000}, {0x44682000}, {0x44684000}, {0x44686000},
- {0x44688000}, {0x4468a000}, {0x4468c000}, {0x4468e000},
- {0x44690000}, {0x44692000}, {0x44694000}, {0x44696000},
- {0x44698000}, {0x4469a000}, {0x4469c000}, {0x4469e000},
- {0x446a0000}, {0x446a2000}, {0x446a4000}, {0x446a6000},
- {0x446a8000}, {0x446aa000}, {0x446ac000}, {0x446ae000},
- {0x446b0000}, {0x446b2000}, {0x446b4000}, {0x446b6000},
- {0x446b8000}, {0x446ba000}, {0x446bc000}, {0x446be000},
- {0x446c0000}, {0x446c2000}, {0x446c4000}, {0x446c6000},
- {0x446c8000}, {0x446ca000}, {0x446cc000}, {0x446ce000},
- {0x446d0000}, {0x446d2000}, {0x446d4000}, {0x446d6000},
- {0x446d8000}, {0x446da000}, {0x446dc000}, {0x446de000},
- {0x446e0000}, {0x446e2000}, {0x446e4000}, {0x446e6000},
- {0x446e8000}, {0x446ea000}, {0x446ec000}, {0x446ee000},
- {0x446f0000}, {0x446f2000}, {0x446f4000}, {0x446f6000},
- {0x446f8000}, {0x446fa000}, {0x446fc000}, {0x446fe000},
- {0x44700000}, {0x44702000}, {0x44704000}, {0x44706000},
- {0x44708000}, {0x4470a000}, {0x4470c000}, {0x4470e000},
- {0x44710000}, {0x44712000}, {0x44714000}, {0x44716000},
- {0x44718000}, {0x4471a000}, {0x4471c000}, {0x4471e000},
- {0x44720000}, {0x44722000}, {0x44724000}, {0x44726000},
- {0x44728000}, {0x4472a000}, {0x4472c000}, {0x4472e000},
- {0x44730000}, {0x44732000}, {0x44734000}, {0x44736000},
- {0x44738000}, {0x4473a000}, {0x4473c000}, {0x4473e000},
- {0x44740000}, {0x44742000}, {0x44744000}, {0x44746000},
- {0x44748000}, {0x4474a000}, {0x4474c000}, {0x4474e000},
- {0x44750000}, {0x44752000}, {0x44754000}, {0x44756000},
- {0x44758000}, {0x4475a000}, {0x4475c000}, {0x4475e000},
- {0x44760000}, {0x44762000}, {0x44764000}, {0x44766000},
- {0x44768000}, {0x4476a000}, {0x4476c000}, {0x4476e000},
- {0x44770000}, {0x44772000}, {0x44774000}, {0x44776000},
- {0x44778000}, {0x4477a000}, {0x4477c000}, {0x4477e000},
- {0x44780000}, {0x44782000}, {0x44784000}, {0x44786000},
- {0x44788000}, {0x4478a000}, {0x4478c000}, {0x4478e000},
- {0x44790000}, {0x44792000}, {0x44794000}, {0x44796000},
- {0x44798000}, {0x4479a000}, {0x4479c000}, {0x4479e000},
- {0x447a0000}, {0x447a2000}, {0x447a4000}, {0x447a6000},
- {0x447a8000}, {0x447aa000}, {0x447ac000}, {0x447ae000},
- {0x447b0000}, {0x447b2000}, {0x447b4000}, {0x447b6000},
- {0x447b8000}, {0x447ba000}, {0x447bc000}, {0x447be000},
- {0x447c0000}, {0x447c2000}, {0x447c4000}, {0x447c6000},
- {0x447c8000}, {0x447ca000}, {0x447cc000}, {0x447ce000},
- {0x447d0000}, {0x447d2000}, {0x447d4000}, {0x447d6000},
- {0x447d8000}, {0x447da000}, {0x447dc000}, {0x447de000},
- {0x447e0000}, {0x447e2000}, {0x447e4000}, {0x447e6000},
- {0x447e8000}, {0x447ea000}, {0x447ec000}, {0x447ee000},
- {0x447f0000}, {0x447f2000}, {0x447f4000}, {0x447f6000},
- {0x447f8000}, {0x447fa000}, {0x447fc000}, {0x447fe000},
- {0x44800000}, {0x44802000}, {0x44804000}, {0x44806000},
- {0x44808000}, {0x4480a000}, {0x4480c000}, {0x4480e000},
- {0x44810000}, {0x44812000}, {0x44814000}, {0x44816000},
- {0x44818000}, {0x4481a000}, {0x4481c000}, {0x4481e000},
- {0x44820000}, {0x44822000}, {0x44824000}, {0x44826000},
- {0x44828000}, {0x4482a000}, {0x4482c000}, {0x4482e000},
- {0x44830000}, {0x44832000}, {0x44834000}, {0x44836000},
- {0x44838000}, {0x4483a000}, {0x4483c000}, {0x4483e000},
- {0x44840000}, {0x44842000}, {0x44844000}, {0x44846000},
- {0x44848000}, {0x4484a000}, {0x4484c000}, {0x4484e000},
- {0x44850000}, {0x44852000}, {0x44854000}, {0x44856000},
- {0x44858000}, {0x4485a000}, {0x4485c000}, {0x4485e000},
- {0x44860000}, {0x44862000}, {0x44864000}, {0x44866000},
- {0x44868000}, {0x4486a000}, {0x4486c000}, {0x4486e000},
- {0x44870000}, {0x44872000}, {0x44874000}, {0x44876000},
- {0x44878000}, {0x4487a000}, {0x4487c000}, {0x4487e000},
- {0x44880000}, {0x44882000}, {0x44884000}, {0x44886000},
- {0x44888000}, {0x4488a000}, {0x4488c000}, {0x4488e000},
- {0x44890000}, {0x44892000}, {0x44894000}, {0x44896000},
- {0x44898000}, {0x4489a000}, {0x4489c000}, {0x4489e000},
- {0x448a0000}, {0x448a2000}, {0x448a4000}, {0x448a6000},
- {0x448a8000}, {0x448aa000}, {0x448ac000}, {0x448ae000},
- {0x448b0000}, {0x448b2000}, {0x448b4000}, {0x448b6000},
- {0x448b8000}, {0x448ba000}, {0x448bc000}, {0x448be000},
- {0x448c0000}, {0x448c2000}, {0x448c4000}, {0x448c6000},
- {0x448c8000}, {0x448ca000}, {0x448cc000}, {0x448ce000},
- {0x448d0000}, {0x448d2000}, {0x448d4000}, {0x448d6000},
- {0x448d8000}, {0x448da000}, {0x448dc000}, {0x448de000},
- {0x448e0000}, {0x448e2000}, {0x448e4000}, {0x448e6000},
- {0x448e8000}, {0x448ea000}, {0x448ec000}, {0x448ee000},
- {0x448f0000}, {0x448f2000}, {0x448f4000}, {0x448f6000},
- {0x448f8000}, {0x448fa000}, {0x448fc000}, {0x448fe000},
- {0x44900000}, {0x44902000}, {0x44904000}, {0x44906000},
- {0x44908000}, {0x4490a000}, {0x4490c000}, {0x4490e000},
- {0x44910000}, {0x44912000}, {0x44914000}, {0x44916000},
- {0x44918000}, {0x4491a000}, {0x4491c000}, {0x4491e000},
- {0x44920000}, {0x44922000}, {0x44924000}, {0x44926000},
- {0x44928000}, {0x4492a000}, {0x4492c000}, {0x4492e000},
- {0x44930000}, {0x44932000}, {0x44934000}, {0x44936000},
- {0x44938000}, {0x4493a000}, {0x4493c000}, {0x4493e000},
- {0x44940000}, {0x44942000}, {0x44944000}, {0x44946000},
- {0x44948000}, {0x4494a000}, {0x4494c000}, {0x4494e000},
- {0x44950000}, {0x44952000}, {0x44954000}, {0x44956000},
- {0x44958000}, {0x4495a000}, {0x4495c000}, {0x4495e000},
- {0x44960000}, {0x44962000}, {0x44964000}, {0x44966000},
- {0x44968000}, {0x4496a000}, {0x4496c000}, {0x4496e000},
- {0x44970000}, {0x44972000}, {0x44974000}, {0x44976000},
- {0x44978000}, {0x4497a000}, {0x4497c000}, {0x4497e000},
- {0x44980000}, {0x44982000}, {0x44984000}, {0x44986000},
- {0x44988000}, {0x4498a000}, {0x4498c000}, {0x4498e000},
- {0x44990000}, {0x44992000}, {0x44994000}, {0x44996000},
- {0x44998000}, {0x4499a000}, {0x4499c000}, {0x4499e000},
- {0x449a0000}, {0x449a2000}, {0x449a4000}, {0x449a6000},
- {0x449a8000}, {0x449aa000}, {0x449ac000}, {0x449ae000},
- {0x449b0000}, {0x449b2000}, {0x449b4000}, {0x449b6000},
- {0x449b8000}, {0x449ba000}, {0x449bc000}, {0x449be000},
- {0x449c0000}, {0x449c2000}, {0x449c4000}, {0x449c6000},
- {0x449c8000}, {0x449ca000}, {0x449cc000}, {0x449ce000},
- {0x449d0000}, {0x449d2000}, {0x449d4000}, {0x449d6000},
- {0x449d8000}, {0x449da000}, {0x449dc000}, {0x449de000},
- {0x449e0000}, {0x449e2000}, {0x449e4000}, {0x449e6000},
- {0x449e8000}, {0x449ea000}, {0x449ec000}, {0x449ee000},
- {0x449f0000}, {0x449f2000}, {0x449f4000}, {0x449f6000},
- {0x449f8000}, {0x449fa000}, {0x449fc000}, {0x449fe000},
- {0x44a00000}, {0x44a02000}, {0x44a04000}, {0x44a06000},
- {0x44a08000}, {0x44a0a000}, {0x44a0c000}, {0x44a0e000},
- {0x44a10000}, {0x44a12000}, {0x44a14000}, {0x44a16000},
- {0x44a18000}, {0x44a1a000}, {0x44a1c000}, {0x44a1e000},
- {0x44a20000}, {0x44a22000}, {0x44a24000}, {0x44a26000},
- {0x44a28000}, {0x44a2a000}, {0x44a2c000}, {0x44a2e000},
- {0x44a30000}, {0x44a32000}, {0x44a34000}, {0x44a36000},
- {0x44a38000}, {0x44a3a000}, {0x44a3c000}, {0x44a3e000},
- {0x44a40000}, {0x44a42000}, {0x44a44000}, {0x44a46000},
- {0x44a48000}, {0x44a4a000}, {0x44a4c000}, {0x44a4e000},
- {0x44a50000}, {0x44a52000}, {0x44a54000}, {0x44a56000},
- {0x44a58000}, {0x44a5a000}, {0x44a5c000}, {0x44a5e000},
- {0x44a60000}, {0x44a62000}, {0x44a64000}, {0x44a66000},
- {0x44a68000}, {0x44a6a000}, {0x44a6c000}, {0x44a6e000},
- {0x44a70000}, {0x44a72000}, {0x44a74000}, {0x44a76000},
- {0x44a78000}, {0x44a7a000}, {0x44a7c000}, {0x44a7e000},
- {0x44a80000}, {0x44a82000}, {0x44a84000}, {0x44a86000},
- {0x44a88000}, {0x44a8a000}, {0x44a8c000}, {0x44a8e000},
- {0x44a90000}, {0x44a92000}, {0x44a94000}, {0x44a96000},
- {0x44a98000}, {0x44a9a000}, {0x44a9c000}, {0x44a9e000},
- {0x44aa0000}, {0x44aa2000}, {0x44aa4000}, {0x44aa6000},
- {0x44aa8000}, {0x44aaa000}, {0x44aac000}, {0x44aae000},
- {0x44ab0000}, {0x44ab2000}, {0x44ab4000}, {0x44ab6000},
- {0x44ab8000}, {0x44aba000}, {0x44abc000}, {0x44abe000},
- {0x44ac0000}, {0x44ac2000}, {0x44ac4000}, {0x44ac6000},
- {0x44ac8000}, {0x44aca000}, {0x44acc000}, {0x44ace000},
- {0x44ad0000}, {0x44ad2000}, {0x44ad4000}, {0x44ad6000},
- {0x44ad8000}, {0x44ada000}, {0x44adc000}, {0x44ade000},
- {0x44ae0000}, {0x44ae2000}, {0x44ae4000}, {0x44ae6000},
- {0x44ae8000}, {0x44aea000}, {0x44aec000}, {0x44aee000},
- {0x44af0000}, {0x44af2000}, {0x44af4000}, {0x44af6000},
- {0x44af8000}, {0x44afa000}, {0x44afc000}, {0x44afe000},
- {0x44b00000}, {0x44b02000}, {0x44b04000}, {0x44b06000},
- {0x44b08000}, {0x44b0a000}, {0x44b0c000}, {0x44b0e000},
- {0x44b10000}, {0x44b12000}, {0x44b14000}, {0x44b16000},
- {0x44b18000}, {0x44b1a000}, {0x44b1c000}, {0x44b1e000},
- {0x44b20000}, {0x44b22000}, {0x44b24000}, {0x44b26000},
- {0x44b28000}, {0x44b2a000}, {0x44b2c000}, {0x44b2e000},
- {0x44b30000}, {0x44b32000}, {0x44b34000}, {0x44b36000},
- {0x44b38000}, {0x44b3a000}, {0x44b3c000}, {0x44b3e000},
- {0x44b40000}, {0x44b42000}, {0x44b44000}, {0x44b46000},
- {0x44b48000}, {0x44b4a000}, {0x44b4c000}, {0x44b4e000},
- {0x44b50000}, {0x44b52000}, {0x44b54000}, {0x44b56000},
- {0x44b58000}, {0x44b5a000}, {0x44b5c000}, {0x44b5e000},
- {0x44b60000}, {0x44b62000}, {0x44b64000}, {0x44b66000},
- {0x44b68000}, {0x44b6a000}, {0x44b6c000}, {0x44b6e000},
- {0x44b70000}, {0x44b72000}, {0x44b74000}, {0x44b76000},
- {0x44b78000}, {0x44b7a000}, {0x44b7c000}, {0x44b7e000},
- {0x44b80000}, {0x44b82000}, {0x44b84000}, {0x44b86000},
- {0x44b88000}, {0x44b8a000}, {0x44b8c000}, {0x44b8e000},
- {0x44b90000}, {0x44b92000}, {0x44b94000}, {0x44b96000},
- {0x44b98000}, {0x44b9a000}, {0x44b9c000}, {0x44b9e000},
- {0x44ba0000}, {0x44ba2000}, {0x44ba4000}, {0x44ba6000},
- {0x44ba8000}, {0x44baa000}, {0x44bac000}, {0x44bae000},
- {0x44bb0000}, {0x44bb2000}, {0x44bb4000}, {0x44bb6000},
- {0x44bb8000}, {0x44bba000}, {0x44bbc000}, {0x44bbe000},
- {0x44bc0000}, {0x44bc2000}, {0x44bc4000}, {0x44bc6000},
- {0x44bc8000}, {0x44bca000}, {0x44bcc000}, {0x44bce000},
- {0x44bd0000}, {0x44bd2000}, {0x44bd4000}, {0x44bd6000},
- {0x44bd8000}, {0x44bda000}, {0x44bdc000}, {0x44bde000},
- {0x44be0000}, {0x44be2000}, {0x44be4000}, {0x44be6000},
- {0x44be8000}, {0x44bea000}, {0x44bec000}, {0x44bee000},
- {0x44bf0000}, {0x44bf2000}, {0x44bf4000}, {0x44bf6000},
- {0x44bf8000}, {0x44bfa000}, {0x44bfc000}, {0x44bfe000},
- {0x44c00000}, {0x44c02000}, {0x44c04000}, {0x44c06000},
- {0x44c08000}, {0x44c0a000}, {0x44c0c000}, {0x44c0e000},
- {0x44c10000}, {0x44c12000}, {0x44c14000}, {0x44c16000},
- {0x44c18000}, {0x44c1a000}, {0x44c1c000}, {0x44c1e000},
- {0x44c20000}, {0x44c22000}, {0x44c24000}, {0x44c26000},
- {0x44c28000}, {0x44c2a000}, {0x44c2c000}, {0x44c2e000},
- {0x44c30000}, {0x44c32000}, {0x44c34000}, {0x44c36000},
- {0x44c38000}, {0x44c3a000}, {0x44c3c000}, {0x44c3e000},
- {0x44c40000}, {0x44c42000}, {0x44c44000}, {0x44c46000},
- {0x44c48000}, {0x44c4a000}, {0x44c4c000}, {0x44c4e000},
- {0x44c50000}, {0x44c52000}, {0x44c54000}, {0x44c56000},
- {0x44c58000}, {0x44c5a000}, {0x44c5c000}, {0x44c5e000},
- {0x44c60000}, {0x44c62000}, {0x44c64000}, {0x44c66000},
- {0x44c68000}, {0x44c6a000}, {0x44c6c000}, {0x44c6e000},
- {0x44c70000}, {0x44c72000}, {0x44c74000}, {0x44c76000},
- {0x44c78000}, {0x44c7a000}, {0x44c7c000}, {0x44c7e000},
- {0x44c80000}, {0x44c82000}, {0x44c84000}, {0x44c86000},
- {0x44c88000}, {0x44c8a000}, {0x44c8c000}, {0x44c8e000},
- {0x44c90000}, {0x44c92000}, {0x44c94000}, {0x44c96000},
- {0x44c98000}, {0x44c9a000}, {0x44c9c000}, {0x44c9e000},
- {0x44ca0000}, {0x44ca2000}, {0x44ca4000}, {0x44ca6000},
- {0x44ca8000}, {0x44caa000}, {0x44cac000}, {0x44cae000},
- {0x44cb0000}, {0x44cb2000}, {0x44cb4000}, {0x44cb6000},
- {0x44cb8000}, {0x44cba000}, {0x44cbc000}, {0x44cbe000},
- {0x44cc0000}, {0x44cc2000}, {0x44cc4000}, {0x44cc6000},
- {0x44cc8000}, {0x44cca000}, {0x44ccc000}, {0x44cce000},
- {0x44cd0000}, {0x44cd2000}, {0x44cd4000}, {0x44cd6000},
- {0x44cd8000}, {0x44cda000}, {0x44cdc000}, {0x44cde000},
- {0x44ce0000}, {0x44ce2000}, {0x44ce4000}, {0x44ce6000},
- {0x44ce8000}, {0x44cea000}, {0x44cec000}, {0x44cee000},
- {0x44cf0000}, {0x44cf2000}, {0x44cf4000}, {0x44cf6000},
- {0x44cf8000}, {0x44cfa000}, {0x44cfc000}, {0x44cfe000},
- {0x44d00000}, {0x44d02000}, {0x44d04000}, {0x44d06000},
- {0x44d08000}, {0x44d0a000}, {0x44d0c000}, {0x44d0e000},
- {0x44d10000}, {0x44d12000}, {0x44d14000}, {0x44d16000},
- {0x44d18000}, {0x44d1a000}, {0x44d1c000}, {0x44d1e000},
- {0x44d20000}, {0x44d22000}, {0x44d24000}, {0x44d26000},
- {0x44d28000}, {0x44d2a000}, {0x44d2c000}, {0x44d2e000},
- {0x44d30000}, {0x44d32000}, {0x44d34000}, {0x44d36000},
- {0x44d38000}, {0x44d3a000}, {0x44d3c000}, {0x44d3e000},
- {0x44d40000}, {0x44d42000}, {0x44d44000}, {0x44d46000},
- {0x44d48000}, {0x44d4a000}, {0x44d4c000}, {0x44d4e000},
- {0x44d50000}, {0x44d52000}, {0x44d54000}, {0x44d56000},
- {0x44d58000}, {0x44d5a000}, {0x44d5c000}, {0x44d5e000},
- {0x44d60000}, {0x44d62000}, {0x44d64000}, {0x44d66000},
- {0x44d68000}, {0x44d6a000}, {0x44d6c000}, {0x44d6e000},
- {0x44d70000}, {0x44d72000}, {0x44d74000}, {0x44d76000},
- {0x44d78000}, {0x44d7a000}, {0x44d7c000}, {0x44d7e000},
- {0x44d80000}, {0x44d82000}, {0x44d84000}, {0x44d86000},
- {0x44d88000}, {0x44d8a000}, {0x44d8c000}, {0x44d8e000},
- {0x44d90000}, {0x44d92000}, {0x44d94000}, {0x44d96000},
- {0x44d98000}, {0x44d9a000}, {0x44d9c000}, {0x44d9e000},
- {0x44da0000}, {0x44da2000}, {0x44da4000}, {0x44da6000},
- {0x44da8000}, {0x44daa000}, {0x44dac000}, {0x44dae000},
- {0x44db0000}, {0x44db2000}, {0x44db4000}, {0x44db6000},
- {0x44db8000}, {0x44dba000}, {0x44dbc000}, {0x44dbe000},
- {0x44dc0000}, {0x44dc2000}, {0x44dc4000}, {0x44dc6000},
- {0x44dc8000}, {0x44dca000}, {0x44dcc000}, {0x44dce000},
- {0x44dd0000}, {0x44dd2000}, {0x44dd4000}, {0x44dd6000},
- {0x44dd8000}, {0x44dda000}, {0x44ddc000}, {0x44dde000},
- {0x44de0000}, {0x44de2000}, {0x44de4000}, {0x44de6000},
- {0x44de8000}, {0x44dea000}, {0x44dec000}, {0x44dee000},
- {0x44df0000}, {0x44df2000}, {0x44df4000}, {0x44df6000},
- {0x44df8000}, {0x44dfa000}, {0x44dfc000}, {0x44dfe000},
- {0x44e00000}, {0x44e02000}, {0x44e04000}, {0x44e06000},
- {0x44e08000}, {0x44e0a000}, {0x44e0c000}, {0x44e0e000},
- {0x44e10000}, {0x44e12000}, {0x44e14000}, {0x44e16000},
- {0x44e18000}, {0x44e1a000}, {0x44e1c000}, {0x44e1e000},
- {0x44e20000}, {0x44e22000}, {0x44e24000}, {0x44e26000},
- {0x44e28000}, {0x44e2a000}, {0x44e2c000}, {0x44e2e000},
- {0x44e30000}, {0x44e32000}, {0x44e34000}, {0x44e36000},
- {0x44e38000}, {0x44e3a000}, {0x44e3c000}, {0x44e3e000},
- {0x44e40000}, {0x44e42000}, {0x44e44000}, {0x44e46000},
- {0x44e48000}, {0x44e4a000}, {0x44e4c000}, {0x44e4e000},
- {0x44e50000}, {0x44e52000}, {0x44e54000}, {0x44e56000},
- {0x44e58000}, {0x44e5a000}, {0x44e5c000}, {0x44e5e000},
- {0x44e60000}, {0x44e62000}, {0x44e64000}, {0x44e66000},
- {0x44e68000}, {0x44e6a000}, {0x44e6c000}, {0x44e6e000},
- {0x44e70000}, {0x44e72000}, {0x44e74000}, {0x44e76000},
- {0x44e78000}, {0x44e7a000}, {0x44e7c000}, {0x44e7e000},
- {0x44e80000}, {0x44e82000}, {0x44e84000}, {0x44e86000},
- {0x44e88000}, {0x44e8a000}, {0x44e8c000}, {0x44e8e000},
- {0x44e90000}, {0x44e92000}, {0x44e94000}, {0x44e96000},
- {0x44e98000}, {0x44e9a000}, {0x44e9c000}, {0x44e9e000},
- {0x44ea0000}, {0x44ea2000}, {0x44ea4000}, {0x44ea6000},
- {0x44ea8000}, {0x44eaa000}, {0x44eac000}, {0x44eae000},
- {0x44eb0000}, {0x44eb2000}, {0x44eb4000}, {0x44eb6000},
- {0x44eb8000}, {0x44eba000}, {0x44ebc000}, {0x44ebe000},
- {0x44ec0000}, {0x44ec2000}, {0x44ec4000}, {0x44ec6000},
- {0x44ec8000}, {0x44eca000}, {0x44ecc000}, {0x44ece000},
- {0x44ed0000}, {0x44ed2000}, {0x44ed4000}, {0x44ed6000},
- {0x44ed8000}, {0x44eda000}, {0x44edc000}, {0x44ede000},
- {0x44ee0000}, {0x44ee2000}, {0x44ee4000}, {0x44ee6000},
- {0x44ee8000}, {0x44eea000}, {0x44eec000}, {0x44eee000},
- {0x44ef0000}, {0x44ef2000}, {0x44ef4000}, {0x44ef6000},
- {0x44ef8000}, {0x44efa000}, {0x44efc000}, {0x44efe000},
- {0x44f00000}, {0x44f02000}, {0x44f04000}, {0x44f06000},
- {0x44f08000}, {0x44f0a000}, {0x44f0c000}, {0x44f0e000},
- {0x44f10000}, {0x44f12000}, {0x44f14000}, {0x44f16000},
- {0x44f18000}, {0x44f1a000}, {0x44f1c000}, {0x44f1e000},
- {0x44f20000}, {0x44f22000}, {0x44f24000}, {0x44f26000},
- {0x44f28000}, {0x44f2a000}, {0x44f2c000}, {0x44f2e000},
- {0x44f30000}, {0x44f32000}, {0x44f34000}, {0x44f36000},
- {0x44f38000}, {0x44f3a000}, {0x44f3c000}, {0x44f3e000},
- {0x44f40000}, {0x44f42000}, {0x44f44000}, {0x44f46000},
- {0x44f48000}, {0x44f4a000}, {0x44f4c000}, {0x44f4e000},
- {0x44f50000}, {0x44f52000}, {0x44f54000}, {0x44f56000},
- {0x44f58000}, {0x44f5a000}, {0x44f5c000}, {0x44f5e000},
- {0x44f60000}, {0x44f62000}, {0x44f64000}, {0x44f66000},
- {0x44f68000}, {0x44f6a000}, {0x44f6c000}, {0x44f6e000},
- {0x44f70000}, {0x44f72000}, {0x44f74000}, {0x44f76000},
- {0x44f78000}, {0x44f7a000}, {0x44f7c000}, {0x44f7e000},
- {0x44f80000}, {0x44f82000}, {0x44f84000}, {0x44f86000},
- {0x44f88000}, {0x44f8a000}, {0x44f8c000}, {0x44f8e000},
- {0x44f90000}, {0x44f92000}, {0x44f94000}, {0x44f96000},
- {0x44f98000}, {0x44f9a000}, {0x44f9c000}, {0x44f9e000},
- {0x44fa0000}, {0x44fa2000}, {0x44fa4000}, {0x44fa6000},
- {0x44fa8000}, {0x44faa000}, {0x44fac000}, {0x44fae000},
- {0x44fb0000}, {0x44fb2000}, {0x44fb4000}, {0x44fb6000},
- {0x44fb8000}, {0x44fba000}, {0x44fbc000}, {0x44fbe000},
- {0x44fc0000}, {0x44fc2000}, {0x44fc4000}, {0x44fc6000},
- {0x44fc8000}, {0x44fca000}, {0x44fcc000}, {0x44fce000},
- {0x44fd0000}, {0x44fd2000}, {0x44fd4000}, {0x44fd6000},
- {0x44fd8000}, {0x44fda000}, {0x44fdc000}, {0x44fde000},
- {0x44fe0000}, {0x44fe2000}, {0x44fe4000}, {0x44fe6000},
- {0x44fe8000}, {0x44fea000}, {0x44fec000}, {0x44fee000},
- {0x44ff0000}, {0x44ff2000}, {0x44ff4000}, {0x44ff6000},
- {0x44ff8000}, {0x44ffa000}, {0x44ffc000}, {0x44ffe000},
- {0x45000000}, {0x45002000}, {0x45004000}, {0x45006000},
- {0x45008000}, {0x4500a000}, {0x4500c000}, {0x4500e000},
- {0x45010000}, {0x45012000}, {0x45014000}, {0x45016000},
- {0x45018000}, {0x4501a000}, {0x4501c000}, {0x4501e000},
- {0x45020000}, {0x45022000}, {0x45024000}, {0x45026000},
- {0x45028000}, {0x4502a000}, {0x4502c000}, {0x4502e000},
- {0x45030000}, {0x45032000}, {0x45034000}, {0x45036000},
- {0x45038000}, {0x4503a000}, {0x4503c000}, {0x4503e000},
- {0x45040000}, {0x45042000}, {0x45044000}, {0x45046000},
- {0x45048000}, {0x4504a000}, {0x4504c000}, {0x4504e000},
- {0x45050000}, {0x45052000}, {0x45054000}, {0x45056000},
- {0x45058000}, {0x4505a000}, {0x4505c000}, {0x4505e000},
- {0x45060000}, {0x45062000}, {0x45064000}, {0x45066000},
- {0x45068000}, {0x4506a000}, {0x4506c000}, {0x4506e000},
- {0x45070000}, {0x45072000}, {0x45074000}, {0x45076000},
- {0x45078000}, {0x4507a000}, {0x4507c000}, {0x4507e000},
- {0x45080000}, {0x45082000}, {0x45084000}, {0x45086000},
- {0x45088000}, {0x4508a000}, {0x4508c000}, {0x4508e000},
- {0x45090000}, {0x45092000}, {0x45094000}, {0x45096000},
- {0x45098000}, {0x4509a000}, {0x4509c000}, {0x4509e000},
- {0x450a0000}, {0x450a2000}, {0x450a4000}, {0x450a6000},
- {0x450a8000}, {0x450aa000}, {0x450ac000}, {0x450ae000},
- {0x450b0000}, {0x450b2000}, {0x450b4000}, {0x450b6000},
- {0x450b8000}, {0x450ba000}, {0x450bc000}, {0x450be000},
- {0x450c0000}, {0x450c2000}, {0x450c4000}, {0x450c6000},
- {0x450c8000}, {0x450ca000}, {0x450cc000}, {0x450ce000},
- {0x450d0000}, {0x450d2000}, {0x450d4000}, {0x450d6000},
- {0x450d8000}, {0x450da000}, {0x450dc000}, {0x450de000},
- {0x450e0000}, {0x450e2000}, {0x450e4000}, {0x450e6000},
- {0x450e8000}, {0x450ea000}, {0x450ec000}, {0x450ee000},
- {0x450f0000}, {0x450f2000}, {0x450f4000}, {0x450f6000},
- {0x450f8000}, {0x450fa000}, {0x450fc000}, {0x450fe000},
- {0x45100000}, {0x45102000}, {0x45104000}, {0x45106000},
- {0x45108000}, {0x4510a000}, {0x4510c000}, {0x4510e000},
- {0x45110000}, {0x45112000}, {0x45114000}, {0x45116000},
- {0x45118000}, {0x4511a000}, {0x4511c000}, {0x4511e000},
- {0x45120000}, {0x45122000}, {0x45124000}, {0x45126000},
- {0x45128000}, {0x4512a000}, {0x4512c000}, {0x4512e000},
- {0x45130000}, {0x45132000}, {0x45134000}, {0x45136000},
- {0x45138000}, {0x4513a000}, {0x4513c000}, {0x4513e000},
- {0x45140000}, {0x45142000}, {0x45144000}, {0x45146000},
- {0x45148000}, {0x4514a000}, {0x4514c000}, {0x4514e000},
- {0x45150000}, {0x45152000}, {0x45154000}, {0x45156000},
- {0x45158000}, {0x4515a000}, {0x4515c000}, {0x4515e000},
- {0x45160000}, {0x45162000}, {0x45164000}, {0x45166000},
- {0x45168000}, {0x4516a000}, {0x4516c000}, {0x4516e000},
- {0x45170000}, {0x45172000}, {0x45174000}, {0x45176000},
- {0x45178000}, {0x4517a000}, {0x4517c000}, {0x4517e000},
- {0x45180000}, {0x45182000}, {0x45184000}, {0x45186000},
- {0x45188000}, {0x4518a000}, {0x4518c000}, {0x4518e000},
- {0x45190000}, {0x45192000}, {0x45194000}, {0x45196000},
- {0x45198000}, {0x4519a000}, {0x4519c000}, {0x4519e000},
- {0x451a0000}, {0x451a2000}, {0x451a4000}, {0x451a6000},
- {0x451a8000}, {0x451aa000}, {0x451ac000}, {0x451ae000},
- {0x451b0000}, {0x451b2000}, {0x451b4000}, {0x451b6000},
- {0x451b8000}, {0x451ba000}, {0x451bc000}, {0x451be000},
- {0x451c0000}, {0x451c2000}, {0x451c4000}, {0x451c6000},
- {0x451c8000}, {0x451ca000}, {0x451cc000}, {0x451ce000},
- {0x451d0000}, {0x451d2000}, {0x451d4000}, {0x451d6000},
- {0x451d8000}, {0x451da000}, {0x451dc000}, {0x451de000},
- {0x451e0000}, {0x451e2000}, {0x451e4000}, {0x451e6000},
- {0x451e8000}, {0x451ea000}, {0x451ec000}, {0x451ee000},
- {0x451f0000}, {0x451f2000}, {0x451f4000}, {0x451f6000},
- {0x451f8000}, {0x451fa000}, {0x451fc000}, {0x451fe000},
- {0x45200000}, {0x45202000}, {0x45204000}, {0x45206000},
- {0x45208000}, {0x4520a000}, {0x4520c000}, {0x4520e000},
- {0x45210000}, {0x45212000}, {0x45214000}, {0x45216000},
- {0x45218000}, {0x4521a000}, {0x4521c000}, {0x4521e000},
- {0x45220000}, {0x45222000}, {0x45224000}, {0x45226000},
- {0x45228000}, {0x4522a000}, {0x4522c000}, {0x4522e000},
- {0x45230000}, {0x45232000}, {0x45234000}, {0x45236000},
- {0x45238000}, {0x4523a000}, {0x4523c000}, {0x4523e000},
- {0x45240000}, {0x45242000}, {0x45244000}, {0x45246000},
- {0x45248000}, {0x4524a000}, {0x4524c000}, {0x4524e000},
- {0x45250000}, {0x45252000}, {0x45254000}, {0x45256000},
- {0x45258000}, {0x4525a000}, {0x4525c000}, {0x4525e000},
- {0x45260000}, {0x45262000}, {0x45264000}, {0x45266000},
- {0x45268000}, {0x4526a000}, {0x4526c000}, {0x4526e000},
- {0x45270000}, {0x45272000}, {0x45274000}, {0x45276000},
- {0x45278000}, {0x4527a000}, {0x4527c000}, {0x4527e000},
- {0x45280000}, {0x45282000}, {0x45284000}, {0x45286000},
- {0x45288000}, {0x4528a000}, {0x4528c000}, {0x4528e000},
- {0x45290000}, {0x45292000}, {0x45294000}, {0x45296000},
- {0x45298000}, {0x4529a000}, {0x4529c000}, {0x4529e000},
- {0x452a0000}, {0x452a2000}, {0x452a4000}, {0x452a6000},
- {0x452a8000}, {0x452aa000}, {0x452ac000}, {0x452ae000},
- {0x452b0000}, {0x452b2000}, {0x452b4000}, {0x452b6000},
- {0x452b8000}, {0x452ba000}, {0x452bc000}, {0x452be000},
- {0x452c0000}, {0x452c2000}, {0x452c4000}, {0x452c6000},
- {0x452c8000}, {0x452ca000}, {0x452cc000}, {0x452ce000},
- {0x452d0000}, {0x452d2000}, {0x452d4000}, {0x452d6000},
- {0x452d8000}, {0x452da000}, {0x452dc000}, {0x452de000},
- {0x452e0000}, {0x452e2000}, {0x452e4000}, {0x452e6000},
- {0x452e8000}, {0x452ea000}, {0x452ec000}, {0x452ee000},
- {0x452f0000}, {0x452f2000}, {0x452f4000}, {0x452f6000},
- {0x452f8000}, {0x452fa000}, {0x452fc000}, {0x452fe000},
- {0x45300000}, {0x45302000}, {0x45304000}, {0x45306000},
- {0x45308000}, {0x4530a000}, {0x4530c000}, {0x4530e000},
- {0x45310000}, {0x45312000}, {0x45314000}, {0x45316000},
- {0x45318000}, {0x4531a000}, {0x4531c000}, {0x4531e000},
- {0x45320000}, {0x45322000}, {0x45324000}, {0x45326000},
- {0x45328000}, {0x4532a000}, {0x4532c000}, {0x4532e000},
- {0x45330000}, {0x45332000}, {0x45334000}, {0x45336000},
- {0x45338000}, {0x4533a000}, {0x4533c000}, {0x4533e000},
- {0x45340000}, {0x45342000}, {0x45344000}, {0x45346000},
- {0x45348000}, {0x4534a000}, {0x4534c000}, {0x4534e000},
- {0x45350000}, {0x45352000}, {0x45354000}, {0x45356000},
- {0x45358000}, {0x4535a000}, {0x4535c000}, {0x4535e000},
- {0x45360000}, {0x45362000}, {0x45364000}, {0x45366000},
- {0x45368000}, {0x4536a000}, {0x4536c000}, {0x4536e000},
- {0x45370000}, {0x45372000}, {0x45374000}, {0x45376000},
- {0x45378000}, {0x4537a000}, {0x4537c000}, {0x4537e000},
- {0x45380000}, {0x45382000}, {0x45384000}, {0x45386000},
- {0x45388000}, {0x4538a000}, {0x4538c000}, {0x4538e000},
- {0x45390000}, {0x45392000}, {0x45394000}, {0x45396000},
- {0x45398000}, {0x4539a000}, {0x4539c000}, {0x4539e000},
- {0x453a0000}, {0x453a2000}, {0x453a4000}, {0x453a6000},
- {0x453a8000}, {0x453aa000}, {0x453ac000}, {0x453ae000},
- {0x453b0000}, {0x453b2000}, {0x453b4000}, {0x453b6000},
- {0x453b8000}, {0x453ba000}, {0x453bc000}, {0x453be000},
- {0x453c0000}, {0x453c2000}, {0x453c4000}, {0x453c6000},
- {0x453c8000}, {0x453ca000}, {0x453cc000}, {0x453ce000},
- {0x453d0000}, {0x453d2000}, {0x453d4000}, {0x453d6000},
- {0x453d8000}, {0x453da000}, {0x453dc000}, {0x453de000},
- {0x453e0000}, {0x453e2000}, {0x453e4000}, {0x453e6000},
- {0x453e8000}, {0x453ea000}, {0x453ec000}, {0x453ee000},
- {0x453f0000}, {0x453f2000}, {0x453f4000}, {0x453f6000},
- {0x453f8000}, {0x453fa000}, {0x453fc000}, {0x453fe000},
- {0x45400000}, {0x45402000}, {0x45404000}, {0x45406000},
- {0x45408000}, {0x4540a000}, {0x4540c000}, {0x4540e000},
- {0x45410000}, {0x45412000}, {0x45414000}, {0x45416000},
- {0x45418000}, {0x4541a000}, {0x4541c000}, {0x4541e000},
- {0x45420000}, {0x45422000}, {0x45424000}, {0x45426000},
- {0x45428000}, {0x4542a000}, {0x4542c000}, {0x4542e000},
- {0x45430000}, {0x45432000}, {0x45434000}, {0x45436000},
- {0x45438000}, {0x4543a000}, {0x4543c000}, {0x4543e000},
- {0x45440000}, {0x45442000}, {0x45444000}, {0x45446000},
- {0x45448000}, {0x4544a000}, {0x4544c000}, {0x4544e000},
- {0x45450000}, {0x45452000}, {0x45454000}, {0x45456000},
- {0x45458000}, {0x4545a000}, {0x4545c000}, {0x4545e000},
- {0x45460000}, {0x45462000}, {0x45464000}, {0x45466000},
- {0x45468000}, {0x4546a000}, {0x4546c000}, {0x4546e000},
- {0x45470000}, {0x45472000}, {0x45474000}, {0x45476000},
- {0x45478000}, {0x4547a000}, {0x4547c000}, {0x4547e000},
- {0x45480000}, {0x45482000}, {0x45484000}, {0x45486000},
- {0x45488000}, {0x4548a000}, {0x4548c000}, {0x4548e000},
- {0x45490000}, {0x45492000}, {0x45494000}, {0x45496000},
- {0x45498000}, {0x4549a000}, {0x4549c000}, {0x4549e000},
- {0x454a0000}, {0x454a2000}, {0x454a4000}, {0x454a6000},
- {0x454a8000}, {0x454aa000}, {0x454ac000}, {0x454ae000},
- {0x454b0000}, {0x454b2000}, {0x454b4000}, {0x454b6000},
- {0x454b8000}, {0x454ba000}, {0x454bc000}, {0x454be000},
- {0x454c0000}, {0x454c2000}, {0x454c4000}, {0x454c6000},
- {0x454c8000}, {0x454ca000}, {0x454cc000}, {0x454ce000},
- {0x454d0000}, {0x454d2000}, {0x454d4000}, {0x454d6000},
- {0x454d8000}, {0x454da000}, {0x454dc000}, {0x454de000},
- {0x454e0000}, {0x454e2000}, {0x454e4000}, {0x454e6000},
- {0x454e8000}, {0x454ea000}, {0x454ec000}, {0x454ee000},
- {0x454f0000}, {0x454f2000}, {0x454f4000}, {0x454f6000},
- {0x454f8000}, {0x454fa000}, {0x454fc000}, {0x454fe000},
- {0x45500000}, {0x45502000}, {0x45504000}, {0x45506000},
- {0x45508000}, {0x4550a000}, {0x4550c000}, {0x4550e000},
- {0x45510000}, {0x45512000}, {0x45514000}, {0x45516000},
- {0x45518000}, {0x4551a000}, {0x4551c000}, {0x4551e000},
- {0x45520000}, {0x45522000}, {0x45524000}, {0x45526000},
- {0x45528000}, {0x4552a000}, {0x4552c000}, {0x4552e000},
- {0x45530000}, {0x45532000}, {0x45534000}, {0x45536000},
- {0x45538000}, {0x4553a000}, {0x4553c000}, {0x4553e000},
- {0x45540000}, {0x45542000}, {0x45544000}, {0x45546000},
- {0x45548000}, {0x4554a000}, {0x4554c000}, {0x4554e000},
- {0x45550000}, {0x45552000}, {0x45554000}, {0x45556000},
- {0x45558000}, {0x4555a000}, {0x4555c000}, {0x4555e000},
- {0x45560000}, {0x45562000}, {0x45564000}, {0x45566000},
- {0x45568000}, {0x4556a000}, {0x4556c000}, {0x4556e000},
- {0x45570000}, {0x45572000}, {0x45574000}, {0x45576000},
- {0x45578000}, {0x4557a000}, {0x4557c000}, {0x4557e000},
- {0x45580000}, {0x45582000}, {0x45584000}, {0x45586000},
- {0x45588000}, {0x4558a000}, {0x4558c000}, {0x4558e000},
- {0x45590000}, {0x45592000}, {0x45594000}, {0x45596000},
- {0x45598000}, {0x4559a000}, {0x4559c000}, {0x4559e000},
- {0x455a0000}, {0x455a2000}, {0x455a4000}, {0x455a6000},
- {0x455a8000}, {0x455aa000}, {0x455ac000}, {0x455ae000},
- {0x455b0000}, {0x455b2000}, {0x455b4000}, {0x455b6000},
- {0x455b8000}, {0x455ba000}, {0x455bc000}, {0x455be000},
- {0x455c0000}, {0x455c2000}, {0x455c4000}, {0x455c6000},
- {0x455c8000}, {0x455ca000}, {0x455cc000}, {0x455ce000},
- {0x455d0000}, {0x455d2000}, {0x455d4000}, {0x455d6000},
- {0x455d8000}, {0x455da000}, {0x455dc000}, {0x455de000},
- {0x455e0000}, {0x455e2000}, {0x455e4000}, {0x455e6000},
- {0x455e8000}, {0x455ea000}, {0x455ec000}, {0x455ee000},
- {0x455f0000}, {0x455f2000}, {0x455f4000}, {0x455f6000},
- {0x455f8000}, {0x455fa000}, {0x455fc000}, {0x455fe000},
- {0x45600000}, {0x45602000}, {0x45604000}, {0x45606000},
- {0x45608000}, {0x4560a000}, {0x4560c000}, {0x4560e000},
- {0x45610000}, {0x45612000}, {0x45614000}, {0x45616000},
- {0x45618000}, {0x4561a000}, {0x4561c000}, {0x4561e000},
- {0x45620000}, {0x45622000}, {0x45624000}, {0x45626000},
- {0x45628000}, {0x4562a000}, {0x4562c000}, {0x4562e000},
- {0x45630000}, {0x45632000}, {0x45634000}, {0x45636000},
- {0x45638000}, {0x4563a000}, {0x4563c000}, {0x4563e000},
- {0x45640000}, {0x45642000}, {0x45644000}, {0x45646000},
- {0x45648000}, {0x4564a000}, {0x4564c000}, {0x4564e000},
- {0x45650000}, {0x45652000}, {0x45654000}, {0x45656000},
- {0x45658000}, {0x4565a000}, {0x4565c000}, {0x4565e000},
- {0x45660000}, {0x45662000}, {0x45664000}, {0x45666000},
- {0x45668000}, {0x4566a000}, {0x4566c000}, {0x4566e000},
- {0x45670000}, {0x45672000}, {0x45674000}, {0x45676000},
- {0x45678000}, {0x4567a000}, {0x4567c000}, {0x4567e000},
- {0x45680000}, {0x45682000}, {0x45684000}, {0x45686000},
- {0x45688000}, {0x4568a000}, {0x4568c000}, {0x4568e000},
- {0x45690000}, {0x45692000}, {0x45694000}, {0x45696000},
- {0x45698000}, {0x4569a000}, {0x4569c000}, {0x4569e000},
- {0x456a0000}, {0x456a2000}, {0x456a4000}, {0x456a6000},
- {0x456a8000}, {0x456aa000}, {0x456ac000}, {0x456ae000},
- {0x456b0000}, {0x456b2000}, {0x456b4000}, {0x456b6000},
- {0x456b8000}, {0x456ba000}, {0x456bc000}, {0x456be000},
- {0x456c0000}, {0x456c2000}, {0x456c4000}, {0x456c6000},
- {0x456c8000}, {0x456ca000}, {0x456cc000}, {0x456ce000},
- {0x456d0000}, {0x456d2000}, {0x456d4000}, {0x456d6000},
- {0x456d8000}, {0x456da000}, {0x456dc000}, {0x456de000},
- {0x456e0000}, {0x456e2000}, {0x456e4000}, {0x456e6000},
- {0x456e8000}, {0x456ea000}, {0x456ec000}, {0x456ee000},
- {0x456f0000}, {0x456f2000}, {0x456f4000}, {0x456f6000},
- {0x456f8000}, {0x456fa000}, {0x456fc000}, {0x456fe000},
- {0x45700000}, {0x45702000}, {0x45704000}, {0x45706000},
- {0x45708000}, {0x4570a000}, {0x4570c000}, {0x4570e000},
- {0x45710000}, {0x45712000}, {0x45714000}, {0x45716000},
- {0x45718000}, {0x4571a000}, {0x4571c000}, {0x4571e000},
- {0x45720000}, {0x45722000}, {0x45724000}, {0x45726000},
- {0x45728000}, {0x4572a000}, {0x4572c000}, {0x4572e000},
- {0x45730000}, {0x45732000}, {0x45734000}, {0x45736000},
- {0x45738000}, {0x4573a000}, {0x4573c000}, {0x4573e000},
- {0x45740000}, {0x45742000}, {0x45744000}, {0x45746000},
- {0x45748000}, {0x4574a000}, {0x4574c000}, {0x4574e000},
- {0x45750000}, {0x45752000}, {0x45754000}, {0x45756000},
- {0x45758000}, {0x4575a000}, {0x4575c000}, {0x4575e000},
- {0x45760000}, {0x45762000}, {0x45764000}, {0x45766000},
- {0x45768000}, {0x4576a000}, {0x4576c000}, {0x4576e000},
- {0x45770000}, {0x45772000}, {0x45774000}, {0x45776000},
- {0x45778000}, {0x4577a000}, {0x4577c000}, {0x4577e000},
- {0x45780000}, {0x45782000}, {0x45784000}, {0x45786000},
- {0x45788000}, {0x4578a000}, {0x4578c000}, {0x4578e000},
- {0x45790000}, {0x45792000}, {0x45794000}, {0x45796000},
- {0x45798000}, {0x4579a000}, {0x4579c000}, {0x4579e000},
- {0x457a0000}, {0x457a2000}, {0x457a4000}, {0x457a6000},
- {0x457a8000}, {0x457aa000}, {0x457ac000}, {0x457ae000},
- {0x457b0000}, {0x457b2000}, {0x457b4000}, {0x457b6000},
- {0x457b8000}, {0x457ba000}, {0x457bc000}, {0x457be000},
- {0x457c0000}, {0x457c2000}, {0x457c4000}, {0x457c6000},
- {0x457c8000}, {0x457ca000}, {0x457cc000}, {0x457ce000},
- {0x457d0000}, {0x457d2000}, {0x457d4000}, {0x457d6000},
- {0x457d8000}, {0x457da000}, {0x457dc000}, {0x457de000},
- {0x457e0000}, {0x457e2000}, {0x457e4000}, {0x457e6000},
- {0x457e8000}, {0x457ea000}, {0x457ec000}, {0x457ee000},
- {0x457f0000}, {0x457f2000}, {0x457f4000}, {0x457f6000},
- {0x457f8000}, {0x457fa000}, {0x457fc000}, {0x457fe000},
- {0x45800000}, {0x45802000}, {0x45804000}, {0x45806000},
- {0x45808000}, {0x4580a000}, {0x4580c000}, {0x4580e000},
- {0x45810000}, {0x45812000}, {0x45814000}, {0x45816000},
- {0x45818000}, {0x4581a000}, {0x4581c000}, {0x4581e000},
- {0x45820000}, {0x45822000}, {0x45824000}, {0x45826000},
- {0x45828000}, {0x4582a000}, {0x4582c000}, {0x4582e000},
- {0x45830000}, {0x45832000}, {0x45834000}, {0x45836000},
- {0x45838000}, {0x4583a000}, {0x4583c000}, {0x4583e000},
- {0x45840000}, {0x45842000}, {0x45844000}, {0x45846000},
- {0x45848000}, {0x4584a000}, {0x4584c000}, {0x4584e000},
- {0x45850000}, {0x45852000}, {0x45854000}, {0x45856000},
- {0x45858000}, {0x4585a000}, {0x4585c000}, {0x4585e000},
- {0x45860000}, {0x45862000}, {0x45864000}, {0x45866000},
- {0x45868000}, {0x4586a000}, {0x4586c000}, {0x4586e000},
- {0x45870000}, {0x45872000}, {0x45874000}, {0x45876000},
- {0x45878000}, {0x4587a000}, {0x4587c000}, {0x4587e000},
- {0x45880000}, {0x45882000}, {0x45884000}, {0x45886000},
- {0x45888000}, {0x4588a000}, {0x4588c000}, {0x4588e000},
- {0x45890000}, {0x45892000}, {0x45894000}, {0x45896000},
- {0x45898000}, {0x4589a000}, {0x4589c000}, {0x4589e000},
- {0x458a0000}, {0x458a2000}, {0x458a4000}, {0x458a6000},
- {0x458a8000}, {0x458aa000}, {0x458ac000}, {0x458ae000},
- {0x458b0000}, {0x458b2000}, {0x458b4000}, {0x458b6000},
- {0x458b8000}, {0x458ba000}, {0x458bc000}, {0x458be000},
- {0x458c0000}, {0x458c2000}, {0x458c4000}, {0x458c6000},
- {0x458c8000}, {0x458ca000}, {0x458cc000}, {0x458ce000},
- {0x458d0000}, {0x458d2000}, {0x458d4000}, {0x458d6000},
- {0x458d8000}, {0x458da000}, {0x458dc000}, {0x458de000},
- {0x458e0000}, {0x458e2000}, {0x458e4000}, {0x458e6000},
- {0x458e8000}, {0x458ea000}, {0x458ec000}, {0x458ee000},
- {0x458f0000}, {0x458f2000}, {0x458f4000}, {0x458f6000},
- {0x458f8000}, {0x458fa000}, {0x458fc000}, {0x458fe000},
- {0x45900000}, {0x45902000}, {0x45904000}, {0x45906000},
- {0x45908000}, {0x4590a000}, {0x4590c000}, {0x4590e000},
- {0x45910000}, {0x45912000}, {0x45914000}, {0x45916000},
- {0x45918000}, {0x4591a000}, {0x4591c000}, {0x4591e000},
- {0x45920000}, {0x45922000}, {0x45924000}, {0x45926000},
- {0x45928000}, {0x4592a000}, {0x4592c000}, {0x4592e000},
- {0x45930000}, {0x45932000}, {0x45934000}, {0x45936000},
- {0x45938000}, {0x4593a000}, {0x4593c000}, {0x4593e000},
- {0x45940000}, {0x45942000}, {0x45944000}, {0x45946000},
- {0x45948000}, {0x4594a000}, {0x4594c000}, {0x4594e000},
- {0x45950000}, {0x45952000}, {0x45954000}, {0x45956000},
- {0x45958000}, {0x4595a000}, {0x4595c000}, {0x4595e000},
- {0x45960000}, {0x45962000}, {0x45964000}, {0x45966000},
- {0x45968000}, {0x4596a000}, {0x4596c000}, {0x4596e000},
- {0x45970000}, {0x45972000}, {0x45974000}, {0x45976000},
- {0x45978000}, {0x4597a000}, {0x4597c000}, {0x4597e000},
- {0x45980000}, {0x45982000}, {0x45984000}, {0x45986000},
- {0x45988000}, {0x4598a000}, {0x4598c000}, {0x4598e000},
- {0x45990000}, {0x45992000}, {0x45994000}, {0x45996000},
- {0x45998000}, {0x4599a000}, {0x4599c000}, {0x4599e000},
- {0x459a0000}, {0x459a2000}, {0x459a4000}, {0x459a6000},
- {0x459a8000}, {0x459aa000}, {0x459ac000}, {0x459ae000},
- {0x459b0000}, {0x459b2000}, {0x459b4000}, {0x459b6000},
- {0x459b8000}, {0x459ba000}, {0x459bc000}, {0x459be000},
- {0x459c0000}, {0x459c2000}, {0x459c4000}, {0x459c6000},
- {0x459c8000}, {0x459ca000}, {0x459cc000}, {0x459ce000},
- {0x459d0000}, {0x459d2000}, {0x459d4000}, {0x459d6000},
- {0x459d8000}, {0x459da000}, {0x459dc000}, {0x459de000},
- {0x459e0000}, {0x459e2000}, {0x459e4000}, {0x459e6000},
- {0x459e8000}, {0x459ea000}, {0x459ec000}, {0x459ee000},
- {0x459f0000}, {0x459f2000}, {0x459f4000}, {0x459f6000},
- {0x459f8000}, {0x459fa000}, {0x459fc000}, {0x459fe000},
- {0x45a00000}, {0x45a02000}, {0x45a04000}, {0x45a06000},
- {0x45a08000}, {0x45a0a000}, {0x45a0c000}, {0x45a0e000},
- {0x45a10000}, {0x45a12000}, {0x45a14000}, {0x45a16000},
- {0x45a18000}, {0x45a1a000}, {0x45a1c000}, {0x45a1e000},
- {0x45a20000}, {0x45a22000}, {0x45a24000}, {0x45a26000},
- {0x45a28000}, {0x45a2a000}, {0x45a2c000}, {0x45a2e000},
- {0x45a30000}, {0x45a32000}, {0x45a34000}, {0x45a36000},
- {0x45a38000}, {0x45a3a000}, {0x45a3c000}, {0x45a3e000},
- {0x45a40000}, {0x45a42000}, {0x45a44000}, {0x45a46000},
- {0x45a48000}, {0x45a4a000}, {0x45a4c000}, {0x45a4e000},
- {0x45a50000}, {0x45a52000}, {0x45a54000}, {0x45a56000},
- {0x45a58000}, {0x45a5a000}, {0x45a5c000}, {0x45a5e000},
- {0x45a60000}, {0x45a62000}, {0x45a64000}, {0x45a66000},
- {0x45a68000}, {0x45a6a000}, {0x45a6c000}, {0x45a6e000},
- {0x45a70000}, {0x45a72000}, {0x45a74000}, {0x45a76000},
- {0x45a78000}, {0x45a7a000}, {0x45a7c000}, {0x45a7e000},
- {0x45a80000}, {0x45a82000}, {0x45a84000}, {0x45a86000},
- {0x45a88000}, {0x45a8a000}, {0x45a8c000}, {0x45a8e000},
- {0x45a90000}, {0x45a92000}, {0x45a94000}, {0x45a96000},
- {0x45a98000}, {0x45a9a000}, {0x45a9c000}, {0x45a9e000},
- {0x45aa0000}, {0x45aa2000}, {0x45aa4000}, {0x45aa6000},
- {0x45aa8000}, {0x45aaa000}, {0x45aac000}, {0x45aae000},
- {0x45ab0000}, {0x45ab2000}, {0x45ab4000}, {0x45ab6000},
- {0x45ab8000}, {0x45aba000}, {0x45abc000}, {0x45abe000},
- {0x45ac0000}, {0x45ac2000}, {0x45ac4000}, {0x45ac6000},
- {0x45ac8000}, {0x45aca000}, {0x45acc000}, {0x45ace000},
- {0x45ad0000}, {0x45ad2000}, {0x45ad4000}, {0x45ad6000},
- {0x45ad8000}, {0x45ada000}, {0x45adc000}, {0x45ade000},
- {0x45ae0000}, {0x45ae2000}, {0x45ae4000}, {0x45ae6000},
- {0x45ae8000}, {0x45aea000}, {0x45aec000}, {0x45aee000},
- {0x45af0000}, {0x45af2000}, {0x45af4000}, {0x45af6000},
- {0x45af8000}, {0x45afa000}, {0x45afc000}, {0x45afe000},
- {0x45b00000}, {0x45b02000}, {0x45b04000}, {0x45b06000},
- {0x45b08000}, {0x45b0a000}, {0x45b0c000}, {0x45b0e000},
- {0x45b10000}, {0x45b12000}, {0x45b14000}, {0x45b16000},
- {0x45b18000}, {0x45b1a000}, {0x45b1c000}, {0x45b1e000},
- {0x45b20000}, {0x45b22000}, {0x45b24000}, {0x45b26000},
- {0x45b28000}, {0x45b2a000}, {0x45b2c000}, {0x45b2e000},
- {0x45b30000}, {0x45b32000}, {0x45b34000}, {0x45b36000},
- {0x45b38000}, {0x45b3a000}, {0x45b3c000}, {0x45b3e000},
- {0x45b40000}, {0x45b42000}, {0x45b44000}, {0x45b46000},
- {0x45b48000}, {0x45b4a000}, {0x45b4c000}, {0x45b4e000},
- {0x45b50000}, {0x45b52000}, {0x45b54000}, {0x45b56000},
- {0x45b58000}, {0x45b5a000}, {0x45b5c000}, {0x45b5e000},
- {0x45b60000}, {0x45b62000}, {0x45b64000}, {0x45b66000},
- {0x45b68000}, {0x45b6a000}, {0x45b6c000}, {0x45b6e000},
- {0x45b70000}, {0x45b72000}, {0x45b74000}, {0x45b76000},
- {0x45b78000}, {0x45b7a000}, {0x45b7c000}, {0x45b7e000},
- {0x45b80000}, {0x45b82000}, {0x45b84000}, {0x45b86000},
- {0x45b88000}, {0x45b8a000}, {0x45b8c000}, {0x45b8e000},
- {0x45b90000}, {0x45b92000}, {0x45b94000}, {0x45b96000},
- {0x45b98000}, {0x45b9a000}, {0x45b9c000}, {0x45b9e000},
- {0x45ba0000}, {0x45ba2000}, {0x45ba4000}, {0x45ba6000},
- {0x45ba8000}, {0x45baa000}, {0x45bac000}, {0x45bae000},
- {0x45bb0000}, {0x45bb2000}, {0x45bb4000}, {0x45bb6000},
- {0x45bb8000}, {0x45bba000}, {0x45bbc000}, {0x45bbe000},
- {0x45bc0000}, {0x45bc2000}, {0x45bc4000}, {0x45bc6000},
- {0x45bc8000}, {0x45bca000}, {0x45bcc000}, {0x45bce000},
- {0x45bd0000}, {0x45bd2000}, {0x45bd4000}, {0x45bd6000},
- {0x45bd8000}, {0x45bda000}, {0x45bdc000}, {0x45bde000},
- {0x45be0000}, {0x45be2000}, {0x45be4000}, {0x45be6000},
- {0x45be8000}, {0x45bea000}, {0x45bec000}, {0x45bee000},
- {0x45bf0000}, {0x45bf2000}, {0x45bf4000}, {0x45bf6000},
- {0x45bf8000}, {0x45bfa000}, {0x45bfc000}, {0x45bfe000},
- {0x45c00000}, {0x45c02000}, {0x45c04000}, {0x45c06000},
- {0x45c08000}, {0x45c0a000}, {0x45c0c000}, {0x45c0e000},
- {0x45c10000}, {0x45c12000}, {0x45c14000}, {0x45c16000},
- {0x45c18000}, {0x45c1a000}, {0x45c1c000}, {0x45c1e000},
- {0x45c20000}, {0x45c22000}, {0x45c24000}, {0x45c26000},
- {0x45c28000}, {0x45c2a000}, {0x45c2c000}, {0x45c2e000},
- {0x45c30000}, {0x45c32000}, {0x45c34000}, {0x45c36000},
- {0x45c38000}, {0x45c3a000}, {0x45c3c000}, {0x45c3e000},
- {0x45c40000}, {0x45c42000}, {0x45c44000}, {0x45c46000},
- {0x45c48000}, {0x45c4a000}, {0x45c4c000}, {0x45c4e000},
- {0x45c50000}, {0x45c52000}, {0x45c54000}, {0x45c56000},
- {0x45c58000}, {0x45c5a000}, {0x45c5c000}, {0x45c5e000},
- {0x45c60000}, {0x45c62000}, {0x45c64000}, {0x45c66000},
- {0x45c68000}, {0x45c6a000}, {0x45c6c000}, {0x45c6e000},
- {0x45c70000}, {0x45c72000}, {0x45c74000}, {0x45c76000},
- {0x45c78000}, {0x45c7a000}, {0x45c7c000}, {0x45c7e000},
- {0x45c80000}, {0x45c82000}, {0x45c84000}, {0x45c86000},
- {0x45c88000}, {0x45c8a000}, {0x45c8c000}, {0x45c8e000},
- {0x45c90000}, {0x45c92000}, {0x45c94000}, {0x45c96000},
- {0x45c98000}, {0x45c9a000}, {0x45c9c000}, {0x45c9e000},
- {0x45ca0000}, {0x45ca2000}, {0x45ca4000}, {0x45ca6000},
- {0x45ca8000}, {0x45caa000}, {0x45cac000}, {0x45cae000},
- {0x45cb0000}, {0x45cb2000}, {0x45cb4000}, {0x45cb6000},
- {0x45cb8000}, {0x45cba000}, {0x45cbc000}, {0x45cbe000},
- {0x45cc0000}, {0x45cc2000}, {0x45cc4000}, {0x45cc6000},
- {0x45cc8000}, {0x45cca000}, {0x45ccc000}, {0x45cce000},
- {0x45cd0000}, {0x45cd2000}, {0x45cd4000}, {0x45cd6000},
- {0x45cd8000}, {0x45cda000}, {0x45cdc000}, {0x45cde000},
- {0x45ce0000}, {0x45ce2000}, {0x45ce4000}, {0x45ce6000},
- {0x45ce8000}, {0x45cea000}, {0x45cec000}, {0x45cee000},
- {0x45cf0000}, {0x45cf2000}, {0x45cf4000}, {0x45cf6000},
- {0x45cf8000}, {0x45cfa000}, {0x45cfc000}, {0x45cfe000},
- {0x45d00000}, {0x45d02000}, {0x45d04000}, {0x45d06000},
- {0x45d08000}, {0x45d0a000}, {0x45d0c000}, {0x45d0e000},
- {0x45d10000}, {0x45d12000}, {0x45d14000}, {0x45d16000},
- {0x45d18000}, {0x45d1a000}, {0x45d1c000}, {0x45d1e000},
- {0x45d20000}, {0x45d22000}, {0x45d24000}, {0x45d26000},
- {0x45d28000}, {0x45d2a000}, {0x45d2c000}, {0x45d2e000},
- {0x45d30000}, {0x45d32000}, {0x45d34000}, {0x45d36000},
- {0x45d38000}, {0x45d3a000}, {0x45d3c000}, {0x45d3e000},
- {0x45d40000}, {0x45d42000}, {0x45d44000}, {0x45d46000},
- {0x45d48000}, {0x45d4a000}, {0x45d4c000}, {0x45d4e000},
- {0x45d50000}, {0x45d52000}, {0x45d54000}, {0x45d56000},
- {0x45d58000}, {0x45d5a000}, {0x45d5c000}, {0x45d5e000},
- {0x45d60000}, {0x45d62000}, {0x45d64000}, {0x45d66000},
- {0x45d68000}, {0x45d6a000}, {0x45d6c000}, {0x45d6e000},
- {0x45d70000}, {0x45d72000}, {0x45d74000}, {0x45d76000},
- {0x45d78000}, {0x45d7a000}, {0x45d7c000}, {0x45d7e000},
- {0x45d80000}, {0x45d82000}, {0x45d84000}, {0x45d86000},
- {0x45d88000}, {0x45d8a000}, {0x45d8c000}, {0x45d8e000},
- {0x45d90000}, {0x45d92000}, {0x45d94000}, {0x45d96000},
- {0x45d98000}, {0x45d9a000}, {0x45d9c000}, {0x45d9e000},
- {0x45da0000}, {0x45da2000}, {0x45da4000}, {0x45da6000},
- {0x45da8000}, {0x45daa000}, {0x45dac000}, {0x45dae000},
- {0x45db0000}, {0x45db2000}, {0x45db4000}, {0x45db6000},
- {0x45db8000}, {0x45dba000}, {0x45dbc000}, {0x45dbe000},
- {0x45dc0000}, {0x45dc2000}, {0x45dc4000}, {0x45dc6000},
- {0x45dc8000}, {0x45dca000}, {0x45dcc000}, {0x45dce000},
- {0x45dd0000}, {0x45dd2000}, {0x45dd4000}, {0x45dd6000},
- {0x45dd8000}, {0x45dda000}, {0x45ddc000}, {0x45dde000},
- {0x45de0000}, {0x45de2000}, {0x45de4000}, {0x45de6000},
- {0x45de8000}, {0x45dea000}, {0x45dec000}, {0x45dee000},
- {0x45df0000}, {0x45df2000}, {0x45df4000}, {0x45df6000},
- {0x45df8000}, {0x45dfa000}, {0x45dfc000}, {0x45dfe000},
- {0x45e00000}, {0x45e02000}, {0x45e04000}, {0x45e06000},
- {0x45e08000}, {0x45e0a000}, {0x45e0c000}, {0x45e0e000},
- {0x45e10000}, {0x45e12000}, {0x45e14000}, {0x45e16000},
- {0x45e18000}, {0x45e1a000}, {0x45e1c000}, {0x45e1e000},
- {0x45e20000}, {0x45e22000}, {0x45e24000}, {0x45e26000},
- {0x45e28000}, {0x45e2a000}, {0x45e2c000}, {0x45e2e000},
- {0x45e30000}, {0x45e32000}, {0x45e34000}, {0x45e36000},
- {0x45e38000}, {0x45e3a000}, {0x45e3c000}, {0x45e3e000},
- {0x45e40000}, {0x45e42000}, {0x45e44000}, {0x45e46000},
- {0x45e48000}, {0x45e4a000}, {0x45e4c000}, {0x45e4e000},
- {0x45e50000}, {0x45e52000}, {0x45e54000}, {0x45e56000},
- {0x45e58000}, {0x45e5a000}, {0x45e5c000}, {0x45e5e000},
- {0x45e60000}, {0x45e62000}, {0x45e64000}, {0x45e66000},
- {0x45e68000}, {0x45e6a000}, {0x45e6c000}, {0x45e6e000},
- {0x45e70000}, {0x45e72000}, {0x45e74000}, {0x45e76000},
- {0x45e78000}, {0x45e7a000}, {0x45e7c000}, {0x45e7e000},
- {0x45e80000}, {0x45e82000}, {0x45e84000}, {0x45e86000},
- {0x45e88000}, {0x45e8a000}, {0x45e8c000}, {0x45e8e000},
- {0x45e90000}, {0x45e92000}, {0x45e94000}, {0x45e96000},
- {0x45e98000}, {0x45e9a000}, {0x45e9c000}, {0x45e9e000},
- {0x45ea0000}, {0x45ea2000}, {0x45ea4000}, {0x45ea6000},
- {0x45ea8000}, {0x45eaa000}, {0x45eac000}, {0x45eae000},
- {0x45eb0000}, {0x45eb2000}, {0x45eb4000}, {0x45eb6000},
- {0x45eb8000}, {0x45eba000}, {0x45ebc000}, {0x45ebe000},
- {0x45ec0000}, {0x45ec2000}, {0x45ec4000}, {0x45ec6000},
- {0x45ec8000}, {0x45eca000}, {0x45ecc000}, {0x45ece000},
- {0x45ed0000}, {0x45ed2000}, {0x45ed4000}, {0x45ed6000},
- {0x45ed8000}, {0x45eda000}, {0x45edc000}, {0x45ede000},
- {0x45ee0000}, {0x45ee2000}, {0x45ee4000}, {0x45ee6000},
- {0x45ee8000}, {0x45eea000}, {0x45eec000}, {0x45eee000},
- {0x45ef0000}, {0x45ef2000}, {0x45ef4000}, {0x45ef6000},
- {0x45ef8000}, {0x45efa000}, {0x45efc000}, {0x45efe000},
- {0x45f00000}, {0x45f02000}, {0x45f04000}, {0x45f06000},
- {0x45f08000}, {0x45f0a000}, {0x45f0c000}, {0x45f0e000},
- {0x45f10000}, {0x45f12000}, {0x45f14000}, {0x45f16000},
- {0x45f18000}, {0x45f1a000}, {0x45f1c000}, {0x45f1e000},
- {0x45f20000}, {0x45f22000}, {0x45f24000}, {0x45f26000},
- {0x45f28000}, {0x45f2a000}, {0x45f2c000}, {0x45f2e000},
- {0x45f30000}, {0x45f32000}, {0x45f34000}, {0x45f36000},
- {0x45f38000}, {0x45f3a000}, {0x45f3c000}, {0x45f3e000},
- {0x45f40000}, {0x45f42000}, {0x45f44000}, {0x45f46000},
- {0x45f48000}, {0x45f4a000}, {0x45f4c000}, {0x45f4e000},
- {0x45f50000}, {0x45f52000}, {0x45f54000}, {0x45f56000},
- {0x45f58000}, {0x45f5a000}, {0x45f5c000}, {0x45f5e000},
- {0x45f60000}, {0x45f62000}, {0x45f64000}, {0x45f66000},
- {0x45f68000}, {0x45f6a000}, {0x45f6c000}, {0x45f6e000},
- {0x45f70000}, {0x45f72000}, {0x45f74000}, {0x45f76000},
- {0x45f78000}, {0x45f7a000}, {0x45f7c000}, {0x45f7e000},
- {0x45f80000}, {0x45f82000}, {0x45f84000}, {0x45f86000},
- {0x45f88000}, {0x45f8a000}, {0x45f8c000}, {0x45f8e000},
- {0x45f90000}, {0x45f92000}, {0x45f94000}, {0x45f96000},
- {0x45f98000}, {0x45f9a000}, {0x45f9c000}, {0x45f9e000},
- {0x45fa0000}, {0x45fa2000}, {0x45fa4000}, {0x45fa6000},
- {0x45fa8000}, {0x45faa000}, {0x45fac000}, {0x45fae000},
- {0x45fb0000}, {0x45fb2000}, {0x45fb4000}, {0x45fb6000},
- {0x45fb8000}, {0x45fba000}, {0x45fbc000}, {0x45fbe000},
- {0x45fc0000}, {0x45fc2000}, {0x45fc4000}, {0x45fc6000},
- {0x45fc8000}, {0x45fca000}, {0x45fcc000}, {0x45fce000},
- {0x45fd0000}, {0x45fd2000}, {0x45fd4000}, {0x45fd6000},
- {0x45fd8000}, {0x45fda000}, {0x45fdc000}, {0x45fde000},
- {0x45fe0000}, {0x45fe2000}, {0x45fe4000}, {0x45fe6000},
- {0x45fe8000}, {0x45fea000}, {0x45fec000}, {0x45fee000},
- {0x45ff0000}, {0x45ff2000}, {0x45ff4000}, {0x45ff6000},
- {0x45ff8000}, {0x45ffa000}, {0x45ffc000}, {0x45ffe000},
- {0x46000000}, {0x46002000}, {0x46004000}, {0x46006000},
- {0x46008000}, {0x4600a000}, {0x4600c000}, {0x4600e000},
- {0x46010000}, {0x46012000}, {0x46014000}, {0x46016000},
- {0x46018000}, {0x4601a000}, {0x4601c000}, {0x4601e000},
- {0x46020000}, {0x46022000}, {0x46024000}, {0x46026000},
- {0x46028000}, {0x4602a000}, {0x4602c000}, {0x4602e000},
- {0x46030000}, {0x46032000}, {0x46034000}, {0x46036000},
- {0x46038000}, {0x4603a000}, {0x4603c000}, {0x4603e000},
- {0x46040000}, {0x46042000}, {0x46044000}, {0x46046000},
- {0x46048000}, {0x4604a000}, {0x4604c000}, {0x4604e000},
- {0x46050000}, {0x46052000}, {0x46054000}, {0x46056000},
- {0x46058000}, {0x4605a000}, {0x4605c000}, {0x4605e000},
- {0x46060000}, {0x46062000}, {0x46064000}, {0x46066000},
- {0x46068000}, {0x4606a000}, {0x4606c000}, {0x4606e000},
- {0x46070000}, {0x46072000}, {0x46074000}, {0x46076000},
- {0x46078000}, {0x4607a000}, {0x4607c000}, {0x4607e000},
- {0x46080000}, {0x46082000}, {0x46084000}, {0x46086000},
- {0x46088000}, {0x4608a000}, {0x4608c000}, {0x4608e000},
- {0x46090000}, {0x46092000}, {0x46094000}, {0x46096000},
- {0x46098000}, {0x4609a000}, {0x4609c000}, {0x4609e000},
- {0x460a0000}, {0x460a2000}, {0x460a4000}, {0x460a6000},
- {0x460a8000}, {0x460aa000}, {0x460ac000}, {0x460ae000},
- {0x460b0000}, {0x460b2000}, {0x460b4000}, {0x460b6000},
- {0x460b8000}, {0x460ba000}, {0x460bc000}, {0x460be000},
- {0x460c0000}, {0x460c2000}, {0x460c4000}, {0x460c6000},
- {0x460c8000}, {0x460ca000}, {0x460cc000}, {0x460ce000},
- {0x460d0000}, {0x460d2000}, {0x460d4000}, {0x460d6000},
- {0x460d8000}, {0x460da000}, {0x460dc000}, {0x460de000},
- {0x460e0000}, {0x460e2000}, {0x460e4000}, {0x460e6000},
- {0x460e8000}, {0x460ea000}, {0x460ec000}, {0x460ee000},
- {0x460f0000}, {0x460f2000}, {0x460f4000}, {0x460f6000},
- {0x460f8000}, {0x460fa000}, {0x460fc000}, {0x460fe000},
- {0x46100000}, {0x46102000}, {0x46104000}, {0x46106000},
- {0x46108000}, {0x4610a000}, {0x4610c000}, {0x4610e000},
- {0x46110000}, {0x46112000}, {0x46114000}, {0x46116000},
- {0x46118000}, {0x4611a000}, {0x4611c000}, {0x4611e000},
- {0x46120000}, {0x46122000}, {0x46124000}, {0x46126000},
- {0x46128000}, {0x4612a000}, {0x4612c000}, {0x4612e000},
- {0x46130000}, {0x46132000}, {0x46134000}, {0x46136000},
- {0x46138000}, {0x4613a000}, {0x4613c000}, {0x4613e000},
- {0x46140000}, {0x46142000}, {0x46144000}, {0x46146000},
- {0x46148000}, {0x4614a000}, {0x4614c000}, {0x4614e000},
- {0x46150000}, {0x46152000}, {0x46154000}, {0x46156000},
- {0x46158000}, {0x4615a000}, {0x4615c000}, {0x4615e000},
- {0x46160000}, {0x46162000}, {0x46164000}, {0x46166000},
- {0x46168000}, {0x4616a000}, {0x4616c000}, {0x4616e000},
- {0x46170000}, {0x46172000}, {0x46174000}, {0x46176000},
- {0x46178000}, {0x4617a000}, {0x4617c000}, {0x4617e000},
- {0x46180000}, {0x46182000}, {0x46184000}, {0x46186000},
- {0x46188000}, {0x4618a000}, {0x4618c000}, {0x4618e000},
- {0x46190000}, {0x46192000}, {0x46194000}, {0x46196000},
- {0x46198000}, {0x4619a000}, {0x4619c000}, {0x4619e000},
- {0x461a0000}, {0x461a2000}, {0x461a4000}, {0x461a6000},
- {0x461a8000}, {0x461aa000}, {0x461ac000}, {0x461ae000},
- {0x461b0000}, {0x461b2000}, {0x461b4000}, {0x461b6000},
- {0x461b8000}, {0x461ba000}, {0x461bc000}, {0x461be000},
- {0x461c0000}, {0x461c2000}, {0x461c4000}, {0x461c6000},
- {0x461c8000}, {0x461ca000}, {0x461cc000}, {0x461ce000},
- {0x461d0000}, {0x461d2000}, {0x461d4000}, {0x461d6000},
- {0x461d8000}, {0x461da000}, {0x461dc000}, {0x461de000},
- {0x461e0000}, {0x461e2000}, {0x461e4000}, {0x461e6000},
- {0x461e8000}, {0x461ea000}, {0x461ec000}, {0x461ee000},
- {0x461f0000}, {0x461f2000}, {0x461f4000}, {0x461f6000},
- {0x461f8000}, {0x461fa000}, {0x461fc000}, {0x461fe000},
- {0x46200000}, {0x46202000}, {0x46204000}, {0x46206000},
- {0x46208000}, {0x4620a000}, {0x4620c000}, {0x4620e000},
- {0x46210000}, {0x46212000}, {0x46214000}, {0x46216000},
- {0x46218000}, {0x4621a000}, {0x4621c000}, {0x4621e000},
- {0x46220000}, {0x46222000}, {0x46224000}, {0x46226000},
- {0x46228000}, {0x4622a000}, {0x4622c000}, {0x4622e000},
- {0x46230000}, {0x46232000}, {0x46234000}, {0x46236000},
- {0x46238000}, {0x4623a000}, {0x4623c000}, {0x4623e000},
- {0x46240000}, {0x46242000}, {0x46244000}, {0x46246000},
- {0x46248000}, {0x4624a000}, {0x4624c000}, {0x4624e000},
- {0x46250000}, {0x46252000}, {0x46254000}, {0x46256000},
- {0x46258000}, {0x4625a000}, {0x4625c000}, {0x4625e000},
- {0x46260000}, {0x46262000}, {0x46264000}, {0x46266000},
- {0x46268000}, {0x4626a000}, {0x4626c000}, {0x4626e000},
- {0x46270000}, {0x46272000}, {0x46274000}, {0x46276000},
- {0x46278000}, {0x4627a000}, {0x4627c000}, {0x4627e000},
- {0x46280000}, {0x46282000}, {0x46284000}, {0x46286000},
- {0x46288000}, {0x4628a000}, {0x4628c000}, {0x4628e000},
- {0x46290000}, {0x46292000}, {0x46294000}, {0x46296000},
- {0x46298000}, {0x4629a000}, {0x4629c000}, {0x4629e000},
- {0x462a0000}, {0x462a2000}, {0x462a4000}, {0x462a6000},
- {0x462a8000}, {0x462aa000}, {0x462ac000}, {0x462ae000},
- {0x462b0000}, {0x462b2000}, {0x462b4000}, {0x462b6000},
- {0x462b8000}, {0x462ba000}, {0x462bc000}, {0x462be000},
- {0x462c0000}, {0x462c2000}, {0x462c4000}, {0x462c6000},
- {0x462c8000}, {0x462ca000}, {0x462cc000}, {0x462ce000},
- {0x462d0000}, {0x462d2000}, {0x462d4000}, {0x462d6000},
- {0x462d8000}, {0x462da000}, {0x462dc000}, {0x462de000},
- {0x462e0000}, {0x462e2000}, {0x462e4000}, {0x462e6000},
- {0x462e8000}, {0x462ea000}, {0x462ec000}, {0x462ee000},
- {0x462f0000}, {0x462f2000}, {0x462f4000}, {0x462f6000},
- {0x462f8000}, {0x462fa000}, {0x462fc000}, {0x462fe000},
- {0x46300000}, {0x46302000}, {0x46304000}, {0x46306000},
- {0x46308000}, {0x4630a000}, {0x4630c000}, {0x4630e000},
- {0x46310000}, {0x46312000}, {0x46314000}, {0x46316000},
- {0x46318000}, {0x4631a000}, {0x4631c000}, {0x4631e000},
- {0x46320000}, {0x46322000}, {0x46324000}, {0x46326000},
- {0x46328000}, {0x4632a000}, {0x4632c000}, {0x4632e000},
- {0x46330000}, {0x46332000}, {0x46334000}, {0x46336000},
- {0x46338000}, {0x4633a000}, {0x4633c000}, {0x4633e000},
- {0x46340000}, {0x46342000}, {0x46344000}, {0x46346000},
- {0x46348000}, {0x4634a000}, {0x4634c000}, {0x4634e000},
- {0x46350000}, {0x46352000}, {0x46354000}, {0x46356000},
- {0x46358000}, {0x4635a000}, {0x4635c000}, {0x4635e000},
- {0x46360000}, {0x46362000}, {0x46364000}, {0x46366000},
- {0x46368000}, {0x4636a000}, {0x4636c000}, {0x4636e000},
- {0x46370000}, {0x46372000}, {0x46374000}, {0x46376000},
- {0x46378000}, {0x4637a000}, {0x4637c000}, {0x4637e000},
- {0x46380000}, {0x46382000}, {0x46384000}, {0x46386000},
- {0x46388000}, {0x4638a000}, {0x4638c000}, {0x4638e000},
- {0x46390000}, {0x46392000}, {0x46394000}, {0x46396000},
- {0x46398000}, {0x4639a000}, {0x4639c000}, {0x4639e000},
- {0x463a0000}, {0x463a2000}, {0x463a4000}, {0x463a6000},
- {0x463a8000}, {0x463aa000}, {0x463ac000}, {0x463ae000},
- {0x463b0000}, {0x463b2000}, {0x463b4000}, {0x463b6000},
- {0x463b8000}, {0x463ba000}, {0x463bc000}, {0x463be000},
- {0x463c0000}, {0x463c2000}, {0x463c4000}, {0x463c6000},
- {0x463c8000}, {0x463ca000}, {0x463cc000}, {0x463ce000},
- {0x463d0000}, {0x463d2000}, {0x463d4000}, {0x463d6000},
- {0x463d8000}, {0x463da000}, {0x463dc000}, {0x463de000},
- {0x463e0000}, {0x463e2000}, {0x463e4000}, {0x463e6000},
- {0x463e8000}, {0x463ea000}, {0x463ec000}, {0x463ee000},
- {0x463f0000}, {0x463f2000}, {0x463f4000}, {0x463f6000},
- {0x463f8000}, {0x463fa000}, {0x463fc000}, {0x463fe000},
- {0x46400000}, {0x46402000}, {0x46404000}, {0x46406000},
- {0x46408000}, {0x4640a000}, {0x4640c000}, {0x4640e000},
- {0x46410000}, {0x46412000}, {0x46414000}, {0x46416000},
- {0x46418000}, {0x4641a000}, {0x4641c000}, {0x4641e000},
- {0x46420000}, {0x46422000}, {0x46424000}, {0x46426000},
- {0x46428000}, {0x4642a000}, {0x4642c000}, {0x4642e000},
- {0x46430000}, {0x46432000}, {0x46434000}, {0x46436000},
- {0x46438000}, {0x4643a000}, {0x4643c000}, {0x4643e000},
- {0x46440000}, {0x46442000}, {0x46444000}, {0x46446000},
- {0x46448000}, {0x4644a000}, {0x4644c000}, {0x4644e000},
- {0x46450000}, {0x46452000}, {0x46454000}, {0x46456000},
- {0x46458000}, {0x4645a000}, {0x4645c000}, {0x4645e000},
- {0x46460000}, {0x46462000}, {0x46464000}, {0x46466000},
- {0x46468000}, {0x4646a000}, {0x4646c000}, {0x4646e000},
- {0x46470000}, {0x46472000}, {0x46474000}, {0x46476000},
- {0x46478000}, {0x4647a000}, {0x4647c000}, {0x4647e000},
- {0x46480000}, {0x46482000}, {0x46484000}, {0x46486000},
- {0x46488000}, {0x4648a000}, {0x4648c000}, {0x4648e000},
- {0x46490000}, {0x46492000}, {0x46494000}, {0x46496000},
- {0x46498000}, {0x4649a000}, {0x4649c000}, {0x4649e000},
- {0x464a0000}, {0x464a2000}, {0x464a4000}, {0x464a6000},
- {0x464a8000}, {0x464aa000}, {0x464ac000}, {0x464ae000},
- {0x464b0000}, {0x464b2000}, {0x464b4000}, {0x464b6000},
- {0x464b8000}, {0x464ba000}, {0x464bc000}, {0x464be000},
- {0x464c0000}, {0x464c2000}, {0x464c4000}, {0x464c6000},
- {0x464c8000}, {0x464ca000}, {0x464cc000}, {0x464ce000},
- {0x464d0000}, {0x464d2000}, {0x464d4000}, {0x464d6000},
- {0x464d8000}, {0x464da000}, {0x464dc000}, {0x464de000},
- {0x464e0000}, {0x464e2000}, {0x464e4000}, {0x464e6000},
- {0x464e8000}, {0x464ea000}, {0x464ec000}, {0x464ee000},
- {0x464f0000}, {0x464f2000}, {0x464f4000}, {0x464f6000},
- {0x464f8000}, {0x464fa000}, {0x464fc000}, {0x464fe000},
- {0x46500000}, {0x46502000}, {0x46504000}, {0x46506000},
- {0x46508000}, {0x4650a000}, {0x4650c000}, {0x4650e000},
- {0x46510000}, {0x46512000}, {0x46514000}, {0x46516000},
- {0x46518000}, {0x4651a000}, {0x4651c000}, {0x4651e000},
- {0x46520000}, {0x46522000}, {0x46524000}, {0x46526000},
- {0x46528000}, {0x4652a000}, {0x4652c000}, {0x4652e000},
- {0x46530000}, {0x46532000}, {0x46534000}, {0x46536000},
- {0x46538000}, {0x4653a000}, {0x4653c000}, {0x4653e000},
- {0x46540000}, {0x46542000}, {0x46544000}, {0x46546000},
- {0x46548000}, {0x4654a000}, {0x4654c000}, {0x4654e000},
- {0x46550000}, {0x46552000}, {0x46554000}, {0x46556000},
- {0x46558000}, {0x4655a000}, {0x4655c000}, {0x4655e000},
- {0x46560000}, {0x46562000}, {0x46564000}, {0x46566000},
- {0x46568000}, {0x4656a000}, {0x4656c000}, {0x4656e000},
- {0x46570000}, {0x46572000}, {0x46574000}, {0x46576000},
- {0x46578000}, {0x4657a000}, {0x4657c000}, {0x4657e000},
- {0x46580000}, {0x46582000}, {0x46584000}, {0x46586000},
- {0x46588000}, {0x4658a000}, {0x4658c000}, {0x4658e000},
- {0x46590000}, {0x46592000}, {0x46594000}, {0x46596000},
- {0x46598000}, {0x4659a000}, {0x4659c000}, {0x4659e000},
- {0x465a0000}, {0x465a2000}, {0x465a4000}, {0x465a6000},
- {0x465a8000}, {0x465aa000}, {0x465ac000}, {0x465ae000},
- {0x465b0000}, {0x465b2000}, {0x465b4000}, {0x465b6000},
- {0x465b8000}, {0x465ba000}, {0x465bc000}, {0x465be000},
- {0x465c0000}, {0x465c2000}, {0x465c4000}, {0x465c6000},
- {0x465c8000}, {0x465ca000}, {0x465cc000}, {0x465ce000},
- {0x465d0000}, {0x465d2000}, {0x465d4000}, {0x465d6000},
- {0x465d8000}, {0x465da000}, {0x465dc000}, {0x465de000},
- {0x465e0000}, {0x465e2000}, {0x465e4000}, {0x465e6000},
- {0x465e8000}, {0x465ea000}, {0x465ec000}, {0x465ee000},
- {0x465f0000}, {0x465f2000}, {0x465f4000}, {0x465f6000},
- {0x465f8000}, {0x465fa000}, {0x465fc000}, {0x465fe000},
- {0x46600000}, {0x46602000}, {0x46604000}, {0x46606000},
- {0x46608000}, {0x4660a000}, {0x4660c000}, {0x4660e000},
- {0x46610000}, {0x46612000}, {0x46614000}, {0x46616000},
- {0x46618000}, {0x4661a000}, {0x4661c000}, {0x4661e000},
- {0x46620000}, {0x46622000}, {0x46624000}, {0x46626000},
- {0x46628000}, {0x4662a000}, {0x4662c000}, {0x4662e000},
- {0x46630000}, {0x46632000}, {0x46634000}, {0x46636000},
- {0x46638000}, {0x4663a000}, {0x4663c000}, {0x4663e000},
- {0x46640000}, {0x46642000}, {0x46644000}, {0x46646000},
- {0x46648000}, {0x4664a000}, {0x4664c000}, {0x4664e000},
- {0x46650000}, {0x46652000}, {0x46654000}, {0x46656000},
- {0x46658000}, {0x4665a000}, {0x4665c000}, {0x4665e000},
- {0x46660000}, {0x46662000}, {0x46664000}, {0x46666000},
- {0x46668000}, {0x4666a000}, {0x4666c000}, {0x4666e000},
- {0x46670000}, {0x46672000}, {0x46674000}, {0x46676000},
- {0x46678000}, {0x4667a000}, {0x4667c000}, {0x4667e000},
- {0x46680000}, {0x46682000}, {0x46684000}, {0x46686000},
- {0x46688000}, {0x4668a000}, {0x4668c000}, {0x4668e000},
- {0x46690000}, {0x46692000}, {0x46694000}, {0x46696000},
- {0x46698000}, {0x4669a000}, {0x4669c000}, {0x4669e000},
- {0x466a0000}, {0x466a2000}, {0x466a4000}, {0x466a6000},
- {0x466a8000}, {0x466aa000}, {0x466ac000}, {0x466ae000},
- {0x466b0000}, {0x466b2000}, {0x466b4000}, {0x466b6000},
- {0x466b8000}, {0x466ba000}, {0x466bc000}, {0x466be000},
- {0x466c0000}, {0x466c2000}, {0x466c4000}, {0x466c6000},
- {0x466c8000}, {0x466ca000}, {0x466cc000}, {0x466ce000},
- {0x466d0000}, {0x466d2000}, {0x466d4000}, {0x466d6000},
- {0x466d8000}, {0x466da000}, {0x466dc000}, {0x466de000},
- {0x466e0000}, {0x466e2000}, {0x466e4000}, {0x466e6000},
- {0x466e8000}, {0x466ea000}, {0x466ec000}, {0x466ee000},
- {0x466f0000}, {0x466f2000}, {0x466f4000}, {0x466f6000},
- {0x466f8000}, {0x466fa000}, {0x466fc000}, {0x466fe000},
- {0x46700000}, {0x46702000}, {0x46704000}, {0x46706000},
- {0x46708000}, {0x4670a000}, {0x4670c000}, {0x4670e000},
- {0x46710000}, {0x46712000}, {0x46714000}, {0x46716000},
- {0x46718000}, {0x4671a000}, {0x4671c000}, {0x4671e000},
- {0x46720000}, {0x46722000}, {0x46724000}, {0x46726000},
- {0x46728000}, {0x4672a000}, {0x4672c000}, {0x4672e000},
- {0x46730000}, {0x46732000}, {0x46734000}, {0x46736000},
- {0x46738000}, {0x4673a000}, {0x4673c000}, {0x4673e000},
- {0x46740000}, {0x46742000}, {0x46744000}, {0x46746000},
- {0x46748000}, {0x4674a000}, {0x4674c000}, {0x4674e000},
- {0x46750000}, {0x46752000}, {0x46754000}, {0x46756000},
- {0x46758000}, {0x4675a000}, {0x4675c000}, {0x4675e000},
- {0x46760000}, {0x46762000}, {0x46764000}, {0x46766000},
- {0x46768000}, {0x4676a000}, {0x4676c000}, {0x4676e000},
- {0x46770000}, {0x46772000}, {0x46774000}, {0x46776000},
- {0x46778000}, {0x4677a000}, {0x4677c000}, {0x4677e000},
- {0x46780000}, {0x46782000}, {0x46784000}, {0x46786000},
- {0x46788000}, {0x4678a000}, {0x4678c000}, {0x4678e000},
- {0x46790000}, {0x46792000}, {0x46794000}, {0x46796000},
- {0x46798000}, {0x4679a000}, {0x4679c000}, {0x4679e000},
- {0x467a0000}, {0x467a2000}, {0x467a4000}, {0x467a6000},
- {0x467a8000}, {0x467aa000}, {0x467ac000}, {0x467ae000},
- {0x467b0000}, {0x467b2000}, {0x467b4000}, {0x467b6000},
- {0x467b8000}, {0x467ba000}, {0x467bc000}, {0x467be000},
- {0x467c0000}, {0x467c2000}, {0x467c4000}, {0x467c6000},
- {0x467c8000}, {0x467ca000}, {0x467cc000}, {0x467ce000},
- {0x467d0000}, {0x467d2000}, {0x467d4000}, {0x467d6000},
- {0x467d8000}, {0x467da000}, {0x467dc000}, {0x467de000},
- {0x467e0000}, {0x467e2000}, {0x467e4000}, {0x467e6000},
- {0x467e8000}, {0x467ea000}, {0x467ec000}, {0x467ee000},
- {0x467f0000}, {0x467f2000}, {0x467f4000}, {0x467f6000},
- {0x467f8000}, {0x467fa000}, {0x467fc000}, {0x467fe000},
- {0x46800000}, {0x46802000}, {0x46804000}, {0x46806000},
- {0x46808000}, {0x4680a000}, {0x4680c000}, {0x4680e000},
- {0x46810000}, {0x46812000}, {0x46814000}, {0x46816000},
- {0x46818000}, {0x4681a000}, {0x4681c000}, {0x4681e000},
- {0x46820000}, {0x46822000}, {0x46824000}, {0x46826000},
- {0x46828000}, {0x4682a000}, {0x4682c000}, {0x4682e000},
- {0x46830000}, {0x46832000}, {0x46834000}, {0x46836000},
- {0x46838000}, {0x4683a000}, {0x4683c000}, {0x4683e000},
- {0x46840000}, {0x46842000}, {0x46844000}, {0x46846000},
- {0x46848000}, {0x4684a000}, {0x4684c000}, {0x4684e000},
- {0x46850000}, {0x46852000}, {0x46854000}, {0x46856000},
- {0x46858000}, {0x4685a000}, {0x4685c000}, {0x4685e000},
- {0x46860000}, {0x46862000}, {0x46864000}, {0x46866000},
- {0x46868000}, {0x4686a000}, {0x4686c000}, {0x4686e000},
- {0x46870000}, {0x46872000}, {0x46874000}, {0x46876000},
- {0x46878000}, {0x4687a000}, {0x4687c000}, {0x4687e000},
- {0x46880000}, {0x46882000}, {0x46884000}, {0x46886000},
- {0x46888000}, {0x4688a000}, {0x4688c000}, {0x4688e000},
- {0x46890000}, {0x46892000}, {0x46894000}, {0x46896000},
- {0x46898000}, {0x4689a000}, {0x4689c000}, {0x4689e000},
- {0x468a0000}, {0x468a2000}, {0x468a4000}, {0x468a6000},
- {0x468a8000}, {0x468aa000}, {0x468ac000}, {0x468ae000},
- {0x468b0000}, {0x468b2000}, {0x468b4000}, {0x468b6000},
- {0x468b8000}, {0x468ba000}, {0x468bc000}, {0x468be000},
- {0x468c0000}, {0x468c2000}, {0x468c4000}, {0x468c6000},
- {0x468c8000}, {0x468ca000}, {0x468cc000}, {0x468ce000},
- {0x468d0000}, {0x468d2000}, {0x468d4000}, {0x468d6000},
- {0x468d8000}, {0x468da000}, {0x468dc000}, {0x468de000},
- {0x468e0000}, {0x468e2000}, {0x468e4000}, {0x468e6000},
- {0x468e8000}, {0x468ea000}, {0x468ec000}, {0x468ee000},
- {0x468f0000}, {0x468f2000}, {0x468f4000}, {0x468f6000},
- {0x468f8000}, {0x468fa000}, {0x468fc000}, {0x468fe000},
- {0x46900000}, {0x46902000}, {0x46904000}, {0x46906000},
- {0x46908000}, {0x4690a000}, {0x4690c000}, {0x4690e000},
- {0x46910000}, {0x46912000}, {0x46914000}, {0x46916000},
- {0x46918000}, {0x4691a000}, {0x4691c000}, {0x4691e000},
- {0x46920000}, {0x46922000}, {0x46924000}, {0x46926000},
- {0x46928000}, {0x4692a000}, {0x4692c000}, {0x4692e000},
- {0x46930000}, {0x46932000}, {0x46934000}, {0x46936000},
- {0x46938000}, {0x4693a000}, {0x4693c000}, {0x4693e000},
- {0x46940000}, {0x46942000}, {0x46944000}, {0x46946000},
- {0x46948000}, {0x4694a000}, {0x4694c000}, {0x4694e000},
- {0x46950000}, {0x46952000}, {0x46954000}, {0x46956000},
- {0x46958000}, {0x4695a000}, {0x4695c000}, {0x4695e000},
- {0x46960000}, {0x46962000}, {0x46964000}, {0x46966000},
- {0x46968000}, {0x4696a000}, {0x4696c000}, {0x4696e000},
- {0x46970000}, {0x46972000}, {0x46974000}, {0x46976000},
- {0x46978000}, {0x4697a000}, {0x4697c000}, {0x4697e000},
- {0x46980000}, {0x46982000}, {0x46984000}, {0x46986000},
- {0x46988000}, {0x4698a000}, {0x4698c000}, {0x4698e000},
- {0x46990000}, {0x46992000}, {0x46994000}, {0x46996000},
- {0x46998000}, {0x4699a000}, {0x4699c000}, {0x4699e000},
- {0x469a0000}, {0x469a2000}, {0x469a4000}, {0x469a6000},
- {0x469a8000}, {0x469aa000}, {0x469ac000}, {0x469ae000},
- {0x469b0000}, {0x469b2000}, {0x469b4000}, {0x469b6000},
- {0x469b8000}, {0x469ba000}, {0x469bc000}, {0x469be000},
- {0x469c0000}, {0x469c2000}, {0x469c4000}, {0x469c6000},
- {0x469c8000}, {0x469ca000}, {0x469cc000}, {0x469ce000},
- {0x469d0000}, {0x469d2000}, {0x469d4000}, {0x469d6000},
- {0x469d8000}, {0x469da000}, {0x469dc000}, {0x469de000},
- {0x469e0000}, {0x469e2000}, {0x469e4000}, {0x469e6000},
- {0x469e8000}, {0x469ea000}, {0x469ec000}, {0x469ee000},
- {0x469f0000}, {0x469f2000}, {0x469f4000}, {0x469f6000},
- {0x469f8000}, {0x469fa000}, {0x469fc000}, {0x469fe000},
- {0x46a00000}, {0x46a02000}, {0x46a04000}, {0x46a06000},
- {0x46a08000}, {0x46a0a000}, {0x46a0c000}, {0x46a0e000},
- {0x46a10000}, {0x46a12000}, {0x46a14000}, {0x46a16000},
- {0x46a18000}, {0x46a1a000}, {0x46a1c000}, {0x46a1e000},
- {0x46a20000}, {0x46a22000}, {0x46a24000}, {0x46a26000},
- {0x46a28000}, {0x46a2a000}, {0x46a2c000}, {0x46a2e000},
- {0x46a30000}, {0x46a32000}, {0x46a34000}, {0x46a36000},
- {0x46a38000}, {0x46a3a000}, {0x46a3c000}, {0x46a3e000},
- {0x46a40000}, {0x46a42000}, {0x46a44000}, {0x46a46000},
- {0x46a48000}, {0x46a4a000}, {0x46a4c000}, {0x46a4e000},
- {0x46a50000}, {0x46a52000}, {0x46a54000}, {0x46a56000},
- {0x46a58000}, {0x46a5a000}, {0x46a5c000}, {0x46a5e000},
- {0x46a60000}, {0x46a62000}, {0x46a64000}, {0x46a66000},
- {0x46a68000}, {0x46a6a000}, {0x46a6c000}, {0x46a6e000},
- {0x46a70000}, {0x46a72000}, {0x46a74000}, {0x46a76000},
- {0x46a78000}, {0x46a7a000}, {0x46a7c000}, {0x46a7e000},
- {0x46a80000}, {0x46a82000}, {0x46a84000}, {0x46a86000},
- {0x46a88000}, {0x46a8a000}, {0x46a8c000}, {0x46a8e000},
- {0x46a90000}, {0x46a92000}, {0x46a94000}, {0x46a96000},
- {0x46a98000}, {0x46a9a000}, {0x46a9c000}, {0x46a9e000},
- {0x46aa0000}, {0x46aa2000}, {0x46aa4000}, {0x46aa6000},
- {0x46aa8000}, {0x46aaa000}, {0x46aac000}, {0x46aae000},
- {0x46ab0000}, {0x46ab2000}, {0x46ab4000}, {0x46ab6000},
- {0x46ab8000}, {0x46aba000}, {0x46abc000}, {0x46abe000},
- {0x46ac0000}, {0x46ac2000}, {0x46ac4000}, {0x46ac6000},
- {0x46ac8000}, {0x46aca000}, {0x46acc000}, {0x46ace000},
- {0x46ad0000}, {0x46ad2000}, {0x46ad4000}, {0x46ad6000},
- {0x46ad8000}, {0x46ada000}, {0x46adc000}, {0x46ade000},
- {0x46ae0000}, {0x46ae2000}, {0x46ae4000}, {0x46ae6000},
- {0x46ae8000}, {0x46aea000}, {0x46aec000}, {0x46aee000},
- {0x46af0000}, {0x46af2000}, {0x46af4000}, {0x46af6000},
- {0x46af8000}, {0x46afa000}, {0x46afc000}, {0x46afe000},
- {0x46b00000}, {0x46b02000}, {0x46b04000}, {0x46b06000},
- {0x46b08000}, {0x46b0a000}, {0x46b0c000}, {0x46b0e000},
- {0x46b10000}, {0x46b12000}, {0x46b14000}, {0x46b16000},
- {0x46b18000}, {0x46b1a000}, {0x46b1c000}, {0x46b1e000},
- {0x46b20000}, {0x46b22000}, {0x46b24000}, {0x46b26000},
- {0x46b28000}, {0x46b2a000}, {0x46b2c000}, {0x46b2e000},
- {0x46b30000}, {0x46b32000}, {0x46b34000}, {0x46b36000},
- {0x46b38000}, {0x46b3a000}, {0x46b3c000}, {0x46b3e000},
- {0x46b40000}, {0x46b42000}, {0x46b44000}, {0x46b46000},
- {0x46b48000}, {0x46b4a000}, {0x46b4c000}, {0x46b4e000},
- {0x46b50000}, {0x46b52000}, {0x46b54000}, {0x46b56000},
- {0x46b58000}, {0x46b5a000}, {0x46b5c000}, {0x46b5e000},
- {0x46b60000}, {0x46b62000}, {0x46b64000}, {0x46b66000},
- {0x46b68000}, {0x46b6a000}, {0x46b6c000}, {0x46b6e000},
- {0x46b70000}, {0x46b72000}, {0x46b74000}, {0x46b76000},
- {0x46b78000}, {0x46b7a000}, {0x46b7c000}, {0x46b7e000},
- {0x46b80000}, {0x46b82000}, {0x46b84000}, {0x46b86000},
- {0x46b88000}, {0x46b8a000}, {0x46b8c000}, {0x46b8e000},
- {0x46b90000}, {0x46b92000}, {0x46b94000}, {0x46b96000},
- {0x46b98000}, {0x46b9a000}, {0x46b9c000}, {0x46b9e000},
- {0x46ba0000}, {0x46ba2000}, {0x46ba4000}, {0x46ba6000},
- {0x46ba8000}, {0x46baa000}, {0x46bac000}, {0x46bae000},
- {0x46bb0000}, {0x46bb2000}, {0x46bb4000}, {0x46bb6000},
- {0x46bb8000}, {0x46bba000}, {0x46bbc000}, {0x46bbe000},
- {0x46bc0000}, {0x46bc2000}, {0x46bc4000}, {0x46bc6000},
- {0x46bc8000}, {0x46bca000}, {0x46bcc000}, {0x46bce000},
- {0x46bd0000}, {0x46bd2000}, {0x46bd4000}, {0x46bd6000},
- {0x46bd8000}, {0x46bda000}, {0x46bdc000}, {0x46bde000},
- {0x46be0000}, {0x46be2000}, {0x46be4000}, {0x46be6000},
- {0x46be8000}, {0x46bea000}, {0x46bec000}, {0x46bee000},
- {0x46bf0000}, {0x46bf2000}, {0x46bf4000}, {0x46bf6000},
- {0x46bf8000}, {0x46bfa000}, {0x46bfc000}, {0x46bfe000},
- {0x46c00000}, {0x46c02000}, {0x46c04000}, {0x46c06000},
- {0x46c08000}, {0x46c0a000}, {0x46c0c000}, {0x46c0e000},
- {0x46c10000}, {0x46c12000}, {0x46c14000}, {0x46c16000},
- {0x46c18000}, {0x46c1a000}, {0x46c1c000}, {0x46c1e000},
- {0x46c20000}, {0x46c22000}, {0x46c24000}, {0x46c26000},
- {0x46c28000}, {0x46c2a000}, {0x46c2c000}, {0x46c2e000},
- {0x46c30000}, {0x46c32000}, {0x46c34000}, {0x46c36000},
- {0x46c38000}, {0x46c3a000}, {0x46c3c000}, {0x46c3e000},
- {0x46c40000}, {0x46c42000}, {0x46c44000}, {0x46c46000},
- {0x46c48000}, {0x46c4a000}, {0x46c4c000}, {0x46c4e000},
- {0x46c50000}, {0x46c52000}, {0x46c54000}, {0x46c56000},
- {0x46c58000}, {0x46c5a000}, {0x46c5c000}, {0x46c5e000},
- {0x46c60000}, {0x46c62000}, {0x46c64000}, {0x46c66000},
- {0x46c68000}, {0x46c6a000}, {0x46c6c000}, {0x46c6e000},
- {0x46c70000}, {0x46c72000}, {0x46c74000}, {0x46c76000},
- {0x46c78000}, {0x46c7a000}, {0x46c7c000}, {0x46c7e000},
- {0x46c80000}, {0x46c82000}, {0x46c84000}, {0x46c86000},
- {0x46c88000}, {0x46c8a000}, {0x46c8c000}, {0x46c8e000},
- {0x46c90000}, {0x46c92000}, {0x46c94000}, {0x46c96000},
- {0x46c98000}, {0x46c9a000}, {0x46c9c000}, {0x46c9e000},
- {0x46ca0000}, {0x46ca2000}, {0x46ca4000}, {0x46ca6000},
- {0x46ca8000}, {0x46caa000}, {0x46cac000}, {0x46cae000},
- {0x46cb0000}, {0x46cb2000}, {0x46cb4000}, {0x46cb6000},
- {0x46cb8000}, {0x46cba000}, {0x46cbc000}, {0x46cbe000},
- {0x46cc0000}, {0x46cc2000}, {0x46cc4000}, {0x46cc6000},
- {0x46cc8000}, {0x46cca000}, {0x46ccc000}, {0x46cce000},
- {0x46cd0000}, {0x46cd2000}, {0x46cd4000}, {0x46cd6000},
- {0x46cd8000}, {0x46cda000}, {0x46cdc000}, {0x46cde000},
- {0x46ce0000}, {0x46ce2000}, {0x46ce4000}, {0x46ce6000},
- {0x46ce8000}, {0x46cea000}, {0x46cec000}, {0x46cee000},
- {0x46cf0000}, {0x46cf2000}, {0x46cf4000}, {0x46cf6000},
- {0x46cf8000}, {0x46cfa000}, {0x46cfc000}, {0x46cfe000},
- {0x46d00000}, {0x46d02000}, {0x46d04000}, {0x46d06000},
- {0x46d08000}, {0x46d0a000}, {0x46d0c000}, {0x46d0e000},
- {0x46d10000}, {0x46d12000}, {0x46d14000}, {0x46d16000},
- {0x46d18000}, {0x46d1a000}, {0x46d1c000}, {0x46d1e000},
- {0x46d20000}, {0x46d22000}, {0x46d24000}, {0x46d26000},
- {0x46d28000}, {0x46d2a000}, {0x46d2c000}, {0x46d2e000},
- {0x46d30000}, {0x46d32000}, {0x46d34000}, {0x46d36000},
- {0x46d38000}, {0x46d3a000}, {0x46d3c000}, {0x46d3e000},
- {0x46d40000}, {0x46d42000}, {0x46d44000}, {0x46d46000},
- {0x46d48000}, {0x46d4a000}, {0x46d4c000}, {0x46d4e000},
- {0x46d50000}, {0x46d52000}, {0x46d54000}, {0x46d56000},
- {0x46d58000}, {0x46d5a000}, {0x46d5c000}, {0x46d5e000},
- {0x46d60000}, {0x46d62000}, {0x46d64000}, {0x46d66000},
- {0x46d68000}, {0x46d6a000}, {0x46d6c000}, {0x46d6e000},
- {0x46d70000}, {0x46d72000}, {0x46d74000}, {0x46d76000},
- {0x46d78000}, {0x46d7a000}, {0x46d7c000}, {0x46d7e000},
- {0x46d80000}, {0x46d82000}, {0x46d84000}, {0x46d86000},
- {0x46d88000}, {0x46d8a000}, {0x46d8c000}, {0x46d8e000},
- {0x46d90000}, {0x46d92000}, {0x46d94000}, {0x46d96000},
- {0x46d98000}, {0x46d9a000}, {0x46d9c000}, {0x46d9e000},
- {0x46da0000}, {0x46da2000}, {0x46da4000}, {0x46da6000},
- {0x46da8000}, {0x46daa000}, {0x46dac000}, {0x46dae000},
- {0x46db0000}, {0x46db2000}, {0x46db4000}, {0x46db6000},
- {0x46db8000}, {0x46dba000}, {0x46dbc000}, {0x46dbe000},
- {0x46dc0000}, {0x46dc2000}, {0x46dc4000}, {0x46dc6000},
- {0x46dc8000}, {0x46dca000}, {0x46dcc000}, {0x46dce000},
- {0x46dd0000}, {0x46dd2000}, {0x46dd4000}, {0x46dd6000},
- {0x46dd8000}, {0x46dda000}, {0x46ddc000}, {0x46dde000},
- {0x46de0000}, {0x46de2000}, {0x46de4000}, {0x46de6000},
- {0x46de8000}, {0x46dea000}, {0x46dec000}, {0x46dee000},
- {0x46df0000}, {0x46df2000}, {0x46df4000}, {0x46df6000},
- {0x46df8000}, {0x46dfa000}, {0x46dfc000}, {0x46dfe000},
- {0x46e00000}, {0x46e02000}, {0x46e04000}, {0x46e06000},
- {0x46e08000}, {0x46e0a000}, {0x46e0c000}, {0x46e0e000},
- {0x46e10000}, {0x46e12000}, {0x46e14000}, {0x46e16000},
- {0x46e18000}, {0x46e1a000}, {0x46e1c000}, {0x46e1e000},
- {0x46e20000}, {0x46e22000}, {0x46e24000}, {0x46e26000},
- {0x46e28000}, {0x46e2a000}, {0x46e2c000}, {0x46e2e000},
- {0x46e30000}, {0x46e32000}, {0x46e34000}, {0x46e36000},
- {0x46e38000}, {0x46e3a000}, {0x46e3c000}, {0x46e3e000},
- {0x46e40000}, {0x46e42000}, {0x46e44000}, {0x46e46000},
- {0x46e48000}, {0x46e4a000}, {0x46e4c000}, {0x46e4e000},
- {0x46e50000}, {0x46e52000}, {0x46e54000}, {0x46e56000},
- {0x46e58000}, {0x46e5a000}, {0x46e5c000}, {0x46e5e000},
- {0x46e60000}, {0x46e62000}, {0x46e64000}, {0x46e66000},
- {0x46e68000}, {0x46e6a000}, {0x46e6c000}, {0x46e6e000},
- {0x46e70000}, {0x46e72000}, {0x46e74000}, {0x46e76000},
- {0x46e78000}, {0x46e7a000}, {0x46e7c000}, {0x46e7e000},
- {0x46e80000}, {0x46e82000}, {0x46e84000}, {0x46e86000},
- {0x46e88000}, {0x46e8a000}, {0x46e8c000}, {0x46e8e000},
- {0x46e90000}, {0x46e92000}, {0x46e94000}, {0x46e96000},
- {0x46e98000}, {0x46e9a000}, {0x46e9c000}, {0x46e9e000},
- {0x46ea0000}, {0x46ea2000}, {0x46ea4000}, {0x46ea6000},
- {0x46ea8000}, {0x46eaa000}, {0x46eac000}, {0x46eae000},
- {0x46eb0000}, {0x46eb2000}, {0x46eb4000}, {0x46eb6000},
- {0x46eb8000}, {0x46eba000}, {0x46ebc000}, {0x46ebe000},
- {0x46ec0000}, {0x46ec2000}, {0x46ec4000}, {0x46ec6000},
- {0x46ec8000}, {0x46eca000}, {0x46ecc000}, {0x46ece000},
- {0x46ed0000}, {0x46ed2000}, {0x46ed4000}, {0x46ed6000},
- {0x46ed8000}, {0x46eda000}, {0x46edc000}, {0x46ede000},
- {0x46ee0000}, {0x46ee2000}, {0x46ee4000}, {0x46ee6000},
- {0x46ee8000}, {0x46eea000}, {0x46eec000}, {0x46eee000},
- {0x46ef0000}, {0x46ef2000}, {0x46ef4000}, {0x46ef6000},
- {0x46ef8000}, {0x46efa000}, {0x46efc000}, {0x46efe000},
- {0x46f00000}, {0x46f02000}, {0x46f04000}, {0x46f06000},
- {0x46f08000}, {0x46f0a000}, {0x46f0c000}, {0x46f0e000},
- {0x46f10000}, {0x46f12000}, {0x46f14000}, {0x46f16000},
- {0x46f18000}, {0x46f1a000}, {0x46f1c000}, {0x46f1e000},
- {0x46f20000}, {0x46f22000}, {0x46f24000}, {0x46f26000},
- {0x46f28000}, {0x46f2a000}, {0x46f2c000}, {0x46f2e000},
- {0x46f30000}, {0x46f32000}, {0x46f34000}, {0x46f36000},
- {0x46f38000}, {0x46f3a000}, {0x46f3c000}, {0x46f3e000},
- {0x46f40000}, {0x46f42000}, {0x46f44000}, {0x46f46000},
- {0x46f48000}, {0x46f4a000}, {0x46f4c000}, {0x46f4e000},
- {0x46f50000}, {0x46f52000}, {0x46f54000}, {0x46f56000},
- {0x46f58000}, {0x46f5a000}, {0x46f5c000}, {0x46f5e000},
- {0x46f60000}, {0x46f62000}, {0x46f64000}, {0x46f66000},
- {0x46f68000}, {0x46f6a000}, {0x46f6c000}, {0x46f6e000},
- {0x46f70000}, {0x46f72000}, {0x46f74000}, {0x46f76000},
- {0x46f78000}, {0x46f7a000}, {0x46f7c000}, {0x46f7e000},
- {0x46f80000}, {0x46f82000}, {0x46f84000}, {0x46f86000},
- {0x46f88000}, {0x46f8a000}, {0x46f8c000}, {0x46f8e000},
- {0x46f90000}, {0x46f92000}, {0x46f94000}, {0x46f96000},
- {0x46f98000}, {0x46f9a000}, {0x46f9c000}, {0x46f9e000},
- {0x46fa0000}, {0x46fa2000}, {0x46fa4000}, {0x46fa6000},
- {0x46fa8000}, {0x46faa000}, {0x46fac000}, {0x46fae000},
- {0x46fb0000}, {0x46fb2000}, {0x46fb4000}, {0x46fb6000},
- {0x46fb8000}, {0x46fba000}, {0x46fbc000}, {0x46fbe000},
- {0x46fc0000}, {0x46fc2000}, {0x46fc4000}, {0x46fc6000},
- {0x46fc8000}, {0x46fca000}, {0x46fcc000}, {0x46fce000},
- {0x46fd0000}, {0x46fd2000}, {0x46fd4000}, {0x46fd6000},
- {0x46fd8000}, {0x46fda000}, {0x46fdc000}, {0x46fde000},
- {0x46fe0000}, {0x46fe2000}, {0x46fe4000}, {0x46fe6000},
- {0x46fe8000}, {0x46fea000}, {0x46fec000}, {0x46fee000},
- {0x46ff0000}, {0x46ff2000}, {0x46ff4000}, {0x46ff6000},
- {0x46ff8000}, {0x46ffa000}, {0x46ffc000}, {0x46ffe000},
- {0x47000000}, {0x47002000}, {0x47004000}, {0x47006000},
- {0x47008000}, {0x4700a000}, {0x4700c000}, {0x4700e000},
- {0x47010000}, {0x47012000}, {0x47014000}, {0x47016000},
- {0x47018000}, {0x4701a000}, {0x4701c000}, {0x4701e000},
- {0x47020000}, {0x47022000}, {0x47024000}, {0x47026000},
- {0x47028000}, {0x4702a000}, {0x4702c000}, {0x4702e000},
- {0x47030000}, {0x47032000}, {0x47034000}, {0x47036000},
- {0x47038000}, {0x4703a000}, {0x4703c000}, {0x4703e000},
- {0x47040000}, {0x47042000}, {0x47044000}, {0x47046000},
- {0x47048000}, {0x4704a000}, {0x4704c000}, {0x4704e000},
- {0x47050000}, {0x47052000}, {0x47054000}, {0x47056000},
- {0x47058000}, {0x4705a000}, {0x4705c000}, {0x4705e000},
- {0x47060000}, {0x47062000}, {0x47064000}, {0x47066000},
- {0x47068000}, {0x4706a000}, {0x4706c000}, {0x4706e000},
- {0x47070000}, {0x47072000}, {0x47074000}, {0x47076000},
- {0x47078000}, {0x4707a000}, {0x4707c000}, {0x4707e000},
- {0x47080000}, {0x47082000}, {0x47084000}, {0x47086000},
- {0x47088000}, {0x4708a000}, {0x4708c000}, {0x4708e000},
- {0x47090000}, {0x47092000}, {0x47094000}, {0x47096000},
- {0x47098000}, {0x4709a000}, {0x4709c000}, {0x4709e000},
- {0x470a0000}, {0x470a2000}, {0x470a4000}, {0x470a6000},
- {0x470a8000}, {0x470aa000}, {0x470ac000}, {0x470ae000},
- {0x470b0000}, {0x470b2000}, {0x470b4000}, {0x470b6000},
- {0x470b8000}, {0x470ba000}, {0x470bc000}, {0x470be000},
- {0x470c0000}, {0x470c2000}, {0x470c4000}, {0x470c6000},
- {0x470c8000}, {0x470ca000}, {0x470cc000}, {0x470ce000},
- {0x470d0000}, {0x470d2000}, {0x470d4000}, {0x470d6000},
- {0x470d8000}, {0x470da000}, {0x470dc000}, {0x470de000},
- {0x470e0000}, {0x470e2000}, {0x470e4000}, {0x470e6000},
- {0x470e8000}, {0x470ea000}, {0x470ec000}, {0x470ee000},
- {0x470f0000}, {0x470f2000}, {0x470f4000}, {0x470f6000},
- {0x470f8000}, {0x470fa000}, {0x470fc000}, {0x470fe000},
- {0x47100000}, {0x47102000}, {0x47104000}, {0x47106000},
- {0x47108000}, {0x4710a000}, {0x4710c000}, {0x4710e000},
- {0x47110000}, {0x47112000}, {0x47114000}, {0x47116000},
- {0x47118000}, {0x4711a000}, {0x4711c000}, {0x4711e000},
- {0x47120000}, {0x47122000}, {0x47124000}, {0x47126000},
- {0x47128000}, {0x4712a000}, {0x4712c000}, {0x4712e000},
- {0x47130000}, {0x47132000}, {0x47134000}, {0x47136000},
- {0x47138000}, {0x4713a000}, {0x4713c000}, {0x4713e000},
- {0x47140000}, {0x47142000}, {0x47144000}, {0x47146000},
- {0x47148000}, {0x4714a000}, {0x4714c000}, {0x4714e000},
- {0x47150000}, {0x47152000}, {0x47154000}, {0x47156000},
- {0x47158000}, {0x4715a000}, {0x4715c000}, {0x4715e000},
- {0x47160000}, {0x47162000}, {0x47164000}, {0x47166000},
- {0x47168000}, {0x4716a000}, {0x4716c000}, {0x4716e000},
- {0x47170000}, {0x47172000}, {0x47174000}, {0x47176000},
- {0x47178000}, {0x4717a000}, {0x4717c000}, {0x4717e000},
- {0x47180000}, {0x47182000}, {0x47184000}, {0x47186000},
- {0x47188000}, {0x4718a000}, {0x4718c000}, {0x4718e000},
- {0x47190000}, {0x47192000}, {0x47194000}, {0x47196000},
- {0x47198000}, {0x4719a000}, {0x4719c000}, {0x4719e000},
- {0x471a0000}, {0x471a2000}, {0x471a4000}, {0x471a6000},
- {0x471a8000}, {0x471aa000}, {0x471ac000}, {0x471ae000},
- {0x471b0000}, {0x471b2000}, {0x471b4000}, {0x471b6000},
- {0x471b8000}, {0x471ba000}, {0x471bc000}, {0x471be000},
- {0x471c0000}, {0x471c2000}, {0x471c4000}, {0x471c6000},
- {0x471c8000}, {0x471ca000}, {0x471cc000}, {0x471ce000},
- {0x471d0000}, {0x471d2000}, {0x471d4000}, {0x471d6000},
- {0x471d8000}, {0x471da000}, {0x471dc000}, {0x471de000},
- {0x471e0000}, {0x471e2000}, {0x471e4000}, {0x471e6000},
- {0x471e8000}, {0x471ea000}, {0x471ec000}, {0x471ee000},
- {0x471f0000}, {0x471f2000}, {0x471f4000}, {0x471f6000},
- {0x471f8000}, {0x471fa000}, {0x471fc000}, {0x471fe000},
- {0x47200000}, {0x47202000}, {0x47204000}, {0x47206000},
- {0x47208000}, {0x4720a000}, {0x4720c000}, {0x4720e000},
- {0x47210000}, {0x47212000}, {0x47214000}, {0x47216000},
- {0x47218000}, {0x4721a000}, {0x4721c000}, {0x4721e000},
- {0x47220000}, {0x47222000}, {0x47224000}, {0x47226000},
- {0x47228000}, {0x4722a000}, {0x4722c000}, {0x4722e000},
- {0x47230000}, {0x47232000}, {0x47234000}, {0x47236000},
- {0x47238000}, {0x4723a000}, {0x4723c000}, {0x4723e000},
- {0x47240000}, {0x47242000}, {0x47244000}, {0x47246000},
- {0x47248000}, {0x4724a000}, {0x4724c000}, {0x4724e000},
- {0x47250000}, {0x47252000}, {0x47254000}, {0x47256000},
- {0x47258000}, {0x4725a000}, {0x4725c000}, {0x4725e000},
- {0x47260000}, {0x47262000}, {0x47264000}, {0x47266000},
- {0x47268000}, {0x4726a000}, {0x4726c000}, {0x4726e000},
- {0x47270000}, {0x47272000}, {0x47274000}, {0x47276000},
- {0x47278000}, {0x4727a000}, {0x4727c000}, {0x4727e000},
- {0x47280000}, {0x47282000}, {0x47284000}, {0x47286000},
- {0x47288000}, {0x4728a000}, {0x4728c000}, {0x4728e000},
- {0x47290000}, {0x47292000}, {0x47294000}, {0x47296000},
- {0x47298000}, {0x4729a000}, {0x4729c000}, {0x4729e000},
- {0x472a0000}, {0x472a2000}, {0x472a4000}, {0x472a6000},
- {0x472a8000}, {0x472aa000}, {0x472ac000}, {0x472ae000},
- {0x472b0000}, {0x472b2000}, {0x472b4000}, {0x472b6000},
- {0x472b8000}, {0x472ba000}, {0x472bc000}, {0x472be000},
- {0x472c0000}, {0x472c2000}, {0x472c4000}, {0x472c6000},
- {0x472c8000}, {0x472ca000}, {0x472cc000}, {0x472ce000},
- {0x472d0000}, {0x472d2000}, {0x472d4000}, {0x472d6000},
- {0x472d8000}, {0x472da000}, {0x472dc000}, {0x472de000},
- {0x472e0000}, {0x472e2000}, {0x472e4000}, {0x472e6000},
- {0x472e8000}, {0x472ea000}, {0x472ec000}, {0x472ee000},
- {0x472f0000}, {0x472f2000}, {0x472f4000}, {0x472f6000},
- {0x472f8000}, {0x472fa000}, {0x472fc000}, {0x472fe000},
- {0x47300000}, {0x47302000}, {0x47304000}, {0x47306000},
- {0x47308000}, {0x4730a000}, {0x4730c000}, {0x4730e000},
- {0x47310000}, {0x47312000}, {0x47314000}, {0x47316000},
- {0x47318000}, {0x4731a000}, {0x4731c000}, {0x4731e000},
- {0x47320000}, {0x47322000}, {0x47324000}, {0x47326000},
- {0x47328000}, {0x4732a000}, {0x4732c000}, {0x4732e000},
- {0x47330000}, {0x47332000}, {0x47334000}, {0x47336000},
- {0x47338000}, {0x4733a000}, {0x4733c000}, {0x4733e000},
- {0x47340000}, {0x47342000}, {0x47344000}, {0x47346000},
- {0x47348000}, {0x4734a000}, {0x4734c000}, {0x4734e000},
- {0x47350000}, {0x47352000}, {0x47354000}, {0x47356000},
- {0x47358000}, {0x4735a000}, {0x4735c000}, {0x4735e000},
- {0x47360000}, {0x47362000}, {0x47364000}, {0x47366000},
- {0x47368000}, {0x4736a000}, {0x4736c000}, {0x4736e000},
- {0x47370000}, {0x47372000}, {0x47374000}, {0x47376000},
- {0x47378000}, {0x4737a000}, {0x4737c000}, {0x4737e000},
- {0x47380000}, {0x47382000}, {0x47384000}, {0x47386000},
- {0x47388000}, {0x4738a000}, {0x4738c000}, {0x4738e000},
- {0x47390000}, {0x47392000}, {0x47394000}, {0x47396000},
- {0x47398000}, {0x4739a000}, {0x4739c000}, {0x4739e000},
- {0x473a0000}, {0x473a2000}, {0x473a4000}, {0x473a6000},
- {0x473a8000}, {0x473aa000}, {0x473ac000}, {0x473ae000},
- {0x473b0000}, {0x473b2000}, {0x473b4000}, {0x473b6000},
- {0x473b8000}, {0x473ba000}, {0x473bc000}, {0x473be000},
- {0x473c0000}, {0x473c2000}, {0x473c4000}, {0x473c6000},
- {0x473c8000}, {0x473ca000}, {0x473cc000}, {0x473ce000},
- {0x473d0000}, {0x473d2000}, {0x473d4000}, {0x473d6000},
- {0x473d8000}, {0x473da000}, {0x473dc000}, {0x473de000},
- {0x473e0000}, {0x473e2000}, {0x473e4000}, {0x473e6000},
- {0x473e8000}, {0x473ea000}, {0x473ec000}, {0x473ee000},
- {0x473f0000}, {0x473f2000}, {0x473f4000}, {0x473f6000},
- {0x473f8000}, {0x473fa000}, {0x473fc000}, {0x473fe000},
- {0x47400000}, {0x47402000}, {0x47404000}, {0x47406000},
- {0x47408000}, {0x4740a000}, {0x4740c000}, {0x4740e000},
- {0x47410000}, {0x47412000}, {0x47414000}, {0x47416000},
- {0x47418000}, {0x4741a000}, {0x4741c000}, {0x4741e000},
- {0x47420000}, {0x47422000}, {0x47424000}, {0x47426000},
- {0x47428000}, {0x4742a000}, {0x4742c000}, {0x4742e000},
- {0x47430000}, {0x47432000}, {0x47434000}, {0x47436000},
- {0x47438000}, {0x4743a000}, {0x4743c000}, {0x4743e000},
- {0x47440000}, {0x47442000}, {0x47444000}, {0x47446000},
- {0x47448000}, {0x4744a000}, {0x4744c000}, {0x4744e000},
- {0x47450000}, {0x47452000}, {0x47454000}, {0x47456000},
- {0x47458000}, {0x4745a000}, {0x4745c000}, {0x4745e000},
- {0x47460000}, {0x47462000}, {0x47464000}, {0x47466000},
- {0x47468000}, {0x4746a000}, {0x4746c000}, {0x4746e000},
- {0x47470000}, {0x47472000}, {0x47474000}, {0x47476000},
- {0x47478000}, {0x4747a000}, {0x4747c000}, {0x4747e000},
- {0x47480000}, {0x47482000}, {0x47484000}, {0x47486000},
- {0x47488000}, {0x4748a000}, {0x4748c000}, {0x4748e000},
- {0x47490000}, {0x47492000}, {0x47494000}, {0x47496000},
- {0x47498000}, {0x4749a000}, {0x4749c000}, {0x4749e000},
- {0x474a0000}, {0x474a2000}, {0x474a4000}, {0x474a6000},
- {0x474a8000}, {0x474aa000}, {0x474ac000}, {0x474ae000},
- {0x474b0000}, {0x474b2000}, {0x474b4000}, {0x474b6000},
- {0x474b8000}, {0x474ba000}, {0x474bc000}, {0x474be000},
- {0x474c0000}, {0x474c2000}, {0x474c4000}, {0x474c6000},
- {0x474c8000}, {0x474ca000}, {0x474cc000}, {0x474ce000},
- {0x474d0000}, {0x474d2000}, {0x474d4000}, {0x474d6000},
- {0x474d8000}, {0x474da000}, {0x474dc000}, {0x474de000},
- {0x474e0000}, {0x474e2000}, {0x474e4000}, {0x474e6000},
- {0x474e8000}, {0x474ea000}, {0x474ec000}, {0x474ee000},
- {0x474f0000}, {0x474f2000}, {0x474f4000}, {0x474f6000},
- {0x474f8000}, {0x474fa000}, {0x474fc000}, {0x474fe000},
- {0x47500000}, {0x47502000}, {0x47504000}, {0x47506000},
- {0x47508000}, {0x4750a000}, {0x4750c000}, {0x4750e000},
- {0x47510000}, {0x47512000}, {0x47514000}, {0x47516000},
- {0x47518000}, {0x4751a000}, {0x4751c000}, {0x4751e000},
- {0x47520000}, {0x47522000}, {0x47524000}, {0x47526000},
- {0x47528000}, {0x4752a000}, {0x4752c000}, {0x4752e000},
- {0x47530000}, {0x47532000}, {0x47534000}, {0x47536000},
- {0x47538000}, {0x4753a000}, {0x4753c000}, {0x4753e000},
- {0x47540000}, {0x47542000}, {0x47544000}, {0x47546000},
- {0x47548000}, {0x4754a000}, {0x4754c000}, {0x4754e000},
- {0x47550000}, {0x47552000}, {0x47554000}, {0x47556000},
- {0x47558000}, {0x4755a000}, {0x4755c000}, {0x4755e000},
- {0x47560000}, {0x47562000}, {0x47564000}, {0x47566000},
- {0x47568000}, {0x4756a000}, {0x4756c000}, {0x4756e000},
- {0x47570000}, {0x47572000}, {0x47574000}, {0x47576000},
- {0x47578000}, {0x4757a000}, {0x4757c000}, {0x4757e000},
- {0x47580000}, {0x47582000}, {0x47584000}, {0x47586000},
- {0x47588000}, {0x4758a000}, {0x4758c000}, {0x4758e000},
- {0x47590000}, {0x47592000}, {0x47594000}, {0x47596000},
- {0x47598000}, {0x4759a000}, {0x4759c000}, {0x4759e000},
- {0x475a0000}, {0x475a2000}, {0x475a4000}, {0x475a6000},
- {0x475a8000}, {0x475aa000}, {0x475ac000}, {0x475ae000},
- {0x475b0000}, {0x475b2000}, {0x475b4000}, {0x475b6000},
- {0x475b8000}, {0x475ba000}, {0x475bc000}, {0x475be000},
- {0x475c0000}, {0x475c2000}, {0x475c4000}, {0x475c6000},
- {0x475c8000}, {0x475ca000}, {0x475cc000}, {0x475ce000},
- {0x475d0000}, {0x475d2000}, {0x475d4000}, {0x475d6000},
- {0x475d8000}, {0x475da000}, {0x475dc000}, {0x475de000},
- {0x475e0000}, {0x475e2000}, {0x475e4000}, {0x475e6000},
- {0x475e8000}, {0x475ea000}, {0x475ec000}, {0x475ee000},
- {0x475f0000}, {0x475f2000}, {0x475f4000}, {0x475f6000},
- {0x475f8000}, {0x475fa000}, {0x475fc000}, {0x475fe000},
- {0x47600000}, {0x47602000}, {0x47604000}, {0x47606000},
- {0x47608000}, {0x4760a000}, {0x4760c000}, {0x4760e000},
- {0x47610000}, {0x47612000}, {0x47614000}, {0x47616000},
- {0x47618000}, {0x4761a000}, {0x4761c000}, {0x4761e000},
- {0x47620000}, {0x47622000}, {0x47624000}, {0x47626000},
- {0x47628000}, {0x4762a000}, {0x4762c000}, {0x4762e000},
- {0x47630000}, {0x47632000}, {0x47634000}, {0x47636000},
- {0x47638000}, {0x4763a000}, {0x4763c000}, {0x4763e000},
- {0x47640000}, {0x47642000}, {0x47644000}, {0x47646000},
- {0x47648000}, {0x4764a000}, {0x4764c000}, {0x4764e000},
- {0x47650000}, {0x47652000}, {0x47654000}, {0x47656000},
- {0x47658000}, {0x4765a000}, {0x4765c000}, {0x4765e000},
- {0x47660000}, {0x47662000}, {0x47664000}, {0x47666000},
- {0x47668000}, {0x4766a000}, {0x4766c000}, {0x4766e000},
- {0x47670000}, {0x47672000}, {0x47674000}, {0x47676000},
- {0x47678000}, {0x4767a000}, {0x4767c000}, {0x4767e000},
- {0x47680000}, {0x47682000}, {0x47684000}, {0x47686000},
- {0x47688000}, {0x4768a000}, {0x4768c000}, {0x4768e000},
- {0x47690000}, {0x47692000}, {0x47694000}, {0x47696000},
- {0x47698000}, {0x4769a000}, {0x4769c000}, {0x4769e000},
- {0x476a0000}, {0x476a2000}, {0x476a4000}, {0x476a6000},
- {0x476a8000}, {0x476aa000}, {0x476ac000}, {0x476ae000},
- {0x476b0000}, {0x476b2000}, {0x476b4000}, {0x476b6000},
- {0x476b8000}, {0x476ba000}, {0x476bc000}, {0x476be000},
- {0x476c0000}, {0x476c2000}, {0x476c4000}, {0x476c6000},
- {0x476c8000}, {0x476ca000}, {0x476cc000}, {0x476ce000},
- {0x476d0000}, {0x476d2000}, {0x476d4000}, {0x476d6000},
- {0x476d8000}, {0x476da000}, {0x476dc000}, {0x476de000},
- {0x476e0000}, {0x476e2000}, {0x476e4000}, {0x476e6000},
- {0x476e8000}, {0x476ea000}, {0x476ec000}, {0x476ee000},
- {0x476f0000}, {0x476f2000}, {0x476f4000}, {0x476f6000},
- {0x476f8000}, {0x476fa000}, {0x476fc000}, {0x476fe000},
- {0x47700000}, {0x47702000}, {0x47704000}, {0x47706000},
- {0x47708000}, {0x4770a000}, {0x4770c000}, {0x4770e000},
- {0x47710000}, {0x47712000}, {0x47714000}, {0x47716000},
- {0x47718000}, {0x4771a000}, {0x4771c000}, {0x4771e000},
- {0x47720000}, {0x47722000}, {0x47724000}, {0x47726000},
- {0x47728000}, {0x4772a000}, {0x4772c000}, {0x4772e000},
- {0x47730000}, {0x47732000}, {0x47734000}, {0x47736000},
- {0x47738000}, {0x4773a000}, {0x4773c000}, {0x4773e000},
- {0x47740000}, {0x47742000}, {0x47744000}, {0x47746000},
- {0x47748000}, {0x4774a000}, {0x4774c000}, {0x4774e000},
- {0x47750000}, {0x47752000}, {0x47754000}, {0x47756000},
- {0x47758000}, {0x4775a000}, {0x4775c000}, {0x4775e000},
- {0x47760000}, {0x47762000}, {0x47764000}, {0x47766000},
- {0x47768000}, {0x4776a000}, {0x4776c000}, {0x4776e000},
- {0x47770000}, {0x47772000}, {0x47774000}, {0x47776000},
- {0x47778000}, {0x4777a000}, {0x4777c000}, {0x4777e000},
- {0x47780000}, {0x47782000}, {0x47784000}, {0x47786000},
- {0x47788000}, {0x4778a000}, {0x4778c000}, {0x4778e000},
- {0x47790000}, {0x47792000}, {0x47794000}, {0x47796000},
- {0x47798000}, {0x4779a000}, {0x4779c000}, {0x4779e000},
- {0x477a0000}, {0x477a2000}, {0x477a4000}, {0x477a6000},
- {0x477a8000}, {0x477aa000}, {0x477ac000}, {0x477ae000},
- {0x477b0000}, {0x477b2000}, {0x477b4000}, {0x477b6000},
- {0x477b8000}, {0x477ba000}, {0x477bc000}, {0x477be000},
- {0x477c0000}, {0x477c2000}, {0x477c4000}, {0x477c6000},
- {0x477c8000}, {0x477ca000}, {0x477cc000}, {0x477ce000},
- {0x477d0000}, {0x477d2000}, {0x477d4000}, {0x477d6000},
- {0x477d8000}, {0x477da000}, {0x477dc000}, {0x477de000},
- {0x477e0000}, {0x477e2000}, {0x477e4000}, {0x477e6000},
- {0x477e8000}, {0x477ea000}, {0x477ec000}, {0x477ee000},
- {0x477f0000}, {0x477f2000}, {0x477f4000}, {0x477f6000},
- {0x477f8000}, {0x477fa000}, {0x477fc000}, {0x477fe000},
- {0x7f800000}, {0x7f802000}, {0x7f804000}, {0x7f806000},
- {0x7f808000}, {0x7f80a000}, {0x7f80c000}, {0x7f80e000},
- {0x7f810000}, {0x7f812000}, {0x7f814000}, {0x7f816000},
- {0x7f818000}, {0x7f81a000}, {0x7f81c000}, {0x7f81e000},
- {0x7f820000}, {0x7f822000}, {0x7f824000}, {0x7f826000},
- {0x7f828000}, {0x7f82a000}, {0x7f82c000}, {0x7f82e000},
- {0x7f830000}, {0x7f832000}, {0x7f834000}, {0x7f836000},
- {0x7f838000}, {0x7f83a000}, {0x7f83c000}, {0x7f83e000},
- {0x7f840000}, {0x7f842000}, {0x7f844000}, {0x7f846000},
- {0x7f848000}, {0x7f84a000}, {0x7f84c000}, {0x7f84e000},
- {0x7f850000}, {0x7f852000}, {0x7f854000}, {0x7f856000},
- {0x7f858000}, {0x7f85a000}, {0x7f85c000}, {0x7f85e000},
- {0x7f860000}, {0x7f862000}, {0x7f864000}, {0x7f866000},
- {0x7f868000}, {0x7f86a000}, {0x7f86c000}, {0x7f86e000},
- {0x7f870000}, {0x7f872000}, {0x7f874000}, {0x7f876000},
- {0x7f878000}, {0x7f87a000}, {0x7f87c000}, {0x7f87e000},
- {0x7f880000}, {0x7f882000}, {0x7f884000}, {0x7f886000},
- {0x7f888000}, {0x7f88a000}, {0x7f88c000}, {0x7f88e000},
- {0x7f890000}, {0x7f892000}, {0x7f894000}, {0x7f896000},
- {0x7f898000}, {0x7f89a000}, {0x7f89c000}, {0x7f89e000},
- {0x7f8a0000}, {0x7f8a2000}, {0x7f8a4000}, {0x7f8a6000},
- {0x7f8a8000}, {0x7f8aa000}, {0x7f8ac000}, {0x7f8ae000},
- {0x7f8b0000}, {0x7f8b2000}, {0x7f8b4000}, {0x7f8b6000},
- {0x7f8b8000}, {0x7f8ba000}, {0x7f8bc000}, {0x7f8be000},
- {0x7f8c0000}, {0x7f8c2000}, {0x7f8c4000}, {0x7f8c6000},
- {0x7f8c8000}, {0x7f8ca000}, {0x7f8cc000}, {0x7f8ce000},
- {0x7f8d0000}, {0x7f8d2000}, {0x7f8d4000}, {0x7f8d6000},
- {0x7f8d8000}, {0x7f8da000}, {0x7f8dc000}, {0x7f8de000},
- {0x7f8e0000}, {0x7f8e2000}, {0x7f8e4000}, {0x7f8e6000},
- {0x7f8e8000}, {0x7f8ea000}, {0x7f8ec000}, {0x7f8ee000},
- {0x7f8f0000}, {0x7f8f2000}, {0x7f8f4000}, {0x7f8f6000},
- {0x7f8f8000}, {0x7f8fa000}, {0x7f8fc000}, {0x7f8fe000},
- {0x7f900000}, {0x7f902000}, {0x7f904000}, {0x7f906000},
- {0x7f908000}, {0x7f90a000}, {0x7f90c000}, {0x7f90e000},
- {0x7f910000}, {0x7f912000}, {0x7f914000}, {0x7f916000},
- {0x7f918000}, {0x7f91a000}, {0x7f91c000}, {0x7f91e000},
- {0x7f920000}, {0x7f922000}, {0x7f924000}, {0x7f926000},
- {0x7f928000}, {0x7f92a000}, {0x7f92c000}, {0x7f92e000},
- {0x7f930000}, {0x7f932000}, {0x7f934000}, {0x7f936000},
- {0x7f938000}, {0x7f93a000}, {0x7f93c000}, {0x7f93e000},
- {0x7f940000}, {0x7f942000}, {0x7f944000}, {0x7f946000},
- {0x7f948000}, {0x7f94a000}, {0x7f94c000}, {0x7f94e000},
- {0x7f950000}, {0x7f952000}, {0x7f954000}, {0x7f956000},
- {0x7f958000}, {0x7f95a000}, {0x7f95c000}, {0x7f95e000},
- {0x7f960000}, {0x7f962000}, {0x7f964000}, {0x7f966000},
- {0x7f968000}, {0x7f96a000}, {0x7f96c000}, {0x7f96e000},
- {0x7f970000}, {0x7f972000}, {0x7f974000}, {0x7f976000},
- {0x7f978000}, {0x7f97a000}, {0x7f97c000}, {0x7f97e000},
- {0x7f980000}, {0x7f982000}, {0x7f984000}, {0x7f986000},
- {0x7f988000}, {0x7f98a000}, {0x7f98c000}, {0x7f98e000},
- {0x7f990000}, {0x7f992000}, {0x7f994000}, {0x7f996000},
- {0x7f998000}, {0x7f99a000}, {0x7f99c000}, {0x7f99e000},
- {0x7f9a0000}, {0x7f9a2000}, {0x7f9a4000}, {0x7f9a6000},
- {0x7f9a8000}, {0x7f9aa000}, {0x7f9ac000}, {0x7f9ae000},
- {0x7f9b0000}, {0x7f9b2000}, {0x7f9b4000}, {0x7f9b6000},
- {0x7f9b8000}, {0x7f9ba000}, {0x7f9bc000}, {0x7f9be000},
- {0x7f9c0000}, {0x7f9c2000}, {0x7f9c4000}, {0x7f9c6000},
- {0x7f9c8000}, {0x7f9ca000}, {0x7f9cc000}, {0x7f9ce000},
- {0x7f9d0000}, {0x7f9d2000}, {0x7f9d4000}, {0x7f9d6000},
- {0x7f9d8000}, {0x7f9da000}, {0x7f9dc000}, {0x7f9de000},
- {0x7f9e0000}, {0x7f9e2000}, {0x7f9e4000}, {0x7f9e6000},
- {0x7f9e8000}, {0x7f9ea000}, {0x7f9ec000}, {0x7f9ee000},
- {0x7f9f0000}, {0x7f9f2000}, {0x7f9f4000}, {0x7f9f6000},
- {0x7f9f8000}, {0x7f9fa000}, {0x7f9fc000}, {0x7f9fe000},
- {0x7fa00000}, {0x7fa02000}, {0x7fa04000}, {0x7fa06000},
- {0x7fa08000}, {0x7fa0a000}, {0x7fa0c000}, {0x7fa0e000},
- {0x7fa10000}, {0x7fa12000}, {0x7fa14000}, {0x7fa16000},
- {0x7fa18000}, {0x7fa1a000}, {0x7fa1c000}, {0x7fa1e000},
- {0x7fa20000}, {0x7fa22000}, {0x7fa24000}, {0x7fa26000},
- {0x7fa28000}, {0x7fa2a000}, {0x7fa2c000}, {0x7fa2e000},
- {0x7fa30000}, {0x7fa32000}, {0x7fa34000}, {0x7fa36000},
- {0x7fa38000}, {0x7fa3a000}, {0x7fa3c000}, {0x7fa3e000},
- {0x7fa40000}, {0x7fa42000}, {0x7fa44000}, {0x7fa46000},
- {0x7fa48000}, {0x7fa4a000}, {0x7fa4c000}, {0x7fa4e000},
- {0x7fa50000}, {0x7fa52000}, {0x7fa54000}, {0x7fa56000},
- {0x7fa58000}, {0x7fa5a000}, {0x7fa5c000}, {0x7fa5e000},
- {0x7fa60000}, {0x7fa62000}, {0x7fa64000}, {0x7fa66000},
- {0x7fa68000}, {0x7fa6a000}, {0x7fa6c000}, {0x7fa6e000},
- {0x7fa70000}, {0x7fa72000}, {0x7fa74000}, {0x7fa76000},
- {0x7fa78000}, {0x7fa7a000}, {0x7fa7c000}, {0x7fa7e000},
- {0x7fa80000}, {0x7fa82000}, {0x7fa84000}, {0x7fa86000},
- {0x7fa88000}, {0x7fa8a000}, {0x7fa8c000}, {0x7fa8e000},
- {0x7fa90000}, {0x7fa92000}, {0x7fa94000}, {0x7fa96000},
- {0x7fa98000}, {0x7fa9a000}, {0x7fa9c000}, {0x7fa9e000},
- {0x7faa0000}, {0x7faa2000}, {0x7faa4000}, {0x7faa6000},
- {0x7faa8000}, {0x7faaa000}, {0x7faac000}, {0x7faae000},
- {0x7fab0000}, {0x7fab2000}, {0x7fab4000}, {0x7fab6000},
- {0x7fab8000}, {0x7faba000}, {0x7fabc000}, {0x7fabe000},
- {0x7fac0000}, {0x7fac2000}, {0x7fac4000}, {0x7fac6000},
- {0x7fac8000}, {0x7faca000}, {0x7facc000}, {0x7face000},
- {0x7fad0000}, {0x7fad2000}, {0x7fad4000}, {0x7fad6000},
- {0x7fad8000}, {0x7fada000}, {0x7fadc000}, {0x7fade000},
- {0x7fae0000}, {0x7fae2000}, {0x7fae4000}, {0x7fae6000},
- {0x7fae8000}, {0x7faea000}, {0x7faec000}, {0x7faee000},
- {0x7faf0000}, {0x7faf2000}, {0x7faf4000}, {0x7faf6000},
- {0x7faf8000}, {0x7fafa000}, {0x7fafc000}, {0x7fafe000},
- {0x7fb00000}, {0x7fb02000}, {0x7fb04000}, {0x7fb06000},
- {0x7fb08000}, {0x7fb0a000}, {0x7fb0c000}, {0x7fb0e000},
- {0x7fb10000}, {0x7fb12000}, {0x7fb14000}, {0x7fb16000},
- {0x7fb18000}, {0x7fb1a000}, {0x7fb1c000}, {0x7fb1e000},
- {0x7fb20000}, {0x7fb22000}, {0x7fb24000}, {0x7fb26000},
- {0x7fb28000}, {0x7fb2a000}, {0x7fb2c000}, {0x7fb2e000},
- {0x7fb30000}, {0x7fb32000}, {0x7fb34000}, {0x7fb36000},
- {0x7fb38000}, {0x7fb3a000}, {0x7fb3c000}, {0x7fb3e000},
- {0x7fb40000}, {0x7fb42000}, {0x7fb44000}, {0x7fb46000},
- {0x7fb48000}, {0x7fb4a000}, {0x7fb4c000}, {0x7fb4e000},
- {0x7fb50000}, {0x7fb52000}, {0x7fb54000}, {0x7fb56000},
- {0x7fb58000}, {0x7fb5a000}, {0x7fb5c000}, {0x7fb5e000},
- {0x7fb60000}, {0x7fb62000}, {0x7fb64000}, {0x7fb66000},
- {0x7fb68000}, {0x7fb6a000}, {0x7fb6c000}, {0x7fb6e000},
- {0x7fb70000}, {0x7fb72000}, {0x7fb74000}, {0x7fb76000},
- {0x7fb78000}, {0x7fb7a000}, {0x7fb7c000}, {0x7fb7e000},
- {0x7fb80000}, {0x7fb82000}, {0x7fb84000}, {0x7fb86000},
- {0x7fb88000}, {0x7fb8a000}, {0x7fb8c000}, {0x7fb8e000},
- {0x7fb90000}, {0x7fb92000}, {0x7fb94000}, {0x7fb96000},
- {0x7fb98000}, {0x7fb9a000}, {0x7fb9c000}, {0x7fb9e000},
- {0x7fba0000}, {0x7fba2000}, {0x7fba4000}, {0x7fba6000},
- {0x7fba8000}, {0x7fbaa000}, {0x7fbac000}, {0x7fbae000},
- {0x7fbb0000}, {0x7fbb2000}, {0x7fbb4000}, {0x7fbb6000},
- {0x7fbb8000}, {0x7fbba000}, {0x7fbbc000}, {0x7fbbe000},
- {0x7fbc0000}, {0x7fbc2000}, {0x7fbc4000}, {0x7fbc6000},
- {0x7fbc8000}, {0x7fbca000}, {0x7fbcc000}, {0x7fbce000},
- {0x7fbd0000}, {0x7fbd2000}, {0x7fbd4000}, {0x7fbd6000},
- {0x7fbd8000}, {0x7fbda000}, {0x7fbdc000}, {0x7fbde000},
- {0x7fbe0000}, {0x7fbe2000}, {0x7fbe4000}, {0x7fbe6000},
- {0x7fbe8000}, {0x7fbea000}, {0x7fbec000}, {0x7fbee000},
- {0x7fbf0000}, {0x7fbf2000}, {0x7fbf4000}, {0x7fbf6000},
- {0x7fbf8000}, {0x7fbfa000}, {0x7fbfc000}, {0x7fbfe000},
- {0x7fc00000}, {0x7fc02000}, {0x7fc04000}, {0x7fc06000},
- {0x7fc08000}, {0x7fc0a000}, {0x7fc0c000}, {0x7fc0e000},
- {0x7fc10000}, {0x7fc12000}, {0x7fc14000}, {0x7fc16000},
- {0x7fc18000}, {0x7fc1a000}, {0x7fc1c000}, {0x7fc1e000},
- {0x7fc20000}, {0x7fc22000}, {0x7fc24000}, {0x7fc26000},
- {0x7fc28000}, {0x7fc2a000}, {0x7fc2c000}, {0x7fc2e000},
- {0x7fc30000}, {0x7fc32000}, {0x7fc34000}, {0x7fc36000},
- {0x7fc38000}, {0x7fc3a000}, {0x7fc3c000}, {0x7fc3e000},
- {0x7fc40000}, {0x7fc42000}, {0x7fc44000}, {0x7fc46000},
- {0x7fc48000}, {0x7fc4a000}, {0x7fc4c000}, {0x7fc4e000},
- {0x7fc50000}, {0x7fc52000}, {0x7fc54000}, {0x7fc56000},
- {0x7fc58000}, {0x7fc5a000}, {0x7fc5c000}, {0x7fc5e000},
- {0x7fc60000}, {0x7fc62000}, {0x7fc64000}, {0x7fc66000},
- {0x7fc68000}, {0x7fc6a000}, {0x7fc6c000}, {0x7fc6e000},
- {0x7fc70000}, {0x7fc72000}, {0x7fc74000}, {0x7fc76000},
- {0x7fc78000}, {0x7fc7a000}, {0x7fc7c000}, {0x7fc7e000},
- {0x7fc80000}, {0x7fc82000}, {0x7fc84000}, {0x7fc86000},
- {0x7fc88000}, {0x7fc8a000}, {0x7fc8c000}, {0x7fc8e000},
- {0x7fc90000}, {0x7fc92000}, {0x7fc94000}, {0x7fc96000},
- {0x7fc98000}, {0x7fc9a000}, {0x7fc9c000}, {0x7fc9e000},
- {0x7fca0000}, {0x7fca2000}, {0x7fca4000}, {0x7fca6000},
- {0x7fca8000}, {0x7fcaa000}, {0x7fcac000}, {0x7fcae000},
- {0x7fcb0000}, {0x7fcb2000}, {0x7fcb4000}, {0x7fcb6000},
- {0x7fcb8000}, {0x7fcba000}, {0x7fcbc000}, {0x7fcbe000},
- {0x7fcc0000}, {0x7fcc2000}, {0x7fcc4000}, {0x7fcc6000},
- {0x7fcc8000}, {0x7fcca000}, {0x7fccc000}, {0x7fcce000},
- {0x7fcd0000}, {0x7fcd2000}, {0x7fcd4000}, {0x7fcd6000},
- {0x7fcd8000}, {0x7fcda000}, {0x7fcdc000}, {0x7fcde000},
- {0x7fce0000}, {0x7fce2000}, {0x7fce4000}, {0x7fce6000},
- {0x7fce8000}, {0x7fcea000}, {0x7fcec000}, {0x7fcee000},
- {0x7fcf0000}, {0x7fcf2000}, {0x7fcf4000}, {0x7fcf6000},
- {0x7fcf8000}, {0x7fcfa000}, {0x7fcfc000}, {0x7fcfe000},
- {0x7fd00000}, {0x7fd02000}, {0x7fd04000}, {0x7fd06000},
- {0x7fd08000}, {0x7fd0a000}, {0x7fd0c000}, {0x7fd0e000},
- {0x7fd10000}, {0x7fd12000}, {0x7fd14000}, {0x7fd16000},
- {0x7fd18000}, {0x7fd1a000}, {0x7fd1c000}, {0x7fd1e000},
- {0x7fd20000}, {0x7fd22000}, {0x7fd24000}, {0x7fd26000},
- {0x7fd28000}, {0x7fd2a000}, {0x7fd2c000}, {0x7fd2e000},
- {0x7fd30000}, {0x7fd32000}, {0x7fd34000}, {0x7fd36000},
- {0x7fd38000}, {0x7fd3a000}, {0x7fd3c000}, {0x7fd3e000},
- {0x7fd40000}, {0x7fd42000}, {0x7fd44000}, {0x7fd46000},
- {0x7fd48000}, {0x7fd4a000}, {0x7fd4c000}, {0x7fd4e000},
- {0x7fd50000}, {0x7fd52000}, {0x7fd54000}, {0x7fd56000},
- {0x7fd58000}, {0x7fd5a000}, {0x7fd5c000}, {0x7fd5e000},
- {0x7fd60000}, {0x7fd62000}, {0x7fd64000}, {0x7fd66000},
- {0x7fd68000}, {0x7fd6a000}, {0x7fd6c000}, {0x7fd6e000},
- {0x7fd70000}, {0x7fd72000}, {0x7fd74000}, {0x7fd76000},
- {0x7fd78000}, {0x7fd7a000}, {0x7fd7c000}, {0x7fd7e000},
- {0x7fd80000}, {0x7fd82000}, {0x7fd84000}, {0x7fd86000},
- {0x7fd88000}, {0x7fd8a000}, {0x7fd8c000}, {0x7fd8e000},
- {0x7fd90000}, {0x7fd92000}, {0x7fd94000}, {0x7fd96000},
- {0x7fd98000}, {0x7fd9a000}, {0x7fd9c000}, {0x7fd9e000},
- {0x7fda0000}, {0x7fda2000}, {0x7fda4000}, {0x7fda6000},
- {0x7fda8000}, {0x7fdaa000}, {0x7fdac000}, {0x7fdae000},
- {0x7fdb0000}, {0x7fdb2000}, {0x7fdb4000}, {0x7fdb6000},
- {0x7fdb8000}, {0x7fdba000}, {0x7fdbc000}, {0x7fdbe000},
- {0x7fdc0000}, {0x7fdc2000}, {0x7fdc4000}, {0x7fdc6000},
- {0x7fdc8000}, {0x7fdca000}, {0x7fdcc000}, {0x7fdce000},
- {0x7fdd0000}, {0x7fdd2000}, {0x7fdd4000}, {0x7fdd6000},
- {0x7fdd8000}, {0x7fdda000}, {0x7fddc000}, {0x7fdde000},
- {0x7fde0000}, {0x7fde2000}, {0x7fde4000}, {0x7fde6000},
- {0x7fde8000}, {0x7fdea000}, {0x7fdec000}, {0x7fdee000},
- {0x7fdf0000}, {0x7fdf2000}, {0x7fdf4000}, {0x7fdf6000},
- {0x7fdf8000}, {0x7fdfa000}, {0x7fdfc000}, {0x7fdfe000},
- {0x7fe00000}, {0x7fe02000}, {0x7fe04000}, {0x7fe06000},
- {0x7fe08000}, {0x7fe0a000}, {0x7fe0c000}, {0x7fe0e000},
- {0x7fe10000}, {0x7fe12000}, {0x7fe14000}, {0x7fe16000},
- {0x7fe18000}, {0x7fe1a000}, {0x7fe1c000}, {0x7fe1e000},
- {0x7fe20000}, {0x7fe22000}, {0x7fe24000}, {0x7fe26000},
- {0x7fe28000}, {0x7fe2a000}, {0x7fe2c000}, {0x7fe2e000},
- {0x7fe30000}, {0x7fe32000}, {0x7fe34000}, {0x7fe36000},
- {0x7fe38000}, {0x7fe3a000}, {0x7fe3c000}, {0x7fe3e000},
- {0x7fe40000}, {0x7fe42000}, {0x7fe44000}, {0x7fe46000},
- {0x7fe48000}, {0x7fe4a000}, {0x7fe4c000}, {0x7fe4e000},
- {0x7fe50000}, {0x7fe52000}, {0x7fe54000}, {0x7fe56000},
- {0x7fe58000}, {0x7fe5a000}, {0x7fe5c000}, {0x7fe5e000},
- {0x7fe60000}, {0x7fe62000}, {0x7fe64000}, {0x7fe66000},
- {0x7fe68000}, {0x7fe6a000}, {0x7fe6c000}, {0x7fe6e000},
- {0x7fe70000}, {0x7fe72000}, {0x7fe74000}, {0x7fe76000},
- {0x7fe78000}, {0x7fe7a000}, {0x7fe7c000}, {0x7fe7e000},
- {0x7fe80000}, {0x7fe82000}, {0x7fe84000}, {0x7fe86000},
- {0x7fe88000}, {0x7fe8a000}, {0x7fe8c000}, {0x7fe8e000},
- {0x7fe90000}, {0x7fe92000}, {0x7fe94000}, {0x7fe96000},
- {0x7fe98000}, {0x7fe9a000}, {0x7fe9c000}, {0x7fe9e000},
- {0x7fea0000}, {0x7fea2000}, {0x7fea4000}, {0x7fea6000},
- {0x7fea8000}, {0x7feaa000}, {0x7feac000}, {0x7feae000},
- {0x7feb0000}, {0x7feb2000}, {0x7feb4000}, {0x7feb6000},
- {0x7feb8000}, {0x7feba000}, {0x7febc000}, {0x7febe000},
- {0x7fec0000}, {0x7fec2000}, {0x7fec4000}, {0x7fec6000},
- {0x7fec8000}, {0x7feca000}, {0x7fecc000}, {0x7fece000},
- {0x7fed0000}, {0x7fed2000}, {0x7fed4000}, {0x7fed6000},
- {0x7fed8000}, {0x7feda000}, {0x7fedc000}, {0x7fede000},
- {0x7fee0000}, {0x7fee2000}, {0x7fee4000}, {0x7fee6000},
- {0x7fee8000}, {0x7feea000}, {0x7feec000}, {0x7feee000},
- {0x7fef0000}, {0x7fef2000}, {0x7fef4000}, {0x7fef6000},
- {0x7fef8000}, {0x7fefa000}, {0x7fefc000}, {0x7fefe000},
- {0x7ff00000}, {0x7ff02000}, {0x7ff04000}, {0x7ff06000},
- {0x7ff08000}, {0x7ff0a000}, {0x7ff0c000}, {0x7ff0e000},
- {0x7ff10000}, {0x7ff12000}, {0x7ff14000}, {0x7ff16000},
- {0x7ff18000}, {0x7ff1a000}, {0x7ff1c000}, {0x7ff1e000},
- {0x7ff20000}, {0x7ff22000}, {0x7ff24000}, {0x7ff26000},
- {0x7ff28000}, {0x7ff2a000}, {0x7ff2c000}, {0x7ff2e000},
- {0x7ff30000}, {0x7ff32000}, {0x7ff34000}, {0x7ff36000},
- {0x7ff38000}, {0x7ff3a000}, {0x7ff3c000}, {0x7ff3e000},
- {0x7ff40000}, {0x7ff42000}, {0x7ff44000}, {0x7ff46000},
- {0x7ff48000}, {0x7ff4a000}, {0x7ff4c000}, {0x7ff4e000},
- {0x7ff50000}, {0x7ff52000}, {0x7ff54000}, {0x7ff56000},
- {0x7ff58000}, {0x7ff5a000}, {0x7ff5c000}, {0x7ff5e000},
- {0x7ff60000}, {0x7ff62000}, {0x7ff64000}, {0x7ff66000},
- {0x7ff68000}, {0x7ff6a000}, {0x7ff6c000}, {0x7ff6e000},
- {0x7ff70000}, {0x7ff72000}, {0x7ff74000}, {0x7ff76000},
- {0x7ff78000}, {0x7ff7a000}, {0x7ff7c000}, {0x7ff7e000},
- {0x7ff80000}, {0x7ff82000}, {0x7ff84000}, {0x7ff86000},
- {0x7ff88000}, {0x7ff8a000}, {0x7ff8c000}, {0x7ff8e000},
- {0x7ff90000}, {0x7ff92000}, {0x7ff94000}, {0x7ff96000},
- {0x7ff98000}, {0x7ff9a000}, {0x7ff9c000}, {0x7ff9e000},
- {0x7ffa0000}, {0x7ffa2000}, {0x7ffa4000}, {0x7ffa6000},
- {0x7ffa8000}, {0x7ffaa000}, {0x7ffac000}, {0x7ffae000},
- {0x7ffb0000}, {0x7ffb2000}, {0x7ffb4000}, {0x7ffb6000},
- {0x7ffb8000}, {0x7ffba000}, {0x7ffbc000}, {0x7ffbe000},
- {0x7ffc0000}, {0x7ffc2000}, {0x7ffc4000}, {0x7ffc6000},
- {0x7ffc8000}, {0x7ffca000}, {0x7ffcc000}, {0x7ffce000},
- {0x7ffd0000}, {0x7ffd2000}, {0x7ffd4000}, {0x7ffd6000},
- {0x7ffd8000}, {0x7ffda000}, {0x7ffdc000}, {0x7ffde000},
- {0x7ffe0000}, {0x7ffe2000}, {0x7ffe4000}, {0x7ffe6000},
- {0x7ffe8000}, {0x7ffea000}, {0x7ffec000}, {0x7ffee000},
- {0x7fff0000}, {0x7fff2000}, {0x7fff4000}, {0x7fff6000},
- {0x7fff8000}, {0x7fffa000}, {0x7fffc000}, {0x7fffe000},
- {0x80000000}, {0xb3800000}, {0xb4000000}, {0xb4400000},
- {0xb4800000}, {0xb4a00000}, {0xb4c00000}, {0xb4e00000},
- {0xb5000000}, {0xb5100000}, {0xb5200000}, {0xb5300000},
- {0xb5400000}, {0xb5500000}, {0xb5600000}, {0xb5700000},
- {0xb5800000}, {0xb5880000}, {0xb5900000}, {0xb5980000},
- {0xb5a00000}, {0xb5a80000}, {0xb5b00000}, {0xb5b80000},
- {0xb5c00000}, {0xb5c80000}, {0xb5d00000}, {0xb5d80000},
- {0xb5e00000}, {0xb5e80000}, {0xb5f00000}, {0xb5f80000},
- {0xb6000000}, {0xb6040000}, {0xb6080000}, {0xb60c0000},
- {0xb6100000}, {0xb6140000}, {0xb6180000}, {0xb61c0000},
- {0xb6200000}, {0xb6240000}, {0xb6280000}, {0xb62c0000},
- {0xb6300000}, {0xb6340000}, {0xb6380000}, {0xb63c0000},
- {0xb6400000}, {0xb6440000}, {0xb6480000}, {0xb64c0000},
- {0xb6500000}, {0xb6540000}, {0xb6580000}, {0xb65c0000},
- {0xb6600000}, {0xb6640000}, {0xb6680000}, {0xb66c0000},
- {0xb6700000}, {0xb6740000}, {0xb6780000}, {0xb67c0000},
- {0xb6800000}, {0xb6820000}, {0xb6840000}, {0xb6860000},
- {0xb6880000}, {0xb68a0000}, {0xb68c0000}, {0xb68e0000},
- {0xb6900000}, {0xb6920000}, {0xb6940000}, {0xb6960000},
- {0xb6980000}, {0xb69a0000}, {0xb69c0000}, {0xb69e0000},
- {0xb6a00000}, {0xb6a20000}, {0xb6a40000}, {0xb6a60000},
- {0xb6a80000}, {0xb6aa0000}, {0xb6ac0000}, {0xb6ae0000},
- {0xb6b00000}, {0xb6b20000}, {0xb6b40000}, {0xb6b60000},
- {0xb6b80000}, {0xb6ba0000}, {0xb6bc0000}, {0xb6be0000},
- {0xb6c00000}, {0xb6c20000}, {0xb6c40000}, {0xb6c60000},
- {0xb6c80000}, {0xb6ca0000}, {0xb6cc0000}, {0xb6ce0000},
- {0xb6d00000}, {0xb6d20000}, {0xb6d40000}, {0xb6d60000},
- {0xb6d80000}, {0xb6da0000}, {0xb6dc0000}, {0xb6de0000},
- {0xb6e00000}, {0xb6e20000}, {0xb6e40000}, {0xb6e60000},
- {0xb6e80000}, {0xb6ea0000}, {0xb6ec0000}, {0xb6ee0000},
- {0xb6f00000}, {0xb6f20000}, {0xb6f40000}, {0xb6f60000},
- {0xb6f80000}, {0xb6fa0000}, {0xb6fc0000}, {0xb6fe0000},
- {0xb7000000}, {0xb7010000}, {0xb7020000}, {0xb7030000},
- {0xb7040000}, {0xb7050000}, {0xb7060000}, {0xb7070000},
- {0xb7080000}, {0xb7090000}, {0xb70a0000}, {0xb70b0000},
- {0xb70c0000}, {0xb70d0000}, {0xb70e0000}, {0xb70f0000},
- {0xb7100000}, {0xb7110000}, {0xb7120000}, {0xb7130000},
- {0xb7140000}, {0xb7150000}, {0xb7160000}, {0xb7170000},
- {0xb7180000}, {0xb7190000}, {0xb71a0000}, {0xb71b0000},
- {0xb71c0000}, {0xb71d0000}, {0xb71e0000}, {0xb71f0000},
- {0xb7200000}, {0xb7210000}, {0xb7220000}, {0xb7230000},
- {0xb7240000}, {0xb7250000}, {0xb7260000}, {0xb7270000},
- {0xb7280000}, {0xb7290000}, {0xb72a0000}, {0xb72b0000},
- {0xb72c0000}, {0xb72d0000}, {0xb72e0000}, {0xb72f0000},
- {0xb7300000}, {0xb7310000}, {0xb7320000}, {0xb7330000},
- {0xb7340000}, {0xb7350000}, {0xb7360000}, {0xb7370000},
- {0xb7380000}, {0xb7390000}, {0xb73a0000}, {0xb73b0000},
- {0xb73c0000}, {0xb73d0000}, {0xb73e0000}, {0xb73f0000},
- {0xb7400000}, {0xb7410000}, {0xb7420000}, {0xb7430000},
- {0xb7440000}, {0xb7450000}, {0xb7460000}, {0xb7470000},
- {0xb7480000}, {0xb7490000}, {0xb74a0000}, {0xb74b0000},
- {0xb74c0000}, {0xb74d0000}, {0xb74e0000}, {0xb74f0000},
- {0xb7500000}, {0xb7510000}, {0xb7520000}, {0xb7530000},
- {0xb7540000}, {0xb7550000}, {0xb7560000}, {0xb7570000},
- {0xb7580000}, {0xb7590000}, {0xb75a0000}, {0xb75b0000},
- {0xb75c0000}, {0xb75d0000}, {0xb75e0000}, {0xb75f0000},
- {0xb7600000}, {0xb7610000}, {0xb7620000}, {0xb7630000},
- {0xb7640000}, {0xb7650000}, {0xb7660000}, {0xb7670000},
- {0xb7680000}, {0xb7690000}, {0xb76a0000}, {0xb76b0000},
- {0xb76c0000}, {0xb76d0000}, {0xb76e0000}, {0xb76f0000},
- {0xb7700000}, {0xb7710000}, {0xb7720000}, {0xb7730000},
- {0xb7740000}, {0xb7750000}, {0xb7760000}, {0xb7770000},
- {0xb7780000}, {0xb7790000}, {0xb77a0000}, {0xb77b0000},
- {0xb77c0000}, {0xb77d0000}, {0xb77e0000}, {0xb77f0000},
- {0xb7800000}, {0xb7808000}, {0xb7810000}, {0xb7818000},
- {0xb7820000}, {0xb7828000}, {0xb7830000}, {0xb7838000},
- {0xb7840000}, {0xb7848000}, {0xb7850000}, {0xb7858000},
- {0xb7860000}, {0xb7868000}, {0xb7870000}, {0xb7878000},
- {0xb7880000}, {0xb7888000}, {0xb7890000}, {0xb7898000},
- {0xb78a0000}, {0xb78a8000}, {0xb78b0000}, {0xb78b8000},
- {0xb78c0000}, {0xb78c8000}, {0xb78d0000}, {0xb78d8000},
- {0xb78e0000}, {0xb78e8000}, {0xb78f0000}, {0xb78f8000},
- {0xb7900000}, {0xb7908000}, {0xb7910000}, {0xb7918000},
- {0xb7920000}, {0xb7928000}, {0xb7930000}, {0xb7938000},
- {0xb7940000}, {0xb7948000}, {0xb7950000}, {0xb7958000},
- {0xb7960000}, {0xb7968000}, {0xb7970000}, {0xb7978000},
- {0xb7980000}, {0xb7988000}, {0xb7990000}, {0xb7998000},
- {0xb79a0000}, {0xb79a8000}, {0xb79b0000}, {0xb79b8000},
- {0xb79c0000}, {0xb79c8000}, {0xb79d0000}, {0xb79d8000},
- {0xb79e0000}, {0xb79e8000}, {0xb79f0000}, {0xb79f8000},
- {0xb7a00000}, {0xb7a08000}, {0xb7a10000}, {0xb7a18000},
- {0xb7a20000}, {0xb7a28000}, {0xb7a30000}, {0xb7a38000},
- {0xb7a40000}, {0xb7a48000}, {0xb7a50000}, {0xb7a58000},
- {0xb7a60000}, {0xb7a68000}, {0xb7a70000}, {0xb7a78000},
- {0xb7a80000}, {0xb7a88000}, {0xb7a90000}, {0xb7a98000},
- {0xb7aa0000}, {0xb7aa8000}, {0xb7ab0000}, {0xb7ab8000},
- {0xb7ac0000}, {0xb7ac8000}, {0xb7ad0000}, {0xb7ad8000},
- {0xb7ae0000}, {0xb7ae8000}, {0xb7af0000}, {0xb7af8000},
- {0xb7b00000}, {0xb7b08000}, {0xb7b10000}, {0xb7b18000},
- {0xb7b20000}, {0xb7b28000}, {0xb7b30000}, {0xb7b38000},
- {0xb7b40000}, {0xb7b48000}, {0xb7b50000}, {0xb7b58000},
- {0xb7b60000}, {0xb7b68000}, {0xb7b70000}, {0xb7b78000},
- {0xb7b80000}, {0xb7b88000}, {0xb7b90000}, {0xb7b98000},
- {0xb7ba0000}, {0xb7ba8000}, {0xb7bb0000}, {0xb7bb8000},
- {0xb7bc0000}, {0xb7bc8000}, {0xb7bd0000}, {0xb7bd8000},
- {0xb7be0000}, {0xb7be8000}, {0xb7bf0000}, {0xb7bf8000},
- {0xb7c00000}, {0xb7c08000}, {0xb7c10000}, {0xb7c18000},
- {0xb7c20000}, {0xb7c28000}, {0xb7c30000}, {0xb7c38000},
- {0xb7c40000}, {0xb7c48000}, {0xb7c50000}, {0xb7c58000},
- {0xb7c60000}, {0xb7c68000}, {0xb7c70000}, {0xb7c78000},
- {0xb7c80000}, {0xb7c88000}, {0xb7c90000}, {0xb7c98000},
- {0xb7ca0000}, {0xb7ca8000}, {0xb7cb0000}, {0xb7cb8000},
- {0xb7cc0000}, {0xb7cc8000}, {0xb7cd0000}, {0xb7cd8000},
- {0xb7ce0000}, {0xb7ce8000}, {0xb7cf0000}, {0xb7cf8000},
- {0xb7d00000}, {0xb7d08000}, {0xb7d10000}, {0xb7d18000},
- {0xb7d20000}, {0xb7d28000}, {0xb7d30000}, {0xb7d38000},
- {0xb7d40000}, {0xb7d48000}, {0xb7d50000}, {0xb7d58000},
- {0xb7d60000}, {0xb7d68000}, {0xb7d70000}, {0xb7d78000},
- {0xb7d80000}, {0xb7d88000}, {0xb7d90000}, {0xb7d98000},
- {0xb7da0000}, {0xb7da8000}, {0xb7db0000}, {0xb7db8000},
- {0xb7dc0000}, {0xb7dc8000}, {0xb7dd0000}, {0xb7dd8000},
- {0xb7de0000}, {0xb7de8000}, {0xb7df0000}, {0xb7df8000},
- {0xb7e00000}, {0xb7e08000}, {0xb7e10000}, {0xb7e18000},
- {0xb7e20000}, {0xb7e28000}, {0xb7e30000}, {0xb7e38000},
- {0xb7e40000}, {0xb7e48000}, {0xb7e50000}, {0xb7e58000},
- {0xb7e60000}, {0xb7e68000}, {0xb7e70000}, {0xb7e78000},
- {0xb7e80000}, {0xb7e88000}, {0xb7e90000}, {0xb7e98000},
- {0xb7ea0000}, {0xb7ea8000}, {0xb7eb0000}, {0xb7eb8000},
- {0xb7ec0000}, {0xb7ec8000}, {0xb7ed0000}, {0xb7ed8000},
- {0xb7ee0000}, {0xb7ee8000}, {0xb7ef0000}, {0xb7ef8000},
- {0xb7f00000}, {0xb7f08000}, {0xb7f10000}, {0xb7f18000},
- {0xb7f20000}, {0xb7f28000}, {0xb7f30000}, {0xb7f38000},
- {0xb7f40000}, {0xb7f48000}, {0xb7f50000}, {0xb7f58000},
- {0xb7f60000}, {0xb7f68000}, {0xb7f70000}, {0xb7f78000},
- {0xb7f80000}, {0xb7f88000}, {0xb7f90000}, {0xb7f98000},
- {0xb7fa0000}, {0xb7fa8000}, {0xb7fb0000}, {0xb7fb8000},
- {0xb7fc0000}, {0xb7fc8000}, {0xb7fd0000}, {0xb7fd8000},
- {0xb7fe0000}, {0xb7fe8000}, {0xb7ff0000}, {0xb7ff8000},
- {0xb8000000}, {0xb8004000}, {0xb8008000}, {0xb800c000},
- {0xb8010000}, {0xb8014000}, {0xb8018000}, {0xb801c000},
- {0xb8020000}, {0xb8024000}, {0xb8028000}, {0xb802c000},
- {0xb8030000}, {0xb8034000}, {0xb8038000}, {0xb803c000},
- {0xb8040000}, {0xb8044000}, {0xb8048000}, {0xb804c000},
- {0xb8050000}, {0xb8054000}, {0xb8058000}, {0xb805c000},
- {0xb8060000}, {0xb8064000}, {0xb8068000}, {0xb806c000},
- {0xb8070000}, {0xb8074000}, {0xb8078000}, {0xb807c000},
- {0xb8080000}, {0xb8084000}, {0xb8088000}, {0xb808c000},
- {0xb8090000}, {0xb8094000}, {0xb8098000}, {0xb809c000},
- {0xb80a0000}, {0xb80a4000}, {0xb80a8000}, {0xb80ac000},
- {0xb80b0000}, {0xb80b4000}, {0xb80b8000}, {0xb80bc000},
- {0xb80c0000}, {0xb80c4000}, {0xb80c8000}, {0xb80cc000},
- {0xb80d0000}, {0xb80d4000}, {0xb80d8000}, {0xb80dc000},
- {0xb80e0000}, {0xb80e4000}, {0xb80e8000}, {0xb80ec000},
- {0xb80f0000}, {0xb80f4000}, {0xb80f8000}, {0xb80fc000},
- {0xb8100000}, {0xb8104000}, {0xb8108000}, {0xb810c000},
- {0xb8110000}, {0xb8114000}, {0xb8118000}, {0xb811c000},
- {0xb8120000}, {0xb8124000}, {0xb8128000}, {0xb812c000},
- {0xb8130000}, {0xb8134000}, {0xb8138000}, {0xb813c000},
- {0xb8140000}, {0xb8144000}, {0xb8148000}, {0xb814c000},
- {0xb8150000}, {0xb8154000}, {0xb8158000}, {0xb815c000},
- {0xb8160000}, {0xb8164000}, {0xb8168000}, {0xb816c000},
- {0xb8170000}, {0xb8174000}, {0xb8178000}, {0xb817c000},
- {0xb8180000}, {0xb8184000}, {0xb8188000}, {0xb818c000},
- {0xb8190000}, {0xb8194000}, {0xb8198000}, {0xb819c000},
- {0xb81a0000}, {0xb81a4000}, {0xb81a8000}, {0xb81ac000},
- {0xb81b0000}, {0xb81b4000}, {0xb81b8000}, {0xb81bc000},
- {0xb81c0000}, {0xb81c4000}, {0xb81c8000}, {0xb81cc000},
- {0xb81d0000}, {0xb81d4000}, {0xb81d8000}, {0xb81dc000},
- {0xb81e0000}, {0xb81e4000}, {0xb81e8000}, {0xb81ec000},
- {0xb81f0000}, {0xb81f4000}, {0xb81f8000}, {0xb81fc000},
- {0xb8200000}, {0xb8204000}, {0xb8208000}, {0xb820c000},
- {0xb8210000}, {0xb8214000}, {0xb8218000}, {0xb821c000},
- {0xb8220000}, {0xb8224000}, {0xb8228000}, {0xb822c000},
- {0xb8230000}, {0xb8234000}, {0xb8238000}, {0xb823c000},
- {0xb8240000}, {0xb8244000}, {0xb8248000}, {0xb824c000},
- {0xb8250000}, {0xb8254000}, {0xb8258000}, {0xb825c000},
- {0xb8260000}, {0xb8264000}, {0xb8268000}, {0xb826c000},
- {0xb8270000}, {0xb8274000}, {0xb8278000}, {0xb827c000},
- {0xb8280000}, {0xb8284000}, {0xb8288000}, {0xb828c000},
- {0xb8290000}, {0xb8294000}, {0xb8298000}, {0xb829c000},
- {0xb82a0000}, {0xb82a4000}, {0xb82a8000}, {0xb82ac000},
- {0xb82b0000}, {0xb82b4000}, {0xb82b8000}, {0xb82bc000},
- {0xb82c0000}, {0xb82c4000}, {0xb82c8000}, {0xb82cc000},
- {0xb82d0000}, {0xb82d4000}, {0xb82d8000}, {0xb82dc000},
- {0xb82e0000}, {0xb82e4000}, {0xb82e8000}, {0xb82ec000},
- {0xb82f0000}, {0xb82f4000}, {0xb82f8000}, {0xb82fc000},
- {0xb8300000}, {0xb8304000}, {0xb8308000}, {0xb830c000},
- {0xb8310000}, {0xb8314000}, {0xb8318000}, {0xb831c000},
- {0xb8320000}, {0xb8324000}, {0xb8328000}, {0xb832c000},
- {0xb8330000}, {0xb8334000}, {0xb8338000}, {0xb833c000},
- {0xb8340000}, {0xb8344000}, {0xb8348000}, {0xb834c000},
- {0xb8350000}, {0xb8354000}, {0xb8358000}, {0xb835c000},
- {0xb8360000}, {0xb8364000}, {0xb8368000}, {0xb836c000},
- {0xb8370000}, {0xb8374000}, {0xb8378000}, {0xb837c000},
- {0xb8380000}, {0xb8384000}, {0xb8388000}, {0xb838c000},
- {0xb8390000}, {0xb8394000}, {0xb8398000}, {0xb839c000},
- {0xb83a0000}, {0xb83a4000}, {0xb83a8000}, {0xb83ac000},
- {0xb83b0000}, {0xb83b4000}, {0xb83b8000}, {0xb83bc000},
- {0xb83c0000}, {0xb83c4000}, {0xb83c8000}, {0xb83cc000},
- {0xb83d0000}, {0xb83d4000}, {0xb83d8000}, {0xb83dc000},
- {0xb83e0000}, {0xb83e4000}, {0xb83e8000}, {0xb83ec000},
- {0xb83f0000}, {0xb83f4000}, {0xb83f8000}, {0xb83fc000},
- {0xb8400000}, {0xb8404000}, {0xb8408000}, {0xb840c000},
- {0xb8410000}, {0xb8414000}, {0xb8418000}, {0xb841c000},
- {0xb8420000}, {0xb8424000}, {0xb8428000}, {0xb842c000},
- {0xb8430000}, {0xb8434000}, {0xb8438000}, {0xb843c000},
- {0xb8440000}, {0xb8444000}, {0xb8448000}, {0xb844c000},
- {0xb8450000}, {0xb8454000}, {0xb8458000}, {0xb845c000},
- {0xb8460000}, {0xb8464000}, {0xb8468000}, {0xb846c000},
- {0xb8470000}, {0xb8474000}, {0xb8478000}, {0xb847c000},
- {0xb8480000}, {0xb8484000}, {0xb8488000}, {0xb848c000},
- {0xb8490000}, {0xb8494000}, {0xb8498000}, {0xb849c000},
- {0xb84a0000}, {0xb84a4000}, {0xb84a8000}, {0xb84ac000},
- {0xb84b0000}, {0xb84b4000}, {0xb84b8000}, {0xb84bc000},
- {0xb84c0000}, {0xb84c4000}, {0xb84c8000}, {0xb84cc000},
- {0xb84d0000}, {0xb84d4000}, {0xb84d8000}, {0xb84dc000},
- {0xb84e0000}, {0xb84e4000}, {0xb84e8000}, {0xb84ec000},
- {0xb84f0000}, {0xb84f4000}, {0xb84f8000}, {0xb84fc000},
- {0xb8500000}, {0xb8504000}, {0xb8508000}, {0xb850c000},
- {0xb8510000}, {0xb8514000}, {0xb8518000}, {0xb851c000},
- {0xb8520000}, {0xb8524000}, {0xb8528000}, {0xb852c000},
- {0xb8530000}, {0xb8534000}, {0xb8538000}, {0xb853c000},
- {0xb8540000}, {0xb8544000}, {0xb8548000}, {0xb854c000},
- {0xb8550000}, {0xb8554000}, {0xb8558000}, {0xb855c000},
- {0xb8560000}, {0xb8564000}, {0xb8568000}, {0xb856c000},
- {0xb8570000}, {0xb8574000}, {0xb8578000}, {0xb857c000},
- {0xb8580000}, {0xb8584000}, {0xb8588000}, {0xb858c000},
- {0xb8590000}, {0xb8594000}, {0xb8598000}, {0xb859c000},
- {0xb85a0000}, {0xb85a4000}, {0xb85a8000}, {0xb85ac000},
- {0xb85b0000}, {0xb85b4000}, {0xb85b8000}, {0xb85bc000},
- {0xb85c0000}, {0xb85c4000}, {0xb85c8000}, {0xb85cc000},
- {0xb85d0000}, {0xb85d4000}, {0xb85d8000}, {0xb85dc000},
- {0xb85e0000}, {0xb85e4000}, {0xb85e8000}, {0xb85ec000},
- {0xb85f0000}, {0xb85f4000}, {0xb85f8000}, {0xb85fc000},
- {0xb8600000}, {0xb8604000}, {0xb8608000}, {0xb860c000},
- {0xb8610000}, {0xb8614000}, {0xb8618000}, {0xb861c000},
- {0xb8620000}, {0xb8624000}, {0xb8628000}, {0xb862c000},
- {0xb8630000}, {0xb8634000}, {0xb8638000}, {0xb863c000},
- {0xb8640000}, {0xb8644000}, {0xb8648000}, {0xb864c000},
- {0xb8650000}, {0xb8654000}, {0xb8658000}, {0xb865c000},
- {0xb8660000}, {0xb8664000}, {0xb8668000}, {0xb866c000},
- {0xb8670000}, {0xb8674000}, {0xb8678000}, {0xb867c000},
- {0xb8680000}, {0xb8684000}, {0xb8688000}, {0xb868c000},
- {0xb8690000}, {0xb8694000}, {0xb8698000}, {0xb869c000},
- {0xb86a0000}, {0xb86a4000}, {0xb86a8000}, {0xb86ac000},
- {0xb86b0000}, {0xb86b4000}, {0xb86b8000}, {0xb86bc000},
- {0xb86c0000}, {0xb86c4000}, {0xb86c8000}, {0xb86cc000},
- {0xb86d0000}, {0xb86d4000}, {0xb86d8000}, {0xb86dc000},
- {0xb86e0000}, {0xb86e4000}, {0xb86e8000}, {0xb86ec000},
- {0xb86f0000}, {0xb86f4000}, {0xb86f8000}, {0xb86fc000},
- {0xb8700000}, {0xb8704000}, {0xb8708000}, {0xb870c000},
- {0xb8710000}, {0xb8714000}, {0xb8718000}, {0xb871c000},
- {0xb8720000}, {0xb8724000}, {0xb8728000}, {0xb872c000},
- {0xb8730000}, {0xb8734000}, {0xb8738000}, {0xb873c000},
- {0xb8740000}, {0xb8744000}, {0xb8748000}, {0xb874c000},
- {0xb8750000}, {0xb8754000}, {0xb8758000}, {0xb875c000},
- {0xb8760000}, {0xb8764000}, {0xb8768000}, {0xb876c000},
- {0xb8770000}, {0xb8774000}, {0xb8778000}, {0xb877c000},
- {0xb8780000}, {0xb8784000}, {0xb8788000}, {0xb878c000},
- {0xb8790000}, {0xb8794000}, {0xb8798000}, {0xb879c000},
- {0xb87a0000}, {0xb87a4000}, {0xb87a8000}, {0xb87ac000},
- {0xb87b0000}, {0xb87b4000}, {0xb87b8000}, {0xb87bc000},
- {0xb87c0000}, {0xb87c4000}, {0xb87c8000}, {0xb87cc000},
- {0xb87d0000}, {0xb87d4000}, {0xb87d8000}, {0xb87dc000},
- {0xb87e0000}, {0xb87e4000}, {0xb87e8000}, {0xb87ec000},
- {0xb87f0000}, {0xb87f4000}, {0xb87f8000}, {0xb87fc000},
- {0xb8800000}, {0xb8802000}, {0xb8804000}, {0xb8806000},
- {0xb8808000}, {0xb880a000}, {0xb880c000}, {0xb880e000},
- {0xb8810000}, {0xb8812000}, {0xb8814000}, {0xb8816000},
- {0xb8818000}, {0xb881a000}, {0xb881c000}, {0xb881e000},
- {0xb8820000}, {0xb8822000}, {0xb8824000}, {0xb8826000},
- {0xb8828000}, {0xb882a000}, {0xb882c000}, {0xb882e000},
- {0xb8830000}, {0xb8832000}, {0xb8834000}, {0xb8836000},
- {0xb8838000}, {0xb883a000}, {0xb883c000}, {0xb883e000},
- {0xb8840000}, {0xb8842000}, {0xb8844000}, {0xb8846000},
- {0xb8848000}, {0xb884a000}, {0xb884c000}, {0xb884e000},
- {0xb8850000}, {0xb8852000}, {0xb8854000}, {0xb8856000},
- {0xb8858000}, {0xb885a000}, {0xb885c000}, {0xb885e000},
- {0xb8860000}, {0xb8862000}, {0xb8864000}, {0xb8866000},
- {0xb8868000}, {0xb886a000}, {0xb886c000}, {0xb886e000},
- {0xb8870000}, {0xb8872000}, {0xb8874000}, {0xb8876000},
- {0xb8878000}, {0xb887a000}, {0xb887c000}, {0xb887e000},
- {0xb8880000}, {0xb8882000}, {0xb8884000}, {0xb8886000},
- {0xb8888000}, {0xb888a000}, {0xb888c000}, {0xb888e000},
- {0xb8890000}, {0xb8892000}, {0xb8894000}, {0xb8896000},
- {0xb8898000}, {0xb889a000}, {0xb889c000}, {0xb889e000},
- {0xb88a0000}, {0xb88a2000}, {0xb88a4000}, {0xb88a6000},
- {0xb88a8000}, {0xb88aa000}, {0xb88ac000}, {0xb88ae000},
- {0xb88b0000}, {0xb88b2000}, {0xb88b4000}, {0xb88b6000},
- {0xb88b8000}, {0xb88ba000}, {0xb88bc000}, {0xb88be000},
- {0xb88c0000}, {0xb88c2000}, {0xb88c4000}, {0xb88c6000},
- {0xb88c8000}, {0xb88ca000}, {0xb88cc000}, {0xb88ce000},
- {0xb88d0000}, {0xb88d2000}, {0xb88d4000}, {0xb88d6000},
- {0xb88d8000}, {0xb88da000}, {0xb88dc000}, {0xb88de000},
- {0xb88e0000}, {0xb88e2000}, {0xb88e4000}, {0xb88e6000},
- {0xb88e8000}, {0xb88ea000}, {0xb88ec000}, {0xb88ee000},
- {0xb88f0000}, {0xb88f2000}, {0xb88f4000}, {0xb88f6000},
- {0xb88f8000}, {0xb88fa000}, {0xb88fc000}, {0xb88fe000},
- {0xb8900000}, {0xb8902000}, {0xb8904000}, {0xb8906000},
- {0xb8908000}, {0xb890a000}, {0xb890c000}, {0xb890e000},
- {0xb8910000}, {0xb8912000}, {0xb8914000}, {0xb8916000},
- {0xb8918000}, {0xb891a000}, {0xb891c000}, {0xb891e000},
- {0xb8920000}, {0xb8922000}, {0xb8924000}, {0xb8926000},
- {0xb8928000}, {0xb892a000}, {0xb892c000}, {0xb892e000},
- {0xb8930000}, {0xb8932000}, {0xb8934000}, {0xb8936000},
- {0xb8938000}, {0xb893a000}, {0xb893c000}, {0xb893e000},
- {0xb8940000}, {0xb8942000}, {0xb8944000}, {0xb8946000},
- {0xb8948000}, {0xb894a000}, {0xb894c000}, {0xb894e000},
- {0xb8950000}, {0xb8952000}, {0xb8954000}, {0xb8956000},
- {0xb8958000}, {0xb895a000}, {0xb895c000}, {0xb895e000},
- {0xb8960000}, {0xb8962000}, {0xb8964000}, {0xb8966000},
- {0xb8968000}, {0xb896a000}, {0xb896c000}, {0xb896e000},
- {0xb8970000}, {0xb8972000}, {0xb8974000}, {0xb8976000},
- {0xb8978000}, {0xb897a000}, {0xb897c000}, {0xb897e000},
- {0xb8980000}, {0xb8982000}, {0xb8984000}, {0xb8986000},
- {0xb8988000}, {0xb898a000}, {0xb898c000}, {0xb898e000},
- {0xb8990000}, {0xb8992000}, {0xb8994000}, {0xb8996000},
- {0xb8998000}, {0xb899a000}, {0xb899c000}, {0xb899e000},
- {0xb89a0000}, {0xb89a2000}, {0xb89a4000}, {0xb89a6000},
- {0xb89a8000}, {0xb89aa000}, {0xb89ac000}, {0xb89ae000},
- {0xb89b0000}, {0xb89b2000}, {0xb89b4000}, {0xb89b6000},
- {0xb89b8000}, {0xb89ba000}, {0xb89bc000}, {0xb89be000},
- {0xb89c0000}, {0xb89c2000}, {0xb89c4000}, {0xb89c6000},
- {0xb89c8000}, {0xb89ca000}, {0xb89cc000}, {0xb89ce000},
- {0xb89d0000}, {0xb89d2000}, {0xb89d4000}, {0xb89d6000},
- {0xb89d8000}, {0xb89da000}, {0xb89dc000}, {0xb89de000},
- {0xb89e0000}, {0xb89e2000}, {0xb89e4000}, {0xb89e6000},
- {0xb89e8000}, {0xb89ea000}, {0xb89ec000}, {0xb89ee000},
- {0xb89f0000}, {0xb89f2000}, {0xb89f4000}, {0xb89f6000},
- {0xb89f8000}, {0xb89fa000}, {0xb89fc000}, {0xb89fe000},
- {0xb8a00000}, {0xb8a02000}, {0xb8a04000}, {0xb8a06000},
- {0xb8a08000}, {0xb8a0a000}, {0xb8a0c000}, {0xb8a0e000},
- {0xb8a10000}, {0xb8a12000}, {0xb8a14000}, {0xb8a16000},
- {0xb8a18000}, {0xb8a1a000}, {0xb8a1c000}, {0xb8a1e000},
- {0xb8a20000}, {0xb8a22000}, {0xb8a24000}, {0xb8a26000},
- {0xb8a28000}, {0xb8a2a000}, {0xb8a2c000}, {0xb8a2e000},
- {0xb8a30000}, {0xb8a32000}, {0xb8a34000}, {0xb8a36000},
- {0xb8a38000}, {0xb8a3a000}, {0xb8a3c000}, {0xb8a3e000},
- {0xb8a40000}, {0xb8a42000}, {0xb8a44000}, {0xb8a46000},
- {0xb8a48000}, {0xb8a4a000}, {0xb8a4c000}, {0xb8a4e000},
- {0xb8a50000}, {0xb8a52000}, {0xb8a54000}, {0xb8a56000},
- {0xb8a58000}, {0xb8a5a000}, {0xb8a5c000}, {0xb8a5e000},
- {0xb8a60000}, {0xb8a62000}, {0xb8a64000}, {0xb8a66000},
- {0xb8a68000}, {0xb8a6a000}, {0xb8a6c000}, {0xb8a6e000},
- {0xb8a70000}, {0xb8a72000}, {0xb8a74000}, {0xb8a76000},
- {0xb8a78000}, {0xb8a7a000}, {0xb8a7c000}, {0xb8a7e000},
- {0xb8a80000}, {0xb8a82000}, {0xb8a84000}, {0xb8a86000},
- {0xb8a88000}, {0xb8a8a000}, {0xb8a8c000}, {0xb8a8e000},
- {0xb8a90000}, {0xb8a92000}, {0xb8a94000}, {0xb8a96000},
- {0xb8a98000}, {0xb8a9a000}, {0xb8a9c000}, {0xb8a9e000},
- {0xb8aa0000}, {0xb8aa2000}, {0xb8aa4000}, {0xb8aa6000},
- {0xb8aa8000}, {0xb8aaa000}, {0xb8aac000}, {0xb8aae000},
- {0xb8ab0000}, {0xb8ab2000}, {0xb8ab4000}, {0xb8ab6000},
- {0xb8ab8000}, {0xb8aba000}, {0xb8abc000}, {0xb8abe000},
- {0xb8ac0000}, {0xb8ac2000}, {0xb8ac4000}, {0xb8ac6000},
- {0xb8ac8000}, {0xb8aca000}, {0xb8acc000}, {0xb8ace000},
- {0xb8ad0000}, {0xb8ad2000}, {0xb8ad4000}, {0xb8ad6000},
- {0xb8ad8000}, {0xb8ada000}, {0xb8adc000}, {0xb8ade000},
- {0xb8ae0000}, {0xb8ae2000}, {0xb8ae4000}, {0xb8ae6000},
- {0xb8ae8000}, {0xb8aea000}, {0xb8aec000}, {0xb8aee000},
- {0xb8af0000}, {0xb8af2000}, {0xb8af4000}, {0xb8af6000},
- {0xb8af8000}, {0xb8afa000}, {0xb8afc000}, {0xb8afe000},
- {0xb8b00000}, {0xb8b02000}, {0xb8b04000}, {0xb8b06000},
- {0xb8b08000}, {0xb8b0a000}, {0xb8b0c000}, {0xb8b0e000},
- {0xb8b10000}, {0xb8b12000}, {0xb8b14000}, {0xb8b16000},
- {0xb8b18000}, {0xb8b1a000}, {0xb8b1c000}, {0xb8b1e000},
- {0xb8b20000}, {0xb8b22000}, {0xb8b24000}, {0xb8b26000},
- {0xb8b28000}, {0xb8b2a000}, {0xb8b2c000}, {0xb8b2e000},
- {0xb8b30000}, {0xb8b32000}, {0xb8b34000}, {0xb8b36000},
- {0xb8b38000}, {0xb8b3a000}, {0xb8b3c000}, {0xb8b3e000},
- {0xb8b40000}, {0xb8b42000}, {0xb8b44000}, {0xb8b46000},
- {0xb8b48000}, {0xb8b4a000}, {0xb8b4c000}, {0xb8b4e000},
- {0xb8b50000}, {0xb8b52000}, {0xb8b54000}, {0xb8b56000},
- {0xb8b58000}, {0xb8b5a000}, {0xb8b5c000}, {0xb8b5e000},
- {0xb8b60000}, {0xb8b62000}, {0xb8b64000}, {0xb8b66000},
- {0xb8b68000}, {0xb8b6a000}, {0xb8b6c000}, {0xb8b6e000},
- {0xb8b70000}, {0xb8b72000}, {0xb8b74000}, {0xb8b76000},
- {0xb8b78000}, {0xb8b7a000}, {0xb8b7c000}, {0xb8b7e000},
- {0xb8b80000}, {0xb8b82000}, {0xb8b84000}, {0xb8b86000},
- {0xb8b88000}, {0xb8b8a000}, {0xb8b8c000}, {0xb8b8e000},
- {0xb8b90000}, {0xb8b92000}, {0xb8b94000}, {0xb8b96000},
- {0xb8b98000}, {0xb8b9a000}, {0xb8b9c000}, {0xb8b9e000},
- {0xb8ba0000}, {0xb8ba2000}, {0xb8ba4000}, {0xb8ba6000},
- {0xb8ba8000}, {0xb8baa000}, {0xb8bac000}, {0xb8bae000},
- {0xb8bb0000}, {0xb8bb2000}, {0xb8bb4000}, {0xb8bb6000},
- {0xb8bb8000}, {0xb8bba000}, {0xb8bbc000}, {0xb8bbe000},
- {0xb8bc0000}, {0xb8bc2000}, {0xb8bc4000}, {0xb8bc6000},
- {0xb8bc8000}, {0xb8bca000}, {0xb8bcc000}, {0xb8bce000},
- {0xb8bd0000}, {0xb8bd2000}, {0xb8bd4000}, {0xb8bd6000},
- {0xb8bd8000}, {0xb8bda000}, {0xb8bdc000}, {0xb8bde000},
- {0xb8be0000}, {0xb8be2000}, {0xb8be4000}, {0xb8be6000},
- {0xb8be8000}, {0xb8bea000}, {0xb8bec000}, {0xb8bee000},
- {0xb8bf0000}, {0xb8bf2000}, {0xb8bf4000}, {0xb8bf6000},
- {0xb8bf8000}, {0xb8bfa000}, {0xb8bfc000}, {0xb8bfe000},
- {0xb8c00000}, {0xb8c02000}, {0xb8c04000}, {0xb8c06000},
- {0xb8c08000}, {0xb8c0a000}, {0xb8c0c000}, {0xb8c0e000},
- {0xb8c10000}, {0xb8c12000}, {0xb8c14000}, {0xb8c16000},
- {0xb8c18000}, {0xb8c1a000}, {0xb8c1c000}, {0xb8c1e000},
- {0xb8c20000}, {0xb8c22000}, {0xb8c24000}, {0xb8c26000},
- {0xb8c28000}, {0xb8c2a000}, {0xb8c2c000}, {0xb8c2e000},
- {0xb8c30000}, {0xb8c32000}, {0xb8c34000}, {0xb8c36000},
- {0xb8c38000}, {0xb8c3a000}, {0xb8c3c000}, {0xb8c3e000},
- {0xb8c40000}, {0xb8c42000}, {0xb8c44000}, {0xb8c46000},
- {0xb8c48000}, {0xb8c4a000}, {0xb8c4c000}, {0xb8c4e000},
- {0xb8c50000}, {0xb8c52000}, {0xb8c54000}, {0xb8c56000},
- {0xb8c58000}, {0xb8c5a000}, {0xb8c5c000}, {0xb8c5e000},
- {0xb8c60000}, {0xb8c62000}, {0xb8c64000}, {0xb8c66000},
- {0xb8c68000}, {0xb8c6a000}, {0xb8c6c000}, {0xb8c6e000},
- {0xb8c70000}, {0xb8c72000}, {0xb8c74000}, {0xb8c76000},
- {0xb8c78000}, {0xb8c7a000}, {0xb8c7c000}, {0xb8c7e000},
- {0xb8c80000}, {0xb8c82000}, {0xb8c84000}, {0xb8c86000},
- {0xb8c88000}, {0xb8c8a000}, {0xb8c8c000}, {0xb8c8e000},
- {0xb8c90000}, {0xb8c92000}, {0xb8c94000}, {0xb8c96000},
- {0xb8c98000}, {0xb8c9a000}, {0xb8c9c000}, {0xb8c9e000},
- {0xb8ca0000}, {0xb8ca2000}, {0xb8ca4000}, {0xb8ca6000},
- {0xb8ca8000}, {0xb8caa000}, {0xb8cac000}, {0xb8cae000},
- {0xb8cb0000}, {0xb8cb2000}, {0xb8cb4000}, {0xb8cb6000},
- {0xb8cb8000}, {0xb8cba000}, {0xb8cbc000}, {0xb8cbe000},
- {0xb8cc0000}, {0xb8cc2000}, {0xb8cc4000}, {0xb8cc6000},
- {0xb8cc8000}, {0xb8cca000}, {0xb8ccc000}, {0xb8cce000},
- {0xb8cd0000}, {0xb8cd2000}, {0xb8cd4000}, {0xb8cd6000},
- {0xb8cd8000}, {0xb8cda000}, {0xb8cdc000}, {0xb8cde000},
- {0xb8ce0000}, {0xb8ce2000}, {0xb8ce4000}, {0xb8ce6000},
- {0xb8ce8000}, {0xb8cea000}, {0xb8cec000}, {0xb8cee000},
- {0xb8cf0000}, {0xb8cf2000}, {0xb8cf4000}, {0xb8cf6000},
- {0xb8cf8000}, {0xb8cfa000}, {0xb8cfc000}, {0xb8cfe000},
- {0xb8d00000}, {0xb8d02000}, {0xb8d04000}, {0xb8d06000},
- {0xb8d08000}, {0xb8d0a000}, {0xb8d0c000}, {0xb8d0e000},
- {0xb8d10000}, {0xb8d12000}, {0xb8d14000}, {0xb8d16000},
- {0xb8d18000}, {0xb8d1a000}, {0xb8d1c000}, {0xb8d1e000},
- {0xb8d20000}, {0xb8d22000}, {0xb8d24000}, {0xb8d26000},
- {0xb8d28000}, {0xb8d2a000}, {0xb8d2c000}, {0xb8d2e000},
- {0xb8d30000}, {0xb8d32000}, {0xb8d34000}, {0xb8d36000},
- {0xb8d38000}, {0xb8d3a000}, {0xb8d3c000}, {0xb8d3e000},
- {0xb8d40000}, {0xb8d42000}, {0xb8d44000}, {0xb8d46000},
- {0xb8d48000}, {0xb8d4a000}, {0xb8d4c000}, {0xb8d4e000},
- {0xb8d50000}, {0xb8d52000}, {0xb8d54000}, {0xb8d56000},
- {0xb8d58000}, {0xb8d5a000}, {0xb8d5c000}, {0xb8d5e000},
- {0xb8d60000}, {0xb8d62000}, {0xb8d64000}, {0xb8d66000},
- {0xb8d68000}, {0xb8d6a000}, {0xb8d6c000}, {0xb8d6e000},
- {0xb8d70000}, {0xb8d72000}, {0xb8d74000}, {0xb8d76000},
- {0xb8d78000}, {0xb8d7a000}, {0xb8d7c000}, {0xb8d7e000},
- {0xb8d80000}, {0xb8d82000}, {0xb8d84000}, {0xb8d86000},
- {0xb8d88000}, {0xb8d8a000}, {0xb8d8c000}, {0xb8d8e000},
- {0xb8d90000}, {0xb8d92000}, {0xb8d94000}, {0xb8d96000},
- {0xb8d98000}, {0xb8d9a000}, {0xb8d9c000}, {0xb8d9e000},
- {0xb8da0000}, {0xb8da2000}, {0xb8da4000}, {0xb8da6000},
- {0xb8da8000}, {0xb8daa000}, {0xb8dac000}, {0xb8dae000},
- {0xb8db0000}, {0xb8db2000}, {0xb8db4000}, {0xb8db6000},
- {0xb8db8000}, {0xb8dba000}, {0xb8dbc000}, {0xb8dbe000},
- {0xb8dc0000}, {0xb8dc2000}, {0xb8dc4000}, {0xb8dc6000},
- {0xb8dc8000}, {0xb8dca000}, {0xb8dcc000}, {0xb8dce000},
- {0xb8dd0000}, {0xb8dd2000}, {0xb8dd4000}, {0xb8dd6000},
- {0xb8dd8000}, {0xb8dda000}, {0xb8ddc000}, {0xb8dde000},
- {0xb8de0000}, {0xb8de2000}, {0xb8de4000}, {0xb8de6000},
- {0xb8de8000}, {0xb8dea000}, {0xb8dec000}, {0xb8dee000},
- {0xb8df0000}, {0xb8df2000}, {0xb8df4000}, {0xb8df6000},
- {0xb8df8000}, {0xb8dfa000}, {0xb8dfc000}, {0xb8dfe000},
- {0xb8e00000}, {0xb8e02000}, {0xb8e04000}, {0xb8e06000},
- {0xb8e08000}, {0xb8e0a000}, {0xb8e0c000}, {0xb8e0e000},
- {0xb8e10000}, {0xb8e12000}, {0xb8e14000}, {0xb8e16000},
- {0xb8e18000}, {0xb8e1a000}, {0xb8e1c000}, {0xb8e1e000},
- {0xb8e20000}, {0xb8e22000}, {0xb8e24000}, {0xb8e26000},
- {0xb8e28000}, {0xb8e2a000}, {0xb8e2c000}, {0xb8e2e000},
- {0xb8e30000}, {0xb8e32000}, {0xb8e34000}, {0xb8e36000},
- {0xb8e38000}, {0xb8e3a000}, {0xb8e3c000}, {0xb8e3e000},
- {0xb8e40000}, {0xb8e42000}, {0xb8e44000}, {0xb8e46000},
- {0xb8e48000}, {0xb8e4a000}, {0xb8e4c000}, {0xb8e4e000},
- {0xb8e50000}, {0xb8e52000}, {0xb8e54000}, {0xb8e56000},
- {0xb8e58000}, {0xb8e5a000}, {0xb8e5c000}, {0xb8e5e000},
- {0xb8e60000}, {0xb8e62000}, {0xb8e64000}, {0xb8e66000},
- {0xb8e68000}, {0xb8e6a000}, {0xb8e6c000}, {0xb8e6e000},
- {0xb8e70000}, {0xb8e72000}, {0xb8e74000}, {0xb8e76000},
- {0xb8e78000}, {0xb8e7a000}, {0xb8e7c000}, {0xb8e7e000},
- {0xb8e80000}, {0xb8e82000}, {0xb8e84000}, {0xb8e86000},
- {0xb8e88000}, {0xb8e8a000}, {0xb8e8c000}, {0xb8e8e000},
- {0xb8e90000}, {0xb8e92000}, {0xb8e94000}, {0xb8e96000},
- {0xb8e98000}, {0xb8e9a000}, {0xb8e9c000}, {0xb8e9e000},
- {0xb8ea0000}, {0xb8ea2000}, {0xb8ea4000}, {0xb8ea6000},
- {0xb8ea8000}, {0xb8eaa000}, {0xb8eac000}, {0xb8eae000},
- {0xb8eb0000}, {0xb8eb2000}, {0xb8eb4000}, {0xb8eb6000},
- {0xb8eb8000}, {0xb8eba000}, {0xb8ebc000}, {0xb8ebe000},
- {0xb8ec0000}, {0xb8ec2000}, {0xb8ec4000}, {0xb8ec6000},
- {0xb8ec8000}, {0xb8eca000}, {0xb8ecc000}, {0xb8ece000},
- {0xb8ed0000}, {0xb8ed2000}, {0xb8ed4000}, {0xb8ed6000},
- {0xb8ed8000}, {0xb8eda000}, {0xb8edc000}, {0xb8ede000},
- {0xb8ee0000}, {0xb8ee2000}, {0xb8ee4000}, {0xb8ee6000},
- {0xb8ee8000}, {0xb8eea000}, {0xb8eec000}, {0xb8eee000},
- {0xb8ef0000}, {0xb8ef2000}, {0xb8ef4000}, {0xb8ef6000},
- {0xb8ef8000}, {0xb8efa000}, {0xb8efc000}, {0xb8efe000},
- {0xb8f00000}, {0xb8f02000}, {0xb8f04000}, {0xb8f06000},
- {0xb8f08000}, {0xb8f0a000}, {0xb8f0c000}, {0xb8f0e000},
- {0xb8f10000}, {0xb8f12000}, {0xb8f14000}, {0xb8f16000},
- {0xb8f18000}, {0xb8f1a000}, {0xb8f1c000}, {0xb8f1e000},
- {0xb8f20000}, {0xb8f22000}, {0xb8f24000}, {0xb8f26000},
- {0xb8f28000}, {0xb8f2a000}, {0xb8f2c000}, {0xb8f2e000},
- {0xb8f30000}, {0xb8f32000}, {0xb8f34000}, {0xb8f36000},
- {0xb8f38000}, {0xb8f3a000}, {0xb8f3c000}, {0xb8f3e000},
- {0xb8f40000}, {0xb8f42000}, {0xb8f44000}, {0xb8f46000},
- {0xb8f48000}, {0xb8f4a000}, {0xb8f4c000}, {0xb8f4e000},
- {0xb8f50000}, {0xb8f52000}, {0xb8f54000}, {0xb8f56000},
- {0xb8f58000}, {0xb8f5a000}, {0xb8f5c000}, {0xb8f5e000},
- {0xb8f60000}, {0xb8f62000}, {0xb8f64000}, {0xb8f66000},
- {0xb8f68000}, {0xb8f6a000}, {0xb8f6c000}, {0xb8f6e000},
- {0xb8f70000}, {0xb8f72000}, {0xb8f74000}, {0xb8f76000},
- {0xb8f78000}, {0xb8f7a000}, {0xb8f7c000}, {0xb8f7e000},
- {0xb8f80000}, {0xb8f82000}, {0xb8f84000}, {0xb8f86000},
- {0xb8f88000}, {0xb8f8a000}, {0xb8f8c000}, {0xb8f8e000},
- {0xb8f90000}, {0xb8f92000}, {0xb8f94000}, {0xb8f96000},
- {0xb8f98000}, {0xb8f9a000}, {0xb8f9c000}, {0xb8f9e000},
- {0xb8fa0000}, {0xb8fa2000}, {0xb8fa4000}, {0xb8fa6000},
- {0xb8fa8000}, {0xb8faa000}, {0xb8fac000}, {0xb8fae000},
- {0xb8fb0000}, {0xb8fb2000}, {0xb8fb4000}, {0xb8fb6000},
- {0xb8fb8000}, {0xb8fba000}, {0xb8fbc000}, {0xb8fbe000},
- {0xb8fc0000}, {0xb8fc2000}, {0xb8fc4000}, {0xb8fc6000},
- {0xb8fc8000}, {0xb8fca000}, {0xb8fcc000}, {0xb8fce000},
- {0xb8fd0000}, {0xb8fd2000}, {0xb8fd4000}, {0xb8fd6000},
- {0xb8fd8000}, {0xb8fda000}, {0xb8fdc000}, {0xb8fde000},
- {0xb8fe0000}, {0xb8fe2000}, {0xb8fe4000}, {0xb8fe6000},
- {0xb8fe8000}, {0xb8fea000}, {0xb8fec000}, {0xb8fee000},
- {0xb8ff0000}, {0xb8ff2000}, {0xb8ff4000}, {0xb8ff6000},
- {0xb8ff8000}, {0xb8ffa000}, {0xb8ffc000}, {0xb8ffe000},
- {0xb9000000}, {0xb9002000}, {0xb9004000}, {0xb9006000},
- {0xb9008000}, {0xb900a000}, {0xb900c000}, {0xb900e000},
- {0xb9010000}, {0xb9012000}, {0xb9014000}, {0xb9016000},
- {0xb9018000}, {0xb901a000}, {0xb901c000}, {0xb901e000},
- {0xb9020000}, {0xb9022000}, {0xb9024000}, {0xb9026000},
- {0xb9028000}, {0xb902a000}, {0xb902c000}, {0xb902e000},
- {0xb9030000}, {0xb9032000}, {0xb9034000}, {0xb9036000},
- {0xb9038000}, {0xb903a000}, {0xb903c000}, {0xb903e000},
- {0xb9040000}, {0xb9042000}, {0xb9044000}, {0xb9046000},
- {0xb9048000}, {0xb904a000}, {0xb904c000}, {0xb904e000},
- {0xb9050000}, {0xb9052000}, {0xb9054000}, {0xb9056000},
- {0xb9058000}, {0xb905a000}, {0xb905c000}, {0xb905e000},
- {0xb9060000}, {0xb9062000}, {0xb9064000}, {0xb9066000},
- {0xb9068000}, {0xb906a000}, {0xb906c000}, {0xb906e000},
- {0xb9070000}, {0xb9072000}, {0xb9074000}, {0xb9076000},
- {0xb9078000}, {0xb907a000}, {0xb907c000}, {0xb907e000},
- {0xb9080000}, {0xb9082000}, {0xb9084000}, {0xb9086000},
- {0xb9088000}, {0xb908a000}, {0xb908c000}, {0xb908e000},
- {0xb9090000}, {0xb9092000}, {0xb9094000}, {0xb9096000},
- {0xb9098000}, {0xb909a000}, {0xb909c000}, {0xb909e000},
- {0xb90a0000}, {0xb90a2000}, {0xb90a4000}, {0xb90a6000},
- {0xb90a8000}, {0xb90aa000}, {0xb90ac000}, {0xb90ae000},
- {0xb90b0000}, {0xb90b2000}, {0xb90b4000}, {0xb90b6000},
- {0xb90b8000}, {0xb90ba000}, {0xb90bc000}, {0xb90be000},
- {0xb90c0000}, {0xb90c2000}, {0xb90c4000}, {0xb90c6000},
- {0xb90c8000}, {0xb90ca000}, {0xb90cc000}, {0xb90ce000},
- {0xb90d0000}, {0xb90d2000}, {0xb90d4000}, {0xb90d6000},
- {0xb90d8000}, {0xb90da000}, {0xb90dc000}, {0xb90de000},
- {0xb90e0000}, {0xb90e2000}, {0xb90e4000}, {0xb90e6000},
- {0xb90e8000}, {0xb90ea000}, {0xb90ec000}, {0xb90ee000},
- {0xb90f0000}, {0xb90f2000}, {0xb90f4000}, {0xb90f6000},
- {0xb90f8000}, {0xb90fa000}, {0xb90fc000}, {0xb90fe000},
- {0xb9100000}, {0xb9102000}, {0xb9104000}, {0xb9106000},
- {0xb9108000}, {0xb910a000}, {0xb910c000}, {0xb910e000},
- {0xb9110000}, {0xb9112000}, {0xb9114000}, {0xb9116000},
- {0xb9118000}, {0xb911a000}, {0xb911c000}, {0xb911e000},
- {0xb9120000}, {0xb9122000}, {0xb9124000}, {0xb9126000},
- {0xb9128000}, {0xb912a000}, {0xb912c000}, {0xb912e000},
- {0xb9130000}, {0xb9132000}, {0xb9134000}, {0xb9136000},
- {0xb9138000}, {0xb913a000}, {0xb913c000}, {0xb913e000},
- {0xb9140000}, {0xb9142000}, {0xb9144000}, {0xb9146000},
- {0xb9148000}, {0xb914a000}, {0xb914c000}, {0xb914e000},
- {0xb9150000}, {0xb9152000}, {0xb9154000}, {0xb9156000},
- {0xb9158000}, {0xb915a000}, {0xb915c000}, {0xb915e000},
- {0xb9160000}, {0xb9162000}, {0xb9164000}, {0xb9166000},
- {0xb9168000}, {0xb916a000}, {0xb916c000}, {0xb916e000},
- {0xb9170000}, {0xb9172000}, {0xb9174000}, {0xb9176000},
- {0xb9178000}, {0xb917a000}, {0xb917c000}, {0xb917e000},
- {0xb9180000}, {0xb9182000}, {0xb9184000}, {0xb9186000},
- {0xb9188000}, {0xb918a000}, {0xb918c000}, {0xb918e000},
- {0xb9190000}, {0xb9192000}, {0xb9194000}, {0xb9196000},
- {0xb9198000}, {0xb919a000}, {0xb919c000}, {0xb919e000},
- {0xb91a0000}, {0xb91a2000}, {0xb91a4000}, {0xb91a6000},
- {0xb91a8000}, {0xb91aa000}, {0xb91ac000}, {0xb91ae000},
- {0xb91b0000}, {0xb91b2000}, {0xb91b4000}, {0xb91b6000},
- {0xb91b8000}, {0xb91ba000}, {0xb91bc000}, {0xb91be000},
- {0xb91c0000}, {0xb91c2000}, {0xb91c4000}, {0xb91c6000},
- {0xb91c8000}, {0xb91ca000}, {0xb91cc000}, {0xb91ce000},
- {0xb91d0000}, {0xb91d2000}, {0xb91d4000}, {0xb91d6000},
- {0xb91d8000}, {0xb91da000}, {0xb91dc000}, {0xb91de000},
- {0xb91e0000}, {0xb91e2000}, {0xb91e4000}, {0xb91e6000},
- {0xb91e8000}, {0xb91ea000}, {0xb91ec000}, {0xb91ee000},
- {0xb91f0000}, {0xb91f2000}, {0xb91f4000}, {0xb91f6000},
- {0xb91f8000}, {0xb91fa000}, {0xb91fc000}, {0xb91fe000},
- {0xb9200000}, {0xb9202000}, {0xb9204000}, {0xb9206000},
- {0xb9208000}, {0xb920a000}, {0xb920c000}, {0xb920e000},
- {0xb9210000}, {0xb9212000}, {0xb9214000}, {0xb9216000},
- {0xb9218000}, {0xb921a000}, {0xb921c000}, {0xb921e000},
- {0xb9220000}, {0xb9222000}, {0xb9224000}, {0xb9226000},
- {0xb9228000}, {0xb922a000}, {0xb922c000}, {0xb922e000},
- {0xb9230000}, {0xb9232000}, {0xb9234000}, {0xb9236000},
- {0xb9238000}, {0xb923a000}, {0xb923c000}, {0xb923e000},
- {0xb9240000}, {0xb9242000}, {0xb9244000}, {0xb9246000},
- {0xb9248000}, {0xb924a000}, {0xb924c000}, {0xb924e000},
- {0xb9250000}, {0xb9252000}, {0xb9254000}, {0xb9256000},
- {0xb9258000}, {0xb925a000}, {0xb925c000}, {0xb925e000},
- {0xb9260000}, {0xb9262000}, {0xb9264000}, {0xb9266000},
- {0xb9268000}, {0xb926a000}, {0xb926c000}, {0xb926e000},
- {0xb9270000}, {0xb9272000}, {0xb9274000}, {0xb9276000},
- {0xb9278000}, {0xb927a000}, {0xb927c000}, {0xb927e000},
- {0xb9280000}, {0xb9282000}, {0xb9284000}, {0xb9286000},
- {0xb9288000}, {0xb928a000}, {0xb928c000}, {0xb928e000},
- {0xb9290000}, {0xb9292000}, {0xb9294000}, {0xb9296000},
- {0xb9298000}, {0xb929a000}, {0xb929c000}, {0xb929e000},
- {0xb92a0000}, {0xb92a2000}, {0xb92a4000}, {0xb92a6000},
- {0xb92a8000}, {0xb92aa000}, {0xb92ac000}, {0xb92ae000},
- {0xb92b0000}, {0xb92b2000}, {0xb92b4000}, {0xb92b6000},
- {0xb92b8000}, {0xb92ba000}, {0xb92bc000}, {0xb92be000},
- {0xb92c0000}, {0xb92c2000}, {0xb92c4000}, {0xb92c6000},
- {0xb92c8000}, {0xb92ca000}, {0xb92cc000}, {0xb92ce000},
- {0xb92d0000}, {0xb92d2000}, {0xb92d4000}, {0xb92d6000},
- {0xb92d8000}, {0xb92da000}, {0xb92dc000}, {0xb92de000},
- {0xb92e0000}, {0xb92e2000}, {0xb92e4000}, {0xb92e6000},
- {0xb92e8000}, {0xb92ea000}, {0xb92ec000}, {0xb92ee000},
- {0xb92f0000}, {0xb92f2000}, {0xb92f4000}, {0xb92f6000},
- {0xb92f8000}, {0xb92fa000}, {0xb92fc000}, {0xb92fe000},
- {0xb9300000}, {0xb9302000}, {0xb9304000}, {0xb9306000},
- {0xb9308000}, {0xb930a000}, {0xb930c000}, {0xb930e000},
- {0xb9310000}, {0xb9312000}, {0xb9314000}, {0xb9316000},
- {0xb9318000}, {0xb931a000}, {0xb931c000}, {0xb931e000},
- {0xb9320000}, {0xb9322000}, {0xb9324000}, {0xb9326000},
- {0xb9328000}, {0xb932a000}, {0xb932c000}, {0xb932e000},
- {0xb9330000}, {0xb9332000}, {0xb9334000}, {0xb9336000},
- {0xb9338000}, {0xb933a000}, {0xb933c000}, {0xb933e000},
- {0xb9340000}, {0xb9342000}, {0xb9344000}, {0xb9346000},
- {0xb9348000}, {0xb934a000}, {0xb934c000}, {0xb934e000},
- {0xb9350000}, {0xb9352000}, {0xb9354000}, {0xb9356000},
- {0xb9358000}, {0xb935a000}, {0xb935c000}, {0xb935e000},
- {0xb9360000}, {0xb9362000}, {0xb9364000}, {0xb9366000},
- {0xb9368000}, {0xb936a000}, {0xb936c000}, {0xb936e000},
- {0xb9370000}, {0xb9372000}, {0xb9374000}, {0xb9376000},
- {0xb9378000}, {0xb937a000}, {0xb937c000}, {0xb937e000},
- {0xb9380000}, {0xb9382000}, {0xb9384000}, {0xb9386000},
- {0xb9388000}, {0xb938a000}, {0xb938c000}, {0xb938e000},
- {0xb9390000}, {0xb9392000}, {0xb9394000}, {0xb9396000},
- {0xb9398000}, {0xb939a000}, {0xb939c000}, {0xb939e000},
- {0xb93a0000}, {0xb93a2000}, {0xb93a4000}, {0xb93a6000},
- {0xb93a8000}, {0xb93aa000}, {0xb93ac000}, {0xb93ae000},
- {0xb93b0000}, {0xb93b2000}, {0xb93b4000}, {0xb93b6000},
- {0xb93b8000}, {0xb93ba000}, {0xb93bc000}, {0xb93be000},
- {0xb93c0000}, {0xb93c2000}, {0xb93c4000}, {0xb93c6000},
- {0xb93c8000}, {0xb93ca000}, {0xb93cc000}, {0xb93ce000},
- {0xb93d0000}, {0xb93d2000}, {0xb93d4000}, {0xb93d6000},
- {0xb93d8000}, {0xb93da000}, {0xb93dc000}, {0xb93de000},
- {0xb93e0000}, {0xb93e2000}, {0xb93e4000}, {0xb93e6000},
- {0xb93e8000}, {0xb93ea000}, {0xb93ec000}, {0xb93ee000},
- {0xb93f0000}, {0xb93f2000}, {0xb93f4000}, {0xb93f6000},
- {0xb93f8000}, {0xb93fa000}, {0xb93fc000}, {0xb93fe000},
- {0xb9400000}, {0xb9402000}, {0xb9404000}, {0xb9406000},
- {0xb9408000}, {0xb940a000}, {0xb940c000}, {0xb940e000},
- {0xb9410000}, {0xb9412000}, {0xb9414000}, {0xb9416000},
- {0xb9418000}, {0xb941a000}, {0xb941c000}, {0xb941e000},
- {0xb9420000}, {0xb9422000}, {0xb9424000}, {0xb9426000},
- {0xb9428000}, {0xb942a000}, {0xb942c000}, {0xb942e000},
- {0xb9430000}, {0xb9432000}, {0xb9434000}, {0xb9436000},
- {0xb9438000}, {0xb943a000}, {0xb943c000}, {0xb943e000},
- {0xb9440000}, {0xb9442000}, {0xb9444000}, {0xb9446000},
- {0xb9448000}, {0xb944a000}, {0xb944c000}, {0xb944e000},
- {0xb9450000}, {0xb9452000}, {0xb9454000}, {0xb9456000},
- {0xb9458000}, {0xb945a000}, {0xb945c000}, {0xb945e000},
- {0xb9460000}, {0xb9462000}, {0xb9464000}, {0xb9466000},
- {0xb9468000}, {0xb946a000}, {0xb946c000}, {0xb946e000},
- {0xb9470000}, {0xb9472000}, {0xb9474000}, {0xb9476000},
- {0xb9478000}, {0xb947a000}, {0xb947c000}, {0xb947e000},
- {0xb9480000}, {0xb9482000}, {0xb9484000}, {0xb9486000},
- {0xb9488000}, {0xb948a000}, {0xb948c000}, {0xb948e000},
- {0xb9490000}, {0xb9492000}, {0xb9494000}, {0xb9496000},
- {0xb9498000}, {0xb949a000}, {0xb949c000}, {0xb949e000},
- {0xb94a0000}, {0xb94a2000}, {0xb94a4000}, {0xb94a6000},
- {0xb94a8000}, {0xb94aa000}, {0xb94ac000}, {0xb94ae000},
- {0xb94b0000}, {0xb94b2000}, {0xb94b4000}, {0xb94b6000},
- {0xb94b8000}, {0xb94ba000}, {0xb94bc000}, {0xb94be000},
- {0xb94c0000}, {0xb94c2000}, {0xb94c4000}, {0xb94c6000},
- {0xb94c8000}, {0xb94ca000}, {0xb94cc000}, {0xb94ce000},
- {0xb94d0000}, {0xb94d2000}, {0xb94d4000}, {0xb94d6000},
- {0xb94d8000}, {0xb94da000}, {0xb94dc000}, {0xb94de000},
- {0xb94e0000}, {0xb94e2000}, {0xb94e4000}, {0xb94e6000},
- {0xb94e8000}, {0xb94ea000}, {0xb94ec000}, {0xb94ee000},
- {0xb94f0000}, {0xb94f2000}, {0xb94f4000}, {0xb94f6000},
- {0xb94f8000}, {0xb94fa000}, {0xb94fc000}, {0xb94fe000},
- {0xb9500000}, {0xb9502000}, {0xb9504000}, {0xb9506000},
- {0xb9508000}, {0xb950a000}, {0xb950c000}, {0xb950e000},
- {0xb9510000}, {0xb9512000}, {0xb9514000}, {0xb9516000},
- {0xb9518000}, {0xb951a000}, {0xb951c000}, {0xb951e000},
- {0xb9520000}, {0xb9522000}, {0xb9524000}, {0xb9526000},
- {0xb9528000}, {0xb952a000}, {0xb952c000}, {0xb952e000},
- {0xb9530000}, {0xb9532000}, {0xb9534000}, {0xb9536000},
- {0xb9538000}, {0xb953a000}, {0xb953c000}, {0xb953e000},
- {0xb9540000}, {0xb9542000}, {0xb9544000}, {0xb9546000},
- {0xb9548000}, {0xb954a000}, {0xb954c000}, {0xb954e000},
- {0xb9550000}, {0xb9552000}, {0xb9554000}, {0xb9556000},
- {0xb9558000}, {0xb955a000}, {0xb955c000}, {0xb955e000},
- {0xb9560000}, {0xb9562000}, {0xb9564000}, {0xb9566000},
- {0xb9568000}, {0xb956a000}, {0xb956c000}, {0xb956e000},
- {0xb9570000}, {0xb9572000}, {0xb9574000}, {0xb9576000},
- {0xb9578000}, {0xb957a000}, {0xb957c000}, {0xb957e000},
- {0xb9580000}, {0xb9582000}, {0xb9584000}, {0xb9586000},
- {0xb9588000}, {0xb958a000}, {0xb958c000}, {0xb958e000},
- {0xb9590000}, {0xb9592000}, {0xb9594000}, {0xb9596000},
- {0xb9598000}, {0xb959a000}, {0xb959c000}, {0xb959e000},
- {0xb95a0000}, {0xb95a2000}, {0xb95a4000}, {0xb95a6000},
- {0xb95a8000}, {0xb95aa000}, {0xb95ac000}, {0xb95ae000},
- {0xb95b0000}, {0xb95b2000}, {0xb95b4000}, {0xb95b6000},
- {0xb95b8000}, {0xb95ba000}, {0xb95bc000}, {0xb95be000},
- {0xb95c0000}, {0xb95c2000}, {0xb95c4000}, {0xb95c6000},
- {0xb95c8000}, {0xb95ca000}, {0xb95cc000}, {0xb95ce000},
- {0xb95d0000}, {0xb95d2000}, {0xb95d4000}, {0xb95d6000},
- {0xb95d8000}, {0xb95da000}, {0xb95dc000}, {0xb95de000},
- {0xb95e0000}, {0xb95e2000}, {0xb95e4000}, {0xb95e6000},
- {0xb95e8000}, {0xb95ea000}, {0xb95ec000}, {0xb95ee000},
- {0xb95f0000}, {0xb95f2000}, {0xb95f4000}, {0xb95f6000},
- {0xb95f8000}, {0xb95fa000}, {0xb95fc000}, {0xb95fe000},
- {0xb9600000}, {0xb9602000}, {0xb9604000}, {0xb9606000},
- {0xb9608000}, {0xb960a000}, {0xb960c000}, {0xb960e000},
- {0xb9610000}, {0xb9612000}, {0xb9614000}, {0xb9616000},
- {0xb9618000}, {0xb961a000}, {0xb961c000}, {0xb961e000},
- {0xb9620000}, {0xb9622000}, {0xb9624000}, {0xb9626000},
- {0xb9628000}, {0xb962a000}, {0xb962c000}, {0xb962e000},
- {0xb9630000}, {0xb9632000}, {0xb9634000}, {0xb9636000},
- {0xb9638000}, {0xb963a000}, {0xb963c000}, {0xb963e000},
- {0xb9640000}, {0xb9642000}, {0xb9644000}, {0xb9646000},
- {0xb9648000}, {0xb964a000}, {0xb964c000}, {0xb964e000},
- {0xb9650000}, {0xb9652000}, {0xb9654000}, {0xb9656000},
- {0xb9658000}, {0xb965a000}, {0xb965c000}, {0xb965e000},
- {0xb9660000}, {0xb9662000}, {0xb9664000}, {0xb9666000},
- {0xb9668000}, {0xb966a000}, {0xb966c000}, {0xb966e000},
- {0xb9670000}, {0xb9672000}, {0xb9674000}, {0xb9676000},
- {0xb9678000}, {0xb967a000}, {0xb967c000}, {0xb967e000},
- {0xb9680000}, {0xb9682000}, {0xb9684000}, {0xb9686000},
- {0xb9688000}, {0xb968a000}, {0xb968c000}, {0xb968e000},
- {0xb9690000}, {0xb9692000}, {0xb9694000}, {0xb9696000},
- {0xb9698000}, {0xb969a000}, {0xb969c000}, {0xb969e000},
- {0xb96a0000}, {0xb96a2000}, {0xb96a4000}, {0xb96a6000},
- {0xb96a8000}, {0xb96aa000}, {0xb96ac000}, {0xb96ae000},
- {0xb96b0000}, {0xb96b2000}, {0xb96b4000}, {0xb96b6000},
- {0xb96b8000}, {0xb96ba000}, {0xb96bc000}, {0xb96be000},
- {0xb96c0000}, {0xb96c2000}, {0xb96c4000}, {0xb96c6000},
- {0xb96c8000}, {0xb96ca000}, {0xb96cc000}, {0xb96ce000},
- {0xb96d0000}, {0xb96d2000}, {0xb96d4000}, {0xb96d6000},
- {0xb96d8000}, {0xb96da000}, {0xb96dc000}, {0xb96de000},
- {0xb96e0000}, {0xb96e2000}, {0xb96e4000}, {0xb96e6000},
- {0xb96e8000}, {0xb96ea000}, {0xb96ec000}, {0xb96ee000},
- {0xb96f0000}, {0xb96f2000}, {0xb96f4000}, {0xb96f6000},
- {0xb96f8000}, {0xb96fa000}, {0xb96fc000}, {0xb96fe000},
- {0xb9700000}, {0xb9702000}, {0xb9704000}, {0xb9706000},
- {0xb9708000}, {0xb970a000}, {0xb970c000}, {0xb970e000},
- {0xb9710000}, {0xb9712000}, {0xb9714000}, {0xb9716000},
- {0xb9718000}, {0xb971a000}, {0xb971c000}, {0xb971e000},
- {0xb9720000}, {0xb9722000}, {0xb9724000}, {0xb9726000},
- {0xb9728000}, {0xb972a000}, {0xb972c000}, {0xb972e000},
- {0xb9730000}, {0xb9732000}, {0xb9734000}, {0xb9736000},
- {0xb9738000}, {0xb973a000}, {0xb973c000}, {0xb973e000},
- {0xb9740000}, {0xb9742000}, {0xb9744000}, {0xb9746000},
- {0xb9748000}, {0xb974a000}, {0xb974c000}, {0xb974e000},
- {0xb9750000}, {0xb9752000}, {0xb9754000}, {0xb9756000},
- {0xb9758000}, {0xb975a000}, {0xb975c000}, {0xb975e000},
- {0xb9760000}, {0xb9762000}, {0xb9764000}, {0xb9766000},
- {0xb9768000}, {0xb976a000}, {0xb976c000}, {0xb976e000},
- {0xb9770000}, {0xb9772000}, {0xb9774000}, {0xb9776000},
- {0xb9778000}, {0xb977a000}, {0xb977c000}, {0xb977e000},
- {0xb9780000}, {0xb9782000}, {0xb9784000}, {0xb9786000},
- {0xb9788000}, {0xb978a000}, {0xb978c000}, {0xb978e000},
- {0xb9790000}, {0xb9792000}, {0xb9794000}, {0xb9796000},
- {0xb9798000}, {0xb979a000}, {0xb979c000}, {0xb979e000},
- {0xb97a0000}, {0xb97a2000}, {0xb97a4000}, {0xb97a6000},
- {0xb97a8000}, {0xb97aa000}, {0xb97ac000}, {0xb97ae000},
- {0xb97b0000}, {0xb97b2000}, {0xb97b4000}, {0xb97b6000},
- {0xb97b8000}, {0xb97ba000}, {0xb97bc000}, {0xb97be000},
- {0xb97c0000}, {0xb97c2000}, {0xb97c4000}, {0xb97c6000},
- {0xb97c8000}, {0xb97ca000}, {0xb97cc000}, {0xb97ce000},
- {0xb97d0000}, {0xb97d2000}, {0xb97d4000}, {0xb97d6000},
- {0xb97d8000}, {0xb97da000}, {0xb97dc000}, {0xb97de000},
- {0xb97e0000}, {0xb97e2000}, {0xb97e4000}, {0xb97e6000},
- {0xb97e8000}, {0xb97ea000}, {0xb97ec000}, {0xb97ee000},
- {0xb97f0000}, {0xb97f2000}, {0xb97f4000}, {0xb97f6000},
- {0xb97f8000}, {0xb97fa000}, {0xb97fc000}, {0xb97fe000},
- {0xb9800000}, {0xb9802000}, {0xb9804000}, {0xb9806000},
- {0xb9808000}, {0xb980a000}, {0xb980c000}, {0xb980e000},
- {0xb9810000}, {0xb9812000}, {0xb9814000}, {0xb9816000},
- {0xb9818000}, {0xb981a000}, {0xb981c000}, {0xb981e000},
- {0xb9820000}, {0xb9822000}, {0xb9824000}, {0xb9826000},
- {0xb9828000}, {0xb982a000}, {0xb982c000}, {0xb982e000},
- {0xb9830000}, {0xb9832000}, {0xb9834000}, {0xb9836000},
- {0xb9838000}, {0xb983a000}, {0xb983c000}, {0xb983e000},
- {0xb9840000}, {0xb9842000}, {0xb9844000}, {0xb9846000},
- {0xb9848000}, {0xb984a000}, {0xb984c000}, {0xb984e000},
- {0xb9850000}, {0xb9852000}, {0xb9854000}, {0xb9856000},
- {0xb9858000}, {0xb985a000}, {0xb985c000}, {0xb985e000},
- {0xb9860000}, {0xb9862000}, {0xb9864000}, {0xb9866000},
- {0xb9868000}, {0xb986a000}, {0xb986c000}, {0xb986e000},
- {0xb9870000}, {0xb9872000}, {0xb9874000}, {0xb9876000},
- {0xb9878000}, {0xb987a000}, {0xb987c000}, {0xb987e000},
- {0xb9880000}, {0xb9882000}, {0xb9884000}, {0xb9886000},
- {0xb9888000}, {0xb988a000}, {0xb988c000}, {0xb988e000},
- {0xb9890000}, {0xb9892000}, {0xb9894000}, {0xb9896000},
- {0xb9898000}, {0xb989a000}, {0xb989c000}, {0xb989e000},
- {0xb98a0000}, {0xb98a2000}, {0xb98a4000}, {0xb98a6000},
- {0xb98a8000}, {0xb98aa000}, {0xb98ac000}, {0xb98ae000},
- {0xb98b0000}, {0xb98b2000}, {0xb98b4000}, {0xb98b6000},
- {0xb98b8000}, {0xb98ba000}, {0xb98bc000}, {0xb98be000},
- {0xb98c0000}, {0xb98c2000}, {0xb98c4000}, {0xb98c6000},
- {0xb98c8000}, {0xb98ca000}, {0xb98cc000}, {0xb98ce000},
- {0xb98d0000}, {0xb98d2000}, {0xb98d4000}, {0xb98d6000},
- {0xb98d8000}, {0xb98da000}, {0xb98dc000}, {0xb98de000},
- {0xb98e0000}, {0xb98e2000}, {0xb98e4000}, {0xb98e6000},
- {0xb98e8000}, {0xb98ea000}, {0xb98ec000}, {0xb98ee000},
- {0xb98f0000}, {0xb98f2000}, {0xb98f4000}, {0xb98f6000},
- {0xb98f8000}, {0xb98fa000}, {0xb98fc000}, {0xb98fe000},
- {0xb9900000}, {0xb9902000}, {0xb9904000}, {0xb9906000},
- {0xb9908000}, {0xb990a000}, {0xb990c000}, {0xb990e000},
- {0xb9910000}, {0xb9912000}, {0xb9914000}, {0xb9916000},
- {0xb9918000}, {0xb991a000}, {0xb991c000}, {0xb991e000},
- {0xb9920000}, {0xb9922000}, {0xb9924000}, {0xb9926000},
- {0xb9928000}, {0xb992a000}, {0xb992c000}, {0xb992e000},
- {0xb9930000}, {0xb9932000}, {0xb9934000}, {0xb9936000},
- {0xb9938000}, {0xb993a000}, {0xb993c000}, {0xb993e000},
- {0xb9940000}, {0xb9942000}, {0xb9944000}, {0xb9946000},
- {0xb9948000}, {0xb994a000}, {0xb994c000}, {0xb994e000},
- {0xb9950000}, {0xb9952000}, {0xb9954000}, {0xb9956000},
- {0xb9958000}, {0xb995a000}, {0xb995c000}, {0xb995e000},
- {0xb9960000}, {0xb9962000}, {0xb9964000}, {0xb9966000},
- {0xb9968000}, {0xb996a000}, {0xb996c000}, {0xb996e000},
- {0xb9970000}, {0xb9972000}, {0xb9974000}, {0xb9976000},
- {0xb9978000}, {0xb997a000}, {0xb997c000}, {0xb997e000},
- {0xb9980000}, {0xb9982000}, {0xb9984000}, {0xb9986000},
- {0xb9988000}, {0xb998a000}, {0xb998c000}, {0xb998e000},
- {0xb9990000}, {0xb9992000}, {0xb9994000}, {0xb9996000},
- {0xb9998000}, {0xb999a000}, {0xb999c000}, {0xb999e000},
- {0xb99a0000}, {0xb99a2000}, {0xb99a4000}, {0xb99a6000},
- {0xb99a8000}, {0xb99aa000}, {0xb99ac000}, {0xb99ae000},
- {0xb99b0000}, {0xb99b2000}, {0xb99b4000}, {0xb99b6000},
- {0xb99b8000}, {0xb99ba000}, {0xb99bc000}, {0xb99be000},
- {0xb99c0000}, {0xb99c2000}, {0xb99c4000}, {0xb99c6000},
- {0xb99c8000}, {0xb99ca000}, {0xb99cc000}, {0xb99ce000},
- {0xb99d0000}, {0xb99d2000}, {0xb99d4000}, {0xb99d6000},
- {0xb99d8000}, {0xb99da000}, {0xb99dc000}, {0xb99de000},
- {0xb99e0000}, {0xb99e2000}, {0xb99e4000}, {0xb99e6000},
- {0xb99e8000}, {0xb99ea000}, {0xb99ec000}, {0xb99ee000},
- {0xb99f0000}, {0xb99f2000}, {0xb99f4000}, {0xb99f6000},
- {0xb99f8000}, {0xb99fa000}, {0xb99fc000}, {0xb99fe000},
- {0xb9a00000}, {0xb9a02000}, {0xb9a04000}, {0xb9a06000},
- {0xb9a08000}, {0xb9a0a000}, {0xb9a0c000}, {0xb9a0e000},
- {0xb9a10000}, {0xb9a12000}, {0xb9a14000}, {0xb9a16000},
- {0xb9a18000}, {0xb9a1a000}, {0xb9a1c000}, {0xb9a1e000},
- {0xb9a20000}, {0xb9a22000}, {0xb9a24000}, {0xb9a26000},
- {0xb9a28000}, {0xb9a2a000}, {0xb9a2c000}, {0xb9a2e000},
- {0xb9a30000}, {0xb9a32000}, {0xb9a34000}, {0xb9a36000},
- {0xb9a38000}, {0xb9a3a000}, {0xb9a3c000}, {0xb9a3e000},
- {0xb9a40000}, {0xb9a42000}, {0xb9a44000}, {0xb9a46000},
- {0xb9a48000}, {0xb9a4a000}, {0xb9a4c000}, {0xb9a4e000},
- {0xb9a50000}, {0xb9a52000}, {0xb9a54000}, {0xb9a56000},
- {0xb9a58000}, {0xb9a5a000}, {0xb9a5c000}, {0xb9a5e000},
- {0xb9a60000}, {0xb9a62000}, {0xb9a64000}, {0xb9a66000},
- {0xb9a68000}, {0xb9a6a000}, {0xb9a6c000}, {0xb9a6e000},
- {0xb9a70000}, {0xb9a72000}, {0xb9a74000}, {0xb9a76000},
- {0xb9a78000}, {0xb9a7a000}, {0xb9a7c000}, {0xb9a7e000},
- {0xb9a80000}, {0xb9a82000}, {0xb9a84000}, {0xb9a86000},
- {0xb9a88000}, {0xb9a8a000}, {0xb9a8c000}, {0xb9a8e000},
- {0xb9a90000}, {0xb9a92000}, {0xb9a94000}, {0xb9a96000},
- {0xb9a98000}, {0xb9a9a000}, {0xb9a9c000}, {0xb9a9e000},
- {0xb9aa0000}, {0xb9aa2000}, {0xb9aa4000}, {0xb9aa6000},
- {0xb9aa8000}, {0xb9aaa000}, {0xb9aac000}, {0xb9aae000},
- {0xb9ab0000}, {0xb9ab2000}, {0xb9ab4000}, {0xb9ab6000},
- {0xb9ab8000}, {0xb9aba000}, {0xb9abc000}, {0xb9abe000},
- {0xb9ac0000}, {0xb9ac2000}, {0xb9ac4000}, {0xb9ac6000},
- {0xb9ac8000}, {0xb9aca000}, {0xb9acc000}, {0xb9ace000},
- {0xb9ad0000}, {0xb9ad2000}, {0xb9ad4000}, {0xb9ad6000},
- {0xb9ad8000}, {0xb9ada000}, {0xb9adc000}, {0xb9ade000},
- {0xb9ae0000}, {0xb9ae2000}, {0xb9ae4000}, {0xb9ae6000},
- {0xb9ae8000}, {0xb9aea000}, {0xb9aec000}, {0xb9aee000},
- {0xb9af0000}, {0xb9af2000}, {0xb9af4000}, {0xb9af6000},
- {0xb9af8000}, {0xb9afa000}, {0xb9afc000}, {0xb9afe000},
- {0xb9b00000}, {0xb9b02000}, {0xb9b04000}, {0xb9b06000},
- {0xb9b08000}, {0xb9b0a000}, {0xb9b0c000}, {0xb9b0e000},
- {0xb9b10000}, {0xb9b12000}, {0xb9b14000}, {0xb9b16000},
- {0xb9b18000}, {0xb9b1a000}, {0xb9b1c000}, {0xb9b1e000},
- {0xb9b20000}, {0xb9b22000}, {0xb9b24000}, {0xb9b26000},
- {0xb9b28000}, {0xb9b2a000}, {0xb9b2c000}, {0xb9b2e000},
- {0xb9b30000}, {0xb9b32000}, {0xb9b34000}, {0xb9b36000},
- {0xb9b38000}, {0xb9b3a000}, {0xb9b3c000}, {0xb9b3e000},
- {0xb9b40000}, {0xb9b42000}, {0xb9b44000}, {0xb9b46000},
- {0xb9b48000}, {0xb9b4a000}, {0xb9b4c000}, {0xb9b4e000},
- {0xb9b50000}, {0xb9b52000}, {0xb9b54000}, {0xb9b56000},
- {0xb9b58000}, {0xb9b5a000}, {0xb9b5c000}, {0xb9b5e000},
- {0xb9b60000}, {0xb9b62000}, {0xb9b64000}, {0xb9b66000},
- {0xb9b68000}, {0xb9b6a000}, {0xb9b6c000}, {0xb9b6e000},
- {0xb9b70000}, {0xb9b72000}, {0xb9b74000}, {0xb9b76000},
- {0xb9b78000}, {0xb9b7a000}, {0xb9b7c000}, {0xb9b7e000},
- {0xb9b80000}, {0xb9b82000}, {0xb9b84000}, {0xb9b86000},
- {0xb9b88000}, {0xb9b8a000}, {0xb9b8c000}, {0xb9b8e000},
- {0xb9b90000}, {0xb9b92000}, {0xb9b94000}, {0xb9b96000},
- {0xb9b98000}, {0xb9b9a000}, {0xb9b9c000}, {0xb9b9e000},
- {0xb9ba0000}, {0xb9ba2000}, {0xb9ba4000}, {0xb9ba6000},
- {0xb9ba8000}, {0xb9baa000}, {0xb9bac000}, {0xb9bae000},
- {0xb9bb0000}, {0xb9bb2000}, {0xb9bb4000}, {0xb9bb6000},
- {0xb9bb8000}, {0xb9bba000}, {0xb9bbc000}, {0xb9bbe000},
- {0xb9bc0000}, {0xb9bc2000}, {0xb9bc4000}, {0xb9bc6000},
- {0xb9bc8000}, {0xb9bca000}, {0xb9bcc000}, {0xb9bce000},
- {0xb9bd0000}, {0xb9bd2000}, {0xb9bd4000}, {0xb9bd6000},
- {0xb9bd8000}, {0xb9bda000}, {0xb9bdc000}, {0xb9bde000},
- {0xb9be0000}, {0xb9be2000}, {0xb9be4000}, {0xb9be6000},
- {0xb9be8000}, {0xb9bea000}, {0xb9bec000}, {0xb9bee000},
- {0xb9bf0000}, {0xb9bf2000}, {0xb9bf4000}, {0xb9bf6000},
- {0xb9bf8000}, {0xb9bfa000}, {0xb9bfc000}, {0xb9bfe000},
- {0xb9c00000}, {0xb9c02000}, {0xb9c04000}, {0xb9c06000},
- {0xb9c08000}, {0xb9c0a000}, {0xb9c0c000}, {0xb9c0e000},
- {0xb9c10000}, {0xb9c12000}, {0xb9c14000}, {0xb9c16000},
- {0xb9c18000}, {0xb9c1a000}, {0xb9c1c000}, {0xb9c1e000},
- {0xb9c20000}, {0xb9c22000}, {0xb9c24000}, {0xb9c26000},
- {0xb9c28000}, {0xb9c2a000}, {0xb9c2c000}, {0xb9c2e000},
- {0xb9c30000}, {0xb9c32000}, {0xb9c34000}, {0xb9c36000},
- {0xb9c38000}, {0xb9c3a000}, {0xb9c3c000}, {0xb9c3e000},
- {0xb9c40000}, {0xb9c42000}, {0xb9c44000}, {0xb9c46000},
- {0xb9c48000}, {0xb9c4a000}, {0xb9c4c000}, {0xb9c4e000},
- {0xb9c50000}, {0xb9c52000}, {0xb9c54000}, {0xb9c56000},
- {0xb9c58000}, {0xb9c5a000}, {0xb9c5c000}, {0xb9c5e000},
- {0xb9c60000}, {0xb9c62000}, {0xb9c64000}, {0xb9c66000},
- {0xb9c68000}, {0xb9c6a000}, {0xb9c6c000}, {0xb9c6e000},
- {0xb9c70000}, {0xb9c72000}, {0xb9c74000}, {0xb9c76000},
- {0xb9c78000}, {0xb9c7a000}, {0xb9c7c000}, {0xb9c7e000},
- {0xb9c80000}, {0xb9c82000}, {0xb9c84000}, {0xb9c86000},
- {0xb9c88000}, {0xb9c8a000}, {0xb9c8c000}, {0xb9c8e000},
- {0xb9c90000}, {0xb9c92000}, {0xb9c94000}, {0xb9c96000},
- {0xb9c98000}, {0xb9c9a000}, {0xb9c9c000}, {0xb9c9e000},
- {0xb9ca0000}, {0xb9ca2000}, {0xb9ca4000}, {0xb9ca6000},
- {0xb9ca8000}, {0xb9caa000}, {0xb9cac000}, {0xb9cae000},
- {0xb9cb0000}, {0xb9cb2000}, {0xb9cb4000}, {0xb9cb6000},
- {0xb9cb8000}, {0xb9cba000}, {0xb9cbc000}, {0xb9cbe000},
- {0xb9cc0000}, {0xb9cc2000}, {0xb9cc4000}, {0xb9cc6000},
- {0xb9cc8000}, {0xb9cca000}, {0xb9ccc000}, {0xb9cce000},
- {0xb9cd0000}, {0xb9cd2000}, {0xb9cd4000}, {0xb9cd6000},
- {0xb9cd8000}, {0xb9cda000}, {0xb9cdc000}, {0xb9cde000},
- {0xb9ce0000}, {0xb9ce2000}, {0xb9ce4000}, {0xb9ce6000},
- {0xb9ce8000}, {0xb9cea000}, {0xb9cec000}, {0xb9cee000},
- {0xb9cf0000}, {0xb9cf2000}, {0xb9cf4000}, {0xb9cf6000},
- {0xb9cf8000}, {0xb9cfa000}, {0xb9cfc000}, {0xb9cfe000},
- {0xb9d00000}, {0xb9d02000}, {0xb9d04000}, {0xb9d06000},
- {0xb9d08000}, {0xb9d0a000}, {0xb9d0c000}, {0xb9d0e000},
- {0xb9d10000}, {0xb9d12000}, {0xb9d14000}, {0xb9d16000},
- {0xb9d18000}, {0xb9d1a000}, {0xb9d1c000}, {0xb9d1e000},
- {0xb9d20000}, {0xb9d22000}, {0xb9d24000}, {0xb9d26000},
- {0xb9d28000}, {0xb9d2a000}, {0xb9d2c000}, {0xb9d2e000},
- {0xb9d30000}, {0xb9d32000}, {0xb9d34000}, {0xb9d36000},
- {0xb9d38000}, {0xb9d3a000}, {0xb9d3c000}, {0xb9d3e000},
- {0xb9d40000}, {0xb9d42000}, {0xb9d44000}, {0xb9d46000},
- {0xb9d48000}, {0xb9d4a000}, {0xb9d4c000}, {0xb9d4e000},
- {0xb9d50000}, {0xb9d52000}, {0xb9d54000}, {0xb9d56000},
- {0xb9d58000}, {0xb9d5a000}, {0xb9d5c000}, {0xb9d5e000},
- {0xb9d60000}, {0xb9d62000}, {0xb9d64000}, {0xb9d66000},
- {0xb9d68000}, {0xb9d6a000}, {0xb9d6c000}, {0xb9d6e000},
- {0xb9d70000}, {0xb9d72000}, {0xb9d74000}, {0xb9d76000},
- {0xb9d78000}, {0xb9d7a000}, {0xb9d7c000}, {0xb9d7e000},
- {0xb9d80000}, {0xb9d82000}, {0xb9d84000}, {0xb9d86000},
- {0xb9d88000}, {0xb9d8a000}, {0xb9d8c000}, {0xb9d8e000},
- {0xb9d90000}, {0xb9d92000}, {0xb9d94000}, {0xb9d96000},
- {0xb9d98000}, {0xb9d9a000}, {0xb9d9c000}, {0xb9d9e000},
- {0xb9da0000}, {0xb9da2000}, {0xb9da4000}, {0xb9da6000},
- {0xb9da8000}, {0xb9daa000}, {0xb9dac000}, {0xb9dae000},
- {0xb9db0000}, {0xb9db2000}, {0xb9db4000}, {0xb9db6000},
- {0xb9db8000}, {0xb9dba000}, {0xb9dbc000}, {0xb9dbe000},
- {0xb9dc0000}, {0xb9dc2000}, {0xb9dc4000}, {0xb9dc6000},
- {0xb9dc8000}, {0xb9dca000}, {0xb9dcc000}, {0xb9dce000},
- {0xb9dd0000}, {0xb9dd2000}, {0xb9dd4000}, {0xb9dd6000},
- {0xb9dd8000}, {0xb9dda000}, {0xb9ddc000}, {0xb9dde000},
- {0xb9de0000}, {0xb9de2000}, {0xb9de4000}, {0xb9de6000},
- {0xb9de8000}, {0xb9dea000}, {0xb9dec000}, {0xb9dee000},
- {0xb9df0000}, {0xb9df2000}, {0xb9df4000}, {0xb9df6000},
- {0xb9df8000}, {0xb9dfa000}, {0xb9dfc000}, {0xb9dfe000},
- {0xb9e00000}, {0xb9e02000}, {0xb9e04000}, {0xb9e06000},
- {0xb9e08000}, {0xb9e0a000}, {0xb9e0c000}, {0xb9e0e000},
- {0xb9e10000}, {0xb9e12000}, {0xb9e14000}, {0xb9e16000},
- {0xb9e18000}, {0xb9e1a000}, {0xb9e1c000}, {0xb9e1e000},
- {0xb9e20000}, {0xb9e22000}, {0xb9e24000}, {0xb9e26000},
- {0xb9e28000}, {0xb9e2a000}, {0xb9e2c000}, {0xb9e2e000},
- {0xb9e30000}, {0xb9e32000}, {0xb9e34000}, {0xb9e36000},
- {0xb9e38000}, {0xb9e3a000}, {0xb9e3c000}, {0xb9e3e000},
- {0xb9e40000}, {0xb9e42000}, {0xb9e44000}, {0xb9e46000},
- {0xb9e48000}, {0xb9e4a000}, {0xb9e4c000}, {0xb9e4e000},
- {0xb9e50000}, {0xb9e52000}, {0xb9e54000}, {0xb9e56000},
- {0xb9e58000}, {0xb9e5a000}, {0xb9e5c000}, {0xb9e5e000},
- {0xb9e60000}, {0xb9e62000}, {0xb9e64000}, {0xb9e66000},
- {0xb9e68000}, {0xb9e6a000}, {0xb9e6c000}, {0xb9e6e000},
- {0xb9e70000}, {0xb9e72000}, {0xb9e74000}, {0xb9e76000},
- {0xb9e78000}, {0xb9e7a000}, {0xb9e7c000}, {0xb9e7e000},
- {0xb9e80000}, {0xb9e82000}, {0xb9e84000}, {0xb9e86000},
- {0xb9e88000}, {0xb9e8a000}, {0xb9e8c000}, {0xb9e8e000},
- {0xb9e90000}, {0xb9e92000}, {0xb9e94000}, {0xb9e96000},
- {0xb9e98000}, {0xb9e9a000}, {0xb9e9c000}, {0xb9e9e000},
- {0xb9ea0000}, {0xb9ea2000}, {0xb9ea4000}, {0xb9ea6000},
- {0xb9ea8000}, {0xb9eaa000}, {0xb9eac000}, {0xb9eae000},
- {0xb9eb0000}, {0xb9eb2000}, {0xb9eb4000}, {0xb9eb6000},
- {0xb9eb8000}, {0xb9eba000}, {0xb9ebc000}, {0xb9ebe000},
- {0xb9ec0000}, {0xb9ec2000}, {0xb9ec4000}, {0xb9ec6000},
- {0xb9ec8000}, {0xb9eca000}, {0xb9ecc000}, {0xb9ece000},
- {0xb9ed0000}, {0xb9ed2000}, {0xb9ed4000}, {0xb9ed6000},
- {0xb9ed8000}, {0xb9eda000}, {0xb9edc000}, {0xb9ede000},
- {0xb9ee0000}, {0xb9ee2000}, {0xb9ee4000}, {0xb9ee6000},
- {0xb9ee8000}, {0xb9eea000}, {0xb9eec000}, {0xb9eee000},
- {0xb9ef0000}, {0xb9ef2000}, {0xb9ef4000}, {0xb9ef6000},
- {0xb9ef8000}, {0xb9efa000}, {0xb9efc000}, {0xb9efe000},
- {0xb9f00000}, {0xb9f02000}, {0xb9f04000}, {0xb9f06000},
- {0xb9f08000}, {0xb9f0a000}, {0xb9f0c000}, {0xb9f0e000},
- {0xb9f10000}, {0xb9f12000}, {0xb9f14000}, {0xb9f16000},
- {0xb9f18000}, {0xb9f1a000}, {0xb9f1c000}, {0xb9f1e000},
- {0xb9f20000}, {0xb9f22000}, {0xb9f24000}, {0xb9f26000},
- {0xb9f28000}, {0xb9f2a000}, {0xb9f2c000}, {0xb9f2e000},
- {0xb9f30000}, {0xb9f32000}, {0xb9f34000}, {0xb9f36000},
- {0xb9f38000}, {0xb9f3a000}, {0xb9f3c000}, {0xb9f3e000},
- {0xb9f40000}, {0xb9f42000}, {0xb9f44000}, {0xb9f46000},
- {0xb9f48000}, {0xb9f4a000}, {0xb9f4c000}, {0xb9f4e000},
- {0xb9f50000}, {0xb9f52000}, {0xb9f54000}, {0xb9f56000},
- {0xb9f58000}, {0xb9f5a000}, {0xb9f5c000}, {0xb9f5e000},
- {0xb9f60000}, {0xb9f62000}, {0xb9f64000}, {0xb9f66000},
- {0xb9f68000}, {0xb9f6a000}, {0xb9f6c000}, {0xb9f6e000},
- {0xb9f70000}, {0xb9f72000}, {0xb9f74000}, {0xb9f76000},
- {0xb9f78000}, {0xb9f7a000}, {0xb9f7c000}, {0xb9f7e000},
- {0xb9f80000}, {0xb9f82000}, {0xb9f84000}, {0xb9f86000},
- {0xb9f88000}, {0xb9f8a000}, {0xb9f8c000}, {0xb9f8e000},
- {0xb9f90000}, {0xb9f92000}, {0xb9f94000}, {0xb9f96000},
- {0xb9f98000}, {0xb9f9a000}, {0xb9f9c000}, {0xb9f9e000},
- {0xb9fa0000}, {0xb9fa2000}, {0xb9fa4000}, {0xb9fa6000},
- {0xb9fa8000}, {0xb9faa000}, {0xb9fac000}, {0xb9fae000},
- {0xb9fb0000}, {0xb9fb2000}, {0xb9fb4000}, {0xb9fb6000},
- {0xb9fb8000}, {0xb9fba000}, {0xb9fbc000}, {0xb9fbe000},
- {0xb9fc0000}, {0xb9fc2000}, {0xb9fc4000}, {0xb9fc6000},
- {0xb9fc8000}, {0xb9fca000}, {0xb9fcc000}, {0xb9fce000},
- {0xb9fd0000}, {0xb9fd2000}, {0xb9fd4000}, {0xb9fd6000},
- {0xb9fd8000}, {0xb9fda000}, {0xb9fdc000}, {0xb9fde000},
- {0xb9fe0000}, {0xb9fe2000}, {0xb9fe4000}, {0xb9fe6000},
- {0xb9fe8000}, {0xb9fea000}, {0xb9fec000}, {0xb9fee000},
- {0xb9ff0000}, {0xb9ff2000}, {0xb9ff4000}, {0xb9ff6000},
- {0xb9ff8000}, {0xb9ffa000}, {0xb9ffc000}, {0xb9ffe000},
- {0xba000000}, {0xba002000}, {0xba004000}, {0xba006000},
- {0xba008000}, {0xba00a000}, {0xba00c000}, {0xba00e000},
- {0xba010000}, {0xba012000}, {0xba014000}, {0xba016000},
- {0xba018000}, {0xba01a000}, {0xba01c000}, {0xba01e000},
- {0xba020000}, {0xba022000}, {0xba024000}, {0xba026000},
- {0xba028000}, {0xba02a000}, {0xba02c000}, {0xba02e000},
- {0xba030000}, {0xba032000}, {0xba034000}, {0xba036000},
- {0xba038000}, {0xba03a000}, {0xba03c000}, {0xba03e000},
- {0xba040000}, {0xba042000}, {0xba044000}, {0xba046000},
- {0xba048000}, {0xba04a000}, {0xba04c000}, {0xba04e000},
- {0xba050000}, {0xba052000}, {0xba054000}, {0xba056000},
- {0xba058000}, {0xba05a000}, {0xba05c000}, {0xba05e000},
- {0xba060000}, {0xba062000}, {0xba064000}, {0xba066000},
- {0xba068000}, {0xba06a000}, {0xba06c000}, {0xba06e000},
- {0xba070000}, {0xba072000}, {0xba074000}, {0xba076000},
- {0xba078000}, {0xba07a000}, {0xba07c000}, {0xba07e000},
- {0xba080000}, {0xba082000}, {0xba084000}, {0xba086000},
- {0xba088000}, {0xba08a000}, {0xba08c000}, {0xba08e000},
- {0xba090000}, {0xba092000}, {0xba094000}, {0xba096000},
- {0xba098000}, {0xba09a000}, {0xba09c000}, {0xba09e000},
- {0xba0a0000}, {0xba0a2000}, {0xba0a4000}, {0xba0a6000},
- {0xba0a8000}, {0xba0aa000}, {0xba0ac000}, {0xba0ae000},
- {0xba0b0000}, {0xba0b2000}, {0xba0b4000}, {0xba0b6000},
- {0xba0b8000}, {0xba0ba000}, {0xba0bc000}, {0xba0be000},
- {0xba0c0000}, {0xba0c2000}, {0xba0c4000}, {0xba0c6000},
- {0xba0c8000}, {0xba0ca000}, {0xba0cc000}, {0xba0ce000},
- {0xba0d0000}, {0xba0d2000}, {0xba0d4000}, {0xba0d6000},
- {0xba0d8000}, {0xba0da000}, {0xba0dc000}, {0xba0de000},
- {0xba0e0000}, {0xba0e2000}, {0xba0e4000}, {0xba0e6000},
- {0xba0e8000}, {0xba0ea000}, {0xba0ec000}, {0xba0ee000},
- {0xba0f0000}, {0xba0f2000}, {0xba0f4000}, {0xba0f6000},
- {0xba0f8000}, {0xba0fa000}, {0xba0fc000}, {0xba0fe000},
- {0xba100000}, {0xba102000}, {0xba104000}, {0xba106000},
- {0xba108000}, {0xba10a000}, {0xba10c000}, {0xba10e000},
- {0xba110000}, {0xba112000}, {0xba114000}, {0xba116000},
- {0xba118000}, {0xba11a000}, {0xba11c000}, {0xba11e000},
- {0xba120000}, {0xba122000}, {0xba124000}, {0xba126000},
- {0xba128000}, {0xba12a000}, {0xba12c000}, {0xba12e000},
- {0xba130000}, {0xba132000}, {0xba134000}, {0xba136000},
- {0xba138000}, {0xba13a000}, {0xba13c000}, {0xba13e000},
- {0xba140000}, {0xba142000}, {0xba144000}, {0xba146000},
- {0xba148000}, {0xba14a000}, {0xba14c000}, {0xba14e000},
- {0xba150000}, {0xba152000}, {0xba154000}, {0xba156000},
- {0xba158000}, {0xba15a000}, {0xba15c000}, {0xba15e000},
- {0xba160000}, {0xba162000}, {0xba164000}, {0xba166000},
- {0xba168000}, {0xba16a000}, {0xba16c000}, {0xba16e000},
- {0xba170000}, {0xba172000}, {0xba174000}, {0xba176000},
- {0xba178000}, {0xba17a000}, {0xba17c000}, {0xba17e000},
- {0xba180000}, {0xba182000}, {0xba184000}, {0xba186000},
- {0xba188000}, {0xba18a000}, {0xba18c000}, {0xba18e000},
- {0xba190000}, {0xba192000}, {0xba194000}, {0xba196000},
- {0xba198000}, {0xba19a000}, {0xba19c000}, {0xba19e000},
- {0xba1a0000}, {0xba1a2000}, {0xba1a4000}, {0xba1a6000},
- {0xba1a8000}, {0xba1aa000}, {0xba1ac000}, {0xba1ae000},
- {0xba1b0000}, {0xba1b2000}, {0xba1b4000}, {0xba1b6000},
- {0xba1b8000}, {0xba1ba000}, {0xba1bc000}, {0xba1be000},
- {0xba1c0000}, {0xba1c2000}, {0xba1c4000}, {0xba1c6000},
- {0xba1c8000}, {0xba1ca000}, {0xba1cc000}, {0xba1ce000},
- {0xba1d0000}, {0xba1d2000}, {0xba1d4000}, {0xba1d6000},
- {0xba1d8000}, {0xba1da000}, {0xba1dc000}, {0xba1de000},
- {0xba1e0000}, {0xba1e2000}, {0xba1e4000}, {0xba1e6000},
- {0xba1e8000}, {0xba1ea000}, {0xba1ec000}, {0xba1ee000},
- {0xba1f0000}, {0xba1f2000}, {0xba1f4000}, {0xba1f6000},
- {0xba1f8000}, {0xba1fa000}, {0xba1fc000}, {0xba1fe000},
- {0xba200000}, {0xba202000}, {0xba204000}, {0xba206000},
- {0xba208000}, {0xba20a000}, {0xba20c000}, {0xba20e000},
- {0xba210000}, {0xba212000}, {0xba214000}, {0xba216000},
- {0xba218000}, {0xba21a000}, {0xba21c000}, {0xba21e000},
- {0xba220000}, {0xba222000}, {0xba224000}, {0xba226000},
- {0xba228000}, {0xba22a000}, {0xba22c000}, {0xba22e000},
- {0xba230000}, {0xba232000}, {0xba234000}, {0xba236000},
- {0xba238000}, {0xba23a000}, {0xba23c000}, {0xba23e000},
- {0xba240000}, {0xba242000}, {0xba244000}, {0xba246000},
- {0xba248000}, {0xba24a000}, {0xba24c000}, {0xba24e000},
- {0xba250000}, {0xba252000}, {0xba254000}, {0xba256000},
- {0xba258000}, {0xba25a000}, {0xba25c000}, {0xba25e000},
- {0xba260000}, {0xba262000}, {0xba264000}, {0xba266000},
- {0xba268000}, {0xba26a000}, {0xba26c000}, {0xba26e000},
- {0xba270000}, {0xba272000}, {0xba274000}, {0xba276000},
- {0xba278000}, {0xba27a000}, {0xba27c000}, {0xba27e000},
- {0xba280000}, {0xba282000}, {0xba284000}, {0xba286000},
- {0xba288000}, {0xba28a000}, {0xba28c000}, {0xba28e000},
- {0xba290000}, {0xba292000}, {0xba294000}, {0xba296000},
- {0xba298000}, {0xba29a000}, {0xba29c000}, {0xba29e000},
- {0xba2a0000}, {0xba2a2000}, {0xba2a4000}, {0xba2a6000},
- {0xba2a8000}, {0xba2aa000}, {0xba2ac000}, {0xba2ae000},
- {0xba2b0000}, {0xba2b2000}, {0xba2b4000}, {0xba2b6000},
- {0xba2b8000}, {0xba2ba000}, {0xba2bc000}, {0xba2be000},
- {0xba2c0000}, {0xba2c2000}, {0xba2c4000}, {0xba2c6000},
- {0xba2c8000}, {0xba2ca000}, {0xba2cc000}, {0xba2ce000},
- {0xba2d0000}, {0xba2d2000}, {0xba2d4000}, {0xba2d6000},
- {0xba2d8000}, {0xba2da000}, {0xba2dc000}, {0xba2de000},
- {0xba2e0000}, {0xba2e2000}, {0xba2e4000}, {0xba2e6000},
- {0xba2e8000}, {0xba2ea000}, {0xba2ec000}, {0xba2ee000},
- {0xba2f0000}, {0xba2f2000}, {0xba2f4000}, {0xba2f6000},
- {0xba2f8000}, {0xba2fa000}, {0xba2fc000}, {0xba2fe000},
- {0xba300000}, {0xba302000}, {0xba304000}, {0xba306000},
- {0xba308000}, {0xba30a000}, {0xba30c000}, {0xba30e000},
- {0xba310000}, {0xba312000}, {0xba314000}, {0xba316000},
- {0xba318000}, {0xba31a000}, {0xba31c000}, {0xba31e000},
- {0xba320000}, {0xba322000}, {0xba324000}, {0xba326000},
- {0xba328000}, {0xba32a000}, {0xba32c000}, {0xba32e000},
- {0xba330000}, {0xba332000}, {0xba334000}, {0xba336000},
- {0xba338000}, {0xba33a000}, {0xba33c000}, {0xba33e000},
- {0xba340000}, {0xba342000}, {0xba344000}, {0xba346000},
- {0xba348000}, {0xba34a000}, {0xba34c000}, {0xba34e000},
- {0xba350000}, {0xba352000}, {0xba354000}, {0xba356000},
- {0xba358000}, {0xba35a000}, {0xba35c000}, {0xba35e000},
- {0xba360000}, {0xba362000}, {0xba364000}, {0xba366000},
- {0xba368000}, {0xba36a000}, {0xba36c000}, {0xba36e000},
- {0xba370000}, {0xba372000}, {0xba374000}, {0xba376000},
- {0xba378000}, {0xba37a000}, {0xba37c000}, {0xba37e000},
- {0xba380000}, {0xba382000}, {0xba384000}, {0xba386000},
- {0xba388000}, {0xba38a000}, {0xba38c000}, {0xba38e000},
- {0xba390000}, {0xba392000}, {0xba394000}, {0xba396000},
- {0xba398000}, {0xba39a000}, {0xba39c000}, {0xba39e000},
- {0xba3a0000}, {0xba3a2000}, {0xba3a4000}, {0xba3a6000},
- {0xba3a8000}, {0xba3aa000}, {0xba3ac000}, {0xba3ae000},
- {0xba3b0000}, {0xba3b2000}, {0xba3b4000}, {0xba3b6000},
- {0xba3b8000}, {0xba3ba000}, {0xba3bc000}, {0xba3be000},
- {0xba3c0000}, {0xba3c2000}, {0xba3c4000}, {0xba3c6000},
- {0xba3c8000}, {0xba3ca000}, {0xba3cc000}, {0xba3ce000},
- {0xba3d0000}, {0xba3d2000}, {0xba3d4000}, {0xba3d6000},
- {0xba3d8000}, {0xba3da000}, {0xba3dc000}, {0xba3de000},
- {0xba3e0000}, {0xba3e2000}, {0xba3e4000}, {0xba3e6000},
- {0xba3e8000}, {0xba3ea000}, {0xba3ec000}, {0xba3ee000},
- {0xba3f0000}, {0xba3f2000}, {0xba3f4000}, {0xba3f6000},
- {0xba3f8000}, {0xba3fa000}, {0xba3fc000}, {0xba3fe000},
- {0xba400000}, {0xba402000}, {0xba404000}, {0xba406000},
- {0xba408000}, {0xba40a000}, {0xba40c000}, {0xba40e000},
- {0xba410000}, {0xba412000}, {0xba414000}, {0xba416000},
- {0xba418000}, {0xba41a000}, {0xba41c000}, {0xba41e000},
- {0xba420000}, {0xba422000}, {0xba424000}, {0xba426000},
- {0xba428000}, {0xba42a000}, {0xba42c000}, {0xba42e000},
- {0xba430000}, {0xba432000}, {0xba434000}, {0xba436000},
- {0xba438000}, {0xba43a000}, {0xba43c000}, {0xba43e000},
- {0xba440000}, {0xba442000}, {0xba444000}, {0xba446000},
- {0xba448000}, {0xba44a000}, {0xba44c000}, {0xba44e000},
- {0xba450000}, {0xba452000}, {0xba454000}, {0xba456000},
- {0xba458000}, {0xba45a000}, {0xba45c000}, {0xba45e000},
- {0xba460000}, {0xba462000}, {0xba464000}, {0xba466000},
- {0xba468000}, {0xba46a000}, {0xba46c000}, {0xba46e000},
- {0xba470000}, {0xba472000}, {0xba474000}, {0xba476000},
- {0xba478000}, {0xba47a000}, {0xba47c000}, {0xba47e000},
- {0xba480000}, {0xba482000}, {0xba484000}, {0xba486000},
- {0xba488000}, {0xba48a000}, {0xba48c000}, {0xba48e000},
- {0xba490000}, {0xba492000}, {0xba494000}, {0xba496000},
- {0xba498000}, {0xba49a000}, {0xba49c000}, {0xba49e000},
- {0xba4a0000}, {0xba4a2000}, {0xba4a4000}, {0xba4a6000},
- {0xba4a8000}, {0xba4aa000}, {0xba4ac000}, {0xba4ae000},
- {0xba4b0000}, {0xba4b2000}, {0xba4b4000}, {0xba4b6000},
- {0xba4b8000}, {0xba4ba000}, {0xba4bc000}, {0xba4be000},
- {0xba4c0000}, {0xba4c2000}, {0xba4c4000}, {0xba4c6000},
- {0xba4c8000}, {0xba4ca000}, {0xba4cc000}, {0xba4ce000},
- {0xba4d0000}, {0xba4d2000}, {0xba4d4000}, {0xba4d6000},
- {0xba4d8000}, {0xba4da000}, {0xba4dc000}, {0xba4de000},
- {0xba4e0000}, {0xba4e2000}, {0xba4e4000}, {0xba4e6000},
- {0xba4e8000}, {0xba4ea000}, {0xba4ec000}, {0xba4ee000},
- {0xba4f0000}, {0xba4f2000}, {0xba4f4000}, {0xba4f6000},
- {0xba4f8000}, {0xba4fa000}, {0xba4fc000}, {0xba4fe000},
- {0xba500000}, {0xba502000}, {0xba504000}, {0xba506000},
- {0xba508000}, {0xba50a000}, {0xba50c000}, {0xba50e000},
- {0xba510000}, {0xba512000}, {0xba514000}, {0xba516000},
- {0xba518000}, {0xba51a000}, {0xba51c000}, {0xba51e000},
- {0xba520000}, {0xba522000}, {0xba524000}, {0xba526000},
- {0xba528000}, {0xba52a000}, {0xba52c000}, {0xba52e000},
- {0xba530000}, {0xba532000}, {0xba534000}, {0xba536000},
- {0xba538000}, {0xba53a000}, {0xba53c000}, {0xba53e000},
- {0xba540000}, {0xba542000}, {0xba544000}, {0xba546000},
- {0xba548000}, {0xba54a000}, {0xba54c000}, {0xba54e000},
- {0xba550000}, {0xba552000}, {0xba554000}, {0xba556000},
- {0xba558000}, {0xba55a000}, {0xba55c000}, {0xba55e000},
- {0xba560000}, {0xba562000}, {0xba564000}, {0xba566000},
- {0xba568000}, {0xba56a000}, {0xba56c000}, {0xba56e000},
- {0xba570000}, {0xba572000}, {0xba574000}, {0xba576000},
- {0xba578000}, {0xba57a000}, {0xba57c000}, {0xba57e000},
- {0xba580000}, {0xba582000}, {0xba584000}, {0xba586000},
- {0xba588000}, {0xba58a000}, {0xba58c000}, {0xba58e000},
- {0xba590000}, {0xba592000}, {0xba594000}, {0xba596000},
- {0xba598000}, {0xba59a000}, {0xba59c000}, {0xba59e000},
- {0xba5a0000}, {0xba5a2000}, {0xba5a4000}, {0xba5a6000},
- {0xba5a8000}, {0xba5aa000}, {0xba5ac000}, {0xba5ae000},
- {0xba5b0000}, {0xba5b2000}, {0xba5b4000}, {0xba5b6000},
- {0xba5b8000}, {0xba5ba000}, {0xba5bc000}, {0xba5be000},
- {0xba5c0000}, {0xba5c2000}, {0xba5c4000}, {0xba5c6000},
- {0xba5c8000}, {0xba5ca000}, {0xba5cc000}, {0xba5ce000},
- {0xba5d0000}, {0xba5d2000}, {0xba5d4000}, {0xba5d6000},
- {0xba5d8000}, {0xba5da000}, {0xba5dc000}, {0xba5de000},
- {0xba5e0000}, {0xba5e2000}, {0xba5e4000}, {0xba5e6000},
- {0xba5e8000}, {0xba5ea000}, {0xba5ec000}, {0xba5ee000},
- {0xba5f0000}, {0xba5f2000}, {0xba5f4000}, {0xba5f6000},
- {0xba5f8000}, {0xba5fa000}, {0xba5fc000}, {0xba5fe000},
- {0xba600000}, {0xba602000}, {0xba604000}, {0xba606000},
- {0xba608000}, {0xba60a000}, {0xba60c000}, {0xba60e000},
- {0xba610000}, {0xba612000}, {0xba614000}, {0xba616000},
- {0xba618000}, {0xba61a000}, {0xba61c000}, {0xba61e000},
- {0xba620000}, {0xba622000}, {0xba624000}, {0xba626000},
- {0xba628000}, {0xba62a000}, {0xba62c000}, {0xba62e000},
- {0xba630000}, {0xba632000}, {0xba634000}, {0xba636000},
- {0xba638000}, {0xba63a000}, {0xba63c000}, {0xba63e000},
- {0xba640000}, {0xba642000}, {0xba644000}, {0xba646000},
- {0xba648000}, {0xba64a000}, {0xba64c000}, {0xba64e000},
- {0xba650000}, {0xba652000}, {0xba654000}, {0xba656000},
- {0xba658000}, {0xba65a000}, {0xba65c000}, {0xba65e000},
- {0xba660000}, {0xba662000}, {0xba664000}, {0xba666000},
- {0xba668000}, {0xba66a000}, {0xba66c000}, {0xba66e000},
- {0xba670000}, {0xba672000}, {0xba674000}, {0xba676000},
- {0xba678000}, {0xba67a000}, {0xba67c000}, {0xba67e000},
- {0xba680000}, {0xba682000}, {0xba684000}, {0xba686000},
- {0xba688000}, {0xba68a000}, {0xba68c000}, {0xba68e000},
- {0xba690000}, {0xba692000}, {0xba694000}, {0xba696000},
- {0xba698000}, {0xba69a000}, {0xba69c000}, {0xba69e000},
- {0xba6a0000}, {0xba6a2000}, {0xba6a4000}, {0xba6a6000},
- {0xba6a8000}, {0xba6aa000}, {0xba6ac000}, {0xba6ae000},
- {0xba6b0000}, {0xba6b2000}, {0xba6b4000}, {0xba6b6000},
- {0xba6b8000}, {0xba6ba000}, {0xba6bc000}, {0xba6be000},
- {0xba6c0000}, {0xba6c2000}, {0xba6c4000}, {0xba6c6000},
- {0xba6c8000}, {0xba6ca000}, {0xba6cc000}, {0xba6ce000},
- {0xba6d0000}, {0xba6d2000}, {0xba6d4000}, {0xba6d6000},
- {0xba6d8000}, {0xba6da000}, {0xba6dc000}, {0xba6de000},
- {0xba6e0000}, {0xba6e2000}, {0xba6e4000}, {0xba6e6000},
- {0xba6e8000}, {0xba6ea000}, {0xba6ec000}, {0xba6ee000},
- {0xba6f0000}, {0xba6f2000}, {0xba6f4000}, {0xba6f6000},
- {0xba6f8000}, {0xba6fa000}, {0xba6fc000}, {0xba6fe000},
- {0xba700000}, {0xba702000}, {0xba704000}, {0xba706000},
- {0xba708000}, {0xba70a000}, {0xba70c000}, {0xba70e000},
- {0xba710000}, {0xba712000}, {0xba714000}, {0xba716000},
- {0xba718000}, {0xba71a000}, {0xba71c000}, {0xba71e000},
- {0xba720000}, {0xba722000}, {0xba724000}, {0xba726000},
- {0xba728000}, {0xba72a000}, {0xba72c000}, {0xba72e000},
- {0xba730000}, {0xba732000}, {0xba734000}, {0xba736000},
- {0xba738000}, {0xba73a000}, {0xba73c000}, {0xba73e000},
- {0xba740000}, {0xba742000}, {0xba744000}, {0xba746000},
- {0xba748000}, {0xba74a000}, {0xba74c000}, {0xba74e000},
- {0xba750000}, {0xba752000}, {0xba754000}, {0xba756000},
- {0xba758000}, {0xba75a000}, {0xba75c000}, {0xba75e000},
- {0xba760000}, {0xba762000}, {0xba764000}, {0xba766000},
- {0xba768000}, {0xba76a000}, {0xba76c000}, {0xba76e000},
- {0xba770000}, {0xba772000}, {0xba774000}, {0xba776000},
- {0xba778000}, {0xba77a000}, {0xba77c000}, {0xba77e000},
- {0xba780000}, {0xba782000}, {0xba784000}, {0xba786000},
- {0xba788000}, {0xba78a000}, {0xba78c000}, {0xba78e000},
- {0xba790000}, {0xba792000}, {0xba794000}, {0xba796000},
- {0xba798000}, {0xba79a000}, {0xba79c000}, {0xba79e000},
- {0xba7a0000}, {0xba7a2000}, {0xba7a4000}, {0xba7a6000},
- {0xba7a8000}, {0xba7aa000}, {0xba7ac000}, {0xba7ae000},
- {0xba7b0000}, {0xba7b2000}, {0xba7b4000}, {0xba7b6000},
- {0xba7b8000}, {0xba7ba000}, {0xba7bc000}, {0xba7be000},
- {0xba7c0000}, {0xba7c2000}, {0xba7c4000}, {0xba7c6000},
- {0xba7c8000}, {0xba7ca000}, {0xba7cc000}, {0xba7ce000},
- {0xba7d0000}, {0xba7d2000}, {0xba7d4000}, {0xba7d6000},
- {0xba7d8000}, {0xba7da000}, {0xba7dc000}, {0xba7de000},
- {0xba7e0000}, {0xba7e2000}, {0xba7e4000}, {0xba7e6000},
- {0xba7e8000}, {0xba7ea000}, {0xba7ec000}, {0xba7ee000},
- {0xba7f0000}, {0xba7f2000}, {0xba7f4000}, {0xba7f6000},
- {0xba7f8000}, {0xba7fa000}, {0xba7fc000}, {0xba7fe000},
- {0xba800000}, {0xba802000}, {0xba804000}, {0xba806000},
- {0xba808000}, {0xba80a000}, {0xba80c000}, {0xba80e000},
- {0xba810000}, {0xba812000}, {0xba814000}, {0xba816000},
- {0xba818000}, {0xba81a000}, {0xba81c000}, {0xba81e000},
- {0xba820000}, {0xba822000}, {0xba824000}, {0xba826000},
- {0xba828000}, {0xba82a000}, {0xba82c000}, {0xba82e000},
- {0xba830000}, {0xba832000}, {0xba834000}, {0xba836000},
- {0xba838000}, {0xba83a000}, {0xba83c000}, {0xba83e000},
- {0xba840000}, {0xba842000}, {0xba844000}, {0xba846000},
- {0xba848000}, {0xba84a000}, {0xba84c000}, {0xba84e000},
- {0xba850000}, {0xba852000}, {0xba854000}, {0xba856000},
- {0xba858000}, {0xba85a000}, {0xba85c000}, {0xba85e000},
- {0xba860000}, {0xba862000}, {0xba864000}, {0xba866000},
- {0xba868000}, {0xba86a000}, {0xba86c000}, {0xba86e000},
- {0xba870000}, {0xba872000}, {0xba874000}, {0xba876000},
- {0xba878000}, {0xba87a000}, {0xba87c000}, {0xba87e000},
- {0xba880000}, {0xba882000}, {0xba884000}, {0xba886000},
- {0xba888000}, {0xba88a000}, {0xba88c000}, {0xba88e000},
- {0xba890000}, {0xba892000}, {0xba894000}, {0xba896000},
- {0xba898000}, {0xba89a000}, {0xba89c000}, {0xba89e000},
- {0xba8a0000}, {0xba8a2000}, {0xba8a4000}, {0xba8a6000},
- {0xba8a8000}, {0xba8aa000}, {0xba8ac000}, {0xba8ae000},
- {0xba8b0000}, {0xba8b2000}, {0xba8b4000}, {0xba8b6000},
- {0xba8b8000}, {0xba8ba000}, {0xba8bc000}, {0xba8be000},
- {0xba8c0000}, {0xba8c2000}, {0xba8c4000}, {0xba8c6000},
- {0xba8c8000}, {0xba8ca000}, {0xba8cc000}, {0xba8ce000},
- {0xba8d0000}, {0xba8d2000}, {0xba8d4000}, {0xba8d6000},
- {0xba8d8000}, {0xba8da000}, {0xba8dc000}, {0xba8de000},
- {0xba8e0000}, {0xba8e2000}, {0xba8e4000}, {0xba8e6000},
- {0xba8e8000}, {0xba8ea000}, {0xba8ec000}, {0xba8ee000},
- {0xba8f0000}, {0xba8f2000}, {0xba8f4000}, {0xba8f6000},
- {0xba8f8000}, {0xba8fa000}, {0xba8fc000}, {0xba8fe000},
- {0xba900000}, {0xba902000}, {0xba904000}, {0xba906000},
- {0xba908000}, {0xba90a000}, {0xba90c000}, {0xba90e000},
- {0xba910000}, {0xba912000}, {0xba914000}, {0xba916000},
- {0xba918000}, {0xba91a000}, {0xba91c000}, {0xba91e000},
- {0xba920000}, {0xba922000}, {0xba924000}, {0xba926000},
- {0xba928000}, {0xba92a000}, {0xba92c000}, {0xba92e000},
- {0xba930000}, {0xba932000}, {0xba934000}, {0xba936000},
- {0xba938000}, {0xba93a000}, {0xba93c000}, {0xba93e000},
- {0xba940000}, {0xba942000}, {0xba944000}, {0xba946000},
- {0xba948000}, {0xba94a000}, {0xba94c000}, {0xba94e000},
- {0xba950000}, {0xba952000}, {0xba954000}, {0xba956000},
- {0xba958000}, {0xba95a000}, {0xba95c000}, {0xba95e000},
- {0xba960000}, {0xba962000}, {0xba964000}, {0xba966000},
- {0xba968000}, {0xba96a000}, {0xba96c000}, {0xba96e000},
- {0xba970000}, {0xba972000}, {0xba974000}, {0xba976000},
- {0xba978000}, {0xba97a000}, {0xba97c000}, {0xba97e000},
- {0xba980000}, {0xba982000}, {0xba984000}, {0xba986000},
- {0xba988000}, {0xba98a000}, {0xba98c000}, {0xba98e000},
- {0xba990000}, {0xba992000}, {0xba994000}, {0xba996000},
- {0xba998000}, {0xba99a000}, {0xba99c000}, {0xba99e000},
- {0xba9a0000}, {0xba9a2000}, {0xba9a4000}, {0xba9a6000},
- {0xba9a8000}, {0xba9aa000}, {0xba9ac000}, {0xba9ae000},
- {0xba9b0000}, {0xba9b2000}, {0xba9b4000}, {0xba9b6000},
- {0xba9b8000}, {0xba9ba000}, {0xba9bc000}, {0xba9be000},
- {0xba9c0000}, {0xba9c2000}, {0xba9c4000}, {0xba9c6000},
- {0xba9c8000}, {0xba9ca000}, {0xba9cc000}, {0xba9ce000},
- {0xba9d0000}, {0xba9d2000}, {0xba9d4000}, {0xba9d6000},
- {0xba9d8000}, {0xba9da000}, {0xba9dc000}, {0xba9de000},
- {0xba9e0000}, {0xba9e2000}, {0xba9e4000}, {0xba9e6000},
- {0xba9e8000}, {0xba9ea000}, {0xba9ec000}, {0xba9ee000},
- {0xba9f0000}, {0xba9f2000}, {0xba9f4000}, {0xba9f6000},
- {0xba9f8000}, {0xba9fa000}, {0xba9fc000}, {0xba9fe000},
- {0xbaa00000}, {0xbaa02000}, {0xbaa04000}, {0xbaa06000},
- {0xbaa08000}, {0xbaa0a000}, {0xbaa0c000}, {0xbaa0e000},
- {0xbaa10000}, {0xbaa12000}, {0xbaa14000}, {0xbaa16000},
- {0xbaa18000}, {0xbaa1a000}, {0xbaa1c000}, {0xbaa1e000},
- {0xbaa20000}, {0xbaa22000}, {0xbaa24000}, {0xbaa26000},
- {0xbaa28000}, {0xbaa2a000}, {0xbaa2c000}, {0xbaa2e000},
- {0xbaa30000}, {0xbaa32000}, {0xbaa34000}, {0xbaa36000},
- {0xbaa38000}, {0xbaa3a000}, {0xbaa3c000}, {0xbaa3e000},
- {0xbaa40000}, {0xbaa42000}, {0xbaa44000}, {0xbaa46000},
- {0xbaa48000}, {0xbaa4a000}, {0xbaa4c000}, {0xbaa4e000},
- {0xbaa50000}, {0xbaa52000}, {0xbaa54000}, {0xbaa56000},
- {0xbaa58000}, {0xbaa5a000}, {0xbaa5c000}, {0xbaa5e000},
- {0xbaa60000}, {0xbaa62000}, {0xbaa64000}, {0xbaa66000},
- {0xbaa68000}, {0xbaa6a000}, {0xbaa6c000}, {0xbaa6e000},
- {0xbaa70000}, {0xbaa72000}, {0xbaa74000}, {0xbaa76000},
- {0xbaa78000}, {0xbaa7a000}, {0xbaa7c000}, {0xbaa7e000},
- {0xbaa80000}, {0xbaa82000}, {0xbaa84000}, {0xbaa86000},
- {0xbaa88000}, {0xbaa8a000}, {0xbaa8c000}, {0xbaa8e000},
- {0xbaa90000}, {0xbaa92000}, {0xbaa94000}, {0xbaa96000},
- {0xbaa98000}, {0xbaa9a000}, {0xbaa9c000}, {0xbaa9e000},
- {0xbaaa0000}, {0xbaaa2000}, {0xbaaa4000}, {0xbaaa6000},
- {0xbaaa8000}, {0xbaaaa000}, {0xbaaac000}, {0xbaaae000},
- {0xbaab0000}, {0xbaab2000}, {0xbaab4000}, {0xbaab6000},
- {0xbaab8000}, {0xbaaba000}, {0xbaabc000}, {0xbaabe000},
- {0xbaac0000}, {0xbaac2000}, {0xbaac4000}, {0xbaac6000},
- {0xbaac8000}, {0xbaaca000}, {0xbaacc000}, {0xbaace000},
- {0xbaad0000}, {0xbaad2000}, {0xbaad4000}, {0xbaad6000},
- {0xbaad8000}, {0xbaada000}, {0xbaadc000}, {0xbaade000},
- {0xbaae0000}, {0xbaae2000}, {0xbaae4000}, {0xbaae6000},
- {0xbaae8000}, {0xbaaea000}, {0xbaaec000}, {0xbaaee000},
- {0xbaaf0000}, {0xbaaf2000}, {0xbaaf4000}, {0xbaaf6000},
- {0xbaaf8000}, {0xbaafa000}, {0xbaafc000}, {0xbaafe000},
- {0xbab00000}, {0xbab02000}, {0xbab04000}, {0xbab06000},
- {0xbab08000}, {0xbab0a000}, {0xbab0c000}, {0xbab0e000},
- {0xbab10000}, {0xbab12000}, {0xbab14000}, {0xbab16000},
- {0xbab18000}, {0xbab1a000}, {0xbab1c000}, {0xbab1e000},
- {0xbab20000}, {0xbab22000}, {0xbab24000}, {0xbab26000},
- {0xbab28000}, {0xbab2a000}, {0xbab2c000}, {0xbab2e000},
- {0xbab30000}, {0xbab32000}, {0xbab34000}, {0xbab36000},
- {0xbab38000}, {0xbab3a000}, {0xbab3c000}, {0xbab3e000},
- {0xbab40000}, {0xbab42000}, {0xbab44000}, {0xbab46000},
- {0xbab48000}, {0xbab4a000}, {0xbab4c000}, {0xbab4e000},
- {0xbab50000}, {0xbab52000}, {0xbab54000}, {0xbab56000},
- {0xbab58000}, {0xbab5a000}, {0xbab5c000}, {0xbab5e000},
- {0xbab60000}, {0xbab62000}, {0xbab64000}, {0xbab66000},
- {0xbab68000}, {0xbab6a000}, {0xbab6c000}, {0xbab6e000},
- {0xbab70000}, {0xbab72000}, {0xbab74000}, {0xbab76000},
- {0xbab78000}, {0xbab7a000}, {0xbab7c000}, {0xbab7e000},
- {0xbab80000}, {0xbab82000}, {0xbab84000}, {0xbab86000},
- {0xbab88000}, {0xbab8a000}, {0xbab8c000}, {0xbab8e000},
- {0xbab90000}, {0xbab92000}, {0xbab94000}, {0xbab96000},
- {0xbab98000}, {0xbab9a000}, {0xbab9c000}, {0xbab9e000},
- {0xbaba0000}, {0xbaba2000}, {0xbaba4000}, {0xbaba6000},
- {0xbaba8000}, {0xbabaa000}, {0xbabac000}, {0xbabae000},
- {0xbabb0000}, {0xbabb2000}, {0xbabb4000}, {0xbabb6000},
- {0xbabb8000}, {0xbabba000}, {0xbabbc000}, {0xbabbe000},
- {0xbabc0000}, {0xbabc2000}, {0xbabc4000}, {0xbabc6000},
- {0xbabc8000}, {0xbabca000}, {0xbabcc000}, {0xbabce000},
- {0xbabd0000}, {0xbabd2000}, {0xbabd4000}, {0xbabd6000},
- {0xbabd8000}, {0xbabda000}, {0xbabdc000}, {0xbabde000},
- {0xbabe0000}, {0xbabe2000}, {0xbabe4000}, {0xbabe6000},
- {0xbabe8000}, {0xbabea000}, {0xbabec000}, {0xbabee000},
- {0xbabf0000}, {0xbabf2000}, {0xbabf4000}, {0xbabf6000},
- {0xbabf8000}, {0xbabfa000}, {0xbabfc000}, {0xbabfe000},
- {0xbac00000}, {0xbac02000}, {0xbac04000}, {0xbac06000},
- {0xbac08000}, {0xbac0a000}, {0xbac0c000}, {0xbac0e000},
- {0xbac10000}, {0xbac12000}, {0xbac14000}, {0xbac16000},
- {0xbac18000}, {0xbac1a000}, {0xbac1c000}, {0xbac1e000},
- {0xbac20000}, {0xbac22000}, {0xbac24000}, {0xbac26000},
- {0xbac28000}, {0xbac2a000}, {0xbac2c000}, {0xbac2e000},
- {0xbac30000}, {0xbac32000}, {0xbac34000}, {0xbac36000},
- {0xbac38000}, {0xbac3a000}, {0xbac3c000}, {0xbac3e000},
- {0xbac40000}, {0xbac42000}, {0xbac44000}, {0xbac46000},
- {0xbac48000}, {0xbac4a000}, {0xbac4c000}, {0xbac4e000},
- {0xbac50000}, {0xbac52000}, {0xbac54000}, {0xbac56000},
- {0xbac58000}, {0xbac5a000}, {0xbac5c000}, {0xbac5e000},
- {0xbac60000}, {0xbac62000}, {0xbac64000}, {0xbac66000},
- {0xbac68000}, {0xbac6a000}, {0xbac6c000}, {0xbac6e000},
- {0xbac70000}, {0xbac72000}, {0xbac74000}, {0xbac76000},
- {0xbac78000}, {0xbac7a000}, {0xbac7c000}, {0xbac7e000},
- {0xbac80000}, {0xbac82000}, {0xbac84000}, {0xbac86000},
- {0xbac88000}, {0xbac8a000}, {0xbac8c000}, {0xbac8e000},
- {0xbac90000}, {0xbac92000}, {0xbac94000}, {0xbac96000},
- {0xbac98000}, {0xbac9a000}, {0xbac9c000}, {0xbac9e000},
- {0xbaca0000}, {0xbaca2000}, {0xbaca4000}, {0xbaca6000},
- {0xbaca8000}, {0xbacaa000}, {0xbacac000}, {0xbacae000},
- {0xbacb0000}, {0xbacb2000}, {0xbacb4000}, {0xbacb6000},
- {0xbacb8000}, {0xbacba000}, {0xbacbc000}, {0xbacbe000},
- {0xbacc0000}, {0xbacc2000}, {0xbacc4000}, {0xbacc6000},
- {0xbacc8000}, {0xbacca000}, {0xbaccc000}, {0xbacce000},
- {0xbacd0000}, {0xbacd2000}, {0xbacd4000}, {0xbacd6000},
- {0xbacd8000}, {0xbacda000}, {0xbacdc000}, {0xbacde000},
- {0xbace0000}, {0xbace2000}, {0xbace4000}, {0xbace6000},
- {0xbace8000}, {0xbacea000}, {0xbacec000}, {0xbacee000},
- {0xbacf0000}, {0xbacf2000}, {0xbacf4000}, {0xbacf6000},
- {0xbacf8000}, {0xbacfa000}, {0xbacfc000}, {0xbacfe000},
- {0xbad00000}, {0xbad02000}, {0xbad04000}, {0xbad06000},
- {0xbad08000}, {0xbad0a000}, {0xbad0c000}, {0xbad0e000},
- {0xbad10000}, {0xbad12000}, {0xbad14000}, {0xbad16000},
- {0xbad18000}, {0xbad1a000}, {0xbad1c000}, {0xbad1e000},
- {0xbad20000}, {0xbad22000}, {0xbad24000}, {0xbad26000},
- {0xbad28000}, {0xbad2a000}, {0xbad2c000}, {0xbad2e000},
- {0xbad30000}, {0xbad32000}, {0xbad34000}, {0xbad36000},
- {0xbad38000}, {0xbad3a000}, {0xbad3c000}, {0xbad3e000},
- {0xbad40000}, {0xbad42000}, {0xbad44000}, {0xbad46000},
- {0xbad48000}, {0xbad4a000}, {0xbad4c000}, {0xbad4e000},
- {0xbad50000}, {0xbad52000}, {0xbad54000}, {0xbad56000},
- {0xbad58000}, {0xbad5a000}, {0xbad5c000}, {0xbad5e000},
- {0xbad60000}, {0xbad62000}, {0xbad64000}, {0xbad66000},
- {0xbad68000}, {0xbad6a000}, {0xbad6c000}, {0xbad6e000},
- {0xbad70000}, {0xbad72000}, {0xbad74000}, {0xbad76000},
- {0xbad78000}, {0xbad7a000}, {0xbad7c000}, {0xbad7e000},
- {0xbad80000}, {0xbad82000}, {0xbad84000}, {0xbad86000},
- {0xbad88000}, {0xbad8a000}, {0xbad8c000}, {0xbad8e000},
- {0xbad90000}, {0xbad92000}, {0xbad94000}, {0xbad96000},
- {0xbad98000}, {0xbad9a000}, {0xbad9c000}, {0xbad9e000},
- {0xbada0000}, {0xbada2000}, {0xbada4000}, {0xbada6000},
- {0xbada8000}, {0xbadaa000}, {0xbadac000}, {0xbadae000},
- {0xbadb0000}, {0xbadb2000}, {0xbadb4000}, {0xbadb6000},
- {0xbadb8000}, {0xbadba000}, {0xbadbc000}, {0xbadbe000},
- {0xbadc0000}, {0xbadc2000}, {0xbadc4000}, {0xbadc6000},
- {0xbadc8000}, {0xbadca000}, {0xbadcc000}, {0xbadce000},
- {0xbadd0000}, {0xbadd2000}, {0xbadd4000}, {0xbadd6000},
- {0xbadd8000}, {0xbadda000}, {0xbaddc000}, {0xbadde000},
- {0xbade0000}, {0xbade2000}, {0xbade4000}, {0xbade6000},
- {0xbade8000}, {0xbadea000}, {0xbadec000}, {0xbadee000},
- {0xbadf0000}, {0xbadf2000}, {0xbadf4000}, {0xbadf6000},
- {0xbadf8000}, {0xbadfa000}, {0xbadfc000}, {0xbadfe000},
- {0xbae00000}, {0xbae02000}, {0xbae04000}, {0xbae06000},
- {0xbae08000}, {0xbae0a000}, {0xbae0c000}, {0xbae0e000},
- {0xbae10000}, {0xbae12000}, {0xbae14000}, {0xbae16000},
- {0xbae18000}, {0xbae1a000}, {0xbae1c000}, {0xbae1e000},
- {0xbae20000}, {0xbae22000}, {0xbae24000}, {0xbae26000},
- {0xbae28000}, {0xbae2a000}, {0xbae2c000}, {0xbae2e000},
- {0xbae30000}, {0xbae32000}, {0xbae34000}, {0xbae36000},
- {0xbae38000}, {0xbae3a000}, {0xbae3c000}, {0xbae3e000},
- {0xbae40000}, {0xbae42000}, {0xbae44000}, {0xbae46000},
- {0xbae48000}, {0xbae4a000}, {0xbae4c000}, {0xbae4e000},
- {0xbae50000}, {0xbae52000}, {0xbae54000}, {0xbae56000},
- {0xbae58000}, {0xbae5a000}, {0xbae5c000}, {0xbae5e000},
- {0xbae60000}, {0xbae62000}, {0xbae64000}, {0xbae66000},
- {0xbae68000}, {0xbae6a000}, {0xbae6c000}, {0xbae6e000},
- {0xbae70000}, {0xbae72000}, {0xbae74000}, {0xbae76000},
- {0xbae78000}, {0xbae7a000}, {0xbae7c000}, {0xbae7e000},
- {0xbae80000}, {0xbae82000}, {0xbae84000}, {0xbae86000},
- {0xbae88000}, {0xbae8a000}, {0xbae8c000}, {0xbae8e000},
- {0xbae90000}, {0xbae92000}, {0xbae94000}, {0xbae96000},
- {0xbae98000}, {0xbae9a000}, {0xbae9c000}, {0xbae9e000},
- {0xbaea0000}, {0xbaea2000}, {0xbaea4000}, {0xbaea6000},
- {0xbaea8000}, {0xbaeaa000}, {0xbaeac000}, {0xbaeae000},
- {0xbaeb0000}, {0xbaeb2000}, {0xbaeb4000}, {0xbaeb6000},
- {0xbaeb8000}, {0xbaeba000}, {0xbaebc000}, {0xbaebe000},
- {0xbaec0000}, {0xbaec2000}, {0xbaec4000}, {0xbaec6000},
- {0xbaec8000}, {0xbaeca000}, {0xbaecc000}, {0xbaece000},
- {0xbaed0000}, {0xbaed2000}, {0xbaed4000}, {0xbaed6000},
- {0xbaed8000}, {0xbaeda000}, {0xbaedc000}, {0xbaede000},
- {0xbaee0000}, {0xbaee2000}, {0xbaee4000}, {0xbaee6000},
- {0xbaee8000}, {0xbaeea000}, {0xbaeec000}, {0xbaeee000},
- {0xbaef0000}, {0xbaef2000}, {0xbaef4000}, {0xbaef6000},
- {0xbaef8000}, {0xbaefa000}, {0xbaefc000}, {0xbaefe000},
- {0xbaf00000}, {0xbaf02000}, {0xbaf04000}, {0xbaf06000},
- {0xbaf08000}, {0xbaf0a000}, {0xbaf0c000}, {0xbaf0e000},
- {0xbaf10000}, {0xbaf12000}, {0xbaf14000}, {0xbaf16000},
- {0xbaf18000}, {0xbaf1a000}, {0xbaf1c000}, {0xbaf1e000},
- {0xbaf20000}, {0xbaf22000}, {0xbaf24000}, {0xbaf26000},
- {0xbaf28000}, {0xbaf2a000}, {0xbaf2c000}, {0xbaf2e000},
- {0xbaf30000}, {0xbaf32000}, {0xbaf34000}, {0xbaf36000},
- {0xbaf38000}, {0xbaf3a000}, {0xbaf3c000}, {0xbaf3e000},
- {0xbaf40000}, {0xbaf42000}, {0xbaf44000}, {0xbaf46000},
- {0xbaf48000}, {0xbaf4a000}, {0xbaf4c000}, {0xbaf4e000},
- {0xbaf50000}, {0xbaf52000}, {0xbaf54000}, {0xbaf56000},
- {0xbaf58000}, {0xbaf5a000}, {0xbaf5c000}, {0xbaf5e000},
- {0xbaf60000}, {0xbaf62000}, {0xbaf64000}, {0xbaf66000},
- {0xbaf68000}, {0xbaf6a000}, {0xbaf6c000}, {0xbaf6e000},
- {0xbaf70000}, {0xbaf72000}, {0xbaf74000}, {0xbaf76000},
- {0xbaf78000}, {0xbaf7a000}, {0xbaf7c000}, {0xbaf7e000},
- {0xbaf80000}, {0xbaf82000}, {0xbaf84000}, {0xbaf86000},
- {0xbaf88000}, {0xbaf8a000}, {0xbaf8c000}, {0xbaf8e000},
- {0xbaf90000}, {0xbaf92000}, {0xbaf94000}, {0xbaf96000},
- {0xbaf98000}, {0xbaf9a000}, {0xbaf9c000}, {0xbaf9e000},
- {0xbafa0000}, {0xbafa2000}, {0xbafa4000}, {0xbafa6000},
- {0xbafa8000}, {0xbafaa000}, {0xbafac000}, {0xbafae000},
- {0xbafb0000}, {0xbafb2000}, {0xbafb4000}, {0xbafb6000},
- {0xbafb8000}, {0xbafba000}, {0xbafbc000}, {0xbafbe000},
- {0xbafc0000}, {0xbafc2000}, {0xbafc4000}, {0xbafc6000},
- {0xbafc8000}, {0xbafca000}, {0xbafcc000}, {0xbafce000},
- {0xbafd0000}, {0xbafd2000}, {0xbafd4000}, {0xbafd6000},
- {0xbafd8000}, {0xbafda000}, {0xbafdc000}, {0xbafde000},
- {0xbafe0000}, {0xbafe2000}, {0xbafe4000}, {0xbafe6000},
- {0xbafe8000}, {0xbafea000}, {0xbafec000}, {0xbafee000},
- {0xbaff0000}, {0xbaff2000}, {0xbaff4000}, {0xbaff6000},
- {0xbaff8000}, {0xbaffa000}, {0xbaffc000}, {0xbaffe000},
- {0xbb000000}, {0xbb002000}, {0xbb004000}, {0xbb006000},
- {0xbb008000}, {0xbb00a000}, {0xbb00c000}, {0xbb00e000},
- {0xbb010000}, {0xbb012000}, {0xbb014000}, {0xbb016000},
- {0xbb018000}, {0xbb01a000}, {0xbb01c000}, {0xbb01e000},
- {0xbb020000}, {0xbb022000}, {0xbb024000}, {0xbb026000},
- {0xbb028000}, {0xbb02a000}, {0xbb02c000}, {0xbb02e000},
- {0xbb030000}, {0xbb032000}, {0xbb034000}, {0xbb036000},
- {0xbb038000}, {0xbb03a000}, {0xbb03c000}, {0xbb03e000},
- {0xbb040000}, {0xbb042000}, {0xbb044000}, {0xbb046000},
- {0xbb048000}, {0xbb04a000}, {0xbb04c000}, {0xbb04e000},
- {0xbb050000}, {0xbb052000}, {0xbb054000}, {0xbb056000},
- {0xbb058000}, {0xbb05a000}, {0xbb05c000}, {0xbb05e000},
- {0xbb060000}, {0xbb062000}, {0xbb064000}, {0xbb066000},
- {0xbb068000}, {0xbb06a000}, {0xbb06c000}, {0xbb06e000},
- {0xbb070000}, {0xbb072000}, {0xbb074000}, {0xbb076000},
- {0xbb078000}, {0xbb07a000}, {0xbb07c000}, {0xbb07e000},
- {0xbb080000}, {0xbb082000}, {0xbb084000}, {0xbb086000},
- {0xbb088000}, {0xbb08a000}, {0xbb08c000}, {0xbb08e000},
- {0xbb090000}, {0xbb092000}, {0xbb094000}, {0xbb096000},
- {0xbb098000}, {0xbb09a000}, {0xbb09c000}, {0xbb09e000},
- {0xbb0a0000}, {0xbb0a2000}, {0xbb0a4000}, {0xbb0a6000},
- {0xbb0a8000}, {0xbb0aa000}, {0xbb0ac000}, {0xbb0ae000},
- {0xbb0b0000}, {0xbb0b2000}, {0xbb0b4000}, {0xbb0b6000},
- {0xbb0b8000}, {0xbb0ba000}, {0xbb0bc000}, {0xbb0be000},
- {0xbb0c0000}, {0xbb0c2000}, {0xbb0c4000}, {0xbb0c6000},
- {0xbb0c8000}, {0xbb0ca000}, {0xbb0cc000}, {0xbb0ce000},
- {0xbb0d0000}, {0xbb0d2000}, {0xbb0d4000}, {0xbb0d6000},
- {0xbb0d8000}, {0xbb0da000}, {0xbb0dc000}, {0xbb0de000},
- {0xbb0e0000}, {0xbb0e2000}, {0xbb0e4000}, {0xbb0e6000},
- {0xbb0e8000}, {0xbb0ea000}, {0xbb0ec000}, {0xbb0ee000},
- {0xbb0f0000}, {0xbb0f2000}, {0xbb0f4000}, {0xbb0f6000},
- {0xbb0f8000}, {0xbb0fa000}, {0xbb0fc000}, {0xbb0fe000},
- {0xbb100000}, {0xbb102000}, {0xbb104000}, {0xbb106000},
- {0xbb108000}, {0xbb10a000}, {0xbb10c000}, {0xbb10e000},
- {0xbb110000}, {0xbb112000}, {0xbb114000}, {0xbb116000},
- {0xbb118000}, {0xbb11a000}, {0xbb11c000}, {0xbb11e000},
- {0xbb120000}, {0xbb122000}, {0xbb124000}, {0xbb126000},
- {0xbb128000}, {0xbb12a000}, {0xbb12c000}, {0xbb12e000},
- {0xbb130000}, {0xbb132000}, {0xbb134000}, {0xbb136000},
- {0xbb138000}, {0xbb13a000}, {0xbb13c000}, {0xbb13e000},
- {0xbb140000}, {0xbb142000}, {0xbb144000}, {0xbb146000},
- {0xbb148000}, {0xbb14a000}, {0xbb14c000}, {0xbb14e000},
- {0xbb150000}, {0xbb152000}, {0xbb154000}, {0xbb156000},
- {0xbb158000}, {0xbb15a000}, {0xbb15c000}, {0xbb15e000},
- {0xbb160000}, {0xbb162000}, {0xbb164000}, {0xbb166000},
- {0xbb168000}, {0xbb16a000}, {0xbb16c000}, {0xbb16e000},
- {0xbb170000}, {0xbb172000}, {0xbb174000}, {0xbb176000},
- {0xbb178000}, {0xbb17a000}, {0xbb17c000}, {0xbb17e000},
- {0xbb180000}, {0xbb182000}, {0xbb184000}, {0xbb186000},
- {0xbb188000}, {0xbb18a000}, {0xbb18c000}, {0xbb18e000},
- {0xbb190000}, {0xbb192000}, {0xbb194000}, {0xbb196000},
- {0xbb198000}, {0xbb19a000}, {0xbb19c000}, {0xbb19e000},
- {0xbb1a0000}, {0xbb1a2000}, {0xbb1a4000}, {0xbb1a6000},
- {0xbb1a8000}, {0xbb1aa000}, {0xbb1ac000}, {0xbb1ae000},
- {0xbb1b0000}, {0xbb1b2000}, {0xbb1b4000}, {0xbb1b6000},
- {0xbb1b8000}, {0xbb1ba000}, {0xbb1bc000}, {0xbb1be000},
- {0xbb1c0000}, {0xbb1c2000}, {0xbb1c4000}, {0xbb1c6000},
- {0xbb1c8000}, {0xbb1ca000}, {0xbb1cc000}, {0xbb1ce000},
- {0xbb1d0000}, {0xbb1d2000}, {0xbb1d4000}, {0xbb1d6000},
- {0xbb1d8000}, {0xbb1da000}, {0xbb1dc000}, {0xbb1de000},
- {0xbb1e0000}, {0xbb1e2000}, {0xbb1e4000}, {0xbb1e6000},
- {0xbb1e8000}, {0xbb1ea000}, {0xbb1ec000}, {0xbb1ee000},
- {0xbb1f0000}, {0xbb1f2000}, {0xbb1f4000}, {0xbb1f6000},
- {0xbb1f8000}, {0xbb1fa000}, {0xbb1fc000}, {0xbb1fe000},
- {0xbb200000}, {0xbb202000}, {0xbb204000}, {0xbb206000},
- {0xbb208000}, {0xbb20a000}, {0xbb20c000}, {0xbb20e000},
- {0xbb210000}, {0xbb212000}, {0xbb214000}, {0xbb216000},
- {0xbb218000}, {0xbb21a000}, {0xbb21c000}, {0xbb21e000},
- {0xbb220000}, {0xbb222000}, {0xbb224000}, {0xbb226000},
- {0xbb228000}, {0xbb22a000}, {0xbb22c000}, {0xbb22e000},
- {0xbb230000}, {0xbb232000}, {0xbb234000}, {0xbb236000},
- {0xbb238000}, {0xbb23a000}, {0xbb23c000}, {0xbb23e000},
- {0xbb240000}, {0xbb242000}, {0xbb244000}, {0xbb246000},
- {0xbb248000}, {0xbb24a000}, {0xbb24c000}, {0xbb24e000},
- {0xbb250000}, {0xbb252000}, {0xbb254000}, {0xbb256000},
- {0xbb258000}, {0xbb25a000}, {0xbb25c000}, {0xbb25e000},
- {0xbb260000}, {0xbb262000}, {0xbb264000}, {0xbb266000},
- {0xbb268000}, {0xbb26a000}, {0xbb26c000}, {0xbb26e000},
- {0xbb270000}, {0xbb272000}, {0xbb274000}, {0xbb276000},
- {0xbb278000}, {0xbb27a000}, {0xbb27c000}, {0xbb27e000},
- {0xbb280000}, {0xbb282000}, {0xbb284000}, {0xbb286000},
- {0xbb288000}, {0xbb28a000}, {0xbb28c000}, {0xbb28e000},
- {0xbb290000}, {0xbb292000}, {0xbb294000}, {0xbb296000},
- {0xbb298000}, {0xbb29a000}, {0xbb29c000}, {0xbb29e000},
- {0xbb2a0000}, {0xbb2a2000}, {0xbb2a4000}, {0xbb2a6000},
- {0xbb2a8000}, {0xbb2aa000}, {0xbb2ac000}, {0xbb2ae000},
- {0xbb2b0000}, {0xbb2b2000}, {0xbb2b4000}, {0xbb2b6000},
- {0xbb2b8000}, {0xbb2ba000}, {0xbb2bc000}, {0xbb2be000},
- {0xbb2c0000}, {0xbb2c2000}, {0xbb2c4000}, {0xbb2c6000},
- {0xbb2c8000}, {0xbb2ca000}, {0xbb2cc000}, {0xbb2ce000},
- {0xbb2d0000}, {0xbb2d2000}, {0xbb2d4000}, {0xbb2d6000},
- {0xbb2d8000}, {0xbb2da000}, {0xbb2dc000}, {0xbb2de000},
- {0xbb2e0000}, {0xbb2e2000}, {0xbb2e4000}, {0xbb2e6000},
- {0xbb2e8000}, {0xbb2ea000}, {0xbb2ec000}, {0xbb2ee000},
- {0xbb2f0000}, {0xbb2f2000}, {0xbb2f4000}, {0xbb2f6000},
- {0xbb2f8000}, {0xbb2fa000}, {0xbb2fc000}, {0xbb2fe000},
- {0xbb300000}, {0xbb302000}, {0xbb304000}, {0xbb306000},
- {0xbb308000}, {0xbb30a000}, {0xbb30c000}, {0xbb30e000},
- {0xbb310000}, {0xbb312000}, {0xbb314000}, {0xbb316000},
- {0xbb318000}, {0xbb31a000}, {0xbb31c000}, {0xbb31e000},
- {0xbb320000}, {0xbb322000}, {0xbb324000}, {0xbb326000},
- {0xbb328000}, {0xbb32a000}, {0xbb32c000}, {0xbb32e000},
- {0xbb330000}, {0xbb332000}, {0xbb334000}, {0xbb336000},
- {0xbb338000}, {0xbb33a000}, {0xbb33c000}, {0xbb33e000},
- {0xbb340000}, {0xbb342000}, {0xbb344000}, {0xbb346000},
- {0xbb348000}, {0xbb34a000}, {0xbb34c000}, {0xbb34e000},
- {0xbb350000}, {0xbb352000}, {0xbb354000}, {0xbb356000},
- {0xbb358000}, {0xbb35a000}, {0xbb35c000}, {0xbb35e000},
- {0xbb360000}, {0xbb362000}, {0xbb364000}, {0xbb366000},
- {0xbb368000}, {0xbb36a000}, {0xbb36c000}, {0xbb36e000},
- {0xbb370000}, {0xbb372000}, {0xbb374000}, {0xbb376000},
- {0xbb378000}, {0xbb37a000}, {0xbb37c000}, {0xbb37e000},
- {0xbb380000}, {0xbb382000}, {0xbb384000}, {0xbb386000},
- {0xbb388000}, {0xbb38a000}, {0xbb38c000}, {0xbb38e000},
- {0xbb390000}, {0xbb392000}, {0xbb394000}, {0xbb396000},
- {0xbb398000}, {0xbb39a000}, {0xbb39c000}, {0xbb39e000},
- {0xbb3a0000}, {0xbb3a2000}, {0xbb3a4000}, {0xbb3a6000},
- {0xbb3a8000}, {0xbb3aa000}, {0xbb3ac000}, {0xbb3ae000},
- {0xbb3b0000}, {0xbb3b2000}, {0xbb3b4000}, {0xbb3b6000},
- {0xbb3b8000}, {0xbb3ba000}, {0xbb3bc000}, {0xbb3be000},
- {0xbb3c0000}, {0xbb3c2000}, {0xbb3c4000}, {0xbb3c6000},
- {0xbb3c8000}, {0xbb3ca000}, {0xbb3cc000}, {0xbb3ce000},
- {0xbb3d0000}, {0xbb3d2000}, {0xbb3d4000}, {0xbb3d6000},
- {0xbb3d8000}, {0xbb3da000}, {0xbb3dc000}, {0xbb3de000},
- {0xbb3e0000}, {0xbb3e2000}, {0xbb3e4000}, {0xbb3e6000},
- {0xbb3e8000}, {0xbb3ea000}, {0xbb3ec000}, {0xbb3ee000},
- {0xbb3f0000}, {0xbb3f2000}, {0xbb3f4000}, {0xbb3f6000},
- {0xbb3f8000}, {0xbb3fa000}, {0xbb3fc000}, {0xbb3fe000},
- {0xbb400000}, {0xbb402000}, {0xbb404000}, {0xbb406000},
- {0xbb408000}, {0xbb40a000}, {0xbb40c000}, {0xbb40e000},
- {0xbb410000}, {0xbb412000}, {0xbb414000}, {0xbb416000},
- {0xbb418000}, {0xbb41a000}, {0xbb41c000}, {0xbb41e000},
- {0xbb420000}, {0xbb422000}, {0xbb424000}, {0xbb426000},
- {0xbb428000}, {0xbb42a000}, {0xbb42c000}, {0xbb42e000},
- {0xbb430000}, {0xbb432000}, {0xbb434000}, {0xbb436000},
- {0xbb438000}, {0xbb43a000}, {0xbb43c000}, {0xbb43e000},
- {0xbb440000}, {0xbb442000}, {0xbb444000}, {0xbb446000},
- {0xbb448000}, {0xbb44a000}, {0xbb44c000}, {0xbb44e000},
- {0xbb450000}, {0xbb452000}, {0xbb454000}, {0xbb456000},
- {0xbb458000}, {0xbb45a000}, {0xbb45c000}, {0xbb45e000},
- {0xbb460000}, {0xbb462000}, {0xbb464000}, {0xbb466000},
- {0xbb468000}, {0xbb46a000}, {0xbb46c000}, {0xbb46e000},
- {0xbb470000}, {0xbb472000}, {0xbb474000}, {0xbb476000},
- {0xbb478000}, {0xbb47a000}, {0xbb47c000}, {0xbb47e000},
- {0xbb480000}, {0xbb482000}, {0xbb484000}, {0xbb486000},
- {0xbb488000}, {0xbb48a000}, {0xbb48c000}, {0xbb48e000},
- {0xbb490000}, {0xbb492000}, {0xbb494000}, {0xbb496000},
- {0xbb498000}, {0xbb49a000}, {0xbb49c000}, {0xbb49e000},
- {0xbb4a0000}, {0xbb4a2000}, {0xbb4a4000}, {0xbb4a6000},
- {0xbb4a8000}, {0xbb4aa000}, {0xbb4ac000}, {0xbb4ae000},
- {0xbb4b0000}, {0xbb4b2000}, {0xbb4b4000}, {0xbb4b6000},
- {0xbb4b8000}, {0xbb4ba000}, {0xbb4bc000}, {0xbb4be000},
- {0xbb4c0000}, {0xbb4c2000}, {0xbb4c4000}, {0xbb4c6000},
- {0xbb4c8000}, {0xbb4ca000}, {0xbb4cc000}, {0xbb4ce000},
- {0xbb4d0000}, {0xbb4d2000}, {0xbb4d4000}, {0xbb4d6000},
- {0xbb4d8000}, {0xbb4da000}, {0xbb4dc000}, {0xbb4de000},
- {0xbb4e0000}, {0xbb4e2000}, {0xbb4e4000}, {0xbb4e6000},
- {0xbb4e8000}, {0xbb4ea000}, {0xbb4ec000}, {0xbb4ee000},
- {0xbb4f0000}, {0xbb4f2000}, {0xbb4f4000}, {0xbb4f6000},
- {0xbb4f8000}, {0xbb4fa000}, {0xbb4fc000}, {0xbb4fe000},
- {0xbb500000}, {0xbb502000}, {0xbb504000}, {0xbb506000},
- {0xbb508000}, {0xbb50a000}, {0xbb50c000}, {0xbb50e000},
- {0xbb510000}, {0xbb512000}, {0xbb514000}, {0xbb516000},
- {0xbb518000}, {0xbb51a000}, {0xbb51c000}, {0xbb51e000},
- {0xbb520000}, {0xbb522000}, {0xbb524000}, {0xbb526000},
- {0xbb528000}, {0xbb52a000}, {0xbb52c000}, {0xbb52e000},
- {0xbb530000}, {0xbb532000}, {0xbb534000}, {0xbb536000},
- {0xbb538000}, {0xbb53a000}, {0xbb53c000}, {0xbb53e000},
- {0xbb540000}, {0xbb542000}, {0xbb544000}, {0xbb546000},
- {0xbb548000}, {0xbb54a000}, {0xbb54c000}, {0xbb54e000},
- {0xbb550000}, {0xbb552000}, {0xbb554000}, {0xbb556000},
- {0xbb558000}, {0xbb55a000}, {0xbb55c000}, {0xbb55e000},
- {0xbb560000}, {0xbb562000}, {0xbb564000}, {0xbb566000},
- {0xbb568000}, {0xbb56a000}, {0xbb56c000}, {0xbb56e000},
- {0xbb570000}, {0xbb572000}, {0xbb574000}, {0xbb576000},
- {0xbb578000}, {0xbb57a000}, {0xbb57c000}, {0xbb57e000},
- {0xbb580000}, {0xbb582000}, {0xbb584000}, {0xbb586000},
- {0xbb588000}, {0xbb58a000}, {0xbb58c000}, {0xbb58e000},
- {0xbb590000}, {0xbb592000}, {0xbb594000}, {0xbb596000},
- {0xbb598000}, {0xbb59a000}, {0xbb59c000}, {0xbb59e000},
- {0xbb5a0000}, {0xbb5a2000}, {0xbb5a4000}, {0xbb5a6000},
- {0xbb5a8000}, {0xbb5aa000}, {0xbb5ac000}, {0xbb5ae000},
- {0xbb5b0000}, {0xbb5b2000}, {0xbb5b4000}, {0xbb5b6000},
- {0xbb5b8000}, {0xbb5ba000}, {0xbb5bc000}, {0xbb5be000},
- {0xbb5c0000}, {0xbb5c2000}, {0xbb5c4000}, {0xbb5c6000},
- {0xbb5c8000}, {0xbb5ca000}, {0xbb5cc000}, {0xbb5ce000},
- {0xbb5d0000}, {0xbb5d2000}, {0xbb5d4000}, {0xbb5d6000},
- {0xbb5d8000}, {0xbb5da000}, {0xbb5dc000}, {0xbb5de000},
- {0xbb5e0000}, {0xbb5e2000}, {0xbb5e4000}, {0xbb5e6000},
- {0xbb5e8000}, {0xbb5ea000}, {0xbb5ec000}, {0xbb5ee000},
- {0xbb5f0000}, {0xbb5f2000}, {0xbb5f4000}, {0xbb5f6000},
- {0xbb5f8000}, {0xbb5fa000}, {0xbb5fc000}, {0xbb5fe000},
- {0xbb600000}, {0xbb602000}, {0xbb604000}, {0xbb606000},
- {0xbb608000}, {0xbb60a000}, {0xbb60c000}, {0xbb60e000},
- {0xbb610000}, {0xbb612000}, {0xbb614000}, {0xbb616000},
- {0xbb618000}, {0xbb61a000}, {0xbb61c000}, {0xbb61e000},
- {0xbb620000}, {0xbb622000}, {0xbb624000}, {0xbb626000},
- {0xbb628000}, {0xbb62a000}, {0xbb62c000}, {0xbb62e000},
- {0xbb630000}, {0xbb632000}, {0xbb634000}, {0xbb636000},
- {0xbb638000}, {0xbb63a000}, {0xbb63c000}, {0xbb63e000},
- {0xbb640000}, {0xbb642000}, {0xbb644000}, {0xbb646000},
- {0xbb648000}, {0xbb64a000}, {0xbb64c000}, {0xbb64e000},
- {0xbb650000}, {0xbb652000}, {0xbb654000}, {0xbb656000},
- {0xbb658000}, {0xbb65a000}, {0xbb65c000}, {0xbb65e000},
- {0xbb660000}, {0xbb662000}, {0xbb664000}, {0xbb666000},
- {0xbb668000}, {0xbb66a000}, {0xbb66c000}, {0xbb66e000},
- {0xbb670000}, {0xbb672000}, {0xbb674000}, {0xbb676000},
- {0xbb678000}, {0xbb67a000}, {0xbb67c000}, {0xbb67e000},
- {0xbb680000}, {0xbb682000}, {0xbb684000}, {0xbb686000},
- {0xbb688000}, {0xbb68a000}, {0xbb68c000}, {0xbb68e000},
- {0xbb690000}, {0xbb692000}, {0xbb694000}, {0xbb696000},
- {0xbb698000}, {0xbb69a000}, {0xbb69c000}, {0xbb69e000},
- {0xbb6a0000}, {0xbb6a2000}, {0xbb6a4000}, {0xbb6a6000},
- {0xbb6a8000}, {0xbb6aa000}, {0xbb6ac000}, {0xbb6ae000},
- {0xbb6b0000}, {0xbb6b2000}, {0xbb6b4000}, {0xbb6b6000},
- {0xbb6b8000}, {0xbb6ba000}, {0xbb6bc000}, {0xbb6be000},
- {0xbb6c0000}, {0xbb6c2000}, {0xbb6c4000}, {0xbb6c6000},
- {0xbb6c8000}, {0xbb6ca000}, {0xbb6cc000}, {0xbb6ce000},
- {0xbb6d0000}, {0xbb6d2000}, {0xbb6d4000}, {0xbb6d6000},
- {0xbb6d8000}, {0xbb6da000}, {0xbb6dc000}, {0xbb6de000},
- {0xbb6e0000}, {0xbb6e2000}, {0xbb6e4000}, {0xbb6e6000},
- {0xbb6e8000}, {0xbb6ea000}, {0xbb6ec000}, {0xbb6ee000},
- {0xbb6f0000}, {0xbb6f2000}, {0xbb6f4000}, {0xbb6f6000},
- {0xbb6f8000}, {0xbb6fa000}, {0xbb6fc000}, {0xbb6fe000},
- {0xbb700000}, {0xbb702000}, {0xbb704000}, {0xbb706000},
- {0xbb708000}, {0xbb70a000}, {0xbb70c000}, {0xbb70e000},
- {0xbb710000}, {0xbb712000}, {0xbb714000}, {0xbb716000},
- {0xbb718000}, {0xbb71a000}, {0xbb71c000}, {0xbb71e000},
- {0xbb720000}, {0xbb722000}, {0xbb724000}, {0xbb726000},
- {0xbb728000}, {0xbb72a000}, {0xbb72c000}, {0xbb72e000},
- {0xbb730000}, {0xbb732000}, {0xbb734000}, {0xbb736000},
- {0xbb738000}, {0xbb73a000}, {0xbb73c000}, {0xbb73e000},
- {0xbb740000}, {0xbb742000}, {0xbb744000}, {0xbb746000},
- {0xbb748000}, {0xbb74a000}, {0xbb74c000}, {0xbb74e000},
- {0xbb750000}, {0xbb752000}, {0xbb754000}, {0xbb756000},
- {0xbb758000}, {0xbb75a000}, {0xbb75c000}, {0xbb75e000},
- {0xbb760000}, {0xbb762000}, {0xbb764000}, {0xbb766000},
- {0xbb768000}, {0xbb76a000}, {0xbb76c000}, {0xbb76e000},
- {0xbb770000}, {0xbb772000}, {0xbb774000}, {0xbb776000},
- {0xbb778000}, {0xbb77a000}, {0xbb77c000}, {0xbb77e000},
- {0xbb780000}, {0xbb782000}, {0xbb784000}, {0xbb786000},
- {0xbb788000}, {0xbb78a000}, {0xbb78c000}, {0xbb78e000},
- {0xbb790000}, {0xbb792000}, {0xbb794000}, {0xbb796000},
- {0xbb798000}, {0xbb79a000}, {0xbb79c000}, {0xbb79e000},
- {0xbb7a0000}, {0xbb7a2000}, {0xbb7a4000}, {0xbb7a6000},
- {0xbb7a8000}, {0xbb7aa000}, {0xbb7ac000}, {0xbb7ae000},
- {0xbb7b0000}, {0xbb7b2000}, {0xbb7b4000}, {0xbb7b6000},
- {0xbb7b8000}, {0xbb7ba000}, {0xbb7bc000}, {0xbb7be000},
- {0xbb7c0000}, {0xbb7c2000}, {0xbb7c4000}, {0xbb7c6000},
- {0xbb7c8000}, {0xbb7ca000}, {0xbb7cc000}, {0xbb7ce000},
- {0xbb7d0000}, {0xbb7d2000}, {0xbb7d4000}, {0xbb7d6000},
- {0xbb7d8000}, {0xbb7da000}, {0xbb7dc000}, {0xbb7de000},
- {0xbb7e0000}, {0xbb7e2000}, {0xbb7e4000}, {0xbb7e6000},
- {0xbb7e8000}, {0xbb7ea000}, {0xbb7ec000}, {0xbb7ee000},
- {0xbb7f0000}, {0xbb7f2000}, {0xbb7f4000}, {0xbb7f6000},
- {0xbb7f8000}, {0xbb7fa000}, {0xbb7fc000}, {0xbb7fe000},
- {0xbb800000}, {0xbb802000}, {0xbb804000}, {0xbb806000},
- {0xbb808000}, {0xbb80a000}, {0xbb80c000}, {0xbb80e000},
- {0xbb810000}, {0xbb812000}, {0xbb814000}, {0xbb816000},
- {0xbb818000}, {0xbb81a000}, {0xbb81c000}, {0xbb81e000},
- {0xbb820000}, {0xbb822000}, {0xbb824000}, {0xbb826000},
- {0xbb828000}, {0xbb82a000}, {0xbb82c000}, {0xbb82e000},
- {0xbb830000}, {0xbb832000}, {0xbb834000}, {0xbb836000},
- {0xbb838000}, {0xbb83a000}, {0xbb83c000}, {0xbb83e000},
- {0xbb840000}, {0xbb842000}, {0xbb844000}, {0xbb846000},
- {0xbb848000}, {0xbb84a000}, {0xbb84c000}, {0xbb84e000},
- {0xbb850000}, {0xbb852000}, {0xbb854000}, {0xbb856000},
- {0xbb858000}, {0xbb85a000}, {0xbb85c000}, {0xbb85e000},
- {0xbb860000}, {0xbb862000}, {0xbb864000}, {0xbb866000},
- {0xbb868000}, {0xbb86a000}, {0xbb86c000}, {0xbb86e000},
- {0xbb870000}, {0xbb872000}, {0xbb874000}, {0xbb876000},
- {0xbb878000}, {0xbb87a000}, {0xbb87c000}, {0xbb87e000},
- {0xbb880000}, {0xbb882000}, {0xbb884000}, {0xbb886000},
- {0xbb888000}, {0xbb88a000}, {0xbb88c000}, {0xbb88e000},
- {0xbb890000}, {0xbb892000}, {0xbb894000}, {0xbb896000},
- {0xbb898000}, {0xbb89a000}, {0xbb89c000}, {0xbb89e000},
- {0xbb8a0000}, {0xbb8a2000}, {0xbb8a4000}, {0xbb8a6000},
- {0xbb8a8000}, {0xbb8aa000}, {0xbb8ac000}, {0xbb8ae000},
- {0xbb8b0000}, {0xbb8b2000}, {0xbb8b4000}, {0xbb8b6000},
- {0xbb8b8000}, {0xbb8ba000}, {0xbb8bc000}, {0xbb8be000},
- {0xbb8c0000}, {0xbb8c2000}, {0xbb8c4000}, {0xbb8c6000},
- {0xbb8c8000}, {0xbb8ca000}, {0xbb8cc000}, {0xbb8ce000},
- {0xbb8d0000}, {0xbb8d2000}, {0xbb8d4000}, {0xbb8d6000},
- {0xbb8d8000}, {0xbb8da000}, {0xbb8dc000}, {0xbb8de000},
- {0xbb8e0000}, {0xbb8e2000}, {0xbb8e4000}, {0xbb8e6000},
- {0xbb8e8000}, {0xbb8ea000}, {0xbb8ec000}, {0xbb8ee000},
- {0xbb8f0000}, {0xbb8f2000}, {0xbb8f4000}, {0xbb8f6000},
- {0xbb8f8000}, {0xbb8fa000}, {0xbb8fc000}, {0xbb8fe000},
- {0xbb900000}, {0xbb902000}, {0xbb904000}, {0xbb906000},
- {0xbb908000}, {0xbb90a000}, {0xbb90c000}, {0xbb90e000},
- {0xbb910000}, {0xbb912000}, {0xbb914000}, {0xbb916000},
- {0xbb918000}, {0xbb91a000}, {0xbb91c000}, {0xbb91e000},
- {0xbb920000}, {0xbb922000}, {0xbb924000}, {0xbb926000},
- {0xbb928000}, {0xbb92a000}, {0xbb92c000}, {0xbb92e000},
- {0xbb930000}, {0xbb932000}, {0xbb934000}, {0xbb936000},
- {0xbb938000}, {0xbb93a000}, {0xbb93c000}, {0xbb93e000},
- {0xbb940000}, {0xbb942000}, {0xbb944000}, {0xbb946000},
- {0xbb948000}, {0xbb94a000}, {0xbb94c000}, {0xbb94e000},
- {0xbb950000}, {0xbb952000}, {0xbb954000}, {0xbb956000},
- {0xbb958000}, {0xbb95a000}, {0xbb95c000}, {0xbb95e000},
- {0xbb960000}, {0xbb962000}, {0xbb964000}, {0xbb966000},
- {0xbb968000}, {0xbb96a000}, {0xbb96c000}, {0xbb96e000},
- {0xbb970000}, {0xbb972000}, {0xbb974000}, {0xbb976000},
- {0xbb978000}, {0xbb97a000}, {0xbb97c000}, {0xbb97e000},
- {0xbb980000}, {0xbb982000}, {0xbb984000}, {0xbb986000},
- {0xbb988000}, {0xbb98a000}, {0xbb98c000}, {0xbb98e000},
- {0xbb990000}, {0xbb992000}, {0xbb994000}, {0xbb996000},
- {0xbb998000}, {0xbb99a000}, {0xbb99c000}, {0xbb99e000},
- {0xbb9a0000}, {0xbb9a2000}, {0xbb9a4000}, {0xbb9a6000},
- {0xbb9a8000}, {0xbb9aa000}, {0xbb9ac000}, {0xbb9ae000},
- {0xbb9b0000}, {0xbb9b2000}, {0xbb9b4000}, {0xbb9b6000},
- {0xbb9b8000}, {0xbb9ba000}, {0xbb9bc000}, {0xbb9be000},
- {0xbb9c0000}, {0xbb9c2000}, {0xbb9c4000}, {0xbb9c6000},
- {0xbb9c8000}, {0xbb9ca000}, {0xbb9cc000}, {0xbb9ce000},
- {0xbb9d0000}, {0xbb9d2000}, {0xbb9d4000}, {0xbb9d6000},
- {0xbb9d8000}, {0xbb9da000}, {0xbb9dc000}, {0xbb9de000},
- {0xbb9e0000}, {0xbb9e2000}, {0xbb9e4000}, {0xbb9e6000},
- {0xbb9e8000}, {0xbb9ea000}, {0xbb9ec000}, {0xbb9ee000},
- {0xbb9f0000}, {0xbb9f2000}, {0xbb9f4000}, {0xbb9f6000},
- {0xbb9f8000}, {0xbb9fa000}, {0xbb9fc000}, {0xbb9fe000},
- {0xbba00000}, {0xbba02000}, {0xbba04000}, {0xbba06000},
- {0xbba08000}, {0xbba0a000}, {0xbba0c000}, {0xbba0e000},
- {0xbba10000}, {0xbba12000}, {0xbba14000}, {0xbba16000},
- {0xbba18000}, {0xbba1a000}, {0xbba1c000}, {0xbba1e000},
- {0xbba20000}, {0xbba22000}, {0xbba24000}, {0xbba26000},
- {0xbba28000}, {0xbba2a000}, {0xbba2c000}, {0xbba2e000},
- {0xbba30000}, {0xbba32000}, {0xbba34000}, {0xbba36000},
- {0xbba38000}, {0xbba3a000}, {0xbba3c000}, {0xbba3e000},
- {0xbba40000}, {0xbba42000}, {0xbba44000}, {0xbba46000},
- {0xbba48000}, {0xbba4a000}, {0xbba4c000}, {0xbba4e000},
- {0xbba50000}, {0xbba52000}, {0xbba54000}, {0xbba56000},
- {0xbba58000}, {0xbba5a000}, {0xbba5c000}, {0xbba5e000},
- {0xbba60000}, {0xbba62000}, {0xbba64000}, {0xbba66000},
- {0xbba68000}, {0xbba6a000}, {0xbba6c000}, {0xbba6e000},
- {0xbba70000}, {0xbba72000}, {0xbba74000}, {0xbba76000},
- {0xbba78000}, {0xbba7a000}, {0xbba7c000}, {0xbba7e000},
- {0xbba80000}, {0xbba82000}, {0xbba84000}, {0xbba86000},
- {0xbba88000}, {0xbba8a000}, {0xbba8c000}, {0xbba8e000},
- {0xbba90000}, {0xbba92000}, {0xbba94000}, {0xbba96000},
- {0xbba98000}, {0xbba9a000}, {0xbba9c000}, {0xbba9e000},
- {0xbbaa0000}, {0xbbaa2000}, {0xbbaa4000}, {0xbbaa6000},
- {0xbbaa8000}, {0xbbaaa000}, {0xbbaac000}, {0xbbaae000},
- {0xbbab0000}, {0xbbab2000}, {0xbbab4000}, {0xbbab6000},
- {0xbbab8000}, {0xbbaba000}, {0xbbabc000}, {0xbbabe000},
- {0xbbac0000}, {0xbbac2000}, {0xbbac4000}, {0xbbac6000},
- {0xbbac8000}, {0xbbaca000}, {0xbbacc000}, {0xbbace000},
- {0xbbad0000}, {0xbbad2000}, {0xbbad4000}, {0xbbad6000},
- {0xbbad8000}, {0xbbada000}, {0xbbadc000}, {0xbbade000},
- {0xbbae0000}, {0xbbae2000}, {0xbbae4000}, {0xbbae6000},
- {0xbbae8000}, {0xbbaea000}, {0xbbaec000}, {0xbbaee000},
- {0xbbaf0000}, {0xbbaf2000}, {0xbbaf4000}, {0xbbaf6000},
- {0xbbaf8000}, {0xbbafa000}, {0xbbafc000}, {0xbbafe000},
- {0xbbb00000}, {0xbbb02000}, {0xbbb04000}, {0xbbb06000},
- {0xbbb08000}, {0xbbb0a000}, {0xbbb0c000}, {0xbbb0e000},
- {0xbbb10000}, {0xbbb12000}, {0xbbb14000}, {0xbbb16000},
- {0xbbb18000}, {0xbbb1a000}, {0xbbb1c000}, {0xbbb1e000},
- {0xbbb20000}, {0xbbb22000}, {0xbbb24000}, {0xbbb26000},
- {0xbbb28000}, {0xbbb2a000}, {0xbbb2c000}, {0xbbb2e000},
- {0xbbb30000}, {0xbbb32000}, {0xbbb34000}, {0xbbb36000},
- {0xbbb38000}, {0xbbb3a000}, {0xbbb3c000}, {0xbbb3e000},
- {0xbbb40000}, {0xbbb42000}, {0xbbb44000}, {0xbbb46000},
- {0xbbb48000}, {0xbbb4a000}, {0xbbb4c000}, {0xbbb4e000},
- {0xbbb50000}, {0xbbb52000}, {0xbbb54000}, {0xbbb56000},
- {0xbbb58000}, {0xbbb5a000}, {0xbbb5c000}, {0xbbb5e000},
- {0xbbb60000}, {0xbbb62000}, {0xbbb64000}, {0xbbb66000},
- {0xbbb68000}, {0xbbb6a000}, {0xbbb6c000}, {0xbbb6e000},
- {0xbbb70000}, {0xbbb72000}, {0xbbb74000}, {0xbbb76000},
- {0xbbb78000}, {0xbbb7a000}, {0xbbb7c000}, {0xbbb7e000},
- {0xbbb80000}, {0xbbb82000}, {0xbbb84000}, {0xbbb86000},
- {0xbbb88000}, {0xbbb8a000}, {0xbbb8c000}, {0xbbb8e000},
- {0xbbb90000}, {0xbbb92000}, {0xbbb94000}, {0xbbb96000},
- {0xbbb98000}, {0xbbb9a000}, {0xbbb9c000}, {0xbbb9e000},
- {0xbbba0000}, {0xbbba2000}, {0xbbba4000}, {0xbbba6000},
- {0xbbba8000}, {0xbbbaa000}, {0xbbbac000}, {0xbbbae000},
- {0xbbbb0000}, {0xbbbb2000}, {0xbbbb4000}, {0xbbbb6000},
- {0xbbbb8000}, {0xbbbba000}, {0xbbbbc000}, {0xbbbbe000},
- {0xbbbc0000}, {0xbbbc2000}, {0xbbbc4000}, {0xbbbc6000},
- {0xbbbc8000}, {0xbbbca000}, {0xbbbcc000}, {0xbbbce000},
- {0xbbbd0000}, {0xbbbd2000}, {0xbbbd4000}, {0xbbbd6000},
- {0xbbbd8000}, {0xbbbda000}, {0xbbbdc000}, {0xbbbde000},
- {0xbbbe0000}, {0xbbbe2000}, {0xbbbe4000}, {0xbbbe6000},
- {0xbbbe8000}, {0xbbbea000}, {0xbbbec000}, {0xbbbee000},
- {0xbbbf0000}, {0xbbbf2000}, {0xbbbf4000}, {0xbbbf6000},
- {0xbbbf8000}, {0xbbbfa000}, {0xbbbfc000}, {0xbbbfe000},
- {0xbbc00000}, {0xbbc02000}, {0xbbc04000}, {0xbbc06000},
- {0xbbc08000}, {0xbbc0a000}, {0xbbc0c000}, {0xbbc0e000},
- {0xbbc10000}, {0xbbc12000}, {0xbbc14000}, {0xbbc16000},
- {0xbbc18000}, {0xbbc1a000}, {0xbbc1c000}, {0xbbc1e000},
- {0xbbc20000}, {0xbbc22000}, {0xbbc24000}, {0xbbc26000},
- {0xbbc28000}, {0xbbc2a000}, {0xbbc2c000}, {0xbbc2e000},
- {0xbbc30000}, {0xbbc32000}, {0xbbc34000}, {0xbbc36000},
- {0xbbc38000}, {0xbbc3a000}, {0xbbc3c000}, {0xbbc3e000},
- {0xbbc40000}, {0xbbc42000}, {0xbbc44000}, {0xbbc46000},
- {0xbbc48000}, {0xbbc4a000}, {0xbbc4c000}, {0xbbc4e000},
- {0xbbc50000}, {0xbbc52000}, {0xbbc54000}, {0xbbc56000},
- {0xbbc58000}, {0xbbc5a000}, {0xbbc5c000}, {0xbbc5e000},
- {0xbbc60000}, {0xbbc62000}, {0xbbc64000}, {0xbbc66000},
- {0xbbc68000}, {0xbbc6a000}, {0xbbc6c000}, {0xbbc6e000},
- {0xbbc70000}, {0xbbc72000}, {0xbbc74000}, {0xbbc76000},
- {0xbbc78000}, {0xbbc7a000}, {0xbbc7c000}, {0xbbc7e000},
- {0xbbc80000}, {0xbbc82000}, {0xbbc84000}, {0xbbc86000},
- {0xbbc88000}, {0xbbc8a000}, {0xbbc8c000}, {0xbbc8e000},
- {0xbbc90000}, {0xbbc92000}, {0xbbc94000}, {0xbbc96000},
- {0xbbc98000}, {0xbbc9a000}, {0xbbc9c000}, {0xbbc9e000},
- {0xbbca0000}, {0xbbca2000}, {0xbbca4000}, {0xbbca6000},
- {0xbbca8000}, {0xbbcaa000}, {0xbbcac000}, {0xbbcae000},
- {0xbbcb0000}, {0xbbcb2000}, {0xbbcb4000}, {0xbbcb6000},
- {0xbbcb8000}, {0xbbcba000}, {0xbbcbc000}, {0xbbcbe000},
- {0xbbcc0000}, {0xbbcc2000}, {0xbbcc4000}, {0xbbcc6000},
- {0xbbcc8000}, {0xbbcca000}, {0xbbccc000}, {0xbbcce000},
- {0xbbcd0000}, {0xbbcd2000}, {0xbbcd4000}, {0xbbcd6000},
- {0xbbcd8000}, {0xbbcda000}, {0xbbcdc000}, {0xbbcde000},
- {0xbbce0000}, {0xbbce2000}, {0xbbce4000}, {0xbbce6000},
- {0xbbce8000}, {0xbbcea000}, {0xbbcec000}, {0xbbcee000},
- {0xbbcf0000}, {0xbbcf2000}, {0xbbcf4000}, {0xbbcf6000},
- {0xbbcf8000}, {0xbbcfa000}, {0xbbcfc000}, {0xbbcfe000},
- {0xbbd00000}, {0xbbd02000}, {0xbbd04000}, {0xbbd06000},
- {0xbbd08000}, {0xbbd0a000}, {0xbbd0c000}, {0xbbd0e000},
- {0xbbd10000}, {0xbbd12000}, {0xbbd14000}, {0xbbd16000},
- {0xbbd18000}, {0xbbd1a000}, {0xbbd1c000}, {0xbbd1e000},
- {0xbbd20000}, {0xbbd22000}, {0xbbd24000}, {0xbbd26000},
- {0xbbd28000}, {0xbbd2a000}, {0xbbd2c000}, {0xbbd2e000},
- {0xbbd30000}, {0xbbd32000}, {0xbbd34000}, {0xbbd36000},
- {0xbbd38000}, {0xbbd3a000}, {0xbbd3c000}, {0xbbd3e000},
- {0xbbd40000}, {0xbbd42000}, {0xbbd44000}, {0xbbd46000},
- {0xbbd48000}, {0xbbd4a000}, {0xbbd4c000}, {0xbbd4e000},
- {0xbbd50000}, {0xbbd52000}, {0xbbd54000}, {0xbbd56000},
- {0xbbd58000}, {0xbbd5a000}, {0xbbd5c000}, {0xbbd5e000},
- {0xbbd60000}, {0xbbd62000}, {0xbbd64000}, {0xbbd66000},
- {0xbbd68000}, {0xbbd6a000}, {0xbbd6c000}, {0xbbd6e000},
- {0xbbd70000}, {0xbbd72000}, {0xbbd74000}, {0xbbd76000},
- {0xbbd78000}, {0xbbd7a000}, {0xbbd7c000}, {0xbbd7e000},
- {0xbbd80000}, {0xbbd82000}, {0xbbd84000}, {0xbbd86000},
- {0xbbd88000}, {0xbbd8a000}, {0xbbd8c000}, {0xbbd8e000},
- {0xbbd90000}, {0xbbd92000}, {0xbbd94000}, {0xbbd96000},
- {0xbbd98000}, {0xbbd9a000}, {0xbbd9c000}, {0xbbd9e000},
- {0xbbda0000}, {0xbbda2000}, {0xbbda4000}, {0xbbda6000},
- {0xbbda8000}, {0xbbdaa000}, {0xbbdac000}, {0xbbdae000},
- {0xbbdb0000}, {0xbbdb2000}, {0xbbdb4000}, {0xbbdb6000},
- {0xbbdb8000}, {0xbbdba000}, {0xbbdbc000}, {0xbbdbe000},
- {0xbbdc0000}, {0xbbdc2000}, {0xbbdc4000}, {0xbbdc6000},
- {0xbbdc8000}, {0xbbdca000}, {0xbbdcc000}, {0xbbdce000},
- {0xbbdd0000}, {0xbbdd2000}, {0xbbdd4000}, {0xbbdd6000},
- {0xbbdd8000}, {0xbbdda000}, {0xbbddc000}, {0xbbdde000},
- {0xbbde0000}, {0xbbde2000}, {0xbbde4000}, {0xbbde6000},
- {0xbbde8000}, {0xbbdea000}, {0xbbdec000}, {0xbbdee000},
- {0xbbdf0000}, {0xbbdf2000}, {0xbbdf4000}, {0xbbdf6000},
- {0xbbdf8000}, {0xbbdfa000}, {0xbbdfc000}, {0xbbdfe000},
- {0xbbe00000}, {0xbbe02000}, {0xbbe04000}, {0xbbe06000},
- {0xbbe08000}, {0xbbe0a000}, {0xbbe0c000}, {0xbbe0e000},
- {0xbbe10000}, {0xbbe12000}, {0xbbe14000}, {0xbbe16000},
- {0xbbe18000}, {0xbbe1a000}, {0xbbe1c000}, {0xbbe1e000},
- {0xbbe20000}, {0xbbe22000}, {0xbbe24000}, {0xbbe26000},
- {0xbbe28000}, {0xbbe2a000}, {0xbbe2c000}, {0xbbe2e000},
- {0xbbe30000}, {0xbbe32000}, {0xbbe34000}, {0xbbe36000},
- {0xbbe38000}, {0xbbe3a000}, {0xbbe3c000}, {0xbbe3e000},
- {0xbbe40000}, {0xbbe42000}, {0xbbe44000}, {0xbbe46000},
- {0xbbe48000}, {0xbbe4a000}, {0xbbe4c000}, {0xbbe4e000},
- {0xbbe50000}, {0xbbe52000}, {0xbbe54000}, {0xbbe56000},
- {0xbbe58000}, {0xbbe5a000}, {0xbbe5c000}, {0xbbe5e000},
- {0xbbe60000}, {0xbbe62000}, {0xbbe64000}, {0xbbe66000},
- {0xbbe68000}, {0xbbe6a000}, {0xbbe6c000}, {0xbbe6e000},
- {0xbbe70000}, {0xbbe72000}, {0xbbe74000}, {0xbbe76000},
- {0xbbe78000}, {0xbbe7a000}, {0xbbe7c000}, {0xbbe7e000},
- {0xbbe80000}, {0xbbe82000}, {0xbbe84000}, {0xbbe86000},
- {0xbbe88000}, {0xbbe8a000}, {0xbbe8c000}, {0xbbe8e000},
- {0xbbe90000}, {0xbbe92000}, {0xbbe94000}, {0xbbe96000},
- {0xbbe98000}, {0xbbe9a000}, {0xbbe9c000}, {0xbbe9e000},
- {0xbbea0000}, {0xbbea2000}, {0xbbea4000}, {0xbbea6000},
- {0xbbea8000}, {0xbbeaa000}, {0xbbeac000}, {0xbbeae000},
- {0xbbeb0000}, {0xbbeb2000}, {0xbbeb4000}, {0xbbeb6000},
- {0xbbeb8000}, {0xbbeba000}, {0xbbebc000}, {0xbbebe000},
- {0xbbec0000}, {0xbbec2000}, {0xbbec4000}, {0xbbec6000},
- {0xbbec8000}, {0xbbeca000}, {0xbbecc000}, {0xbbece000},
- {0xbbed0000}, {0xbbed2000}, {0xbbed4000}, {0xbbed6000},
- {0xbbed8000}, {0xbbeda000}, {0xbbedc000}, {0xbbede000},
- {0xbbee0000}, {0xbbee2000}, {0xbbee4000}, {0xbbee6000},
- {0xbbee8000}, {0xbbeea000}, {0xbbeec000}, {0xbbeee000},
- {0xbbef0000}, {0xbbef2000}, {0xbbef4000}, {0xbbef6000},
- {0xbbef8000}, {0xbbefa000}, {0xbbefc000}, {0xbbefe000},
- {0xbbf00000}, {0xbbf02000}, {0xbbf04000}, {0xbbf06000},
- {0xbbf08000}, {0xbbf0a000}, {0xbbf0c000}, {0xbbf0e000},
- {0xbbf10000}, {0xbbf12000}, {0xbbf14000}, {0xbbf16000},
- {0xbbf18000}, {0xbbf1a000}, {0xbbf1c000}, {0xbbf1e000},
- {0xbbf20000}, {0xbbf22000}, {0xbbf24000}, {0xbbf26000},
- {0xbbf28000}, {0xbbf2a000}, {0xbbf2c000}, {0xbbf2e000},
- {0xbbf30000}, {0xbbf32000}, {0xbbf34000}, {0xbbf36000},
- {0xbbf38000}, {0xbbf3a000}, {0xbbf3c000}, {0xbbf3e000},
- {0xbbf40000}, {0xbbf42000}, {0xbbf44000}, {0xbbf46000},
- {0xbbf48000}, {0xbbf4a000}, {0xbbf4c000}, {0xbbf4e000},
- {0xbbf50000}, {0xbbf52000}, {0xbbf54000}, {0xbbf56000},
- {0xbbf58000}, {0xbbf5a000}, {0xbbf5c000}, {0xbbf5e000},
- {0xbbf60000}, {0xbbf62000}, {0xbbf64000}, {0xbbf66000},
- {0xbbf68000}, {0xbbf6a000}, {0xbbf6c000}, {0xbbf6e000},
- {0xbbf70000}, {0xbbf72000}, {0xbbf74000}, {0xbbf76000},
- {0xbbf78000}, {0xbbf7a000}, {0xbbf7c000}, {0xbbf7e000},
- {0xbbf80000}, {0xbbf82000}, {0xbbf84000}, {0xbbf86000},
- {0xbbf88000}, {0xbbf8a000}, {0xbbf8c000}, {0xbbf8e000},
- {0xbbf90000}, {0xbbf92000}, {0xbbf94000}, {0xbbf96000},
- {0xbbf98000}, {0xbbf9a000}, {0xbbf9c000}, {0xbbf9e000},
- {0xbbfa0000}, {0xbbfa2000}, {0xbbfa4000}, {0xbbfa6000},
- {0xbbfa8000}, {0xbbfaa000}, {0xbbfac000}, {0xbbfae000},
- {0xbbfb0000}, {0xbbfb2000}, {0xbbfb4000}, {0xbbfb6000},
- {0xbbfb8000}, {0xbbfba000}, {0xbbfbc000}, {0xbbfbe000},
- {0xbbfc0000}, {0xbbfc2000}, {0xbbfc4000}, {0xbbfc6000},
- {0xbbfc8000}, {0xbbfca000}, {0xbbfcc000}, {0xbbfce000},
- {0xbbfd0000}, {0xbbfd2000}, {0xbbfd4000}, {0xbbfd6000},
- {0xbbfd8000}, {0xbbfda000}, {0xbbfdc000}, {0xbbfde000},
- {0xbbfe0000}, {0xbbfe2000}, {0xbbfe4000}, {0xbbfe6000},
- {0xbbfe8000}, {0xbbfea000}, {0xbbfec000}, {0xbbfee000},
- {0xbbff0000}, {0xbbff2000}, {0xbbff4000}, {0xbbff6000},
- {0xbbff8000}, {0xbbffa000}, {0xbbffc000}, {0xbbffe000},
- {0xbc000000}, {0xbc002000}, {0xbc004000}, {0xbc006000},
- {0xbc008000}, {0xbc00a000}, {0xbc00c000}, {0xbc00e000},
- {0xbc010000}, {0xbc012000}, {0xbc014000}, {0xbc016000},
- {0xbc018000}, {0xbc01a000}, {0xbc01c000}, {0xbc01e000},
- {0xbc020000}, {0xbc022000}, {0xbc024000}, {0xbc026000},
- {0xbc028000}, {0xbc02a000}, {0xbc02c000}, {0xbc02e000},
- {0xbc030000}, {0xbc032000}, {0xbc034000}, {0xbc036000},
- {0xbc038000}, {0xbc03a000}, {0xbc03c000}, {0xbc03e000},
- {0xbc040000}, {0xbc042000}, {0xbc044000}, {0xbc046000},
- {0xbc048000}, {0xbc04a000}, {0xbc04c000}, {0xbc04e000},
- {0xbc050000}, {0xbc052000}, {0xbc054000}, {0xbc056000},
- {0xbc058000}, {0xbc05a000}, {0xbc05c000}, {0xbc05e000},
- {0xbc060000}, {0xbc062000}, {0xbc064000}, {0xbc066000},
- {0xbc068000}, {0xbc06a000}, {0xbc06c000}, {0xbc06e000},
- {0xbc070000}, {0xbc072000}, {0xbc074000}, {0xbc076000},
- {0xbc078000}, {0xbc07a000}, {0xbc07c000}, {0xbc07e000},
- {0xbc080000}, {0xbc082000}, {0xbc084000}, {0xbc086000},
- {0xbc088000}, {0xbc08a000}, {0xbc08c000}, {0xbc08e000},
- {0xbc090000}, {0xbc092000}, {0xbc094000}, {0xbc096000},
- {0xbc098000}, {0xbc09a000}, {0xbc09c000}, {0xbc09e000},
- {0xbc0a0000}, {0xbc0a2000}, {0xbc0a4000}, {0xbc0a6000},
- {0xbc0a8000}, {0xbc0aa000}, {0xbc0ac000}, {0xbc0ae000},
- {0xbc0b0000}, {0xbc0b2000}, {0xbc0b4000}, {0xbc0b6000},
- {0xbc0b8000}, {0xbc0ba000}, {0xbc0bc000}, {0xbc0be000},
- {0xbc0c0000}, {0xbc0c2000}, {0xbc0c4000}, {0xbc0c6000},
- {0xbc0c8000}, {0xbc0ca000}, {0xbc0cc000}, {0xbc0ce000},
- {0xbc0d0000}, {0xbc0d2000}, {0xbc0d4000}, {0xbc0d6000},
- {0xbc0d8000}, {0xbc0da000}, {0xbc0dc000}, {0xbc0de000},
- {0xbc0e0000}, {0xbc0e2000}, {0xbc0e4000}, {0xbc0e6000},
- {0xbc0e8000}, {0xbc0ea000}, {0xbc0ec000}, {0xbc0ee000},
- {0xbc0f0000}, {0xbc0f2000}, {0xbc0f4000}, {0xbc0f6000},
- {0xbc0f8000}, {0xbc0fa000}, {0xbc0fc000}, {0xbc0fe000},
- {0xbc100000}, {0xbc102000}, {0xbc104000}, {0xbc106000},
- {0xbc108000}, {0xbc10a000}, {0xbc10c000}, {0xbc10e000},
- {0xbc110000}, {0xbc112000}, {0xbc114000}, {0xbc116000},
- {0xbc118000}, {0xbc11a000}, {0xbc11c000}, {0xbc11e000},
- {0xbc120000}, {0xbc122000}, {0xbc124000}, {0xbc126000},
- {0xbc128000}, {0xbc12a000}, {0xbc12c000}, {0xbc12e000},
- {0xbc130000}, {0xbc132000}, {0xbc134000}, {0xbc136000},
- {0xbc138000}, {0xbc13a000}, {0xbc13c000}, {0xbc13e000},
- {0xbc140000}, {0xbc142000}, {0xbc144000}, {0xbc146000},
- {0xbc148000}, {0xbc14a000}, {0xbc14c000}, {0xbc14e000},
- {0xbc150000}, {0xbc152000}, {0xbc154000}, {0xbc156000},
- {0xbc158000}, {0xbc15a000}, {0xbc15c000}, {0xbc15e000},
- {0xbc160000}, {0xbc162000}, {0xbc164000}, {0xbc166000},
- {0xbc168000}, {0xbc16a000}, {0xbc16c000}, {0xbc16e000},
- {0xbc170000}, {0xbc172000}, {0xbc174000}, {0xbc176000},
- {0xbc178000}, {0xbc17a000}, {0xbc17c000}, {0xbc17e000},
- {0xbc180000}, {0xbc182000}, {0xbc184000}, {0xbc186000},
- {0xbc188000}, {0xbc18a000}, {0xbc18c000}, {0xbc18e000},
- {0xbc190000}, {0xbc192000}, {0xbc194000}, {0xbc196000},
- {0xbc198000}, {0xbc19a000}, {0xbc19c000}, {0xbc19e000},
- {0xbc1a0000}, {0xbc1a2000}, {0xbc1a4000}, {0xbc1a6000},
- {0xbc1a8000}, {0xbc1aa000}, {0xbc1ac000}, {0xbc1ae000},
- {0xbc1b0000}, {0xbc1b2000}, {0xbc1b4000}, {0xbc1b6000},
- {0xbc1b8000}, {0xbc1ba000}, {0xbc1bc000}, {0xbc1be000},
- {0xbc1c0000}, {0xbc1c2000}, {0xbc1c4000}, {0xbc1c6000},
- {0xbc1c8000}, {0xbc1ca000}, {0xbc1cc000}, {0xbc1ce000},
- {0xbc1d0000}, {0xbc1d2000}, {0xbc1d4000}, {0xbc1d6000},
- {0xbc1d8000}, {0xbc1da000}, {0xbc1dc000}, {0xbc1de000},
- {0xbc1e0000}, {0xbc1e2000}, {0xbc1e4000}, {0xbc1e6000},
- {0xbc1e8000}, {0xbc1ea000}, {0xbc1ec000}, {0xbc1ee000},
- {0xbc1f0000}, {0xbc1f2000}, {0xbc1f4000}, {0xbc1f6000},
- {0xbc1f8000}, {0xbc1fa000}, {0xbc1fc000}, {0xbc1fe000},
- {0xbc200000}, {0xbc202000}, {0xbc204000}, {0xbc206000},
- {0xbc208000}, {0xbc20a000}, {0xbc20c000}, {0xbc20e000},
- {0xbc210000}, {0xbc212000}, {0xbc214000}, {0xbc216000},
- {0xbc218000}, {0xbc21a000}, {0xbc21c000}, {0xbc21e000},
- {0xbc220000}, {0xbc222000}, {0xbc224000}, {0xbc226000},
- {0xbc228000}, {0xbc22a000}, {0xbc22c000}, {0xbc22e000},
- {0xbc230000}, {0xbc232000}, {0xbc234000}, {0xbc236000},
- {0xbc238000}, {0xbc23a000}, {0xbc23c000}, {0xbc23e000},
- {0xbc240000}, {0xbc242000}, {0xbc244000}, {0xbc246000},
- {0xbc248000}, {0xbc24a000}, {0xbc24c000}, {0xbc24e000},
- {0xbc250000}, {0xbc252000}, {0xbc254000}, {0xbc256000},
- {0xbc258000}, {0xbc25a000}, {0xbc25c000}, {0xbc25e000},
- {0xbc260000}, {0xbc262000}, {0xbc264000}, {0xbc266000},
- {0xbc268000}, {0xbc26a000}, {0xbc26c000}, {0xbc26e000},
- {0xbc270000}, {0xbc272000}, {0xbc274000}, {0xbc276000},
- {0xbc278000}, {0xbc27a000}, {0xbc27c000}, {0xbc27e000},
- {0xbc280000}, {0xbc282000}, {0xbc284000}, {0xbc286000},
- {0xbc288000}, {0xbc28a000}, {0xbc28c000}, {0xbc28e000},
- {0xbc290000}, {0xbc292000}, {0xbc294000}, {0xbc296000},
- {0xbc298000}, {0xbc29a000}, {0xbc29c000}, {0xbc29e000},
- {0xbc2a0000}, {0xbc2a2000}, {0xbc2a4000}, {0xbc2a6000},
- {0xbc2a8000}, {0xbc2aa000}, {0xbc2ac000}, {0xbc2ae000},
- {0xbc2b0000}, {0xbc2b2000}, {0xbc2b4000}, {0xbc2b6000},
- {0xbc2b8000}, {0xbc2ba000}, {0xbc2bc000}, {0xbc2be000},
- {0xbc2c0000}, {0xbc2c2000}, {0xbc2c4000}, {0xbc2c6000},
- {0xbc2c8000}, {0xbc2ca000}, {0xbc2cc000}, {0xbc2ce000},
- {0xbc2d0000}, {0xbc2d2000}, {0xbc2d4000}, {0xbc2d6000},
- {0xbc2d8000}, {0xbc2da000}, {0xbc2dc000}, {0xbc2de000},
- {0xbc2e0000}, {0xbc2e2000}, {0xbc2e4000}, {0xbc2e6000},
- {0xbc2e8000}, {0xbc2ea000}, {0xbc2ec000}, {0xbc2ee000},
- {0xbc2f0000}, {0xbc2f2000}, {0xbc2f4000}, {0xbc2f6000},
- {0xbc2f8000}, {0xbc2fa000}, {0xbc2fc000}, {0xbc2fe000},
- {0xbc300000}, {0xbc302000}, {0xbc304000}, {0xbc306000},
- {0xbc308000}, {0xbc30a000}, {0xbc30c000}, {0xbc30e000},
- {0xbc310000}, {0xbc312000}, {0xbc314000}, {0xbc316000},
- {0xbc318000}, {0xbc31a000}, {0xbc31c000}, {0xbc31e000},
- {0xbc320000}, {0xbc322000}, {0xbc324000}, {0xbc326000},
- {0xbc328000}, {0xbc32a000}, {0xbc32c000}, {0xbc32e000},
- {0xbc330000}, {0xbc332000}, {0xbc334000}, {0xbc336000},
- {0xbc338000}, {0xbc33a000}, {0xbc33c000}, {0xbc33e000},
- {0xbc340000}, {0xbc342000}, {0xbc344000}, {0xbc346000},
- {0xbc348000}, {0xbc34a000}, {0xbc34c000}, {0xbc34e000},
- {0xbc350000}, {0xbc352000}, {0xbc354000}, {0xbc356000},
- {0xbc358000}, {0xbc35a000}, {0xbc35c000}, {0xbc35e000},
- {0xbc360000}, {0xbc362000}, {0xbc364000}, {0xbc366000},
- {0xbc368000}, {0xbc36a000}, {0xbc36c000}, {0xbc36e000},
- {0xbc370000}, {0xbc372000}, {0xbc374000}, {0xbc376000},
- {0xbc378000}, {0xbc37a000}, {0xbc37c000}, {0xbc37e000},
- {0xbc380000}, {0xbc382000}, {0xbc384000}, {0xbc386000},
- {0xbc388000}, {0xbc38a000}, {0xbc38c000}, {0xbc38e000},
- {0xbc390000}, {0xbc392000}, {0xbc394000}, {0xbc396000},
- {0xbc398000}, {0xbc39a000}, {0xbc39c000}, {0xbc39e000},
- {0xbc3a0000}, {0xbc3a2000}, {0xbc3a4000}, {0xbc3a6000},
- {0xbc3a8000}, {0xbc3aa000}, {0xbc3ac000}, {0xbc3ae000},
- {0xbc3b0000}, {0xbc3b2000}, {0xbc3b4000}, {0xbc3b6000},
- {0xbc3b8000}, {0xbc3ba000}, {0xbc3bc000}, {0xbc3be000},
- {0xbc3c0000}, {0xbc3c2000}, {0xbc3c4000}, {0xbc3c6000},
- {0xbc3c8000}, {0xbc3ca000}, {0xbc3cc000}, {0xbc3ce000},
- {0xbc3d0000}, {0xbc3d2000}, {0xbc3d4000}, {0xbc3d6000},
- {0xbc3d8000}, {0xbc3da000}, {0xbc3dc000}, {0xbc3de000},
- {0xbc3e0000}, {0xbc3e2000}, {0xbc3e4000}, {0xbc3e6000},
- {0xbc3e8000}, {0xbc3ea000}, {0xbc3ec000}, {0xbc3ee000},
- {0xbc3f0000}, {0xbc3f2000}, {0xbc3f4000}, {0xbc3f6000},
- {0xbc3f8000}, {0xbc3fa000}, {0xbc3fc000}, {0xbc3fe000},
- {0xbc400000}, {0xbc402000}, {0xbc404000}, {0xbc406000},
- {0xbc408000}, {0xbc40a000}, {0xbc40c000}, {0xbc40e000},
- {0xbc410000}, {0xbc412000}, {0xbc414000}, {0xbc416000},
- {0xbc418000}, {0xbc41a000}, {0xbc41c000}, {0xbc41e000},
- {0xbc420000}, {0xbc422000}, {0xbc424000}, {0xbc426000},
- {0xbc428000}, {0xbc42a000}, {0xbc42c000}, {0xbc42e000},
- {0xbc430000}, {0xbc432000}, {0xbc434000}, {0xbc436000},
- {0xbc438000}, {0xbc43a000}, {0xbc43c000}, {0xbc43e000},
- {0xbc440000}, {0xbc442000}, {0xbc444000}, {0xbc446000},
- {0xbc448000}, {0xbc44a000}, {0xbc44c000}, {0xbc44e000},
- {0xbc450000}, {0xbc452000}, {0xbc454000}, {0xbc456000},
- {0xbc458000}, {0xbc45a000}, {0xbc45c000}, {0xbc45e000},
- {0xbc460000}, {0xbc462000}, {0xbc464000}, {0xbc466000},
- {0xbc468000}, {0xbc46a000}, {0xbc46c000}, {0xbc46e000},
- {0xbc470000}, {0xbc472000}, {0xbc474000}, {0xbc476000},
- {0xbc478000}, {0xbc47a000}, {0xbc47c000}, {0xbc47e000},
- {0xbc480000}, {0xbc482000}, {0xbc484000}, {0xbc486000},
- {0xbc488000}, {0xbc48a000}, {0xbc48c000}, {0xbc48e000},
- {0xbc490000}, {0xbc492000}, {0xbc494000}, {0xbc496000},
- {0xbc498000}, {0xbc49a000}, {0xbc49c000}, {0xbc49e000},
- {0xbc4a0000}, {0xbc4a2000}, {0xbc4a4000}, {0xbc4a6000},
- {0xbc4a8000}, {0xbc4aa000}, {0xbc4ac000}, {0xbc4ae000},
- {0xbc4b0000}, {0xbc4b2000}, {0xbc4b4000}, {0xbc4b6000},
- {0xbc4b8000}, {0xbc4ba000}, {0xbc4bc000}, {0xbc4be000},
- {0xbc4c0000}, {0xbc4c2000}, {0xbc4c4000}, {0xbc4c6000},
- {0xbc4c8000}, {0xbc4ca000}, {0xbc4cc000}, {0xbc4ce000},
- {0xbc4d0000}, {0xbc4d2000}, {0xbc4d4000}, {0xbc4d6000},
- {0xbc4d8000}, {0xbc4da000}, {0xbc4dc000}, {0xbc4de000},
- {0xbc4e0000}, {0xbc4e2000}, {0xbc4e4000}, {0xbc4e6000},
- {0xbc4e8000}, {0xbc4ea000}, {0xbc4ec000}, {0xbc4ee000},
- {0xbc4f0000}, {0xbc4f2000}, {0xbc4f4000}, {0xbc4f6000},
- {0xbc4f8000}, {0xbc4fa000}, {0xbc4fc000}, {0xbc4fe000},
- {0xbc500000}, {0xbc502000}, {0xbc504000}, {0xbc506000},
- {0xbc508000}, {0xbc50a000}, {0xbc50c000}, {0xbc50e000},
- {0xbc510000}, {0xbc512000}, {0xbc514000}, {0xbc516000},
- {0xbc518000}, {0xbc51a000}, {0xbc51c000}, {0xbc51e000},
- {0xbc520000}, {0xbc522000}, {0xbc524000}, {0xbc526000},
- {0xbc528000}, {0xbc52a000}, {0xbc52c000}, {0xbc52e000},
- {0xbc530000}, {0xbc532000}, {0xbc534000}, {0xbc536000},
- {0xbc538000}, {0xbc53a000}, {0xbc53c000}, {0xbc53e000},
- {0xbc540000}, {0xbc542000}, {0xbc544000}, {0xbc546000},
- {0xbc548000}, {0xbc54a000}, {0xbc54c000}, {0xbc54e000},
- {0xbc550000}, {0xbc552000}, {0xbc554000}, {0xbc556000},
- {0xbc558000}, {0xbc55a000}, {0xbc55c000}, {0xbc55e000},
- {0xbc560000}, {0xbc562000}, {0xbc564000}, {0xbc566000},
- {0xbc568000}, {0xbc56a000}, {0xbc56c000}, {0xbc56e000},
- {0xbc570000}, {0xbc572000}, {0xbc574000}, {0xbc576000},
- {0xbc578000}, {0xbc57a000}, {0xbc57c000}, {0xbc57e000},
- {0xbc580000}, {0xbc582000}, {0xbc584000}, {0xbc586000},
- {0xbc588000}, {0xbc58a000}, {0xbc58c000}, {0xbc58e000},
- {0xbc590000}, {0xbc592000}, {0xbc594000}, {0xbc596000},
- {0xbc598000}, {0xbc59a000}, {0xbc59c000}, {0xbc59e000},
- {0xbc5a0000}, {0xbc5a2000}, {0xbc5a4000}, {0xbc5a6000},
- {0xbc5a8000}, {0xbc5aa000}, {0xbc5ac000}, {0xbc5ae000},
- {0xbc5b0000}, {0xbc5b2000}, {0xbc5b4000}, {0xbc5b6000},
- {0xbc5b8000}, {0xbc5ba000}, {0xbc5bc000}, {0xbc5be000},
- {0xbc5c0000}, {0xbc5c2000}, {0xbc5c4000}, {0xbc5c6000},
- {0xbc5c8000}, {0xbc5ca000}, {0xbc5cc000}, {0xbc5ce000},
- {0xbc5d0000}, {0xbc5d2000}, {0xbc5d4000}, {0xbc5d6000},
- {0xbc5d8000}, {0xbc5da000}, {0xbc5dc000}, {0xbc5de000},
- {0xbc5e0000}, {0xbc5e2000}, {0xbc5e4000}, {0xbc5e6000},
- {0xbc5e8000}, {0xbc5ea000}, {0xbc5ec000}, {0xbc5ee000},
- {0xbc5f0000}, {0xbc5f2000}, {0xbc5f4000}, {0xbc5f6000},
- {0xbc5f8000}, {0xbc5fa000}, {0xbc5fc000}, {0xbc5fe000},
- {0xbc600000}, {0xbc602000}, {0xbc604000}, {0xbc606000},
- {0xbc608000}, {0xbc60a000}, {0xbc60c000}, {0xbc60e000},
- {0xbc610000}, {0xbc612000}, {0xbc614000}, {0xbc616000},
- {0xbc618000}, {0xbc61a000}, {0xbc61c000}, {0xbc61e000},
- {0xbc620000}, {0xbc622000}, {0xbc624000}, {0xbc626000},
- {0xbc628000}, {0xbc62a000}, {0xbc62c000}, {0xbc62e000},
- {0xbc630000}, {0xbc632000}, {0xbc634000}, {0xbc636000},
- {0xbc638000}, {0xbc63a000}, {0xbc63c000}, {0xbc63e000},
- {0xbc640000}, {0xbc642000}, {0xbc644000}, {0xbc646000},
- {0xbc648000}, {0xbc64a000}, {0xbc64c000}, {0xbc64e000},
- {0xbc650000}, {0xbc652000}, {0xbc654000}, {0xbc656000},
- {0xbc658000}, {0xbc65a000}, {0xbc65c000}, {0xbc65e000},
- {0xbc660000}, {0xbc662000}, {0xbc664000}, {0xbc666000},
- {0xbc668000}, {0xbc66a000}, {0xbc66c000}, {0xbc66e000},
- {0xbc670000}, {0xbc672000}, {0xbc674000}, {0xbc676000},
- {0xbc678000}, {0xbc67a000}, {0xbc67c000}, {0xbc67e000},
- {0xbc680000}, {0xbc682000}, {0xbc684000}, {0xbc686000},
- {0xbc688000}, {0xbc68a000}, {0xbc68c000}, {0xbc68e000},
- {0xbc690000}, {0xbc692000}, {0xbc694000}, {0xbc696000},
- {0xbc698000}, {0xbc69a000}, {0xbc69c000}, {0xbc69e000},
- {0xbc6a0000}, {0xbc6a2000}, {0xbc6a4000}, {0xbc6a6000},
- {0xbc6a8000}, {0xbc6aa000}, {0xbc6ac000}, {0xbc6ae000},
- {0xbc6b0000}, {0xbc6b2000}, {0xbc6b4000}, {0xbc6b6000},
- {0xbc6b8000}, {0xbc6ba000}, {0xbc6bc000}, {0xbc6be000},
- {0xbc6c0000}, {0xbc6c2000}, {0xbc6c4000}, {0xbc6c6000},
- {0xbc6c8000}, {0xbc6ca000}, {0xbc6cc000}, {0xbc6ce000},
- {0xbc6d0000}, {0xbc6d2000}, {0xbc6d4000}, {0xbc6d6000},
- {0xbc6d8000}, {0xbc6da000}, {0xbc6dc000}, {0xbc6de000},
- {0xbc6e0000}, {0xbc6e2000}, {0xbc6e4000}, {0xbc6e6000},
- {0xbc6e8000}, {0xbc6ea000}, {0xbc6ec000}, {0xbc6ee000},
- {0xbc6f0000}, {0xbc6f2000}, {0xbc6f4000}, {0xbc6f6000},
- {0xbc6f8000}, {0xbc6fa000}, {0xbc6fc000}, {0xbc6fe000},
- {0xbc700000}, {0xbc702000}, {0xbc704000}, {0xbc706000},
- {0xbc708000}, {0xbc70a000}, {0xbc70c000}, {0xbc70e000},
- {0xbc710000}, {0xbc712000}, {0xbc714000}, {0xbc716000},
- {0xbc718000}, {0xbc71a000}, {0xbc71c000}, {0xbc71e000},
- {0xbc720000}, {0xbc722000}, {0xbc724000}, {0xbc726000},
- {0xbc728000}, {0xbc72a000}, {0xbc72c000}, {0xbc72e000},
- {0xbc730000}, {0xbc732000}, {0xbc734000}, {0xbc736000},
- {0xbc738000}, {0xbc73a000}, {0xbc73c000}, {0xbc73e000},
- {0xbc740000}, {0xbc742000}, {0xbc744000}, {0xbc746000},
- {0xbc748000}, {0xbc74a000}, {0xbc74c000}, {0xbc74e000},
- {0xbc750000}, {0xbc752000}, {0xbc754000}, {0xbc756000},
- {0xbc758000}, {0xbc75a000}, {0xbc75c000}, {0xbc75e000},
- {0xbc760000}, {0xbc762000}, {0xbc764000}, {0xbc766000},
- {0xbc768000}, {0xbc76a000}, {0xbc76c000}, {0xbc76e000},
- {0xbc770000}, {0xbc772000}, {0xbc774000}, {0xbc776000},
- {0xbc778000}, {0xbc77a000}, {0xbc77c000}, {0xbc77e000},
- {0xbc780000}, {0xbc782000}, {0xbc784000}, {0xbc786000},
- {0xbc788000}, {0xbc78a000}, {0xbc78c000}, {0xbc78e000},
- {0xbc790000}, {0xbc792000}, {0xbc794000}, {0xbc796000},
- {0xbc798000}, {0xbc79a000}, {0xbc79c000}, {0xbc79e000},
- {0xbc7a0000}, {0xbc7a2000}, {0xbc7a4000}, {0xbc7a6000},
- {0xbc7a8000}, {0xbc7aa000}, {0xbc7ac000}, {0xbc7ae000},
- {0xbc7b0000}, {0xbc7b2000}, {0xbc7b4000}, {0xbc7b6000},
- {0xbc7b8000}, {0xbc7ba000}, {0xbc7bc000}, {0xbc7be000},
- {0xbc7c0000}, {0xbc7c2000}, {0xbc7c4000}, {0xbc7c6000},
- {0xbc7c8000}, {0xbc7ca000}, {0xbc7cc000}, {0xbc7ce000},
- {0xbc7d0000}, {0xbc7d2000}, {0xbc7d4000}, {0xbc7d6000},
- {0xbc7d8000}, {0xbc7da000}, {0xbc7dc000}, {0xbc7de000},
- {0xbc7e0000}, {0xbc7e2000}, {0xbc7e4000}, {0xbc7e6000},
- {0xbc7e8000}, {0xbc7ea000}, {0xbc7ec000}, {0xbc7ee000},
- {0xbc7f0000}, {0xbc7f2000}, {0xbc7f4000}, {0xbc7f6000},
- {0xbc7f8000}, {0xbc7fa000}, {0xbc7fc000}, {0xbc7fe000},
- {0xbc800000}, {0xbc802000}, {0xbc804000}, {0xbc806000},
- {0xbc808000}, {0xbc80a000}, {0xbc80c000}, {0xbc80e000},
- {0xbc810000}, {0xbc812000}, {0xbc814000}, {0xbc816000},
- {0xbc818000}, {0xbc81a000}, {0xbc81c000}, {0xbc81e000},
- {0xbc820000}, {0xbc822000}, {0xbc824000}, {0xbc826000},
- {0xbc828000}, {0xbc82a000}, {0xbc82c000}, {0xbc82e000},
- {0xbc830000}, {0xbc832000}, {0xbc834000}, {0xbc836000},
- {0xbc838000}, {0xbc83a000}, {0xbc83c000}, {0xbc83e000},
- {0xbc840000}, {0xbc842000}, {0xbc844000}, {0xbc846000},
- {0xbc848000}, {0xbc84a000}, {0xbc84c000}, {0xbc84e000},
- {0xbc850000}, {0xbc852000}, {0xbc854000}, {0xbc856000},
- {0xbc858000}, {0xbc85a000}, {0xbc85c000}, {0xbc85e000},
- {0xbc860000}, {0xbc862000}, {0xbc864000}, {0xbc866000},
- {0xbc868000}, {0xbc86a000}, {0xbc86c000}, {0xbc86e000},
- {0xbc870000}, {0xbc872000}, {0xbc874000}, {0xbc876000},
- {0xbc878000}, {0xbc87a000}, {0xbc87c000}, {0xbc87e000},
- {0xbc880000}, {0xbc882000}, {0xbc884000}, {0xbc886000},
- {0xbc888000}, {0xbc88a000}, {0xbc88c000}, {0xbc88e000},
- {0xbc890000}, {0xbc892000}, {0xbc894000}, {0xbc896000},
- {0xbc898000}, {0xbc89a000}, {0xbc89c000}, {0xbc89e000},
- {0xbc8a0000}, {0xbc8a2000}, {0xbc8a4000}, {0xbc8a6000},
- {0xbc8a8000}, {0xbc8aa000}, {0xbc8ac000}, {0xbc8ae000},
- {0xbc8b0000}, {0xbc8b2000}, {0xbc8b4000}, {0xbc8b6000},
- {0xbc8b8000}, {0xbc8ba000}, {0xbc8bc000}, {0xbc8be000},
- {0xbc8c0000}, {0xbc8c2000}, {0xbc8c4000}, {0xbc8c6000},
- {0xbc8c8000}, {0xbc8ca000}, {0xbc8cc000}, {0xbc8ce000},
- {0xbc8d0000}, {0xbc8d2000}, {0xbc8d4000}, {0xbc8d6000},
- {0xbc8d8000}, {0xbc8da000}, {0xbc8dc000}, {0xbc8de000},
- {0xbc8e0000}, {0xbc8e2000}, {0xbc8e4000}, {0xbc8e6000},
- {0xbc8e8000}, {0xbc8ea000}, {0xbc8ec000}, {0xbc8ee000},
- {0xbc8f0000}, {0xbc8f2000}, {0xbc8f4000}, {0xbc8f6000},
- {0xbc8f8000}, {0xbc8fa000}, {0xbc8fc000}, {0xbc8fe000},
- {0xbc900000}, {0xbc902000}, {0xbc904000}, {0xbc906000},
- {0xbc908000}, {0xbc90a000}, {0xbc90c000}, {0xbc90e000},
- {0xbc910000}, {0xbc912000}, {0xbc914000}, {0xbc916000},
- {0xbc918000}, {0xbc91a000}, {0xbc91c000}, {0xbc91e000},
- {0xbc920000}, {0xbc922000}, {0xbc924000}, {0xbc926000},
- {0xbc928000}, {0xbc92a000}, {0xbc92c000}, {0xbc92e000},
- {0xbc930000}, {0xbc932000}, {0xbc934000}, {0xbc936000},
- {0xbc938000}, {0xbc93a000}, {0xbc93c000}, {0xbc93e000},
- {0xbc940000}, {0xbc942000}, {0xbc944000}, {0xbc946000},
- {0xbc948000}, {0xbc94a000}, {0xbc94c000}, {0xbc94e000},
- {0xbc950000}, {0xbc952000}, {0xbc954000}, {0xbc956000},
- {0xbc958000}, {0xbc95a000}, {0xbc95c000}, {0xbc95e000},
- {0xbc960000}, {0xbc962000}, {0xbc964000}, {0xbc966000},
- {0xbc968000}, {0xbc96a000}, {0xbc96c000}, {0xbc96e000},
- {0xbc970000}, {0xbc972000}, {0xbc974000}, {0xbc976000},
- {0xbc978000}, {0xbc97a000}, {0xbc97c000}, {0xbc97e000},
- {0xbc980000}, {0xbc982000}, {0xbc984000}, {0xbc986000},
- {0xbc988000}, {0xbc98a000}, {0xbc98c000}, {0xbc98e000},
- {0xbc990000}, {0xbc992000}, {0xbc994000}, {0xbc996000},
- {0xbc998000}, {0xbc99a000}, {0xbc99c000}, {0xbc99e000},
- {0xbc9a0000}, {0xbc9a2000}, {0xbc9a4000}, {0xbc9a6000},
- {0xbc9a8000}, {0xbc9aa000}, {0xbc9ac000}, {0xbc9ae000},
- {0xbc9b0000}, {0xbc9b2000}, {0xbc9b4000}, {0xbc9b6000},
- {0xbc9b8000}, {0xbc9ba000}, {0xbc9bc000}, {0xbc9be000},
- {0xbc9c0000}, {0xbc9c2000}, {0xbc9c4000}, {0xbc9c6000},
- {0xbc9c8000}, {0xbc9ca000}, {0xbc9cc000}, {0xbc9ce000},
- {0xbc9d0000}, {0xbc9d2000}, {0xbc9d4000}, {0xbc9d6000},
- {0xbc9d8000}, {0xbc9da000}, {0xbc9dc000}, {0xbc9de000},
- {0xbc9e0000}, {0xbc9e2000}, {0xbc9e4000}, {0xbc9e6000},
- {0xbc9e8000}, {0xbc9ea000}, {0xbc9ec000}, {0xbc9ee000},
- {0xbc9f0000}, {0xbc9f2000}, {0xbc9f4000}, {0xbc9f6000},
- {0xbc9f8000}, {0xbc9fa000}, {0xbc9fc000}, {0xbc9fe000},
- {0xbca00000}, {0xbca02000}, {0xbca04000}, {0xbca06000},
- {0xbca08000}, {0xbca0a000}, {0xbca0c000}, {0xbca0e000},
- {0xbca10000}, {0xbca12000}, {0xbca14000}, {0xbca16000},
- {0xbca18000}, {0xbca1a000}, {0xbca1c000}, {0xbca1e000},
- {0xbca20000}, {0xbca22000}, {0xbca24000}, {0xbca26000},
- {0xbca28000}, {0xbca2a000}, {0xbca2c000}, {0xbca2e000},
- {0xbca30000}, {0xbca32000}, {0xbca34000}, {0xbca36000},
- {0xbca38000}, {0xbca3a000}, {0xbca3c000}, {0xbca3e000},
- {0xbca40000}, {0xbca42000}, {0xbca44000}, {0xbca46000},
- {0xbca48000}, {0xbca4a000}, {0xbca4c000}, {0xbca4e000},
- {0xbca50000}, {0xbca52000}, {0xbca54000}, {0xbca56000},
- {0xbca58000}, {0xbca5a000}, {0xbca5c000}, {0xbca5e000},
- {0xbca60000}, {0xbca62000}, {0xbca64000}, {0xbca66000},
- {0xbca68000}, {0xbca6a000}, {0xbca6c000}, {0xbca6e000},
- {0xbca70000}, {0xbca72000}, {0xbca74000}, {0xbca76000},
- {0xbca78000}, {0xbca7a000}, {0xbca7c000}, {0xbca7e000},
- {0xbca80000}, {0xbca82000}, {0xbca84000}, {0xbca86000},
- {0xbca88000}, {0xbca8a000}, {0xbca8c000}, {0xbca8e000},
- {0xbca90000}, {0xbca92000}, {0xbca94000}, {0xbca96000},
- {0xbca98000}, {0xbca9a000}, {0xbca9c000}, {0xbca9e000},
- {0xbcaa0000}, {0xbcaa2000}, {0xbcaa4000}, {0xbcaa6000},
- {0xbcaa8000}, {0xbcaaa000}, {0xbcaac000}, {0xbcaae000},
- {0xbcab0000}, {0xbcab2000}, {0xbcab4000}, {0xbcab6000},
- {0xbcab8000}, {0xbcaba000}, {0xbcabc000}, {0xbcabe000},
- {0xbcac0000}, {0xbcac2000}, {0xbcac4000}, {0xbcac6000},
- {0xbcac8000}, {0xbcaca000}, {0xbcacc000}, {0xbcace000},
- {0xbcad0000}, {0xbcad2000}, {0xbcad4000}, {0xbcad6000},
- {0xbcad8000}, {0xbcada000}, {0xbcadc000}, {0xbcade000},
- {0xbcae0000}, {0xbcae2000}, {0xbcae4000}, {0xbcae6000},
- {0xbcae8000}, {0xbcaea000}, {0xbcaec000}, {0xbcaee000},
- {0xbcaf0000}, {0xbcaf2000}, {0xbcaf4000}, {0xbcaf6000},
- {0xbcaf8000}, {0xbcafa000}, {0xbcafc000}, {0xbcafe000},
- {0xbcb00000}, {0xbcb02000}, {0xbcb04000}, {0xbcb06000},
- {0xbcb08000}, {0xbcb0a000}, {0xbcb0c000}, {0xbcb0e000},
- {0xbcb10000}, {0xbcb12000}, {0xbcb14000}, {0xbcb16000},
- {0xbcb18000}, {0xbcb1a000}, {0xbcb1c000}, {0xbcb1e000},
- {0xbcb20000}, {0xbcb22000}, {0xbcb24000}, {0xbcb26000},
- {0xbcb28000}, {0xbcb2a000}, {0xbcb2c000}, {0xbcb2e000},
- {0xbcb30000}, {0xbcb32000}, {0xbcb34000}, {0xbcb36000},
- {0xbcb38000}, {0xbcb3a000}, {0xbcb3c000}, {0xbcb3e000},
- {0xbcb40000}, {0xbcb42000}, {0xbcb44000}, {0xbcb46000},
- {0xbcb48000}, {0xbcb4a000}, {0xbcb4c000}, {0xbcb4e000},
- {0xbcb50000}, {0xbcb52000}, {0xbcb54000}, {0xbcb56000},
- {0xbcb58000}, {0xbcb5a000}, {0xbcb5c000}, {0xbcb5e000},
- {0xbcb60000}, {0xbcb62000}, {0xbcb64000}, {0xbcb66000},
- {0xbcb68000}, {0xbcb6a000}, {0xbcb6c000}, {0xbcb6e000},
- {0xbcb70000}, {0xbcb72000}, {0xbcb74000}, {0xbcb76000},
- {0xbcb78000}, {0xbcb7a000}, {0xbcb7c000}, {0xbcb7e000},
- {0xbcb80000}, {0xbcb82000}, {0xbcb84000}, {0xbcb86000},
- {0xbcb88000}, {0xbcb8a000}, {0xbcb8c000}, {0xbcb8e000},
- {0xbcb90000}, {0xbcb92000}, {0xbcb94000}, {0xbcb96000},
- {0xbcb98000}, {0xbcb9a000}, {0xbcb9c000}, {0xbcb9e000},
- {0xbcba0000}, {0xbcba2000}, {0xbcba4000}, {0xbcba6000},
- {0xbcba8000}, {0xbcbaa000}, {0xbcbac000}, {0xbcbae000},
- {0xbcbb0000}, {0xbcbb2000}, {0xbcbb4000}, {0xbcbb6000},
- {0xbcbb8000}, {0xbcbba000}, {0xbcbbc000}, {0xbcbbe000},
- {0xbcbc0000}, {0xbcbc2000}, {0xbcbc4000}, {0xbcbc6000},
- {0xbcbc8000}, {0xbcbca000}, {0xbcbcc000}, {0xbcbce000},
- {0xbcbd0000}, {0xbcbd2000}, {0xbcbd4000}, {0xbcbd6000},
- {0xbcbd8000}, {0xbcbda000}, {0xbcbdc000}, {0xbcbde000},
- {0xbcbe0000}, {0xbcbe2000}, {0xbcbe4000}, {0xbcbe6000},
- {0xbcbe8000}, {0xbcbea000}, {0xbcbec000}, {0xbcbee000},
- {0xbcbf0000}, {0xbcbf2000}, {0xbcbf4000}, {0xbcbf6000},
- {0xbcbf8000}, {0xbcbfa000}, {0xbcbfc000}, {0xbcbfe000},
- {0xbcc00000}, {0xbcc02000}, {0xbcc04000}, {0xbcc06000},
- {0xbcc08000}, {0xbcc0a000}, {0xbcc0c000}, {0xbcc0e000},
- {0xbcc10000}, {0xbcc12000}, {0xbcc14000}, {0xbcc16000},
- {0xbcc18000}, {0xbcc1a000}, {0xbcc1c000}, {0xbcc1e000},
- {0xbcc20000}, {0xbcc22000}, {0xbcc24000}, {0xbcc26000},
- {0xbcc28000}, {0xbcc2a000}, {0xbcc2c000}, {0xbcc2e000},
- {0xbcc30000}, {0xbcc32000}, {0xbcc34000}, {0xbcc36000},
- {0xbcc38000}, {0xbcc3a000}, {0xbcc3c000}, {0xbcc3e000},
- {0xbcc40000}, {0xbcc42000}, {0xbcc44000}, {0xbcc46000},
- {0xbcc48000}, {0xbcc4a000}, {0xbcc4c000}, {0xbcc4e000},
- {0xbcc50000}, {0xbcc52000}, {0xbcc54000}, {0xbcc56000},
- {0xbcc58000}, {0xbcc5a000}, {0xbcc5c000}, {0xbcc5e000},
- {0xbcc60000}, {0xbcc62000}, {0xbcc64000}, {0xbcc66000},
- {0xbcc68000}, {0xbcc6a000}, {0xbcc6c000}, {0xbcc6e000},
- {0xbcc70000}, {0xbcc72000}, {0xbcc74000}, {0xbcc76000},
- {0xbcc78000}, {0xbcc7a000}, {0xbcc7c000}, {0xbcc7e000},
- {0xbcc80000}, {0xbcc82000}, {0xbcc84000}, {0xbcc86000},
- {0xbcc88000}, {0xbcc8a000}, {0xbcc8c000}, {0xbcc8e000},
- {0xbcc90000}, {0xbcc92000}, {0xbcc94000}, {0xbcc96000},
- {0xbcc98000}, {0xbcc9a000}, {0xbcc9c000}, {0xbcc9e000},
- {0xbcca0000}, {0xbcca2000}, {0xbcca4000}, {0xbcca6000},
- {0xbcca8000}, {0xbccaa000}, {0xbccac000}, {0xbccae000},
- {0xbccb0000}, {0xbccb2000}, {0xbccb4000}, {0xbccb6000},
- {0xbccb8000}, {0xbccba000}, {0xbccbc000}, {0xbccbe000},
- {0xbccc0000}, {0xbccc2000}, {0xbccc4000}, {0xbccc6000},
- {0xbccc8000}, {0xbccca000}, {0xbcccc000}, {0xbccce000},
- {0xbccd0000}, {0xbccd2000}, {0xbccd4000}, {0xbccd6000},
- {0xbccd8000}, {0xbccda000}, {0xbccdc000}, {0xbccde000},
- {0xbcce0000}, {0xbcce2000}, {0xbcce4000}, {0xbcce6000},
- {0xbcce8000}, {0xbccea000}, {0xbccec000}, {0xbccee000},
- {0xbccf0000}, {0xbccf2000}, {0xbccf4000}, {0xbccf6000},
- {0xbccf8000}, {0xbccfa000}, {0xbccfc000}, {0xbccfe000},
- {0xbcd00000}, {0xbcd02000}, {0xbcd04000}, {0xbcd06000},
- {0xbcd08000}, {0xbcd0a000}, {0xbcd0c000}, {0xbcd0e000},
- {0xbcd10000}, {0xbcd12000}, {0xbcd14000}, {0xbcd16000},
- {0xbcd18000}, {0xbcd1a000}, {0xbcd1c000}, {0xbcd1e000},
- {0xbcd20000}, {0xbcd22000}, {0xbcd24000}, {0xbcd26000},
- {0xbcd28000}, {0xbcd2a000}, {0xbcd2c000}, {0xbcd2e000},
- {0xbcd30000}, {0xbcd32000}, {0xbcd34000}, {0xbcd36000},
- {0xbcd38000}, {0xbcd3a000}, {0xbcd3c000}, {0xbcd3e000},
- {0xbcd40000}, {0xbcd42000}, {0xbcd44000}, {0xbcd46000},
- {0xbcd48000}, {0xbcd4a000}, {0xbcd4c000}, {0xbcd4e000},
- {0xbcd50000}, {0xbcd52000}, {0xbcd54000}, {0xbcd56000},
- {0xbcd58000}, {0xbcd5a000}, {0xbcd5c000}, {0xbcd5e000},
- {0xbcd60000}, {0xbcd62000}, {0xbcd64000}, {0xbcd66000},
- {0xbcd68000}, {0xbcd6a000}, {0xbcd6c000}, {0xbcd6e000},
- {0xbcd70000}, {0xbcd72000}, {0xbcd74000}, {0xbcd76000},
- {0xbcd78000}, {0xbcd7a000}, {0xbcd7c000}, {0xbcd7e000},
- {0xbcd80000}, {0xbcd82000}, {0xbcd84000}, {0xbcd86000},
- {0xbcd88000}, {0xbcd8a000}, {0xbcd8c000}, {0xbcd8e000},
- {0xbcd90000}, {0xbcd92000}, {0xbcd94000}, {0xbcd96000},
- {0xbcd98000}, {0xbcd9a000}, {0xbcd9c000}, {0xbcd9e000},
- {0xbcda0000}, {0xbcda2000}, {0xbcda4000}, {0xbcda6000},
- {0xbcda8000}, {0xbcdaa000}, {0xbcdac000}, {0xbcdae000},
- {0xbcdb0000}, {0xbcdb2000}, {0xbcdb4000}, {0xbcdb6000},
- {0xbcdb8000}, {0xbcdba000}, {0xbcdbc000}, {0xbcdbe000},
- {0xbcdc0000}, {0xbcdc2000}, {0xbcdc4000}, {0xbcdc6000},
- {0xbcdc8000}, {0xbcdca000}, {0xbcdcc000}, {0xbcdce000},
- {0xbcdd0000}, {0xbcdd2000}, {0xbcdd4000}, {0xbcdd6000},
- {0xbcdd8000}, {0xbcdda000}, {0xbcddc000}, {0xbcdde000},
- {0xbcde0000}, {0xbcde2000}, {0xbcde4000}, {0xbcde6000},
- {0xbcde8000}, {0xbcdea000}, {0xbcdec000}, {0xbcdee000},
- {0xbcdf0000}, {0xbcdf2000}, {0xbcdf4000}, {0xbcdf6000},
- {0xbcdf8000}, {0xbcdfa000}, {0xbcdfc000}, {0xbcdfe000},
- {0xbce00000}, {0xbce02000}, {0xbce04000}, {0xbce06000},
- {0xbce08000}, {0xbce0a000}, {0xbce0c000}, {0xbce0e000},
- {0xbce10000}, {0xbce12000}, {0xbce14000}, {0xbce16000},
- {0xbce18000}, {0xbce1a000}, {0xbce1c000}, {0xbce1e000},
- {0xbce20000}, {0xbce22000}, {0xbce24000}, {0xbce26000},
- {0xbce28000}, {0xbce2a000}, {0xbce2c000}, {0xbce2e000},
- {0xbce30000}, {0xbce32000}, {0xbce34000}, {0xbce36000},
- {0xbce38000}, {0xbce3a000}, {0xbce3c000}, {0xbce3e000},
- {0xbce40000}, {0xbce42000}, {0xbce44000}, {0xbce46000},
- {0xbce48000}, {0xbce4a000}, {0xbce4c000}, {0xbce4e000},
- {0xbce50000}, {0xbce52000}, {0xbce54000}, {0xbce56000},
- {0xbce58000}, {0xbce5a000}, {0xbce5c000}, {0xbce5e000},
- {0xbce60000}, {0xbce62000}, {0xbce64000}, {0xbce66000},
- {0xbce68000}, {0xbce6a000}, {0xbce6c000}, {0xbce6e000},
- {0xbce70000}, {0xbce72000}, {0xbce74000}, {0xbce76000},
- {0xbce78000}, {0xbce7a000}, {0xbce7c000}, {0xbce7e000},
- {0xbce80000}, {0xbce82000}, {0xbce84000}, {0xbce86000},
- {0xbce88000}, {0xbce8a000}, {0xbce8c000}, {0xbce8e000},
- {0xbce90000}, {0xbce92000}, {0xbce94000}, {0xbce96000},
- {0xbce98000}, {0xbce9a000}, {0xbce9c000}, {0xbce9e000},
- {0xbcea0000}, {0xbcea2000}, {0xbcea4000}, {0xbcea6000},
- {0xbcea8000}, {0xbceaa000}, {0xbceac000}, {0xbceae000},
- {0xbceb0000}, {0xbceb2000}, {0xbceb4000}, {0xbceb6000},
- {0xbceb8000}, {0xbceba000}, {0xbcebc000}, {0xbcebe000},
- {0xbcec0000}, {0xbcec2000}, {0xbcec4000}, {0xbcec6000},
- {0xbcec8000}, {0xbceca000}, {0xbcecc000}, {0xbcece000},
- {0xbced0000}, {0xbced2000}, {0xbced4000}, {0xbced6000},
- {0xbced8000}, {0xbceda000}, {0xbcedc000}, {0xbcede000},
- {0xbcee0000}, {0xbcee2000}, {0xbcee4000}, {0xbcee6000},
- {0xbcee8000}, {0xbceea000}, {0xbceec000}, {0xbceee000},
- {0xbcef0000}, {0xbcef2000}, {0xbcef4000}, {0xbcef6000},
- {0xbcef8000}, {0xbcefa000}, {0xbcefc000}, {0xbcefe000},
- {0xbcf00000}, {0xbcf02000}, {0xbcf04000}, {0xbcf06000},
- {0xbcf08000}, {0xbcf0a000}, {0xbcf0c000}, {0xbcf0e000},
- {0xbcf10000}, {0xbcf12000}, {0xbcf14000}, {0xbcf16000},
- {0xbcf18000}, {0xbcf1a000}, {0xbcf1c000}, {0xbcf1e000},
- {0xbcf20000}, {0xbcf22000}, {0xbcf24000}, {0xbcf26000},
- {0xbcf28000}, {0xbcf2a000}, {0xbcf2c000}, {0xbcf2e000},
- {0xbcf30000}, {0xbcf32000}, {0xbcf34000}, {0xbcf36000},
- {0xbcf38000}, {0xbcf3a000}, {0xbcf3c000}, {0xbcf3e000},
- {0xbcf40000}, {0xbcf42000}, {0xbcf44000}, {0xbcf46000},
- {0xbcf48000}, {0xbcf4a000}, {0xbcf4c000}, {0xbcf4e000},
- {0xbcf50000}, {0xbcf52000}, {0xbcf54000}, {0xbcf56000},
- {0xbcf58000}, {0xbcf5a000}, {0xbcf5c000}, {0xbcf5e000},
- {0xbcf60000}, {0xbcf62000}, {0xbcf64000}, {0xbcf66000},
- {0xbcf68000}, {0xbcf6a000}, {0xbcf6c000}, {0xbcf6e000},
- {0xbcf70000}, {0xbcf72000}, {0xbcf74000}, {0xbcf76000},
- {0xbcf78000}, {0xbcf7a000}, {0xbcf7c000}, {0xbcf7e000},
- {0xbcf80000}, {0xbcf82000}, {0xbcf84000}, {0xbcf86000},
- {0xbcf88000}, {0xbcf8a000}, {0xbcf8c000}, {0xbcf8e000},
- {0xbcf90000}, {0xbcf92000}, {0xbcf94000}, {0xbcf96000},
- {0xbcf98000}, {0xbcf9a000}, {0xbcf9c000}, {0xbcf9e000},
- {0xbcfa0000}, {0xbcfa2000}, {0xbcfa4000}, {0xbcfa6000},
- {0xbcfa8000}, {0xbcfaa000}, {0xbcfac000}, {0xbcfae000},
- {0xbcfb0000}, {0xbcfb2000}, {0xbcfb4000}, {0xbcfb6000},
- {0xbcfb8000}, {0xbcfba000}, {0xbcfbc000}, {0xbcfbe000},
- {0xbcfc0000}, {0xbcfc2000}, {0xbcfc4000}, {0xbcfc6000},
- {0xbcfc8000}, {0xbcfca000}, {0xbcfcc000}, {0xbcfce000},
- {0xbcfd0000}, {0xbcfd2000}, {0xbcfd4000}, {0xbcfd6000},
- {0xbcfd8000}, {0xbcfda000}, {0xbcfdc000}, {0xbcfde000},
- {0xbcfe0000}, {0xbcfe2000}, {0xbcfe4000}, {0xbcfe6000},
- {0xbcfe8000}, {0xbcfea000}, {0xbcfec000}, {0xbcfee000},
- {0xbcff0000}, {0xbcff2000}, {0xbcff4000}, {0xbcff6000},
- {0xbcff8000}, {0xbcffa000}, {0xbcffc000}, {0xbcffe000},
- {0xbd000000}, {0xbd002000}, {0xbd004000}, {0xbd006000},
- {0xbd008000}, {0xbd00a000}, {0xbd00c000}, {0xbd00e000},
- {0xbd010000}, {0xbd012000}, {0xbd014000}, {0xbd016000},
- {0xbd018000}, {0xbd01a000}, {0xbd01c000}, {0xbd01e000},
- {0xbd020000}, {0xbd022000}, {0xbd024000}, {0xbd026000},
- {0xbd028000}, {0xbd02a000}, {0xbd02c000}, {0xbd02e000},
- {0xbd030000}, {0xbd032000}, {0xbd034000}, {0xbd036000},
- {0xbd038000}, {0xbd03a000}, {0xbd03c000}, {0xbd03e000},
- {0xbd040000}, {0xbd042000}, {0xbd044000}, {0xbd046000},
- {0xbd048000}, {0xbd04a000}, {0xbd04c000}, {0xbd04e000},
- {0xbd050000}, {0xbd052000}, {0xbd054000}, {0xbd056000},
- {0xbd058000}, {0xbd05a000}, {0xbd05c000}, {0xbd05e000},
- {0xbd060000}, {0xbd062000}, {0xbd064000}, {0xbd066000},
- {0xbd068000}, {0xbd06a000}, {0xbd06c000}, {0xbd06e000},
- {0xbd070000}, {0xbd072000}, {0xbd074000}, {0xbd076000},
- {0xbd078000}, {0xbd07a000}, {0xbd07c000}, {0xbd07e000},
- {0xbd080000}, {0xbd082000}, {0xbd084000}, {0xbd086000},
- {0xbd088000}, {0xbd08a000}, {0xbd08c000}, {0xbd08e000},
- {0xbd090000}, {0xbd092000}, {0xbd094000}, {0xbd096000},
- {0xbd098000}, {0xbd09a000}, {0xbd09c000}, {0xbd09e000},
- {0xbd0a0000}, {0xbd0a2000}, {0xbd0a4000}, {0xbd0a6000},
- {0xbd0a8000}, {0xbd0aa000}, {0xbd0ac000}, {0xbd0ae000},
- {0xbd0b0000}, {0xbd0b2000}, {0xbd0b4000}, {0xbd0b6000},
- {0xbd0b8000}, {0xbd0ba000}, {0xbd0bc000}, {0xbd0be000},
- {0xbd0c0000}, {0xbd0c2000}, {0xbd0c4000}, {0xbd0c6000},
- {0xbd0c8000}, {0xbd0ca000}, {0xbd0cc000}, {0xbd0ce000},
- {0xbd0d0000}, {0xbd0d2000}, {0xbd0d4000}, {0xbd0d6000},
- {0xbd0d8000}, {0xbd0da000}, {0xbd0dc000}, {0xbd0de000},
- {0xbd0e0000}, {0xbd0e2000}, {0xbd0e4000}, {0xbd0e6000},
- {0xbd0e8000}, {0xbd0ea000}, {0xbd0ec000}, {0xbd0ee000},
- {0xbd0f0000}, {0xbd0f2000}, {0xbd0f4000}, {0xbd0f6000},
- {0xbd0f8000}, {0xbd0fa000}, {0xbd0fc000}, {0xbd0fe000},
- {0xbd100000}, {0xbd102000}, {0xbd104000}, {0xbd106000},
- {0xbd108000}, {0xbd10a000}, {0xbd10c000}, {0xbd10e000},
- {0xbd110000}, {0xbd112000}, {0xbd114000}, {0xbd116000},
- {0xbd118000}, {0xbd11a000}, {0xbd11c000}, {0xbd11e000},
- {0xbd120000}, {0xbd122000}, {0xbd124000}, {0xbd126000},
- {0xbd128000}, {0xbd12a000}, {0xbd12c000}, {0xbd12e000},
- {0xbd130000}, {0xbd132000}, {0xbd134000}, {0xbd136000},
- {0xbd138000}, {0xbd13a000}, {0xbd13c000}, {0xbd13e000},
- {0xbd140000}, {0xbd142000}, {0xbd144000}, {0xbd146000},
- {0xbd148000}, {0xbd14a000}, {0xbd14c000}, {0xbd14e000},
- {0xbd150000}, {0xbd152000}, {0xbd154000}, {0xbd156000},
- {0xbd158000}, {0xbd15a000}, {0xbd15c000}, {0xbd15e000},
- {0xbd160000}, {0xbd162000}, {0xbd164000}, {0xbd166000},
- {0xbd168000}, {0xbd16a000}, {0xbd16c000}, {0xbd16e000},
- {0xbd170000}, {0xbd172000}, {0xbd174000}, {0xbd176000},
- {0xbd178000}, {0xbd17a000}, {0xbd17c000}, {0xbd17e000},
- {0xbd180000}, {0xbd182000}, {0xbd184000}, {0xbd186000},
- {0xbd188000}, {0xbd18a000}, {0xbd18c000}, {0xbd18e000},
- {0xbd190000}, {0xbd192000}, {0xbd194000}, {0xbd196000},
- {0xbd198000}, {0xbd19a000}, {0xbd19c000}, {0xbd19e000},
- {0xbd1a0000}, {0xbd1a2000}, {0xbd1a4000}, {0xbd1a6000},
- {0xbd1a8000}, {0xbd1aa000}, {0xbd1ac000}, {0xbd1ae000},
- {0xbd1b0000}, {0xbd1b2000}, {0xbd1b4000}, {0xbd1b6000},
- {0xbd1b8000}, {0xbd1ba000}, {0xbd1bc000}, {0xbd1be000},
- {0xbd1c0000}, {0xbd1c2000}, {0xbd1c4000}, {0xbd1c6000},
- {0xbd1c8000}, {0xbd1ca000}, {0xbd1cc000}, {0xbd1ce000},
- {0xbd1d0000}, {0xbd1d2000}, {0xbd1d4000}, {0xbd1d6000},
- {0xbd1d8000}, {0xbd1da000}, {0xbd1dc000}, {0xbd1de000},
- {0xbd1e0000}, {0xbd1e2000}, {0xbd1e4000}, {0xbd1e6000},
- {0xbd1e8000}, {0xbd1ea000}, {0xbd1ec000}, {0xbd1ee000},
- {0xbd1f0000}, {0xbd1f2000}, {0xbd1f4000}, {0xbd1f6000},
- {0xbd1f8000}, {0xbd1fa000}, {0xbd1fc000}, {0xbd1fe000},
- {0xbd200000}, {0xbd202000}, {0xbd204000}, {0xbd206000},
- {0xbd208000}, {0xbd20a000}, {0xbd20c000}, {0xbd20e000},
- {0xbd210000}, {0xbd212000}, {0xbd214000}, {0xbd216000},
- {0xbd218000}, {0xbd21a000}, {0xbd21c000}, {0xbd21e000},
- {0xbd220000}, {0xbd222000}, {0xbd224000}, {0xbd226000},
- {0xbd228000}, {0xbd22a000}, {0xbd22c000}, {0xbd22e000},
- {0xbd230000}, {0xbd232000}, {0xbd234000}, {0xbd236000},
- {0xbd238000}, {0xbd23a000}, {0xbd23c000}, {0xbd23e000},
- {0xbd240000}, {0xbd242000}, {0xbd244000}, {0xbd246000},
- {0xbd248000}, {0xbd24a000}, {0xbd24c000}, {0xbd24e000},
- {0xbd250000}, {0xbd252000}, {0xbd254000}, {0xbd256000},
- {0xbd258000}, {0xbd25a000}, {0xbd25c000}, {0xbd25e000},
- {0xbd260000}, {0xbd262000}, {0xbd264000}, {0xbd266000},
- {0xbd268000}, {0xbd26a000}, {0xbd26c000}, {0xbd26e000},
- {0xbd270000}, {0xbd272000}, {0xbd274000}, {0xbd276000},
- {0xbd278000}, {0xbd27a000}, {0xbd27c000}, {0xbd27e000},
- {0xbd280000}, {0xbd282000}, {0xbd284000}, {0xbd286000},
- {0xbd288000}, {0xbd28a000}, {0xbd28c000}, {0xbd28e000},
- {0xbd290000}, {0xbd292000}, {0xbd294000}, {0xbd296000},
- {0xbd298000}, {0xbd29a000}, {0xbd29c000}, {0xbd29e000},
- {0xbd2a0000}, {0xbd2a2000}, {0xbd2a4000}, {0xbd2a6000},
- {0xbd2a8000}, {0xbd2aa000}, {0xbd2ac000}, {0xbd2ae000},
- {0xbd2b0000}, {0xbd2b2000}, {0xbd2b4000}, {0xbd2b6000},
- {0xbd2b8000}, {0xbd2ba000}, {0xbd2bc000}, {0xbd2be000},
- {0xbd2c0000}, {0xbd2c2000}, {0xbd2c4000}, {0xbd2c6000},
- {0xbd2c8000}, {0xbd2ca000}, {0xbd2cc000}, {0xbd2ce000},
- {0xbd2d0000}, {0xbd2d2000}, {0xbd2d4000}, {0xbd2d6000},
- {0xbd2d8000}, {0xbd2da000}, {0xbd2dc000}, {0xbd2de000},
- {0xbd2e0000}, {0xbd2e2000}, {0xbd2e4000}, {0xbd2e6000},
- {0xbd2e8000}, {0xbd2ea000}, {0xbd2ec000}, {0xbd2ee000},
- {0xbd2f0000}, {0xbd2f2000}, {0xbd2f4000}, {0xbd2f6000},
- {0xbd2f8000}, {0xbd2fa000}, {0xbd2fc000}, {0xbd2fe000},
- {0xbd300000}, {0xbd302000}, {0xbd304000}, {0xbd306000},
- {0xbd308000}, {0xbd30a000}, {0xbd30c000}, {0xbd30e000},
- {0xbd310000}, {0xbd312000}, {0xbd314000}, {0xbd316000},
- {0xbd318000}, {0xbd31a000}, {0xbd31c000}, {0xbd31e000},
- {0xbd320000}, {0xbd322000}, {0xbd324000}, {0xbd326000},
- {0xbd328000}, {0xbd32a000}, {0xbd32c000}, {0xbd32e000},
- {0xbd330000}, {0xbd332000}, {0xbd334000}, {0xbd336000},
- {0xbd338000}, {0xbd33a000}, {0xbd33c000}, {0xbd33e000},
- {0xbd340000}, {0xbd342000}, {0xbd344000}, {0xbd346000},
- {0xbd348000}, {0xbd34a000}, {0xbd34c000}, {0xbd34e000},
- {0xbd350000}, {0xbd352000}, {0xbd354000}, {0xbd356000},
- {0xbd358000}, {0xbd35a000}, {0xbd35c000}, {0xbd35e000},
- {0xbd360000}, {0xbd362000}, {0xbd364000}, {0xbd366000},
- {0xbd368000}, {0xbd36a000}, {0xbd36c000}, {0xbd36e000},
- {0xbd370000}, {0xbd372000}, {0xbd374000}, {0xbd376000},
- {0xbd378000}, {0xbd37a000}, {0xbd37c000}, {0xbd37e000},
- {0xbd380000}, {0xbd382000}, {0xbd384000}, {0xbd386000},
- {0xbd388000}, {0xbd38a000}, {0xbd38c000}, {0xbd38e000},
- {0xbd390000}, {0xbd392000}, {0xbd394000}, {0xbd396000},
- {0xbd398000}, {0xbd39a000}, {0xbd39c000}, {0xbd39e000},
- {0xbd3a0000}, {0xbd3a2000}, {0xbd3a4000}, {0xbd3a6000},
- {0xbd3a8000}, {0xbd3aa000}, {0xbd3ac000}, {0xbd3ae000},
- {0xbd3b0000}, {0xbd3b2000}, {0xbd3b4000}, {0xbd3b6000},
- {0xbd3b8000}, {0xbd3ba000}, {0xbd3bc000}, {0xbd3be000},
- {0xbd3c0000}, {0xbd3c2000}, {0xbd3c4000}, {0xbd3c6000},
- {0xbd3c8000}, {0xbd3ca000}, {0xbd3cc000}, {0xbd3ce000},
- {0xbd3d0000}, {0xbd3d2000}, {0xbd3d4000}, {0xbd3d6000},
- {0xbd3d8000}, {0xbd3da000}, {0xbd3dc000}, {0xbd3de000},
- {0xbd3e0000}, {0xbd3e2000}, {0xbd3e4000}, {0xbd3e6000},
- {0xbd3e8000}, {0xbd3ea000}, {0xbd3ec000}, {0xbd3ee000},
- {0xbd3f0000}, {0xbd3f2000}, {0xbd3f4000}, {0xbd3f6000},
- {0xbd3f8000}, {0xbd3fa000}, {0xbd3fc000}, {0xbd3fe000},
- {0xbd400000}, {0xbd402000}, {0xbd404000}, {0xbd406000},
- {0xbd408000}, {0xbd40a000}, {0xbd40c000}, {0xbd40e000},
- {0xbd410000}, {0xbd412000}, {0xbd414000}, {0xbd416000},
- {0xbd418000}, {0xbd41a000}, {0xbd41c000}, {0xbd41e000},
- {0xbd420000}, {0xbd422000}, {0xbd424000}, {0xbd426000},
- {0xbd428000}, {0xbd42a000}, {0xbd42c000}, {0xbd42e000},
- {0xbd430000}, {0xbd432000}, {0xbd434000}, {0xbd436000},
- {0xbd438000}, {0xbd43a000}, {0xbd43c000}, {0xbd43e000},
- {0xbd440000}, {0xbd442000}, {0xbd444000}, {0xbd446000},
- {0xbd448000}, {0xbd44a000}, {0xbd44c000}, {0xbd44e000},
- {0xbd450000}, {0xbd452000}, {0xbd454000}, {0xbd456000},
- {0xbd458000}, {0xbd45a000}, {0xbd45c000}, {0xbd45e000},
- {0xbd460000}, {0xbd462000}, {0xbd464000}, {0xbd466000},
- {0xbd468000}, {0xbd46a000}, {0xbd46c000}, {0xbd46e000},
- {0xbd470000}, {0xbd472000}, {0xbd474000}, {0xbd476000},
- {0xbd478000}, {0xbd47a000}, {0xbd47c000}, {0xbd47e000},
- {0xbd480000}, {0xbd482000}, {0xbd484000}, {0xbd486000},
- {0xbd488000}, {0xbd48a000}, {0xbd48c000}, {0xbd48e000},
- {0xbd490000}, {0xbd492000}, {0xbd494000}, {0xbd496000},
- {0xbd498000}, {0xbd49a000}, {0xbd49c000}, {0xbd49e000},
- {0xbd4a0000}, {0xbd4a2000}, {0xbd4a4000}, {0xbd4a6000},
- {0xbd4a8000}, {0xbd4aa000}, {0xbd4ac000}, {0xbd4ae000},
- {0xbd4b0000}, {0xbd4b2000}, {0xbd4b4000}, {0xbd4b6000},
- {0xbd4b8000}, {0xbd4ba000}, {0xbd4bc000}, {0xbd4be000},
- {0xbd4c0000}, {0xbd4c2000}, {0xbd4c4000}, {0xbd4c6000},
- {0xbd4c8000}, {0xbd4ca000}, {0xbd4cc000}, {0xbd4ce000},
- {0xbd4d0000}, {0xbd4d2000}, {0xbd4d4000}, {0xbd4d6000},
- {0xbd4d8000}, {0xbd4da000}, {0xbd4dc000}, {0xbd4de000},
- {0xbd4e0000}, {0xbd4e2000}, {0xbd4e4000}, {0xbd4e6000},
- {0xbd4e8000}, {0xbd4ea000}, {0xbd4ec000}, {0xbd4ee000},
- {0xbd4f0000}, {0xbd4f2000}, {0xbd4f4000}, {0xbd4f6000},
- {0xbd4f8000}, {0xbd4fa000}, {0xbd4fc000}, {0xbd4fe000},
- {0xbd500000}, {0xbd502000}, {0xbd504000}, {0xbd506000},
- {0xbd508000}, {0xbd50a000}, {0xbd50c000}, {0xbd50e000},
- {0xbd510000}, {0xbd512000}, {0xbd514000}, {0xbd516000},
- {0xbd518000}, {0xbd51a000}, {0xbd51c000}, {0xbd51e000},
- {0xbd520000}, {0xbd522000}, {0xbd524000}, {0xbd526000},
- {0xbd528000}, {0xbd52a000}, {0xbd52c000}, {0xbd52e000},
- {0xbd530000}, {0xbd532000}, {0xbd534000}, {0xbd536000},
- {0xbd538000}, {0xbd53a000}, {0xbd53c000}, {0xbd53e000},
- {0xbd540000}, {0xbd542000}, {0xbd544000}, {0xbd546000},
- {0xbd548000}, {0xbd54a000}, {0xbd54c000}, {0xbd54e000},
- {0xbd550000}, {0xbd552000}, {0xbd554000}, {0xbd556000},
- {0xbd558000}, {0xbd55a000}, {0xbd55c000}, {0xbd55e000},
- {0xbd560000}, {0xbd562000}, {0xbd564000}, {0xbd566000},
- {0xbd568000}, {0xbd56a000}, {0xbd56c000}, {0xbd56e000},
- {0xbd570000}, {0xbd572000}, {0xbd574000}, {0xbd576000},
- {0xbd578000}, {0xbd57a000}, {0xbd57c000}, {0xbd57e000},
- {0xbd580000}, {0xbd582000}, {0xbd584000}, {0xbd586000},
- {0xbd588000}, {0xbd58a000}, {0xbd58c000}, {0xbd58e000},
- {0xbd590000}, {0xbd592000}, {0xbd594000}, {0xbd596000},
- {0xbd598000}, {0xbd59a000}, {0xbd59c000}, {0xbd59e000},
- {0xbd5a0000}, {0xbd5a2000}, {0xbd5a4000}, {0xbd5a6000},
- {0xbd5a8000}, {0xbd5aa000}, {0xbd5ac000}, {0xbd5ae000},
- {0xbd5b0000}, {0xbd5b2000}, {0xbd5b4000}, {0xbd5b6000},
- {0xbd5b8000}, {0xbd5ba000}, {0xbd5bc000}, {0xbd5be000},
- {0xbd5c0000}, {0xbd5c2000}, {0xbd5c4000}, {0xbd5c6000},
- {0xbd5c8000}, {0xbd5ca000}, {0xbd5cc000}, {0xbd5ce000},
- {0xbd5d0000}, {0xbd5d2000}, {0xbd5d4000}, {0xbd5d6000},
- {0xbd5d8000}, {0xbd5da000}, {0xbd5dc000}, {0xbd5de000},
- {0xbd5e0000}, {0xbd5e2000}, {0xbd5e4000}, {0xbd5e6000},
- {0xbd5e8000}, {0xbd5ea000}, {0xbd5ec000}, {0xbd5ee000},
- {0xbd5f0000}, {0xbd5f2000}, {0xbd5f4000}, {0xbd5f6000},
- {0xbd5f8000}, {0xbd5fa000}, {0xbd5fc000}, {0xbd5fe000},
- {0xbd600000}, {0xbd602000}, {0xbd604000}, {0xbd606000},
- {0xbd608000}, {0xbd60a000}, {0xbd60c000}, {0xbd60e000},
- {0xbd610000}, {0xbd612000}, {0xbd614000}, {0xbd616000},
- {0xbd618000}, {0xbd61a000}, {0xbd61c000}, {0xbd61e000},
- {0xbd620000}, {0xbd622000}, {0xbd624000}, {0xbd626000},
- {0xbd628000}, {0xbd62a000}, {0xbd62c000}, {0xbd62e000},
- {0xbd630000}, {0xbd632000}, {0xbd634000}, {0xbd636000},
- {0xbd638000}, {0xbd63a000}, {0xbd63c000}, {0xbd63e000},
- {0xbd640000}, {0xbd642000}, {0xbd644000}, {0xbd646000},
- {0xbd648000}, {0xbd64a000}, {0xbd64c000}, {0xbd64e000},
- {0xbd650000}, {0xbd652000}, {0xbd654000}, {0xbd656000},
- {0xbd658000}, {0xbd65a000}, {0xbd65c000}, {0xbd65e000},
- {0xbd660000}, {0xbd662000}, {0xbd664000}, {0xbd666000},
- {0xbd668000}, {0xbd66a000}, {0xbd66c000}, {0xbd66e000},
- {0xbd670000}, {0xbd672000}, {0xbd674000}, {0xbd676000},
- {0xbd678000}, {0xbd67a000}, {0xbd67c000}, {0xbd67e000},
- {0xbd680000}, {0xbd682000}, {0xbd684000}, {0xbd686000},
- {0xbd688000}, {0xbd68a000}, {0xbd68c000}, {0xbd68e000},
- {0xbd690000}, {0xbd692000}, {0xbd694000}, {0xbd696000},
- {0xbd698000}, {0xbd69a000}, {0xbd69c000}, {0xbd69e000},
- {0xbd6a0000}, {0xbd6a2000}, {0xbd6a4000}, {0xbd6a6000},
- {0xbd6a8000}, {0xbd6aa000}, {0xbd6ac000}, {0xbd6ae000},
- {0xbd6b0000}, {0xbd6b2000}, {0xbd6b4000}, {0xbd6b6000},
- {0xbd6b8000}, {0xbd6ba000}, {0xbd6bc000}, {0xbd6be000},
- {0xbd6c0000}, {0xbd6c2000}, {0xbd6c4000}, {0xbd6c6000},
- {0xbd6c8000}, {0xbd6ca000}, {0xbd6cc000}, {0xbd6ce000},
- {0xbd6d0000}, {0xbd6d2000}, {0xbd6d4000}, {0xbd6d6000},
- {0xbd6d8000}, {0xbd6da000}, {0xbd6dc000}, {0xbd6de000},
- {0xbd6e0000}, {0xbd6e2000}, {0xbd6e4000}, {0xbd6e6000},
- {0xbd6e8000}, {0xbd6ea000}, {0xbd6ec000}, {0xbd6ee000},
- {0xbd6f0000}, {0xbd6f2000}, {0xbd6f4000}, {0xbd6f6000},
- {0xbd6f8000}, {0xbd6fa000}, {0xbd6fc000}, {0xbd6fe000},
- {0xbd700000}, {0xbd702000}, {0xbd704000}, {0xbd706000},
- {0xbd708000}, {0xbd70a000}, {0xbd70c000}, {0xbd70e000},
- {0xbd710000}, {0xbd712000}, {0xbd714000}, {0xbd716000},
- {0xbd718000}, {0xbd71a000}, {0xbd71c000}, {0xbd71e000},
- {0xbd720000}, {0xbd722000}, {0xbd724000}, {0xbd726000},
- {0xbd728000}, {0xbd72a000}, {0xbd72c000}, {0xbd72e000},
- {0xbd730000}, {0xbd732000}, {0xbd734000}, {0xbd736000},
- {0xbd738000}, {0xbd73a000}, {0xbd73c000}, {0xbd73e000},
- {0xbd740000}, {0xbd742000}, {0xbd744000}, {0xbd746000},
- {0xbd748000}, {0xbd74a000}, {0xbd74c000}, {0xbd74e000},
- {0xbd750000}, {0xbd752000}, {0xbd754000}, {0xbd756000},
- {0xbd758000}, {0xbd75a000}, {0xbd75c000}, {0xbd75e000},
- {0xbd760000}, {0xbd762000}, {0xbd764000}, {0xbd766000},
- {0xbd768000}, {0xbd76a000}, {0xbd76c000}, {0xbd76e000},
- {0xbd770000}, {0xbd772000}, {0xbd774000}, {0xbd776000},
- {0xbd778000}, {0xbd77a000}, {0xbd77c000}, {0xbd77e000},
- {0xbd780000}, {0xbd782000}, {0xbd784000}, {0xbd786000},
- {0xbd788000}, {0xbd78a000}, {0xbd78c000}, {0xbd78e000},
- {0xbd790000}, {0xbd792000}, {0xbd794000}, {0xbd796000},
- {0xbd798000}, {0xbd79a000}, {0xbd79c000}, {0xbd79e000},
- {0xbd7a0000}, {0xbd7a2000}, {0xbd7a4000}, {0xbd7a6000},
- {0xbd7a8000}, {0xbd7aa000}, {0xbd7ac000}, {0xbd7ae000},
- {0xbd7b0000}, {0xbd7b2000}, {0xbd7b4000}, {0xbd7b6000},
- {0xbd7b8000}, {0xbd7ba000}, {0xbd7bc000}, {0xbd7be000},
- {0xbd7c0000}, {0xbd7c2000}, {0xbd7c4000}, {0xbd7c6000},
- {0xbd7c8000}, {0xbd7ca000}, {0xbd7cc000}, {0xbd7ce000},
- {0xbd7d0000}, {0xbd7d2000}, {0xbd7d4000}, {0xbd7d6000},
- {0xbd7d8000}, {0xbd7da000}, {0xbd7dc000}, {0xbd7de000},
- {0xbd7e0000}, {0xbd7e2000}, {0xbd7e4000}, {0xbd7e6000},
- {0xbd7e8000}, {0xbd7ea000}, {0xbd7ec000}, {0xbd7ee000},
- {0xbd7f0000}, {0xbd7f2000}, {0xbd7f4000}, {0xbd7f6000},
- {0xbd7f8000}, {0xbd7fa000}, {0xbd7fc000}, {0xbd7fe000},
- {0xbd800000}, {0xbd802000}, {0xbd804000}, {0xbd806000},
- {0xbd808000}, {0xbd80a000}, {0xbd80c000}, {0xbd80e000},
- {0xbd810000}, {0xbd812000}, {0xbd814000}, {0xbd816000},
- {0xbd818000}, {0xbd81a000}, {0xbd81c000}, {0xbd81e000},
- {0xbd820000}, {0xbd822000}, {0xbd824000}, {0xbd826000},
- {0xbd828000}, {0xbd82a000}, {0xbd82c000}, {0xbd82e000},
- {0xbd830000}, {0xbd832000}, {0xbd834000}, {0xbd836000},
- {0xbd838000}, {0xbd83a000}, {0xbd83c000}, {0xbd83e000},
- {0xbd840000}, {0xbd842000}, {0xbd844000}, {0xbd846000},
- {0xbd848000}, {0xbd84a000}, {0xbd84c000}, {0xbd84e000},
- {0xbd850000}, {0xbd852000}, {0xbd854000}, {0xbd856000},
- {0xbd858000}, {0xbd85a000}, {0xbd85c000}, {0xbd85e000},
- {0xbd860000}, {0xbd862000}, {0xbd864000}, {0xbd866000},
- {0xbd868000}, {0xbd86a000}, {0xbd86c000}, {0xbd86e000},
- {0xbd870000}, {0xbd872000}, {0xbd874000}, {0xbd876000},
- {0xbd878000}, {0xbd87a000}, {0xbd87c000}, {0xbd87e000},
- {0xbd880000}, {0xbd882000}, {0xbd884000}, {0xbd886000},
- {0xbd888000}, {0xbd88a000}, {0xbd88c000}, {0xbd88e000},
- {0xbd890000}, {0xbd892000}, {0xbd894000}, {0xbd896000},
- {0xbd898000}, {0xbd89a000}, {0xbd89c000}, {0xbd89e000},
- {0xbd8a0000}, {0xbd8a2000}, {0xbd8a4000}, {0xbd8a6000},
- {0xbd8a8000}, {0xbd8aa000}, {0xbd8ac000}, {0xbd8ae000},
- {0xbd8b0000}, {0xbd8b2000}, {0xbd8b4000}, {0xbd8b6000},
- {0xbd8b8000}, {0xbd8ba000}, {0xbd8bc000}, {0xbd8be000},
- {0xbd8c0000}, {0xbd8c2000}, {0xbd8c4000}, {0xbd8c6000},
- {0xbd8c8000}, {0xbd8ca000}, {0xbd8cc000}, {0xbd8ce000},
- {0xbd8d0000}, {0xbd8d2000}, {0xbd8d4000}, {0xbd8d6000},
- {0xbd8d8000}, {0xbd8da000}, {0xbd8dc000}, {0xbd8de000},
- {0xbd8e0000}, {0xbd8e2000}, {0xbd8e4000}, {0xbd8e6000},
- {0xbd8e8000}, {0xbd8ea000}, {0xbd8ec000}, {0xbd8ee000},
- {0xbd8f0000}, {0xbd8f2000}, {0xbd8f4000}, {0xbd8f6000},
- {0xbd8f8000}, {0xbd8fa000}, {0xbd8fc000}, {0xbd8fe000},
- {0xbd900000}, {0xbd902000}, {0xbd904000}, {0xbd906000},
- {0xbd908000}, {0xbd90a000}, {0xbd90c000}, {0xbd90e000},
- {0xbd910000}, {0xbd912000}, {0xbd914000}, {0xbd916000},
- {0xbd918000}, {0xbd91a000}, {0xbd91c000}, {0xbd91e000},
- {0xbd920000}, {0xbd922000}, {0xbd924000}, {0xbd926000},
- {0xbd928000}, {0xbd92a000}, {0xbd92c000}, {0xbd92e000},
- {0xbd930000}, {0xbd932000}, {0xbd934000}, {0xbd936000},
- {0xbd938000}, {0xbd93a000}, {0xbd93c000}, {0xbd93e000},
- {0xbd940000}, {0xbd942000}, {0xbd944000}, {0xbd946000},
- {0xbd948000}, {0xbd94a000}, {0xbd94c000}, {0xbd94e000},
- {0xbd950000}, {0xbd952000}, {0xbd954000}, {0xbd956000},
- {0xbd958000}, {0xbd95a000}, {0xbd95c000}, {0xbd95e000},
- {0xbd960000}, {0xbd962000}, {0xbd964000}, {0xbd966000},
- {0xbd968000}, {0xbd96a000}, {0xbd96c000}, {0xbd96e000},
- {0xbd970000}, {0xbd972000}, {0xbd974000}, {0xbd976000},
- {0xbd978000}, {0xbd97a000}, {0xbd97c000}, {0xbd97e000},
- {0xbd980000}, {0xbd982000}, {0xbd984000}, {0xbd986000},
- {0xbd988000}, {0xbd98a000}, {0xbd98c000}, {0xbd98e000},
- {0xbd990000}, {0xbd992000}, {0xbd994000}, {0xbd996000},
- {0xbd998000}, {0xbd99a000}, {0xbd99c000}, {0xbd99e000},
- {0xbd9a0000}, {0xbd9a2000}, {0xbd9a4000}, {0xbd9a6000},
- {0xbd9a8000}, {0xbd9aa000}, {0xbd9ac000}, {0xbd9ae000},
- {0xbd9b0000}, {0xbd9b2000}, {0xbd9b4000}, {0xbd9b6000},
- {0xbd9b8000}, {0xbd9ba000}, {0xbd9bc000}, {0xbd9be000},
- {0xbd9c0000}, {0xbd9c2000}, {0xbd9c4000}, {0xbd9c6000},
- {0xbd9c8000}, {0xbd9ca000}, {0xbd9cc000}, {0xbd9ce000},
- {0xbd9d0000}, {0xbd9d2000}, {0xbd9d4000}, {0xbd9d6000},
- {0xbd9d8000}, {0xbd9da000}, {0xbd9dc000}, {0xbd9de000},
- {0xbd9e0000}, {0xbd9e2000}, {0xbd9e4000}, {0xbd9e6000},
- {0xbd9e8000}, {0xbd9ea000}, {0xbd9ec000}, {0xbd9ee000},
- {0xbd9f0000}, {0xbd9f2000}, {0xbd9f4000}, {0xbd9f6000},
- {0xbd9f8000}, {0xbd9fa000}, {0xbd9fc000}, {0xbd9fe000},
- {0xbda00000}, {0xbda02000}, {0xbda04000}, {0xbda06000},
- {0xbda08000}, {0xbda0a000}, {0xbda0c000}, {0xbda0e000},
- {0xbda10000}, {0xbda12000}, {0xbda14000}, {0xbda16000},
- {0xbda18000}, {0xbda1a000}, {0xbda1c000}, {0xbda1e000},
- {0xbda20000}, {0xbda22000}, {0xbda24000}, {0xbda26000},
- {0xbda28000}, {0xbda2a000}, {0xbda2c000}, {0xbda2e000},
- {0xbda30000}, {0xbda32000}, {0xbda34000}, {0xbda36000},
- {0xbda38000}, {0xbda3a000}, {0xbda3c000}, {0xbda3e000},
- {0xbda40000}, {0xbda42000}, {0xbda44000}, {0xbda46000},
- {0xbda48000}, {0xbda4a000}, {0xbda4c000}, {0xbda4e000},
- {0xbda50000}, {0xbda52000}, {0xbda54000}, {0xbda56000},
- {0xbda58000}, {0xbda5a000}, {0xbda5c000}, {0xbda5e000},
- {0xbda60000}, {0xbda62000}, {0xbda64000}, {0xbda66000},
- {0xbda68000}, {0xbda6a000}, {0xbda6c000}, {0xbda6e000},
- {0xbda70000}, {0xbda72000}, {0xbda74000}, {0xbda76000},
- {0xbda78000}, {0xbda7a000}, {0xbda7c000}, {0xbda7e000},
- {0xbda80000}, {0xbda82000}, {0xbda84000}, {0xbda86000},
- {0xbda88000}, {0xbda8a000}, {0xbda8c000}, {0xbda8e000},
- {0xbda90000}, {0xbda92000}, {0xbda94000}, {0xbda96000},
- {0xbda98000}, {0xbda9a000}, {0xbda9c000}, {0xbda9e000},
- {0xbdaa0000}, {0xbdaa2000}, {0xbdaa4000}, {0xbdaa6000},
- {0xbdaa8000}, {0xbdaaa000}, {0xbdaac000}, {0xbdaae000},
- {0xbdab0000}, {0xbdab2000}, {0xbdab4000}, {0xbdab6000},
- {0xbdab8000}, {0xbdaba000}, {0xbdabc000}, {0xbdabe000},
- {0xbdac0000}, {0xbdac2000}, {0xbdac4000}, {0xbdac6000},
- {0xbdac8000}, {0xbdaca000}, {0xbdacc000}, {0xbdace000},
- {0xbdad0000}, {0xbdad2000}, {0xbdad4000}, {0xbdad6000},
- {0xbdad8000}, {0xbdada000}, {0xbdadc000}, {0xbdade000},
- {0xbdae0000}, {0xbdae2000}, {0xbdae4000}, {0xbdae6000},
- {0xbdae8000}, {0xbdaea000}, {0xbdaec000}, {0xbdaee000},
- {0xbdaf0000}, {0xbdaf2000}, {0xbdaf4000}, {0xbdaf6000},
- {0xbdaf8000}, {0xbdafa000}, {0xbdafc000}, {0xbdafe000},
- {0xbdb00000}, {0xbdb02000}, {0xbdb04000}, {0xbdb06000},
- {0xbdb08000}, {0xbdb0a000}, {0xbdb0c000}, {0xbdb0e000},
- {0xbdb10000}, {0xbdb12000}, {0xbdb14000}, {0xbdb16000},
- {0xbdb18000}, {0xbdb1a000}, {0xbdb1c000}, {0xbdb1e000},
- {0xbdb20000}, {0xbdb22000}, {0xbdb24000}, {0xbdb26000},
- {0xbdb28000}, {0xbdb2a000}, {0xbdb2c000}, {0xbdb2e000},
- {0xbdb30000}, {0xbdb32000}, {0xbdb34000}, {0xbdb36000},
- {0xbdb38000}, {0xbdb3a000}, {0xbdb3c000}, {0xbdb3e000},
- {0xbdb40000}, {0xbdb42000}, {0xbdb44000}, {0xbdb46000},
- {0xbdb48000}, {0xbdb4a000}, {0xbdb4c000}, {0xbdb4e000},
- {0xbdb50000}, {0xbdb52000}, {0xbdb54000}, {0xbdb56000},
- {0xbdb58000}, {0xbdb5a000}, {0xbdb5c000}, {0xbdb5e000},
- {0xbdb60000}, {0xbdb62000}, {0xbdb64000}, {0xbdb66000},
- {0xbdb68000}, {0xbdb6a000}, {0xbdb6c000}, {0xbdb6e000},
- {0xbdb70000}, {0xbdb72000}, {0xbdb74000}, {0xbdb76000},
- {0xbdb78000}, {0xbdb7a000}, {0xbdb7c000}, {0xbdb7e000},
- {0xbdb80000}, {0xbdb82000}, {0xbdb84000}, {0xbdb86000},
- {0xbdb88000}, {0xbdb8a000}, {0xbdb8c000}, {0xbdb8e000},
- {0xbdb90000}, {0xbdb92000}, {0xbdb94000}, {0xbdb96000},
- {0xbdb98000}, {0xbdb9a000}, {0xbdb9c000}, {0xbdb9e000},
- {0xbdba0000}, {0xbdba2000}, {0xbdba4000}, {0xbdba6000},
- {0xbdba8000}, {0xbdbaa000}, {0xbdbac000}, {0xbdbae000},
- {0xbdbb0000}, {0xbdbb2000}, {0xbdbb4000}, {0xbdbb6000},
- {0xbdbb8000}, {0xbdbba000}, {0xbdbbc000}, {0xbdbbe000},
- {0xbdbc0000}, {0xbdbc2000}, {0xbdbc4000}, {0xbdbc6000},
- {0xbdbc8000}, {0xbdbca000}, {0xbdbcc000}, {0xbdbce000},
- {0xbdbd0000}, {0xbdbd2000}, {0xbdbd4000}, {0xbdbd6000},
- {0xbdbd8000}, {0xbdbda000}, {0xbdbdc000}, {0xbdbde000},
- {0xbdbe0000}, {0xbdbe2000}, {0xbdbe4000}, {0xbdbe6000},
- {0xbdbe8000}, {0xbdbea000}, {0xbdbec000}, {0xbdbee000},
- {0xbdbf0000}, {0xbdbf2000}, {0xbdbf4000}, {0xbdbf6000},
- {0xbdbf8000}, {0xbdbfa000}, {0xbdbfc000}, {0xbdbfe000},
- {0xbdc00000}, {0xbdc02000}, {0xbdc04000}, {0xbdc06000},
- {0xbdc08000}, {0xbdc0a000}, {0xbdc0c000}, {0xbdc0e000},
- {0xbdc10000}, {0xbdc12000}, {0xbdc14000}, {0xbdc16000},
- {0xbdc18000}, {0xbdc1a000}, {0xbdc1c000}, {0xbdc1e000},
- {0xbdc20000}, {0xbdc22000}, {0xbdc24000}, {0xbdc26000},
- {0xbdc28000}, {0xbdc2a000}, {0xbdc2c000}, {0xbdc2e000},
- {0xbdc30000}, {0xbdc32000}, {0xbdc34000}, {0xbdc36000},
- {0xbdc38000}, {0xbdc3a000}, {0xbdc3c000}, {0xbdc3e000},
- {0xbdc40000}, {0xbdc42000}, {0xbdc44000}, {0xbdc46000},
- {0xbdc48000}, {0xbdc4a000}, {0xbdc4c000}, {0xbdc4e000},
- {0xbdc50000}, {0xbdc52000}, {0xbdc54000}, {0xbdc56000},
- {0xbdc58000}, {0xbdc5a000}, {0xbdc5c000}, {0xbdc5e000},
- {0xbdc60000}, {0xbdc62000}, {0xbdc64000}, {0xbdc66000},
- {0xbdc68000}, {0xbdc6a000}, {0xbdc6c000}, {0xbdc6e000},
- {0xbdc70000}, {0xbdc72000}, {0xbdc74000}, {0xbdc76000},
- {0xbdc78000}, {0xbdc7a000}, {0xbdc7c000}, {0xbdc7e000},
- {0xbdc80000}, {0xbdc82000}, {0xbdc84000}, {0xbdc86000},
- {0xbdc88000}, {0xbdc8a000}, {0xbdc8c000}, {0xbdc8e000},
- {0xbdc90000}, {0xbdc92000}, {0xbdc94000}, {0xbdc96000},
- {0xbdc98000}, {0xbdc9a000}, {0xbdc9c000}, {0xbdc9e000},
- {0xbdca0000}, {0xbdca2000}, {0xbdca4000}, {0xbdca6000},
- {0xbdca8000}, {0xbdcaa000}, {0xbdcac000}, {0xbdcae000},
- {0xbdcb0000}, {0xbdcb2000}, {0xbdcb4000}, {0xbdcb6000},
- {0xbdcb8000}, {0xbdcba000}, {0xbdcbc000}, {0xbdcbe000},
- {0xbdcc0000}, {0xbdcc2000}, {0xbdcc4000}, {0xbdcc6000},
- {0xbdcc8000}, {0xbdcca000}, {0xbdccc000}, {0xbdcce000},
- {0xbdcd0000}, {0xbdcd2000}, {0xbdcd4000}, {0xbdcd6000},
- {0xbdcd8000}, {0xbdcda000}, {0xbdcdc000}, {0xbdcde000},
- {0xbdce0000}, {0xbdce2000}, {0xbdce4000}, {0xbdce6000},
- {0xbdce8000}, {0xbdcea000}, {0xbdcec000}, {0xbdcee000},
- {0xbdcf0000}, {0xbdcf2000}, {0xbdcf4000}, {0xbdcf6000},
- {0xbdcf8000}, {0xbdcfa000}, {0xbdcfc000}, {0xbdcfe000},
- {0xbdd00000}, {0xbdd02000}, {0xbdd04000}, {0xbdd06000},
- {0xbdd08000}, {0xbdd0a000}, {0xbdd0c000}, {0xbdd0e000},
- {0xbdd10000}, {0xbdd12000}, {0xbdd14000}, {0xbdd16000},
- {0xbdd18000}, {0xbdd1a000}, {0xbdd1c000}, {0xbdd1e000},
- {0xbdd20000}, {0xbdd22000}, {0xbdd24000}, {0xbdd26000},
- {0xbdd28000}, {0xbdd2a000}, {0xbdd2c000}, {0xbdd2e000},
- {0xbdd30000}, {0xbdd32000}, {0xbdd34000}, {0xbdd36000},
- {0xbdd38000}, {0xbdd3a000}, {0xbdd3c000}, {0xbdd3e000},
- {0xbdd40000}, {0xbdd42000}, {0xbdd44000}, {0xbdd46000},
- {0xbdd48000}, {0xbdd4a000}, {0xbdd4c000}, {0xbdd4e000},
- {0xbdd50000}, {0xbdd52000}, {0xbdd54000}, {0xbdd56000},
- {0xbdd58000}, {0xbdd5a000}, {0xbdd5c000}, {0xbdd5e000},
- {0xbdd60000}, {0xbdd62000}, {0xbdd64000}, {0xbdd66000},
- {0xbdd68000}, {0xbdd6a000}, {0xbdd6c000}, {0xbdd6e000},
- {0xbdd70000}, {0xbdd72000}, {0xbdd74000}, {0xbdd76000},
- {0xbdd78000}, {0xbdd7a000}, {0xbdd7c000}, {0xbdd7e000},
- {0xbdd80000}, {0xbdd82000}, {0xbdd84000}, {0xbdd86000},
- {0xbdd88000}, {0xbdd8a000}, {0xbdd8c000}, {0xbdd8e000},
- {0xbdd90000}, {0xbdd92000}, {0xbdd94000}, {0xbdd96000},
- {0xbdd98000}, {0xbdd9a000}, {0xbdd9c000}, {0xbdd9e000},
- {0xbdda0000}, {0xbdda2000}, {0xbdda4000}, {0xbdda6000},
- {0xbdda8000}, {0xbddaa000}, {0xbddac000}, {0xbddae000},
- {0xbddb0000}, {0xbddb2000}, {0xbddb4000}, {0xbddb6000},
- {0xbddb8000}, {0xbddba000}, {0xbddbc000}, {0xbddbe000},
- {0xbddc0000}, {0xbddc2000}, {0xbddc4000}, {0xbddc6000},
- {0xbddc8000}, {0xbddca000}, {0xbddcc000}, {0xbddce000},
- {0xbddd0000}, {0xbddd2000}, {0xbddd4000}, {0xbddd6000},
- {0xbddd8000}, {0xbddda000}, {0xbdddc000}, {0xbddde000},
- {0xbdde0000}, {0xbdde2000}, {0xbdde4000}, {0xbdde6000},
- {0xbdde8000}, {0xbddea000}, {0xbddec000}, {0xbddee000},
- {0xbddf0000}, {0xbddf2000}, {0xbddf4000}, {0xbddf6000},
- {0xbddf8000}, {0xbddfa000}, {0xbddfc000}, {0xbddfe000},
- {0xbde00000}, {0xbde02000}, {0xbde04000}, {0xbde06000},
- {0xbde08000}, {0xbde0a000}, {0xbde0c000}, {0xbde0e000},
- {0xbde10000}, {0xbde12000}, {0xbde14000}, {0xbde16000},
- {0xbde18000}, {0xbde1a000}, {0xbde1c000}, {0xbde1e000},
- {0xbde20000}, {0xbde22000}, {0xbde24000}, {0xbde26000},
- {0xbde28000}, {0xbde2a000}, {0xbde2c000}, {0xbde2e000},
- {0xbde30000}, {0xbde32000}, {0xbde34000}, {0xbde36000},
- {0xbde38000}, {0xbde3a000}, {0xbde3c000}, {0xbde3e000},
- {0xbde40000}, {0xbde42000}, {0xbde44000}, {0xbde46000},
- {0xbde48000}, {0xbde4a000}, {0xbde4c000}, {0xbde4e000},
- {0xbde50000}, {0xbde52000}, {0xbde54000}, {0xbde56000},
- {0xbde58000}, {0xbde5a000}, {0xbde5c000}, {0xbde5e000},
- {0xbde60000}, {0xbde62000}, {0xbde64000}, {0xbde66000},
- {0xbde68000}, {0xbde6a000}, {0xbde6c000}, {0xbde6e000},
- {0xbde70000}, {0xbde72000}, {0xbde74000}, {0xbde76000},
- {0xbde78000}, {0xbde7a000}, {0xbde7c000}, {0xbde7e000},
- {0xbde80000}, {0xbde82000}, {0xbde84000}, {0xbde86000},
- {0xbde88000}, {0xbde8a000}, {0xbde8c000}, {0xbde8e000},
- {0xbde90000}, {0xbde92000}, {0xbde94000}, {0xbde96000},
- {0xbde98000}, {0xbde9a000}, {0xbde9c000}, {0xbde9e000},
- {0xbdea0000}, {0xbdea2000}, {0xbdea4000}, {0xbdea6000},
- {0xbdea8000}, {0xbdeaa000}, {0xbdeac000}, {0xbdeae000},
- {0xbdeb0000}, {0xbdeb2000}, {0xbdeb4000}, {0xbdeb6000},
- {0xbdeb8000}, {0xbdeba000}, {0xbdebc000}, {0xbdebe000},
- {0xbdec0000}, {0xbdec2000}, {0xbdec4000}, {0xbdec6000},
- {0xbdec8000}, {0xbdeca000}, {0xbdecc000}, {0xbdece000},
- {0xbded0000}, {0xbded2000}, {0xbded4000}, {0xbded6000},
- {0xbded8000}, {0xbdeda000}, {0xbdedc000}, {0xbdede000},
- {0xbdee0000}, {0xbdee2000}, {0xbdee4000}, {0xbdee6000},
- {0xbdee8000}, {0xbdeea000}, {0xbdeec000}, {0xbdeee000},
- {0xbdef0000}, {0xbdef2000}, {0xbdef4000}, {0xbdef6000},
- {0xbdef8000}, {0xbdefa000}, {0xbdefc000}, {0xbdefe000},
- {0xbdf00000}, {0xbdf02000}, {0xbdf04000}, {0xbdf06000},
- {0xbdf08000}, {0xbdf0a000}, {0xbdf0c000}, {0xbdf0e000},
- {0xbdf10000}, {0xbdf12000}, {0xbdf14000}, {0xbdf16000},
- {0xbdf18000}, {0xbdf1a000}, {0xbdf1c000}, {0xbdf1e000},
- {0xbdf20000}, {0xbdf22000}, {0xbdf24000}, {0xbdf26000},
- {0xbdf28000}, {0xbdf2a000}, {0xbdf2c000}, {0xbdf2e000},
- {0xbdf30000}, {0xbdf32000}, {0xbdf34000}, {0xbdf36000},
- {0xbdf38000}, {0xbdf3a000}, {0xbdf3c000}, {0xbdf3e000},
- {0xbdf40000}, {0xbdf42000}, {0xbdf44000}, {0xbdf46000},
- {0xbdf48000}, {0xbdf4a000}, {0xbdf4c000}, {0xbdf4e000},
- {0xbdf50000}, {0xbdf52000}, {0xbdf54000}, {0xbdf56000},
- {0xbdf58000}, {0xbdf5a000}, {0xbdf5c000}, {0xbdf5e000},
- {0xbdf60000}, {0xbdf62000}, {0xbdf64000}, {0xbdf66000},
- {0xbdf68000}, {0xbdf6a000}, {0xbdf6c000}, {0xbdf6e000},
- {0xbdf70000}, {0xbdf72000}, {0xbdf74000}, {0xbdf76000},
- {0xbdf78000}, {0xbdf7a000}, {0xbdf7c000}, {0xbdf7e000},
- {0xbdf80000}, {0xbdf82000}, {0xbdf84000}, {0xbdf86000},
- {0xbdf88000}, {0xbdf8a000}, {0xbdf8c000}, {0xbdf8e000},
- {0xbdf90000}, {0xbdf92000}, {0xbdf94000}, {0xbdf96000},
- {0xbdf98000}, {0xbdf9a000}, {0xbdf9c000}, {0xbdf9e000},
- {0xbdfa0000}, {0xbdfa2000}, {0xbdfa4000}, {0xbdfa6000},
- {0xbdfa8000}, {0xbdfaa000}, {0xbdfac000}, {0xbdfae000},
- {0xbdfb0000}, {0xbdfb2000}, {0xbdfb4000}, {0xbdfb6000},
- {0xbdfb8000}, {0xbdfba000}, {0xbdfbc000}, {0xbdfbe000},
- {0xbdfc0000}, {0xbdfc2000}, {0xbdfc4000}, {0xbdfc6000},
- {0xbdfc8000}, {0xbdfca000}, {0xbdfcc000}, {0xbdfce000},
- {0xbdfd0000}, {0xbdfd2000}, {0xbdfd4000}, {0xbdfd6000},
- {0xbdfd8000}, {0xbdfda000}, {0xbdfdc000}, {0xbdfde000},
- {0xbdfe0000}, {0xbdfe2000}, {0xbdfe4000}, {0xbdfe6000},
- {0xbdfe8000}, {0xbdfea000}, {0xbdfec000}, {0xbdfee000},
- {0xbdff0000}, {0xbdff2000}, {0xbdff4000}, {0xbdff6000},
- {0xbdff8000}, {0xbdffa000}, {0xbdffc000}, {0xbdffe000},
- {0xbe000000}, {0xbe002000}, {0xbe004000}, {0xbe006000},
- {0xbe008000}, {0xbe00a000}, {0xbe00c000}, {0xbe00e000},
- {0xbe010000}, {0xbe012000}, {0xbe014000}, {0xbe016000},
- {0xbe018000}, {0xbe01a000}, {0xbe01c000}, {0xbe01e000},
- {0xbe020000}, {0xbe022000}, {0xbe024000}, {0xbe026000},
- {0xbe028000}, {0xbe02a000}, {0xbe02c000}, {0xbe02e000},
- {0xbe030000}, {0xbe032000}, {0xbe034000}, {0xbe036000},
- {0xbe038000}, {0xbe03a000}, {0xbe03c000}, {0xbe03e000},
- {0xbe040000}, {0xbe042000}, {0xbe044000}, {0xbe046000},
- {0xbe048000}, {0xbe04a000}, {0xbe04c000}, {0xbe04e000},
- {0xbe050000}, {0xbe052000}, {0xbe054000}, {0xbe056000},
- {0xbe058000}, {0xbe05a000}, {0xbe05c000}, {0xbe05e000},
- {0xbe060000}, {0xbe062000}, {0xbe064000}, {0xbe066000},
- {0xbe068000}, {0xbe06a000}, {0xbe06c000}, {0xbe06e000},
- {0xbe070000}, {0xbe072000}, {0xbe074000}, {0xbe076000},
- {0xbe078000}, {0xbe07a000}, {0xbe07c000}, {0xbe07e000},
- {0xbe080000}, {0xbe082000}, {0xbe084000}, {0xbe086000},
- {0xbe088000}, {0xbe08a000}, {0xbe08c000}, {0xbe08e000},
- {0xbe090000}, {0xbe092000}, {0xbe094000}, {0xbe096000},
- {0xbe098000}, {0xbe09a000}, {0xbe09c000}, {0xbe09e000},
- {0xbe0a0000}, {0xbe0a2000}, {0xbe0a4000}, {0xbe0a6000},
- {0xbe0a8000}, {0xbe0aa000}, {0xbe0ac000}, {0xbe0ae000},
- {0xbe0b0000}, {0xbe0b2000}, {0xbe0b4000}, {0xbe0b6000},
- {0xbe0b8000}, {0xbe0ba000}, {0xbe0bc000}, {0xbe0be000},
- {0xbe0c0000}, {0xbe0c2000}, {0xbe0c4000}, {0xbe0c6000},
- {0xbe0c8000}, {0xbe0ca000}, {0xbe0cc000}, {0xbe0ce000},
- {0xbe0d0000}, {0xbe0d2000}, {0xbe0d4000}, {0xbe0d6000},
- {0xbe0d8000}, {0xbe0da000}, {0xbe0dc000}, {0xbe0de000},
- {0xbe0e0000}, {0xbe0e2000}, {0xbe0e4000}, {0xbe0e6000},
- {0xbe0e8000}, {0xbe0ea000}, {0xbe0ec000}, {0xbe0ee000},
- {0xbe0f0000}, {0xbe0f2000}, {0xbe0f4000}, {0xbe0f6000},
- {0xbe0f8000}, {0xbe0fa000}, {0xbe0fc000}, {0xbe0fe000},
- {0xbe100000}, {0xbe102000}, {0xbe104000}, {0xbe106000},
- {0xbe108000}, {0xbe10a000}, {0xbe10c000}, {0xbe10e000},
- {0xbe110000}, {0xbe112000}, {0xbe114000}, {0xbe116000},
- {0xbe118000}, {0xbe11a000}, {0xbe11c000}, {0xbe11e000},
- {0xbe120000}, {0xbe122000}, {0xbe124000}, {0xbe126000},
- {0xbe128000}, {0xbe12a000}, {0xbe12c000}, {0xbe12e000},
- {0xbe130000}, {0xbe132000}, {0xbe134000}, {0xbe136000},
- {0xbe138000}, {0xbe13a000}, {0xbe13c000}, {0xbe13e000},
- {0xbe140000}, {0xbe142000}, {0xbe144000}, {0xbe146000},
- {0xbe148000}, {0xbe14a000}, {0xbe14c000}, {0xbe14e000},
- {0xbe150000}, {0xbe152000}, {0xbe154000}, {0xbe156000},
- {0xbe158000}, {0xbe15a000}, {0xbe15c000}, {0xbe15e000},
- {0xbe160000}, {0xbe162000}, {0xbe164000}, {0xbe166000},
- {0xbe168000}, {0xbe16a000}, {0xbe16c000}, {0xbe16e000},
- {0xbe170000}, {0xbe172000}, {0xbe174000}, {0xbe176000},
- {0xbe178000}, {0xbe17a000}, {0xbe17c000}, {0xbe17e000},
- {0xbe180000}, {0xbe182000}, {0xbe184000}, {0xbe186000},
- {0xbe188000}, {0xbe18a000}, {0xbe18c000}, {0xbe18e000},
- {0xbe190000}, {0xbe192000}, {0xbe194000}, {0xbe196000},
- {0xbe198000}, {0xbe19a000}, {0xbe19c000}, {0xbe19e000},
- {0xbe1a0000}, {0xbe1a2000}, {0xbe1a4000}, {0xbe1a6000},
- {0xbe1a8000}, {0xbe1aa000}, {0xbe1ac000}, {0xbe1ae000},
- {0xbe1b0000}, {0xbe1b2000}, {0xbe1b4000}, {0xbe1b6000},
- {0xbe1b8000}, {0xbe1ba000}, {0xbe1bc000}, {0xbe1be000},
- {0xbe1c0000}, {0xbe1c2000}, {0xbe1c4000}, {0xbe1c6000},
- {0xbe1c8000}, {0xbe1ca000}, {0xbe1cc000}, {0xbe1ce000},
- {0xbe1d0000}, {0xbe1d2000}, {0xbe1d4000}, {0xbe1d6000},
- {0xbe1d8000}, {0xbe1da000}, {0xbe1dc000}, {0xbe1de000},
- {0xbe1e0000}, {0xbe1e2000}, {0xbe1e4000}, {0xbe1e6000},
- {0xbe1e8000}, {0xbe1ea000}, {0xbe1ec000}, {0xbe1ee000},
- {0xbe1f0000}, {0xbe1f2000}, {0xbe1f4000}, {0xbe1f6000},
- {0xbe1f8000}, {0xbe1fa000}, {0xbe1fc000}, {0xbe1fe000},
- {0xbe200000}, {0xbe202000}, {0xbe204000}, {0xbe206000},
- {0xbe208000}, {0xbe20a000}, {0xbe20c000}, {0xbe20e000},
- {0xbe210000}, {0xbe212000}, {0xbe214000}, {0xbe216000},
- {0xbe218000}, {0xbe21a000}, {0xbe21c000}, {0xbe21e000},
- {0xbe220000}, {0xbe222000}, {0xbe224000}, {0xbe226000},
- {0xbe228000}, {0xbe22a000}, {0xbe22c000}, {0xbe22e000},
- {0xbe230000}, {0xbe232000}, {0xbe234000}, {0xbe236000},
- {0xbe238000}, {0xbe23a000}, {0xbe23c000}, {0xbe23e000},
- {0xbe240000}, {0xbe242000}, {0xbe244000}, {0xbe246000},
- {0xbe248000}, {0xbe24a000}, {0xbe24c000}, {0xbe24e000},
- {0xbe250000}, {0xbe252000}, {0xbe254000}, {0xbe256000},
- {0xbe258000}, {0xbe25a000}, {0xbe25c000}, {0xbe25e000},
- {0xbe260000}, {0xbe262000}, {0xbe264000}, {0xbe266000},
- {0xbe268000}, {0xbe26a000}, {0xbe26c000}, {0xbe26e000},
- {0xbe270000}, {0xbe272000}, {0xbe274000}, {0xbe276000},
- {0xbe278000}, {0xbe27a000}, {0xbe27c000}, {0xbe27e000},
- {0xbe280000}, {0xbe282000}, {0xbe284000}, {0xbe286000},
- {0xbe288000}, {0xbe28a000}, {0xbe28c000}, {0xbe28e000},
- {0xbe290000}, {0xbe292000}, {0xbe294000}, {0xbe296000},
- {0xbe298000}, {0xbe29a000}, {0xbe29c000}, {0xbe29e000},
- {0xbe2a0000}, {0xbe2a2000}, {0xbe2a4000}, {0xbe2a6000},
- {0xbe2a8000}, {0xbe2aa000}, {0xbe2ac000}, {0xbe2ae000},
- {0xbe2b0000}, {0xbe2b2000}, {0xbe2b4000}, {0xbe2b6000},
- {0xbe2b8000}, {0xbe2ba000}, {0xbe2bc000}, {0xbe2be000},
- {0xbe2c0000}, {0xbe2c2000}, {0xbe2c4000}, {0xbe2c6000},
- {0xbe2c8000}, {0xbe2ca000}, {0xbe2cc000}, {0xbe2ce000},
- {0xbe2d0000}, {0xbe2d2000}, {0xbe2d4000}, {0xbe2d6000},
- {0xbe2d8000}, {0xbe2da000}, {0xbe2dc000}, {0xbe2de000},
- {0xbe2e0000}, {0xbe2e2000}, {0xbe2e4000}, {0xbe2e6000},
- {0xbe2e8000}, {0xbe2ea000}, {0xbe2ec000}, {0xbe2ee000},
- {0xbe2f0000}, {0xbe2f2000}, {0xbe2f4000}, {0xbe2f6000},
- {0xbe2f8000}, {0xbe2fa000}, {0xbe2fc000}, {0xbe2fe000},
- {0xbe300000}, {0xbe302000}, {0xbe304000}, {0xbe306000},
- {0xbe308000}, {0xbe30a000}, {0xbe30c000}, {0xbe30e000},
- {0xbe310000}, {0xbe312000}, {0xbe314000}, {0xbe316000},
- {0xbe318000}, {0xbe31a000}, {0xbe31c000}, {0xbe31e000},
- {0xbe320000}, {0xbe322000}, {0xbe324000}, {0xbe326000},
- {0xbe328000}, {0xbe32a000}, {0xbe32c000}, {0xbe32e000},
- {0xbe330000}, {0xbe332000}, {0xbe334000}, {0xbe336000},
- {0xbe338000}, {0xbe33a000}, {0xbe33c000}, {0xbe33e000},
- {0xbe340000}, {0xbe342000}, {0xbe344000}, {0xbe346000},
- {0xbe348000}, {0xbe34a000}, {0xbe34c000}, {0xbe34e000},
- {0xbe350000}, {0xbe352000}, {0xbe354000}, {0xbe356000},
- {0xbe358000}, {0xbe35a000}, {0xbe35c000}, {0xbe35e000},
- {0xbe360000}, {0xbe362000}, {0xbe364000}, {0xbe366000},
- {0xbe368000}, {0xbe36a000}, {0xbe36c000}, {0xbe36e000},
- {0xbe370000}, {0xbe372000}, {0xbe374000}, {0xbe376000},
- {0xbe378000}, {0xbe37a000}, {0xbe37c000}, {0xbe37e000},
- {0xbe380000}, {0xbe382000}, {0xbe384000}, {0xbe386000},
- {0xbe388000}, {0xbe38a000}, {0xbe38c000}, {0xbe38e000},
- {0xbe390000}, {0xbe392000}, {0xbe394000}, {0xbe396000},
- {0xbe398000}, {0xbe39a000}, {0xbe39c000}, {0xbe39e000},
- {0xbe3a0000}, {0xbe3a2000}, {0xbe3a4000}, {0xbe3a6000},
- {0xbe3a8000}, {0xbe3aa000}, {0xbe3ac000}, {0xbe3ae000},
- {0xbe3b0000}, {0xbe3b2000}, {0xbe3b4000}, {0xbe3b6000},
- {0xbe3b8000}, {0xbe3ba000}, {0xbe3bc000}, {0xbe3be000},
- {0xbe3c0000}, {0xbe3c2000}, {0xbe3c4000}, {0xbe3c6000},
- {0xbe3c8000}, {0xbe3ca000}, {0xbe3cc000}, {0xbe3ce000},
- {0xbe3d0000}, {0xbe3d2000}, {0xbe3d4000}, {0xbe3d6000},
- {0xbe3d8000}, {0xbe3da000}, {0xbe3dc000}, {0xbe3de000},
- {0xbe3e0000}, {0xbe3e2000}, {0xbe3e4000}, {0xbe3e6000},
- {0xbe3e8000}, {0xbe3ea000}, {0xbe3ec000}, {0xbe3ee000},
- {0xbe3f0000}, {0xbe3f2000}, {0xbe3f4000}, {0xbe3f6000},
- {0xbe3f8000}, {0xbe3fa000}, {0xbe3fc000}, {0xbe3fe000},
- {0xbe400000}, {0xbe402000}, {0xbe404000}, {0xbe406000},
- {0xbe408000}, {0xbe40a000}, {0xbe40c000}, {0xbe40e000},
- {0xbe410000}, {0xbe412000}, {0xbe414000}, {0xbe416000},
- {0xbe418000}, {0xbe41a000}, {0xbe41c000}, {0xbe41e000},
- {0xbe420000}, {0xbe422000}, {0xbe424000}, {0xbe426000},
- {0xbe428000}, {0xbe42a000}, {0xbe42c000}, {0xbe42e000},
- {0xbe430000}, {0xbe432000}, {0xbe434000}, {0xbe436000},
- {0xbe438000}, {0xbe43a000}, {0xbe43c000}, {0xbe43e000},
- {0xbe440000}, {0xbe442000}, {0xbe444000}, {0xbe446000},
- {0xbe448000}, {0xbe44a000}, {0xbe44c000}, {0xbe44e000},
- {0xbe450000}, {0xbe452000}, {0xbe454000}, {0xbe456000},
- {0xbe458000}, {0xbe45a000}, {0xbe45c000}, {0xbe45e000},
- {0xbe460000}, {0xbe462000}, {0xbe464000}, {0xbe466000},
- {0xbe468000}, {0xbe46a000}, {0xbe46c000}, {0xbe46e000},
- {0xbe470000}, {0xbe472000}, {0xbe474000}, {0xbe476000},
- {0xbe478000}, {0xbe47a000}, {0xbe47c000}, {0xbe47e000},
- {0xbe480000}, {0xbe482000}, {0xbe484000}, {0xbe486000},
- {0xbe488000}, {0xbe48a000}, {0xbe48c000}, {0xbe48e000},
- {0xbe490000}, {0xbe492000}, {0xbe494000}, {0xbe496000},
- {0xbe498000}, {0xbe49a000}, {0xbe49c000}, {0xbe49e000},
- {0xbe4a0000}, {0xbe4a2000}, {0xbe4a4000}, {0xbe4a6000},
- {0xbe4a8000}, {0xbe4aa000}, {0xbe4ac000}, {0xbe4ae000},
- {0xbe4b0000}, {0xbe4b2000}, {0xbe4b4000}, {0xbe4b6000},
- {0xbe4b8000}, {0xbe4ba000}, {0xbe4bc000}, {0xbe4be000},
- {0xbe4c0000}, {0xbe4c2000}, {0xbe4c4000}, {0xbe4c6000},
- {0xbe4c8000}, {0xbe4ca000}, {0xbe4cc000}, {0xbe4ce000},
- {0xbe4d0000}, {0xbe4d2000}, {0xbe4d4000}, {0xbe4d6000},
- {0xbe4d8000}, {0xbe4da000}, {0xbe4dc000}, {0xbe4de000},
- {0xbe4e0000}, {0xbe4e2000}, {0xbe4e4000}, {0xbe4e6000},
- {0xbe4e8000}, {0xbe4ea000}, {0xbe4ec000}, {0xbe4ee000},
- {0xbe4f0000}, {0xbe4f2000}, {0xbe4f4000}, {0xbe4f6000},
- {0xbe4f8000}, {0xbe4fa000}, {0xbe4fc000}, {0xbe4fe000},
- {0xbe500000}, {0xbe502000}, {0xbe504000}, {0xbe506000},
- {0xbe508000}, {0xbe50a000}, {0xbe50c000}, {0xbe50e000},
- {0xbe510000}, {0xbe512000}, {0xbe514000}, {0xbe516000},
- {0xbe518000}, {0xbe51a000}, {0xbe51c000}, {0xbe51e000},
- {0xbe520000}, {0xbe522000}, {0xbe524000}, {0xbe526000},
- {0xbe528000}, {0xbe52a000}, {0xbe52c000}, {0xbe52e000},
- {0xbe530000}, {0xbe532000}, {0xbe534000}, {0xbe536000},
- {0xbe538000}, {0xbe53a000}, {0xbe53c000}, {0xbe53e000},
- {0xbe540000}, {0xbe542000}, {0xbe544000}, {0xbe546000},
- {0xbe548000}, {0xbe54a000}, {0xbe54c000}, {0xbe54e000},
- {0xbe550000}, {0xbe552000}, {0xbe554000}, {0xbe556000},
- {0xbe558000}, {0xbe55a000}, {0xbe55c000}, {0xbe55e000},
- {0xbe560000}, {0xbe562000}, {0xbe564000}, {0xbe566000},
- {0xbe568000}, {0xbe56a000}, {0xbe56c000}, {0xbe56e000},
- {0xbe570000}, {0xbe572000}, {0xbe574000}, {0xbe576000},
- {0xbe578000}, {0xbe57a000}, {0xbe57c000}, {0xbe57e000},
- {0xbe580000}, {0xbe582000}, {0xbe584000}, {0xbe586000},
- {0xbe588000}, {0xbe58a000}, {0xbe58c000}, {0xbe58e000},
- {0xbe590000}, {0xbe592000}, {0xbe594000}, {0xbe596000},
- {0xbe598000}, {0xbe59a000}, {0xbe59c000}, {0xbe59e000},
- {0xbe5a0000}, {0xbe5a2000}, {0xbe5a4000}, {0xbe5a6000},
- {0xbe5a8000}, {0xbe5aa000}, {0xbe5ac000}, {0xbe5ae000},
- {0xbe5b0000}, {0xbe5b2000}, {0xbe5b4000}, {0xbe5b6000},
- {0xbe5b8000}, {0xbe5ba000}, {0xbe5bc000}, {0xbe5be000},
- {0xbe5c0000}, {0xbe5c2000}, {0xbe5c4000}, {0xbe5c6000},
- {0xbe5c8000}, {0xbe5ca000}, {0xbe5cc000}, {0xbe5ce000},
- {0xbe5d0000}, {0xbe5d2000}, {0xbe5d4000}, {0xbe5d6000},
- {0xbe5d8000}, {0xbe5da000}, {0xbe5dc000}, {0xbe5de000},
- {0xbe5e0000}, {0xbe5e2000}, {0xbe5e4000}, {0xbe5e6000},
- {0xbe5e8000}, {0xbe5ea000}, {0xbe5ec000}, {0xbe5ee000},
- {0xbe5f0000}, {0xbe5f2000}, {0xbe5f4000}, {0xbe5f6000},
- {0xbe5f8000}, {0xbe5fa000}, {0xbe5fc000}, {0xbe5fe000},
- {0xbe600000}, {0xbe602000}, {0xbe604000}, {0xbe606000},
- {0xbe608000}, {0xbe60a000}, {0xbe60c000}, {0xbe60e000},
- {0xbe610000}, {0xbe612000}, {0xbe614000}, {0xbe616000},
- {0xbe618000}, {0xbe61a000}, {0xbe61c000}, {0xbe61e000},
- {0xbe620000}, {0xbe622000}, {0xbe624000}, {0xbe626000},
- {0xbe628000}, {0xbe62a000}, {0xbe62c000}, {0xbe62e000},
- {0xbe630000}, {0xbe632000}, {0xbe634000}, {0xbe636000},
- {0xbe638000}, {0xbe63a000}, {0xbe63c000}, {0xbe63e000},
- {0xbe640000}, {0xbe642000}, {0xbe644000}, {0xbe646000},
- {0xbe648000}, {0xbe64a000}, {0xbe64c000}, {0xbe64e000},
- {0xbe650000}, {0xbe652000}, {0xbe654000}, {0xbe656000},
- {0xbe658000}, {0xbe65a000}, {0xbe65c000}, {0xbe65e000},
- {0xbe660000}, {0xbe662000}, {0xbe664000}, {0xbe666000},
- {0xbe668000}, {0xbe66a000}, {0xbe66c000}, {0xbe66e000},
- {0xbe670000}, {0xbe672000}, {0xbe674000}, {0xbe676000},
- {0xbe678000}, {0xbe67a000}, {0xbe67c000}, {0xbe67e000},
- {0xbe680000}, {0xbe682000}, {0xbe684000}, {0xbe686000},
- {0xbe688000}, {0xbe68a000}, {0xbe68c000}, {0xbe68e000},
- {0xbe690000}, {0xbe692000}, {0xbe694000}, {0xbe696000},
- {0xbe698000}, {0xbe69a000}, {0xbe69c000}, {0xbe69e000},
- {0xbe6a0000}, {0xbe6a2000}, {0xbe6a4000}, {0xbe6a6000},
- {0xbe6a8000}, {0xbe6aa000}, {0xbe6ac000}, {0xbe6ae000},
- {0xbe6b0000}, {0xbe6b2000}, {0xbe6b4000}, {0xbe6b6000},
- {0xbe6b8000}, {0xbe6ba000}, {0xbe6bc000}, {0xbe6be000},
- {0xbe6c0000}, {0xbe6c2000}, {0xbe6c4000}, {0xbe6c6000},
- {0xbe6c8000}, {0xbe6ca000}, {0xbe6cc000}, {0xbe6ce000},
- {0xbe6d0000}, {0xbe6d2000}, {0xbe6d4000}, {0xbe6d6000},
- {0xbe6d8000}, {0xbe6da000}, {0xbe6dc000}, {0xbe6de000},
- {0xbe6e0000}, {0xbe6e2000}, {0xbe6e4000}, {0xbe6e6000},
- {0xbe6e8000}, {0xbe6ea000}, {0xbe6ec000}, {0xbe6ee000},
- {0xbe6f0000}, {0xbe6f2000}, {0xbe6f4000}, {0xbe6f6000},
- {0xbe6f8000}, {0xbe6fa000}, {0xbe6fc000}, {0xbe6fe000},
- {0xbe700000}, {0xbe702000}, {0xbe704000}, {0xbe706000},
- {0xbe708000}, {0xbe70a000}, {0xbe70c000}, {0xbe70e000},
- {0xbe710000}, {0xbe712000}, {0xbe714000}, {0xbe716000},
- {0xbe718000}, {0xbe71a000}, {0xbe71c000}, {0xbe71e000},
- {0xbe720000}, {0xbe722000}, {0xbe724000}, {0xbe726000},
- {0xbe728000}, {0xbe72a000}, {0xbe72c000}, {0xbe72e000},
- {0xbe730000}, {0xbe732000}, {0xbe734000}, {0xbe736000},
- {0xbe738000}, {0xbe73a000}, {0xbe73c000}, {0xbe73e000},
- {0xbe740000}, {0xbe742000}, {0xbe744000}, {0xbe746000},
- {0xbe748000}, {0xbe74a000}, {0xbe74c000}, {0xbe74e000},
- {0xbe750000}, {0xbe752000}, {0xbe754000}, {0xbe756000},
- {0xbe758000}, {0xbe75a000}, {0xbe75c000}, {0xbe75e000},
- {0xbe760000}, {0xbe762000}, {0xbe764000}, {0xbe766000},
- {0xbe768000}, {0xbe76a000}, {0xbe76c000}, {0xbe76e000},
- {0xbe770000}, {0xbe772000}, {0xbe774000}, {0xbe776000},
- {0xbe778000}, {0xbe77a000}, {0xbe77c000}, {0xbe77e000},
- {0xbe780000}, {0xbe782000}, {0xbe784000}, {0xbe786000},
- {0xbe788000}, {0xbe78a000}, {0xbe78c000}, {0xbe78e000},
- {0xbe790000}, {0xbe792000}, {0xbe794000}, {0xbe796000},
- {0xbe798000}, {0xbe79a000}, {0xbe79c000}, {0xbe79e000},
- {0xbe7a0000}, {0xbe7a2000}, {0xbe7a4000}, {0xbe7a6000},
- {0xbe7a8000}, {0xbe7aa000}, {0xbe7ac000}, {0xbe7ae000},
- {0xbe7b0000}, {0xbe7b2000}, {0xbe7b4000}, {0xbe7b6000},
- {0xbe7b8000}, {0xbe7ba000}, {0xbe7bc000}, {0xbe7be000},
- {0xbe7c0000}, {0xbe7c2000}, {0xbe7c4000}, {0xbe7c6000},
- {0xbe7c8000}, {0xbe7ca000}, {0xbe7cc000}, {0xbe7ce000},
- {0xbe7d0000}, {0xbe7d2000}, {0xbe7d4000}, {0xbe7d6000},
- {0xbe7d8000}, {0xbe7da000}, {0xbe7dc000}, {0xbe7de000},
- {0xbe7e0000}, {0xbe7e2000}, {0xbe7e4000}, {0xbe7e6000},
- {0xbe7e8000}, {0xbe7ea000}, {0xbe7ec000}, {0xbe7ee000},
- {0xbe7f0000}, {0xbe7f2000}, {0xbe7f4000}, {0xbe7f6000},
- {0xbe7f8000}, {0xbe7fa000}, {0xbe7fc000}, {0xbe7fe000},
- {0xbe800000}, {0xbe802000}, {0xbe804000}, {0xbe806000},
- {0xbe808000}, {0xbe80a000}, {0xbe80c000}, {0xbe80e000},
- {0xbe810000}, {0xbe812000}, {0xbe814000}, {0xbe816000},
- {0xbe818000}, {0xbe81a000}, {0xbe81c000}, {0xbe81e000},
- {0xbe820000}, {0xbe822000}, {0xbe824000}, {0xbe826000},
- {0xbe828000}, {0xbe82a000}, {0xbe82c000}, {0xbe82e000},
- {0xbe830000}, {0xbe832000}, {0xbe834000}, {0xbe836000},
- {0xbe838000}, {0xbe83a000}, {0xbe83c000}, {0xbe83e000},
- {0xbe840000}, {0xbe842000}, {0xbe844000}, {0xbe846000},
- {0xbe848000}, {0xbe84a000}, {0xbe84c000}, {0xbe84e000},
- {0xbe850000}, {0xbe852000}, {0xbe854000}, {0xbe856000},
- {0xbe858000}, {0xbe85a000}, {0xbe85c000}, {0xbe85e000},
- {0xbe860000}, {0xbe862000}, {0xbe864000}, {0xbe866000},
- {0xbe868000}, {0xbe86a000}, {0xbe86c000}, {0xbe86e000},
- {0xbe870000}, {0xbe872000}, {0xbe874000}, {0xbe876000},
- {0xbe878000}, {0xbe87a000}, {0xbe87c000}, {0xbe87e000},
- {0xbe880000}, {0xbe882000}, {0xbe884000}, {0xbe886000},
- {0xbe888000}, {0xbe88a000}, {0xbe88c000}, {0xbe88e000},
- {0xbe890000}, {0xbe892000}, {0xbe894000}, {0xbe896000},
- {0xbe898000}, {0xbe89a000}, {0xbe89c000}, {0xbe89e000},
- {0xbe8a0000}, {0xbe8a2000}, {0xbe8a4000}, {0xbe8a6000},
- {0xbe8a8000}, {0xbe8aa000}, {0xbe8ac000}, {0xbe8ae000},
- {0xbe8b0000}, {0xbe8b2000}, {0xbe8b4000}, {0xbe8b6000},
- {0xbe8b8000}, {0xbe8ba000}, {0xbe8bc000}, {0xbe8be000},
- {0xbe8c0000}, {0xbe8c2000}, {0xbe8c4000}, {0xbe8c6000},
- {0xbe8c8000}, {0xbe8ca000}, {0xbe8cc000}, {0xbe8ce000},
- {0xbe8d0000}, {0xbe8d2000}, {0xbe8d4000}, {0xbe8d6000},
- {0xbe8d8000}, {0xbe8da000}, {0xbe8dc000}, {0xbe8de000},
- {0xbe8e0000}, {0xbe8e2000}, {0xbe8e4000}, {0xbe8e6000},
- {0xbe8e8000}, {0xbe8ea000}, {0xbe8ec000}, {0xbe8ee000},
- {0xbe8f0000}, {0xbe8f2000}, {0xbe8f4000}, {0xbe8f6000},
- {0xbe8f8000}, {0xbe8fa000}, {0xbe8fc000}, {0xbe8fe000},
- {0xbe900000}, {0xbe902000}, {0xbe904000}, {0xbe906000},
- {0xbe908000}, {0xbe90a000}, {0xbe90c000}, {0xbe90e000},
- {0xbe910000}, {0xbe912000}, {0xbe914000}, {0xbe916000},
- {0xbe918000}, {0xbe91a000}, {0xbe91c000}, {0xbe91e000},
- {0xbe920000}, {0xbe922000}, {0xbe924000}, {0xbe926000},
- {0xbe928000}, {0xbe92a000}, {0xbe92c000}, {0xbe92e000},
- {0xbe930000}, {0xbe932000}, {0xbe934000}, {0xbe936000},
- {0xbe938000}, {0xbe93a000}, {0xbe93c000}, {0xbe93e000},
- {0xbe940000}, {0xbe942000}, {0xbe944000}, {0xbe946000},
- {0xbe948000}, {0xbe94a000}, {0xbe94c000}, {0xbe94e000},
- {0xbe950000}, {0xbe952000}, {0xbe954000}, {0xbe956000},
- {0xbe958000}, {0xbe95a000}, {0xbe95c000}, {0xbe95e000},
- {0xbe960000}, {0xbe962000}, {0xbe964000}, {0xbe966000},
- {0xbe968000}, {0xbe96a000}, {0xbe96c000}, {0xbe96e000},
- {0xbe970000}, {0xbe972000}, {0xbe974000}, {0xbe976000},
- {0xbe978000}, {0xbe97a000}, {0xbe97c000}, {0xbe97e000},
- {0xbe980000}, {0xbe982000}, {0xbe984000}, {0xbe986000},
- {0xbe988000}, {0xbe98a000}, {0xbe98c000}, {0xbe98e000},
- {0xbe990000}, {0xbe992000}, {0xbe994000}, {0xbe996000},
- {0xbe998000}, {0xbe99a000}, {0xbe99c000}, {0xbe99e000},
- {0xbe9a0000}, {0xbe9a2000}, {0xbe9a4000}, {0xbe9a6000},
- {0xbe9a8000}, {0xbe9aa000}, {0xbe9ac000}, {0xbe9ae000},
- {0xbe9b0000}, {0xbe9b2000}, {0xbe9b4000}, {0xbe9b6000},
- {0xbe9b8000}, {0xbe9ba000}, {0xbe9bc000}, {0xbe9be000},
- {0xbe9c0000}, {0xbe9c2000}, {0xbe9c4000}, {0xbe9c6000},
- {0xbe9c8000}, {0xbe9ca000}, {0xbe9cc000}, {0xbe9ce000},
- {0xbe9d0000}, {0xbe9d2000}, {0xbe9d4000}, {0xbe9d6000},
- {0xbe9d8000}, {0xbe9da000}, {0xbe9dc000}, {0xbe9de000},
- {0xbe9e0000}, {0xbe9e2000}, {0xbe9e4000}, {0xbe9e6000},
- {0xbe9e8000}, {0xbe9ea000}, {0xbe9ec000}, {0xbe9ee000},
- {0xbe9f0000}, {0xbe9f2000}, {0xbe9f4000}, {0xbe9f6000},
- {0xbe9f8000}, {0xbe9fa000}, {0xbe9fc000}, {0xbe9fe000},
- {0xbea00000}, {0xbea02000}, {0xbea04000}, {0xbea06000},
- {0xbea08000}, {0xbea0a000}, {0xbea0c000}, {0xbea0e000},
- {0xbea10000}, {0xbea12000}, {0xbea14000}, {0xbea16000},
- {0xbea18000}, {0xbea1a000}, {0xbea1c000}, {0xbea1e000},
- {0xbea20000}, {0xbea22000}, {0xbea24000}, {0xbea26000},
- {0xbea28000}, {0xbea2a000}, {0xbea2c000}, {0xbea2e000},
- {0xbea30000}, {0xbea32000}, {0xbea34000}, {0xbea36000},
- {0xbea38000}, {0xbea3a000}, {0xbea3c000}, {0xbea3e000},
- {0xbea40000}, {0xbea42000}, {0xbea44000}, {0xbea46000},
- {0xbea48000}, {0xbea4a000}, {0xbea4c000}, {0xbea4e000},
- {0xbea50000}, {0xbea52000}, {0xbea54000}, {0xbea56000},
- {0xbea58000}, {0xbea5a000}, {0xbea5c000}, {0xbea5e000},
- {0xbea60000}, {0xbea62000}, {0xbea64000}, {0xbea66000},
- {0xbea68000}, {0xbea6a000}, {0xbea6c000}, {0xbea6e000},
- {0xbea70000}, {0xbea72000}, {0xbea74000}, {0xbea76000},
- {0xbea78000}, {0xbea7a000}, {0xbea7c000}, {0xbea7e000},
- {0xbea80000}, {0xbea82000}, {0xbea84000}, {0xbea86000},
- {0xbea88000}, {0xbea8a000}, {0xbea8c000}, {0xbea8e000},
- {0xbea90000}, {0xbea92000}, {0xbea94000}, {0xbea96000},
- {0xbea98000}, {0xbea9a000}, {0xbea9c000}, {0xbea9e000},
- {0xbeaa0000}, {0xbeaa2000}, {0xbeaa4000}, {0xbeaa6000},
- {0xbeaa8000}, {0xbeaaa000}, {0xbeaac000}, {0xbeaae000},
- {0xbeab0000}, {0xbeab2000}, {0xbeab4000}, {0xbeab6000},
- {0xbeab8000}, {0xbeaba000}, {0xbeabc000}, {0xbeabe000},
- {0xbeac0000}, {0xbeac2000}, {0xbeac4000}, {0xbeac6000},
- {0xbeac8000}, {0xbeaca000}, {0xbeacc000}, {0xbeace000},
- {0xbead0000}, {0xbead2000}, {0xbead4000}, {0xbead6000},
- {0xbead8000}, {0xbeada000}, {0xbeadc000}, {0xbeade000},
- {0xbeae0000}, {0xbeae2000}, {0xbeae4000}, {0xbeae6000},
- {0xbeae8000}, {0xbeaea000}, {0xbeaec000}, {0xbeaee000},
- {0xbeaf0000}, {0xbeaf2000}, {0xbeaf4000}, {0xbeaf6000},
- {0xbeaf8000}, {0xbeafa000}, {0xbeafc000}, {0xbeafe000},
- {0xbeb00000}, {0xbeb02000}, {0xbeb04000}, {0xbeb06000},
- {0xbeb08000}, {0xbeb0a000}, {0xbeb0c000}, {0xbeb0e000},
- {0xbeb10000}, {0xbeb12000}, {0xbeb14000}, {0xbeb16000},
- {0xbeb18000}, {0xbeb1a000}, {0xbeb1c000}, {0xbeb1e000},
- {0xbeb20000}, {0xbeb22000}, {0xbeb24000}, {0xbeb26000},
- {0xbeb28000}, {0xbeb2a000}, {0xbeb2c000}, {0xbeb2e000},
- {0xbeb30000}, {0xbeb32000}, {0xbeb34000}, {0xbeb36000},
- {0xbeb38000}, {0xbeb3a000}, {0xbeb3c000}, {0xbeb3e000},
- {0xbeb40000}, {0xbeb42000}, {0xbeb44000}, {0xbeb46000},
- {0xbeb48000}, {0xbeb4a000}, {0xbeb4c000}, {0xbeb4e000},
- {0xbeb50000}, {0xbeb52000}, {0xbeb54000}, {0xbeb56000},
- {0xbeb58000}, {0xbeb5a000}, {0xbeb5c000}, {0xbeb5e000},
- {0xbeb60000}, {0xbeb62000}, {0xbeb64000}, {0xbeb66000},
- {0xbeb68000}, {0xbeb6a000}, {0xbeb6c000}, {0xbeb6e000},
- {0xbeb70000}, {0xbeb72000}, {0xbeb74000}, {0xbeb76000},
- {0xbeb78000}, {0xbeb7a000}, {0xbeb7c000}, {0xbeb7e000},
- {0xbeb80000}, {0xbeb82000}, {0xbeb84000}, {0xbeb86000},
- {0xbeb88000}, {0xbeb8a000}, {0xbeb8c000}, {0xbeb8e000},
- {0xbeb90000}, {0xbeb92000}, {0xbeb94000}, {0xbeb96000},
- {0xbeb98000}, {0xbeb9a000}, {0xbeb9c000}, {0xbeb9e000},
- {0xbeba0000}, {0xbeba2000}, {0xbeba4000}, {0xbeba6000},
- {0xbeba8000}, {0xbebaa000}, {0xbebac000}, {0xbebae000},
- {0xbebb0000}, {0xbebb2000}, {0xbebb4000}, {0xbebb6000},
- {0xbebb8000}, {0xbebba000}, {0xbebbc000}, {0xbebbe000},
- {0xbebc0000}, {0xbebc2000}, {0xbebc4000}, {0xbebc6000},
- {0xbebc8000}, {0xbebca000}, {0xbebcc000}, {0xbebce000},
- {0xbebd0000}, {0xbebd2000}, {0xbebd4000}, {0xbebd6000},
- {0xbebd8000}, {0xbebda000}, {0xbebdc000}, {0xbebde000},
- {0xbebe0000}, {0xbebe2000}, {0xbebe4000}, {0xbebe6000},
- {0xbebe8000}, {0xbebea000}, {0xbebec000}, {0xbebee000},
- {0xbebf0000}, {0xbebf2000}, {0xbebf4000}, {0xbebf6000},
- {0xbebf8000}, {0xbebfa000}, {0xbebfc000}, {0xbebfe000},
- {0xbec00000}, {0xbec02000}, {0xbec04000}, {0xbec06000},
- {0xbec08000}, {0xbec0a000}, {0xbec0c000}, {0xbec0e000},
- {0xbec10000}, {0xbec12000}, {0xbec14000}, {0xbec16000},
- {0xbec18000}, {0xbec1a000}, {0xbec1c000}, {0xbec1e000},
- {0xbec20000}, {0xbec22000}, {0xbec24000}, {0xbec26000},
- {0xbec28000}, {0xbec2a000}, {0xbec2c000}, {0xbec2e000},
- {0xbec30000}, {0xbec32000}, {0xbec34000}, {0xbec36000},
- {0xbec38000}, {0xbec3a000}, {0xbec3c000}, {0xbec3e000},
- {0xbec40000}, {0xbec42000}, {0xbec44000}, {0xbec46000},
- {0xbec48000}, {0xbec4a000}, {0xbec4c000}, {0xbec4e000},
- {0xbec50000}, {0xbec52000}, {0xbec54000}, {0xbec56000},
- {0xbec58000}, {0xbec5a000}, {0xbec5c000}, {0xbec5e000},
- {0xbec60000}, {0xbec62000}, {0xbec64000}, {0xbec66000},
- {0xbec68000}, {0xbec6a000}, {0xbec6c000}, {0xbec6e000},
- {0xbec70000}, {0xbec72000}, {0xbec74000}, {0xbec76000},
- {0xbec78000}, {0xbec7a000}, {0xbec7c000}, {0xbec7e000},
- {0xbec80000}, {0xbec82000}, {0xbec84000}, {0xbec86000},
- {0xbec88000}, {0xbec8a000}, {0xbec8c000}, {0xbec8e000},
- {0xbec90000}, {0xbec92000}, {0xbec94000}, {0xbec96000},
- {0xbec98000}, {0xbec9a000}, {0xbec9c000}, {0xbec9e000},
- {0xbeca0000}, {0xbeca2000}, {0xbeca4000}, {0xbeca6000},
- {0xbeca8000}, {0xbecaa000}, {0xbecac000}, {0xbecae000},
- {0xbecb0000}, {0xbecb2000}, {0xbecb4000}, {0xbecb6000},
- {0xbecb8000}, {0xbecba000}, {0xbecbc000}, {0xbecbe000},
- {0xbecc0000}, {0xbecc2000}, {0xbecc4000}, {0xbecc6000},
- {0xbecc8000}, {0xbecca000}, {0xbeccc000}, {0xbecce000},
- {0xbecd0000}, {0xbecd2000}, {0xbecd4000}, {0xbecd6000},
- {0xbecd8000}, {0xbecda000}, {0xbecdc000}, {0xbecde000},
- {0xbece0000}, {0xbece2000}, {0xbece4000}, {0xbece6000},
- {0xbece8000}, {0xbecea000}, {0xbecec000}, {0xbecee000},
- {0xbecf0000}, {0xbecf2000}, {0xbecf4000}, {0xbecf6000},
- {0xbecf8000}, {0xbecfa000}, {0xbecfc000}, {0xbecfe000},
- {0xbed00000}, {0xbed02000}, {0xbed04000}, {0xbed06000},
- {0xbed08000}, {0xbed0a000}, {0xbed0c000}, {0xbed0e000},
- {0xbed10000}, {0xbed12000}, {0xbed14000}, {0xbed16000},
- {0xbed18000}, {0xbed1a000}, {0xbed1c000}, {0xbed1e000},
- {0xbed20000}, {0xbed22000}, {0xbed24000}, {0xbed26000},
- {0xbed28000}, {0xbed2a000}, {0xbed2c000}, {0xbed2e000},
- {0xbed30000}, {0xbed32000}, {0xbed34000}, {0xbed36000},
- {0xbed38000}, {0xbed3a000}, {0xbed3c000}, {0xbed3e000},
- {0xbed40000}, {0xbed42000}, {0xbed44000}, {0xbed46000},
- {0xbed48000}, {0xbed4a000}, {0xbed4c000}, {0xbed4e000},
- {0xbed50000}, {0xbed52000}, {0xbed54000}, {0xbed56000},
- {0xbed58000}, {0xbed5a000}, {0xbed5c000}, {0xbed5e000},
- {0xbed60000}, {0xbed62000}, {0xbed64000}, {0xbed66000},
- {0xbed68000}, {0xbed6a000}, {0xbed6c000}, {0xbed6e000},
- {0xbed70000}, {0xbed72000}, {0xbed74000}, {0xbed76000},
- {0xbed78000}, {0xbed7a000}, {0xbed7c000}, {0xbed7e000},
- {0xbed80000}, {0xbed82000}, {0xbed84000}, {0xbed86000},
- {0xbed88000}, {0xbed8a000}, {0xbed8c000}, {0xbed8e000},
- {0xbed90000}, {0xbed92000}, {0xbed94000}, {0xbed96000},
- {0xbed98000}, {0xbed9a000}, {0xbed9c000}, {0xbed9e000},
- {0xbeda0000}, {0xbeda2000}, {0xbeda4000}, {0xbeda6000},
- {0xbeda8000}, {0xbedaa000}, {0xbedac000}, {0xbedae000},
- {0xbedb0000}, {0xbedb2000}, {0xbedb4000}, {0xbedb6000},
- {0xbedb8000}, {0xbedba000}, {0xbedbc000}, {0xbedbe000},
- {0xbedc0000}, {0xbedc2000}, {0xbedc4000}, {0xbedc6000},
- {0xbedc8000}, {0xbedca000}, {0xbedcc000}, {0xbedce000},
- {0xbedd0000}, {0xbedd2000}, {0xbedd4000}, {0xbedd6000},
- {0xbedd8000}, {0xbedda000}, {0xbeddc000}, {0xbedde000},
- {0xbede0000}, {0xbede2000}, {0xbede4000}, {0xbede6000},
- {0xbede8000}, {0xbedea000}, {0xbedec000}, {0xbedee000},
- {0xbedf0000}, {0xbedf2000}, {0xbedf4000}, {0xbedf6000},
- {0xbedf8000}, {0xbedfa000}, {0xbedfc000}, {0xbedfe000},
- {0xbee00000}, {0xbee02000}, {0xbee04000}, {0xbee06000},
- {0xbee08000}, {0xbee0a000}, {0xbee0c000}, {0xbee0e000},
- {0xbee10000}, {0xbee12000}, {0xbee14000}, {0xbee16000},
- {0xbee18000}, {0xbee1a000}, {0xbee1c000}, {0xbee1e000},
- {0xbee20000}, {0xbee22000}, {0xbee24000}, {0xbee26000},
- {0xbee28000}, {0xbee2a000}, {0xbee2c000}, {0xbee2e000},
- {0xbee30000}, {0xbee32000}, {0xbee34000}, {0xbee36000},
- {0xbee38000}, {0xbee3a000}, {0xbee3c000}, {0xbee3e000},
- {0xbee40000}, {0xbee42000}, {0xbee44000}, {0xbee46000},
- {0xbee48000}, {0xbee4a000}, {0xbee4c000}, {0xbee4e000},
- {0xbee50000}, {0xbee52000}, {0xbee54000}, {0xbee56000},
- {0xbee58000}, {0xbee5a000}, {0xbee5c000}, {0xbee5e000},
- {0xbee60000}, {0xbee62000}, {0xbee64000}, {0xbee66000},
- {0xbee68000}, {0xbee6a000}, {0xbee6c000}, {0xbee6e000},
- {0xbee70000}, {0xbee72000}, {0xbee74000}, {0xbee76000},
- {0xbee78000}, {0xbee7a000}, {0xbee7c000}, {0xbee7e000},
- {0xbee80000}, {0xbee82000}, {0xbee84000}, {0xbee86000},
- {0xbee88000}, {0xbee8a000}, {0xbee8c000}, {0xbee8e000},
- {0xbee90000}, {0xbee92000}, {0xbee94000}, {0xbee96000},
- {0xbee98000}, {0xbee9a000}, {0xbee9c000}, {0xbee9e000},
- {0xbeea0000}, {0xbeea2000}, {0xbeea4000}, {0xbeea6000},
- {0xbeea8000}, {0xbeeaa000}, {0xbeeac000}, {0xbeeae000},
- {0xbeeb0000}, {0xbeeb2000}, {0xbeeb4000}, {0xbeeb6000},
- {0xbeeb8000}, {0xbeeba000}, {0xbeebc000}, {0xbeebe000},
- {0xbeec0000}, {0xbeec2000}, {0xbeec4000}, {0xbeec6000},
- {0xbeec8000}, {0xbeeca000}, {0xbeecc000}, {0xbeece000},
- {0xbeed0000}, {0xbeed2000}, {0xbeed4000}, {0xbeed6000},
- {0xbeed8000}, {0xbeeda000}, {0xbeedc000}, {0xbeede000},
- {0xbeee0000}, {0xbeee2000}, {0xbeee4000}, {0xbeee6000},
- {0xbeee8000}, {0xbeeea000}, {0xbeeec000}, {0xbeeee000},
- {0xbeef0000}, {0xbeef2000}, {0xbeef4000}, {0xbeef6000},
- {0xbeef8000}, {0xbeefa000}, {0xbeefc000}, {0xbeefe000},
- {0xbef00000}, {0xbef02000}, {0xbef04000}, {0xbef06000},
- {0xbef08000}, {0xbef0a000}, {0xbef0c000}, {0xbef0e000},
- {0xbef10000}, {0xbef12000}, {0xbef14000}, {0xbef16000},
- {0xbef18000}, {0xbef1a000}, {0xbef1c000}, {0xbef1e000},
- {0xbef20000}, {0xbef22000}, {0xbef24000}, {0xbef26000},
- {0xbef28000}, {0xbef2a000}, {0xbef2c000}, {0xbef2e000},
- {0xbef30000}, {0xbef32000}, {0xbef34000}, {0xbef36000},
- {0xbef38000}, {0xbef3a000}, {0xbef3c000}, {0xbef3e000},
- {0xbef40000}, {0xbef42000}, {0xbef44000}, {0xbef46000},
- {0xbef48000}, {0xbef4a000}, {0xbef4c000}, {0xbef4e000},
- {0xbef50000}, {0xbef52000}, {0xbef54000}, {0xbef56000},
- {0xbef58000}, {0xbef5a000}, {0xbef5c000}, {0xbef5e000},
- {0xbef60000}, {0xbef62000}, {0xbef64000}, {0xbef66000},
- {0xbef68000}, {0xbef6a000}, {0xbef6c000}, {0xbef6e000},
- {0xbef70000}, {0xbef72000}, {0xbef74000}, {0xbef76000},
- {0xbef78000}, {0xbef7a000}, {0xbef7c000}, {0xbef7e000},
- {0xbef80000}, {0xbef82000}, {0xbef84000}, {0xbef86000},
- {0xbef88000}, {0xbef8a000}, {0xbef8c000}, {0xbef8e000},
- {0xbef90000}, {0xbef92000}, {0xbef94000}, {0xbef96000},
- {0xbef98000}, {0xbef9a000}, {0xbef9c000}, {0xbef9e000},
- {0xbefa0000}, {0xbefa2000}, {0xbefa4000}, {0xbefa6000},
- {0xbefa8000}, {0xbefaa000}, {0xbefac000}, {0xbefae000},
- {0xbefb0000}, {0xbefb2000}, {0xbefb4000}, {0xbefb6000},
- {0xbefb8000}, {0xbefba000}, {0xbefbc000}, {0xbefbe000},
- {0xbefc0000}, {0xbefc2000}, {0xbefc4000}, {0xbefc6000},
- {0xbefc8000}, {0xbefca000}, {0xbefcc000}, {0xbefce000},
- {0xbefd0000}, {0xbefd2000}, {0xbefd4000}, {0xbefd6000},
- {0xbefd8000}, {0xbefda000}, {0xbefdc000}, {0xbefde000},
- {0xbefe0000}, {0xbefe2000}, {0xbefe4000}, {0xbefe6000},
- {0xbefe8000}, {0xbefea000}, {0xbefec000}, {0xbefee000},
- {0xbeff0000}, {0xbeff2000}, {0xbeff4000}, {0xbeff6000},
- {0xbeff8000}, {0xbeffa000}, {0xbeffc000}, {0xbeffe000},
- {0xbf000000}, {0xbf002000}, {0xbf004000}, {0xbf006000},
- {0xbf008000}, {0xbf00a000}, {0xbf00c000}, {0xbf00e000},
- {0xbf010000}, {0xbf012000}, {0xbf014000}, {0xbf016000},
- {0xbf018000}, {0xbf01a000}, {0xbf01c000}, {0xbf01e000},
- {0xbf020000}, {0xbf022000}, {0xbf024000}, {0xbf026000},
- {0xbf028000}, {0xbf02a000}, {0xbf02c000}, {0xbf02e000},
- {0xbf030000}, {0xbf032000}, {0xbf034000}, {0xbf036000},
- {0xbf038000}, {0xbf03a000}, {0xbf03c000}, {0xbf03e000},
- {0xbf040000}, {0xbf042000}, {0xbf044000}, {0xbf046000},
- {0xbf048000}, {0xbf04a000}, {0xbf04c000}, {0xbf04e000},
- {0xbf050000}, {0xbf052000}, {0xbf054000}, {0xbf056000},
- {0xbf058000}, {0xbf05a000}, {0xbf05c000}, {0xbf05e000},
- {0xbf060000}, {0xbf062000}, {0xbf064000}, {0xbf066000},
- {0xbf068000}, {0xbf06a000}, {0xbf06c000}, {0xbf06e000},
- {0xbf070000}, {0xbf072000}, {0xbf074000}, {0xbf076000},
- {0xbf078000}, {0xbf07a000}, {0xbf07c000}, {0xbf07e000},
- {0xbf080000}, {0xbf082000}, {0xbf084000}, {0xbf086000},
- {0xbf088000}, {0xbf08a000}, {0xbf08c000}, {0xbf08e000},
- {0xbf090000}, {0xbf092000}, {0xbf094000}, {0xbf096000},
- {0xbf098000}, {0xbf09a000}, {0xbf09c000}, {0xbf09e000},
- {0xbf0a0000}, {0xbf0a2000}, {0xbf0a4000}, {0xbf0a6000},
- {0xbf0a8000}, {0xbf0aa000}, {0xbf0ac000}, {0xbf0ae000},
- {0xbf0b0000}, {0xbf0b2000}, {0xbf0b4000}, {0xbf0b6000},
- {0xbf0b8000}, {0xbf0ba000}, {0xbf0bc000}, {0xbf0be000},
- {0xbf0c0000}, {0xbf0c2000}, {0xbf0c4000}, {0xbf0c6000},
- {0xbf0c8000}, {0xbf0ca000}, {0xbf0cc000}, {0xbf0ce000},
- {0xbf0d0000}, {0xbf0d2000}, {0xbf0d4000}, {0xbf0d6000},
- {0xbf0d8000}, {0xbf0da000}, {0xbf0dc000}, {0xbf0de000},
- {0xbf0e0000}, {0xbf0e2000}, {0xbf0e4000}, {0xbf0e6000},
- {0xbf0e8000}, {0xbf0ea000}, {0xbf0ec000}, {0xbf0ee000},
- {0xbf0f0000}, {0xbf0f2000}, {0xbf0f4000}, {0xbf0f6000},
- {0xbf0f8000}, {0xbf0fa000}, {0xbf0fc000}, {0xbf0fe000},
- {0xbf100000}, {0xbf102000}, {0xbf104000}, {0xbf106000},
- {0xbf108000}, {0xbf10a000}, {0xbf10c000}, {0xbf10e000},
- {0xbf110000}, {0xbf112000}, {0xbf114000}, {0xbf116000},
- {0xbf118000}, {0xbf11a000}, {0xbf11c000}, {0xbf11e000},
- {0xbf120000}, {0xbf122000}, {0xbf124000}, {0xbf126000},
- {0xbf128000}, {0xbf12a000}, {0xbf12c000}, {0xbf12e000},
- {0xbf130000}, {0xbf132000}, {0xbf134000}, {0xbf136000},
- {0xbf138000}, {0xbf13a000}, {0xbf13c000}, {0xbf13e000},
- {0xbf140000}, {0xbf142000}, {0xbf144000}, {0xbf146000},
- {0xbf148000}, {0xbf14a000}, {0xbf14c000}, {0xbf14e000},
- {0xbf150000}, {0xbf152000}, {0xbf154000}, {0xbf156000},
- {0xbf158000}, {0xbf15a000}, {0xbf15c000}, {0xbf15e000},
- {0xbf160000}, {0xbf162000}, {0xbf164000}, {0xbf166000},
- {0xbf168000}, {0xbf16a000}, {0xbf16c000}, {0xbf16e000},
- {0xbf170000}, {0xbf172000}, {0xbf174000}, {0xbf176000},
- {0xbf178000}, {0xbf17a000}, {0xbf17c000}, {0xbf17e000},
- {0xbf180000}, {0xbf182000}, {0xbf184000}, {0xbf186000},
- {0xbf188000}, {0xbf18a000}, {0xbf18c000}, {0xbf18e000},
- {0xbf190000}, {0xbf192000}, {0xbf194000}, {0xbf196000},
- {0xbf198000}, {0xbf19a000}, {0xbf19c000}, {0xbf19e000},
- {0xbf1a0000}, {0xbf1a2000}, {0xbf1a4000}, {0xbf1a6000},
- {0xbf1a8000}, {0xbf1aa000}, {0xbf1ac000}, {0xbf1ae000},
- {0xbf1b0000}, {0xbf1b2000}, {0xbf1b4000}, {0xbf1b6000},
- {0xbf1b8000}, {0xbf1ba000}, {0xbf1bc000}, {0xbf1be000},
- {0xbf1c0000}, {0xbf1c2000}, {0xbf1c4000}, {0xbf1c6000},
- {0xbf1c8000}, {0xbf1ca000}, {0xbf1cc000}, {0xbf1ce000},
- {0xbf1d0000}, {0xbf1d2000}, {0xbf1d4000}, {0xbf1d6000},
- {0xbf1d8000}, {0xbf1da000}, {0xbf1dc000}, {0xbf1de000},
- {0xbf1e0000}, {0xbf1e2000}, {0xbf1e4000}, {0xbf1e6000},
- {0xbf1e8000}, {0xbf1ea000}, {0xbf1ec000}, {0xbf1ee000},
- {0xbf1f0000}, {0xbf1f2000}, {0xbf1f4000}, {0xbf1f6000},
- {0xbf1f8000}, {0xbf1fa000}, {0xbf1fc000}, {0xbf1fe000},
- {0xbf200000}, {0xbf202000}, {0xbf204000}, {0xbf206000},
- {0xbf208000}, {0xbf20a000}, {0xbf20c000}, {0xbf20e000},
- {0xbf210000}, {0xbf212000}, {0xbf214000}, {0xbf216000},
- {0xbf218000}, {0xbf21a000}, {0xbf21c000}, {0xbf21e000},
- {0xbf220000}, {0xbf222000}, {0xbf224000}, {0xbf226000},
- {0xbf228000}, {0xbf22a000}, {0xbf22c000}, {0xbf22e000},
- {0xbf230000}, {0xbf232000}, {0xbf234000}, {0xbf236000},
- {0xbf238000}, {0xbf23a000}, {0xbf23c000}, {0xbf23e000},
- {0xbf240000}, {0xbf242000}, {0xbf244000}, {0xbf246000},
- {0xbf248000}, {0xbf24a000}, {0xbf24c000}, {0xbf24e000},
- {0xbf250000}, {0xbf252000}, {0xbf254000}, {0xbf256000},
- {0xbf258000}, {0xbf25a000}, {0xbf25c000}, {0xbf25e000},
- {0xbf260000}, {0xbf262000}, {0xbf264000}, {0xbf266000},
- {0xbf268000}, {0xbf26a000}, {0xbf26c000}, {0xbf26e000},
- {0xbf270000}, {0xbf272000}, {0xbf274000}, {0xbf276000},
- {0xbf278000}, {0xbf27a000}, {0xbf27c000}, {0xbf27e000},
- {0xbf280000}, {0xbf282000}, {0xbf284000}, {0xbf286000},
- {0xbf288000}, {0xbf28a000}, {0xbf28c000}, {0xbf28e000},
- {0xbf290000}, {0xbf292000}, {0xbf294000}, {0xbf296000},
- {0xbf298000}, {0xbf29a000}, {0xbf29c000}, {0xbf29e000},
- {0xbf2a0000}, {0xbf2a2000}, {0xbf2a4000}, {0xbf2a6000},
- {0xbf2a8000}, {0xbf2aa000}, {0xbf2ac000}, {0xbf2ae000},
- {0xbf2b0000}, {0xbf2b2000}, {0xbf2b4000}, {0xbf2b6000},
- {0xbf2b8000}, {0xbf2ba000}, {0xbf2bc000}, {0xbf2be000},
- {0xbf2c0000}, {0xbf2c2000}, {0xbf2c4000}, {0xbf2c6000},
- {0xbf2c8000}, {0xbf2ca000}, {0xbf2cc000}, {0xbf2ce000},
- {0xbf2d0000}, {0xbf2d2000}, {0xbf2d4000}, {0xbf2d6000},
- {0xbf2d8000}, {0xbf2da000}, {0xbf2dc000}, {0xbf2de000},
- {0xbf2e0000}, {0xbf2e2000}, {0xbf2e4000}, {0xbf2e6000},
- {0xbf2e8000}, {0xbf2ea000}, {0xbf2ec000}, {0xbf2ee000},
- {0xbf2f0000}, {0xbf2f2000}, {0xbf2f4000}, {0xbf2f6000},
- {0xbf2f8000}, {0xbf2fa000}, {0xbf2fc000}, {0xbf2fe000},
- {0xbf300000}, {0xbf302000}, {0xbf304000}, {0xbf306000},
- {0xbf308000}, {0xbf30a000}, {0xbf30c000}, {0xbf30e000},
- {0xbf310000}, {0xbf312000}, {0xbf314000}, {0xbf316000},
- {0xbf318000}, {0xbf31a000}, {0xbf31c000}, {0xbf31e000},
- {0xbf320000}, {0xbf322000}, {0xbf324000}, {0xbf326000},
- {0xbf328000}, {0xbf32a000}, {0xbf32c000}, {0xbf32e000},
- {0xbf330000}, {0xbf332000}, {0xbf334000}, {0xbf336000},
- {0xbf338000}, {0xbf33a000}, {0xbf33c000}, {0xbf33e000},
- {0xbf340000}, {0xbf342000}, {0xbf344000}, {0xbf346000},
- {0xbf348000}, {0xbf34a000}, {0xbf34c000}, {0xbf34e000},
- {0xbf350000}, {0xbf352000}, {0xbf354000}, {0xbf356000},
- {0xbf358000}, {0xbf35a000}, {0xbf35c000}, {0xbf35e000},
- {0xbf360000}, {0xbf362000}, {0xbf364000}, {0xbf366000},
- {0xbf368000}, {0xbf36a000}, {0xbf36c000}, {0xbf36e000},
- {0xbf370000}, {0xbf372000}, {0xbf374000}, {0xbf376000},
- {0xbf378000}, {0xbf37a000}, {0xbf37c000}, {0xbf37e000},
- {0xbf380000}, {0xbf382000}, {0xbf384000}, {0xbf386000},
- {0xbf388000}, {0xbf38a000}, {0xbf38c000}, {0xbf38e000},
- {0xbf390000}, {0xbf392000}, {0xbf394000}, {0xbf396000},
- {0xbf398000}, {0xbf39a000}, {0xbf39c000}, {0xbf39e000},
- {0xbf3a0000}, {0xbf3a2000}, {0xbf3a4000}, {0xbf3a6000},
- {0xbf3a8000}, {0xbf3aa000}, {0xbf3ac000}, {0xbf3ae000},
- {0xbf3b0000}, {0xbf3b2000}, {0xbf3b4000}, {0xbf3b6000},
- {0xbf3b8000}, {0xbf3ba000}, {0xbf3bc000}, {0xbf3be000},
- {0xbf3c0000}, {0xbf3c2000}, {0xbf3c4000}, {0xbf3c6000},
- {0xbf3c8000}, {0xbf3ca000}, {0xbf3cc000}, {0xbf3ce000},
- {0xbf3d0000}, {0xbf3d2000}, {0xbf3d4000}, {0xbf3d6000},
- {0xbf3d8000}, {0xbf3da000}, {0xbf3dc000}, {0xbf3de000},
- {0xbf3e0000}, {0xbf3e2000}, {0xbf3e4000}, {0xbf3e6000},
- {0xbf3e8000}, {0xbf3ea000}, {0xbf3ec000}, {0xbf3ee000},
- {0xbf3f0000}, {0xbf3f2000}, {0xbf3f4000}, {0xbf3f6000},
- {0xbf3f8000}, {0xbf3fa000}, {0xbf3fc000}, {0xbf3fe000},
- {0xbf400000}, {0xbf402000}, {0xbf404000}, {0xbf406000},
- {0xbf408000}, {0xbf40a000}, {0xbf40c000}, {0xbf40e000},
- {0xbf410000}, {0xbf412000}, {0xbf414000}, {0xbf416000},
- {0xbf418000}, {0xbf41a000}, {0xbf41c000}, {0xbf41e000},
- {0xbf420000}, {0xbf422000}, {0xbf424000}, {0xbf426000},
- {0xbf428000}, {0xbf42a000}, {0xbf42c000}, {0xbf42e000},
- {0xbf430000}, {0xbf432000}, {0xbf434000}, {0xbf436000},
- {0xbf438000}, {0xbf43a000}, {0xbf43c000}, {0xbf43e000},
- {0xbf440000}, {0xbf442000}, {0xbf444000}, {0xbf446000},
- {0xbf448000}, {0xbf44a000}, {0xbf44c000}, {0xbf44e000},
- {0xbf450000}, {0xbf452000}, {0xbf454000}, {0xbf456000},
- {0xbf458000}, {0xbf45a000}, {0xbf45c000}, {0xbf45e000},
- {0xbf460000}, {0xbf462000}, {0xbf464000}, {0xbf466000},
- {0xbf468000}, {0xbf46a000}, {0xbf46c000}, {0xbf46e000},
- {0xbf470000}, {0xbf472000}, {0xbf474000}, {0xbf476000},
- {0xbf478000}, {0xbf47a000}, {0xbf47c000}, {0xbf47e000},
- {0xbf480000}, {0xbf482000}, {0xbf484000}, {0xbf486000},
- {0xbf488000}, {0xbf48a000}, {0xbf48c000}, {0xbf48e000},
- {0xbf490000}, {0xbf492000}, {0xbf494000}, {0xbf496000},
- {0xbf498000}, {0xbf49a000}, {0xbf49c000}, {0xbf49e000},
- {0xbf4a0000}, {0xbf4a2000}, {0xbf4a4000}, {0xbf4a6000},
- {0xbf4a8000}, {0xbf4aa000}, {0xbf4ac000}, {0xbf4ae000},
- {0xbf4b0000}, {0xbf4b2000}, {0xbf4b4000}, {0xbf4b6000},
- {0xbf4b8000}, {0xbf4ba000}, {0xbf4bc000}, {0xbf4be000},
- {0xbf4c0000}, {0xbf4c2000}, {0xbf4c4000}, {0xbf4c6000},
- {0xbf4c8000}, {0xbf4ca000}, {0xbf4cc000}, {0xbf4ce000},
- {0xbf4d0000}, {0xbf4d2000}, {0xbf4d4000}, {0xbf4d6000},
- {0xbf4d8000}, {0xbf4da000}, {0xbf4dc000}, {0xbf4de000},
- {0xbf4e0000}, {0xbf4e2000}, {0xbf4e4000}, {0xbf4e6000},
- {0xbf4e8000}, {0xbf4ea000}, {0xbf4ec000}, {0xbf4ee000},
- {0xbf4f0000}, {0xbf4f2000}, {0xbf4f4000}, {0xbf4f6000},
- {0xbf4f8000}, {0xbf4fa000}, {0xbf4fc000}, {0xbf4fe000},
- {0xbf500000}, {0xbf502000}, {0xbf504000}, {0xbf506000},
- {0xbf508000}, {0xbf50a000}, {0xbf50c000}, {0xbf50e000},
- {0xbf510000}, {0xbf512000}, {0xbf514000}, {0xbf516000},
- {0xbf518000}, {0xbf51a000}, {0xbf51c000}, {0xbf51e000},
- {0xbf520000}, {0xbf522000}, {0xbf524000}, {0xbf526000},
- {0xbf528000}, {0xbf52a000}, {0xbf52c000}, {0xbf52e000},
- {0xbf530000}, {0xbf532000}, {0xbf534000}, {0xbf536000},
- {0xbf538000}, {0xbf53a000}, {0xbf53c000}, {0xbf53e000},
- {0xbf540000}, {0xbf542000}, {0xbf544000}, {0xbf546000},
- {0xbf548000}, {0xbf54a000}, {0xbf54c000}, {0xbf54e000},
- {0xbf550000}, {0xbf552000}, {0xbf554000}, {0xbf556000},
- {0xbf558000}, {0xbf55a000}, {0xbf55c000}, {0xbf55e000},
- {0xbf560000}, {0xbf562000}, {0xbf564000}, {0xbf566000},
- {0xbf568000}, {0xbf56a000}, {0xbf56c000}, {0xbf56e000},
- {0xbf570000}, {0xbf572000}, {0xbf574000}, {0xbf576000},
- {0xbf578000}, {0xbf57a000}, {0xbf57c000}, {0xbf57e000},
- {0xbf580000}, {0xbf582000}, {0xbf584000}, {0xbf586000},
- {0xbf588000}, {0xbf58a000}, {0xbf58c000}, {0xbf58e000},
- {0xbf590000}, {0xbf592000}, {0xbf594000}, {0xbf596000},
- {0xbf598000}, {0xbf59a000}, {0xbf59c000}, {0xbf59e000},
- {0xbf5a0000}, {0xbf5a2000}, {0xbf5a4000}, {0xbf5a6000},
- {0xbf5a8000}, {0xbf5aa000}, {0xbf5ac000}, {0xbf5ae000},
- {0xbf5b0000}, {0xbf5b2000}, {0xbf5b4000}, {0xbf5b6000},
- {0xbf5b8000}, {0xbf5ba000}, {0xbf5bc000}, {0xbf5be000},
- {0xbf5c0000}, {0xbf5c2000}, {0xbf5c4000}, {0xbf5c6000},
- {0xbf5c8000}, {0xbf5ca000}, {0xbf5cc000}, {0xbf5ce000},
- {0xbf5d0000}, {0xbf5d2000}, {0xbf5d4000}, {0xbf5d6000},
- {0xbf5d8000}, {0xbf5da000}, {0xbf5dc000}, {0xbf5de000},
- {0xbf5e0000}, {0xbf5e2000}, {0xbf5e4000}, {0xbf5e6000},
- {0xbf5e8000}, {0xbf5ea000}, {0xbf5ec000}, {0xbf5ee000},
- {0xbf5f0000}, {0xbf5f2000}, {0xbf5f4000}, {0xbf5f6000},
- {0xbf5f8000}, {0xbf5fa000}, {0xbf5fc000}, {0xbf5fe000},
- {0xbf600000}, {0xbf602000}, {0xbf604000}, {0xbf606000},
- {0xbf608000}, {0xbf60a000}, {0xbf60c000}, {0xbf60e000},
- {0xbf610000}, {0xbf612000}, {0xbf614000}, {0xbf616000},
- {0xbf618000}, {0xbf61a000}, {0xbf61c000}, {0xbf61e000},
- {0xbf620000}, {0xbf622000}, {0xbf624000}, {0xbf626000},
- {0xbf628000}, {0xbf62a000}, {0xbf62c000}, {0xbf62e000},
- {0xbf630000}, {0xbf632000}, {0xbf634000}, {0xbf636000},
- {0xbf638000}, {0xbf63a000}, {0xbf63c000}, {0xbf63e000},
- {0xbf640000}, {0xbf642000}, {0xbf644000}, {0xbf646000},
- {0xbf648000}, {0xbf64a000}, {0xbf64c000}, {0xbf64e000},
- {0xbf650000}, {0xbf652000}, {0xbf654000}, {0xbf656000},
- {0xbf658000}, {0xbf65a000}, {0xbf65c000}, {0xbf65e000},
- {0xbf660000}, {0xbf662000}, {0xbf664000}, {0xbf666000},
- {0xbf668000}, {0xbf66a000}, {0xbf66c000}, {0xbf66e000},
- {0xbf670000}, {0xbf672000}, {0xbf674000}, {0xbf676000},
- {0xbf678000}, {0xbf67a000}, {0xbf67c000}, {0xbf67e000},
- {0xbf680000}, {0xbf682000}, {0xbf684000}, {0xbf686000},
- {0xbf688000}, {0xbf68a000}, {0xbf68c000}, {0xbf68e000},
- {0xbf690000}, {0xbf692000}, {0xbf694000}, {0xbf696000},
- {0xbf698000}, {0xbf69a000}, {0xbf69c000}, {0xbf69e000},
- {0xbf6a0000}, {0xbf6a2000}, {0xbf6a4000}, {0xbf6a6000},
- {0xbf6a8000}, {0xbf6aa000}, {0xbf6ac000}, {0xbf6ae000},
- {0xbf6b0000}, {0xbf6b2000}, {0xbf6b4000}, {0xbf6b6000},
- {0xbf6b8000}, {0xbf6ba000}, {0xbf6bc000}, {0xbf6be000},
- {0xbf6c0000}, {0xbf6c2000}, {0xbf6c4000}, {0xbf6c6000},
- {0xbf6c8000}, {0xbf6ca000}, {0xbf6cc000}, {0xbf6ce000},
- {0xbf6d0000}, {0xbf6d2000}, {0xbf6d4000}, {0xbf6d6000},
- {0xbf6d8000}, {0xbf6da000}, {0xbf6dc000}, {0xbf6de000},
- {0xbf6e0000}, {0xbf6e2000}, {0xbf6e4000}, {0xbf6e6000},
- {0xbf6e8000}, {0xbf6ea000}, {0xbf6ec000}, {0xbf6ee000},
- {0xbf6f0000}, {0xbf6f2000}, {0xbf6f4000}, {0xbf6f6000},
- {0xbf6f8000}, {0xbf6fa000}, {0xbf6fc000}, {0xbf6fe000},
- {0xbf700000}, {0xbf702000}, {0xbf704000}, {0xbf706000},
- {0xbf708000}, {0xbf70a000}, {0xbf70c000}, {0xbf70e000},
- {0xbf710000}, {0xbf712000}, {0xbf714000}, {0xbf716000},
- {0xbf718000}, {0xbf71a000}, {0xbf71c000}, {0xbf71e000},
- {0xbf720000}, {0xbf722000}, {0xbf724000}, {0xbf726000},
- {0xbf728000}, {0xbf72a000}, {0xbf72c000}, {0xbf72e000},
- {0xbf730000}, {0xbf732000}, {0xbf734000}, {0xbf736000},
- {0xbf738000}, {0xbf73a000}, {0xbf73c000}, {0xbf73e000},
- {0xbf740000}, {0xbf742000}, {0xbf744000}, {0xbf746000},
- {0xbf748000}, {0xbf74a000}, {0xbf74c000}, {0xbf74e000},
- {0xbf750000}, {0xbf752000}, {0xbf754000}, {0xbf756000},
- {0xbf758000}, {0xbf75a000}, {0xbf75c000}, {0xbf75e000},
- {0xbf760000}, {0xbf762000}, {0xbf764000}, {0xbf766000},
- {0xbf768000}, {0xbf76a000}, {0xbf76c000}, {0xbf76e000},
- {0xbf770000}, {0xbf772000}, {0xbf774000}, {0xbf776000},
- {0xbf778000}, {0xbf77a000}, {0xbf77c000}, {0xbf77e000},
- {0xbf780000}, {0xbf782000}, {0xbf784000}, {0xbf786000},
- {0xbf788000}, {0xbf78a000}, {0xbf78c000}, {0xbf78e000},
- {0xbf790000}, {0xbf792000}, {0xbf794000}, {0xbf796000},
- {0xbf798000}, {0xbf79a000}, {0xbf79c000}, {0xbf79e000},
- {0xbf7a0000}, {0xbf7a2000}, {0xbf7a4000}, {0xbf7a6000},
- {0xbf7a8000}, {0xbf7aa000}, {0xbf7ac000}, {0xbf7ae000},
- {0xbf7b0000}, {0xbf7b2000}, {0xbf7b4000}, {0xbf7b6000},
- {0xbf7b8000}, {0xbf7ba000}, {0xbf7bc000}, {0xbf7be000},
- {0xbf7c0000}, {0xbf7c2000}, {0xbf7c4000}, {0xbf7c6000},
- {0xbf7c8000}, {0xbf7ca000}, {0xbf7cc000}, {0xbf7ce000},
- {0xbf7d0000}, {0xbf7d2000}, {0xbf7d4000}, {0xbf7d6000},
- {0xbf7d8000}, {0xbf7da000}, {0xbf7dc000}, {0xbf7de000},
- {0xbf7e0000}, {0xbf7e2000}, {0xbf7e4000}, {0xbf7e6000},
- {0xbf7e8000}, {0xbf7ea000}, {0xbf7ec000}, {0xbf7ee000},
- {0xbf7f0000}, {0xbf7f2000}, {0xbf7f4000}, {0xbf7f6000},
- {0xbf7f8000}, {0xbf7fa000}, {0xbf7fc000}, {0xbf7fe000},
- {0xbf800000}, {0xbf802000}, {0xbf804000}, {0xbf806000},
- {0xbf808000}, {0xbf80a000}, {0xbf80c000}, {0xbf80e000},
- {0xbf810000}, {0xbf812000}, {0xbf814000}, {0xbf816000},
- {0xbf818000}, {0xbf81a000}, {0xbf81c000}, {0xbf81e000},
- {0xbf820000}, {0xbf822000}, {0xbf824000}, {0xbf826000},
- {0xbf828000}, {0xbf82a000}, {0xbf82c000}, {0xbf82e000},
- {0xbf830000}, {0xbf832000}, {0xbf834000}, {0xbf836000},
- {0xbf838000}, {0xbf83a000}, {0xbf83c000}, {0xbf83e000},
- {0xbf840000}, {0xbf842000}, {0xbf844000}, {0xbf846000},
- {0xbf848000}, {0xbf84a000}, {0xbf84c000}, {0xbf84e000},
- {0xbf850000}, {0xbf852000}, {0xbf854000}, {0xbf856000},
- {0xbf858000}, {0xbf85a000}, {0xbf85c000}, {0xbf85e000},
- {0xbf860000}, {0xbf862000}, {0xbf864000}, {0xbf866000},
- {0xbf868000}, {0xbf86a000}, {0xbf86c000}, {0xbf86e000},
- {0xbf870000}, {0xbf872000}, {0xbf874000}, {0xbf876000},
- {0xbf878000}, {0xbf87a000}, {0xbf87c000}, {0xbf87e000},
- {0xbf880000}, {0xbf882000}, {0xbf884000}, {0xbf886000},
- {0xbf888000}, {0xbf88a000}, {0xbf88c000}, {0xbf88e000},
- {0xbf890000}, {0xbf892000}, {0xbf894000}, {0xbf896000},
- {0xbf898000}, {0xbf89a000}, {0xbf89c000}, {0xbf89e000},
- {0xbf8a0000}, {0xbf8a2000}, {0xbf8a4000}, {0xbf8a6000},
- {0xbf8a8000}, {0xbf8aa000}, {0xbf8ac000}, {0xbf8ae000},
- {0xbf8b0000}, {0xbf8b2000}, {0xbf8b4000}, {0xbf8b6000},
- {0xbf8b8000}, {0xbf8ba000}, {0xbf8bc000}, {0xbf8be000},
- {0xbf8c0000}, {0xbf8c2000}, {0xbf8c4000}, {0xbf8c6000},
- {0xbf8c8000}, {0xbf8ca000}, {0xbf8cc000}, {0xbf8ce000},
- {0xbf8d0000}, {0xbf8d2000}, {0xbf8d4000}, {0xbf8d6000},
- {0xbf8d8000}, {0xbf8da000}, {0xbf8dc000}, {0xbf8de000},
- {0xbf8e0000}, {0xbf8e2000}, {0xbf8e4000}, {0xbf8e6000},
- {0xbf8e8000}, {0xbf8ea000}, {0xbf8ec000}, {0xbf8ee000},
- {0xbf8f0000}, {0xbf8f2000}, {0xbf8f4000}, {0xbf8f6000},
- {0xbf8f8000}, {0xbf8fa000}, {0xbf8fc000}, {0xbf8fe000},
- {0xbf900000}, {0xbf902000}, {0xbf904000}, {0xbf906000},
- {0xbf908000}, {0xbf90a000}, {0xbf90c000}, {0xbf90e000},
- {0xbf910000}, {0xbf912000}, {0xbf914000}, {0xbf916000},
- {0xbf918000}, {0xbf91a000}, {0xbf91c000}, {0xbf91e000},
- {0xbf920000}, {0xbf922000}, {0xbf924000}, {0xbf926000},
- {0xbf928000}, {0xbf92a000}, {0xbf92c000}, {0xbf92e000},
- {0xbf930000}, {0xbf932000}, {0xbf934000}, {0xbf936000},
- {0xbf938000}, {0xbf93a000}, {0xbf93c000}, {0xbf93e000},
- {0xbf940000}, {0xbf942000}, {0xbf944000}, {0xbf946000},
- {0xbf948000}, {0xbf94a000}, {0xbf94c000}, {0xbf94e000},
- {0xbf950000}, {0xbf952000}, {0xbf954000}, {0xbf956000},
- {0xbf958000}, {0xbf95a000}, {0xbf95c000}, {0xbf95e000},
- {0xbf960000}, {0xbf962000}, {0xbf964000}, {0xbf966000},
- {0xbf968000}, {0xbf96a000}, {0xbf96c000}, {0xbf96e000},
- {0xbf970000}, {0xbf972000}, {0xbf974000}, {0xbf976000},
- {0xbf978000}, {0xbf97a000}, {0xbf97c000}, {0xbf97e000},
- {0xbf980000}, {0xbf982000}, {0xbf984000}, {0xbf986000},
- {0xbf988000}, {0xbf98a000}, {0xbf98c000}, {0xbf98e000},
- {0xbf990000}, {0xbf992000}, {0xbf994000}, {0xbf996000},
- {0xbf998000}, {0xbf99a000}, {0xbf99c000}, {0xbf99e000},
- {0xbf9a0000}, {0xbf9a2000}, {0xbf9a4000}, {0xbf9a6000},
- {0xbf9a8000}, {0xbf9aa000}, {0xbf9ac000}, {0xbf9ae000},
- {0xbf9b0000}, {0xbf9b2000}, {0xbf9b4000}, {0xbf9b6000},
- {0xbf9b8000}, {0xbf9ba000}, {0xbf9bc000}, {0xbf9be000},
- {0xbf9c0000}, {0xbf9c2000}, {0xbf9c4000}, {0xbf9c6000},
- {0xbf9c8000}, {0xbf9ca000}, {0xbf9cc000}, {0xbf9ce000},
- {0xbf9d0000}, {0xbf9d2000}, {0xbf9d4000}, {0xbf9d6000},
- {0xbf9d8000}, {0xbf9da000}, {0xbf9dc000}, {0xbf9de000},
- {0xbf9e0000}, {0xbf9e2000}, {0xbf9e4000}, {0xbf9e6000},
- {0xbf9e8000}, {0xbf9ea000}, {0xbf9ec000}, {0xbf9ee000},
- {0xbf9f0000}, {0xbf9f2000}, {0xbf9f4000}, {0xbf9f6000},
- {0xbf9f8000}, {0xbf9fa000}, {0xbf9fc000}, {0xbf9fe000},
- {0xbfa00000}, {0xbfa02000}, {0xbfa04000}, {0xbfa06000},
- {0xbfa08000}, {0xbfa0a000}, {0xbfa0c000}, {0xbfa0e000},
- {0xbfa10000}, {0xbfa12000}, {0xbfa14000}, {0xbfa16000},
- {0xbfa18000}, {0xbfa1a000}, {0xbfa1c000}, {0xbfa1e000},
- {0xbfa20000}, {0xbfa22000}, {0xbfa24000}, {0xbfa26000},
- {0xbfa28000}, {0xbfa2a000}, {0xbfa2c000}, {0xbfa2e000},
- {0xbfa30000}, {0xbfa32000}, {0xbfa34000}, {0xbfa36000},
- {0xbfa38000}, {0xbfa3a000}, {0xbfa3c000}, {0xbfa3e000},
- {0xbfa40000}, {0xbfa42000}, {0xbfa44000}, {0xbfa46000},
- {0xbfa48000}, {0xbfa4a000}, {0xbfa4c000}, {0xbfa4e000},
- {0xbfa50000}, {0xbfa52000}, {0xbfa54000}, {0xbfa56000},
- {0xbfa58000}, {0xbfa5a000}, {0xbfa5c000}, {0xbfa5e000},
- {0xbfa60000}, {0xbfa62000}, {0xbfa64000}, {0xbfa66000},
- {0xbfa68000}, {0xbfa6a000}, {0xbfa6c000}, {0xbfa6e000},
- {0xbfa70000}, {0xbfa72000}, {0xbfa74000}, {0xbfa76000},
- {0xbfa78000}, {0xbfa7a000}, {0xbfa7c000}, {0xbfa7e000},
- {0xbfa80000}, {0xbfa82000}, {0xbfa84000}, {0xbfa86000},
- {0xbfa88000}, {0xbfa8a000}, {0xbfa8c000}, {0xbfa8e000},
- {0xbfa90000}, {0xbfa92000}, {0xbfa94000}, {0xbfa96000},
- {0xbfa98000}, {0xbfa9a000}, {0xbfa9c000}, {0xbfa9e000},
- {0xbfaa0000}, {0xbfaa2000}, {0xbfaa4000}, {0xbfaa6000},
- {0xbfaa8000}, {0xbfaaa000}, {0xbfaac000}, {0xbfaae000},
- {0xbfab0000}, {0xbfab2000}, {0xbfab4000}, {0xbfab6000},
- {0xbfab8000}, {0xbfaba000}, {0xbfabc000}, {0xbfabe000},
- {0xbfac0000}, {0xbfac2000}, {0xbfac4000}, {0xbfac6000},
- {0xbfac8000}, {0xbfaca000}, {0xbfacc000}, {0xbface000},
- {0xbfad0000}, {0xbfad2000}, {0xbfad4000}, {0xbfad6000},
- {0xbfad8000}, {0xbfada000}, {0xbfadc000}, {0xbfade000},
- {0xbfae0000}, {0xbfae2000}, {0xbfae4000}, {0xbfae6000},
- {0xbfae8000}, {0xbfaea000}, {0xbfaec000}, {0xbfaee000},
- {0xbfaf0000}, {0xbfaf2000}, {0xbfaf4000}, {0xbfaf6000},
- {0xbfaf8000}, {0xbfafa000}, {0xbfafc000}, {0xbfafe000},
- {0xbfb00000}, {0xbfb02000}, {0xbfb04000}, {0xbfb06000},
- {0xbfb08000}, {0xbfb0a000}, {0xbfb0c000}, {0xbfb0e000},
- {0xbfb10000}, {0xbfb12000}, {0xbfb14000}, {0xbfb16000},
- {0xbfb18000}, {0xbfb1a000}, {0xbfb1c000}, {0xbfb1e000},
- {0xbfb20000}, {0xbfb22000}, {0xbfb24000}, {0xbfb26000},
- {0xbfb28000}, {0xbfb2a000}, {0xbfb2c000}, {0xbfb2e000},
- {0xbfb30000}, {0xbfb32000}, {0xbfb34000}, {0xbfb36000},
- {0xbfb38000}, {0xbfb3a000}, {0xbfb3c000}, {0xbfb3e000},
- {0xbfb40000}, {0xbfb42000}, {0xbfb44000}, {0xbfb46000},
- {0xbfb48000}, {0xbfb4a000}, {0xbfb4c000}, {0xbfb4e000},
- {0xbfb50000}, {0xbfb52000}, {0xbfb54000}, {0xbfb56000},
- {0xbfb58000}, {0xbfb5a000}, {0xbfb5c000}, {0xbfb5e000},
- {0xbfb60000}, {0xbfb62000}, {0xbfb64000}, {0xbfb66000},
- {0xbfb68000}, {0xbfb6a000}, {0xbfb6c000}, {0xbfb6e000},
- {0xbfb70000}, {0xbfb72000}, {0xbfb74000}, {0xbfb76000},
- {0xbfb78000}, {0xbfb7a000}, {0xbfb7c000}, {0xbfb7e000},
- {0xbfb80000}, {0xbfb82000}, {0xbfb84000}, {0xbfb86000},
- {0xbfb88000}, {0xbfb8a000}, {0xbfb8c000}, {0xbfb8e000},
- {0xbfb90000}, {0xbfb92000}, {0xbfb94000}, {0xbfb96000},
- {0xbfb98000}, {0xbfb9a000}, {0xbfb9c000}, {0xbfb9e000},
- {0xbfba0000}, {0xbfba2000}, {0xbfba4000}, {0xbfba6000},
- {0xbfba8000}, {0xbfbaa000}, {0xbfbac000}, {0xbfbae000},
- {0xbfbb0000}, {0xbfbb2000}, {0xbfbb4000}, {0xbfbb6000},
- {0xbfbb8000}, {0xbfbba000}, {0xbfbbc000}, {0xbfbbe000},
- {0xbfbc0000}, {0xbfbc2000}, {0xbfbc4000}, {0xbfbc6000},
- {0xbfbc8000}, {0xbfbca000}, {0xbfbcc000}, {0xbfbce000},
- {0xbfbd0000}, {0xbfbd2000}, {0xbfbd4000}, {0xbfbd6000},
- {0xbfbd8000}, {0xbfbda000}, {0xbfbdc000}, {0xbfbde000},
- {0xbfbe0000}, {0xbfbe2000}, {0xbfbe4000}, {0xbfbe6000},
- {0xbfbe8000}, {0xbfbea000}, {0xbfbec000}, {0xbfbee000},
- {0xbfbf0000}, {0xbfbf2000}, {0xbfbf4000}, {0xbfbf6000},
- {0xbfbf8000}, {0xbfbfa000}, {0xbfbfc000}, {0xbfbfe000},
- {0xbfc00000}, {0xbfc02000}, {0xbfc04000}, {0xbfc06000},
- {0xbfc08000}, {0xbfc0a000}, {0xbfc0c000}, {0xbfc0e000},
- {0xbfc10000}, {0xbfc12000}, {0xbfc14000}, {0xbfc16000},
- {0xbfc18000}, {0xbfc1a000}, {0xbfc1c000}, {0xbfc1e000},
- {0xbfc20000}, {0xbfc22000}, {0xbfc24000}, {0xbfc26000},
- {0xbfc28000}, {0xbfc2a000}, {0xbfc2c000}, {0xbfc2e000},
- {0xbfc30000}, {0xbfc32000}, {0xbfc34000}, {0xbfc36000},
- {0xbfc38000}, {0xbfc3a000}, {0xbfc3c000}, {0xbfc3e000},
- {0xbfc40000}, {0xbfc42000}, {0xbfc44000}, {0xbfc46000},
- {0xbfc48000}, {0xbfc4a000}, {0xbfc4c000}, {0xbfc4e000},
- {0xbfc50000}, {0xbfc52000}, {0xbfc54000}, {0xbfc56000},
- {0xbfc58000}, {0xbfc5a000}, {0xbfc5c000}, {0xbfc5e000},
- {0xbfc60000}, {0xbfc62000}, {0xbfc64000}, {0xbfc66000},
- {0xbfc68000}, {0xbfc6a000}, {0xbfc6c000}, {0xbfc6e000},
- {0xbfc70000}, {0xbfc72000}, {0xbfc74000}, {0xbfc76000},
- {0xbfc78000}, {0xbfc7a000}, {0xbfc7c000}, {0xbfc7e000},
- {0xbfc80000}, {0xbfc82000}, {0xbfc84000}, {0xbfc86000},
- {0xbfc88000}, {0xbfc8a000}, {0xbfc8c000}, {0xbfc8e000},
- {0xbfc90000}, {0xbfc92000}, {0xbfc94000}, {0xbfc96000},
- {0xbfc98000}, {0xbfc9a000}, {0xbfc9c000}, {0xbfc9e000},
- {0xbfca0000}, {0xbfca2000}, {0xbfca4000}, {0xbfca6000},
- {0xbfca8000}, {0xbfcaa000}, {0xbfcac000}, {0xbfcae000},
- {0xbfcb0000}, {0xbfcb2000}, {0xbfcb4000}, {0xbfcb6000},
- {0xbfcb8000}, {0xbfcba000}, {0xbfcbc000}, {0xbfcbe000},
- {0xbfcc0000}, {0xbfcc2000}, {0xbfcc4000}, {0xbfcc6000},
- {0xbfcc8000}, {0xbfcca000}, {0xbfccc000}, {0xbfcce000},
- {0xbfcd0000}, {0xbfcd2000}, {0xbfcd4000}, {0xbfcd6000},
- {0xbfcd8000}, {0xbfcda000}, {0xbfcdc000}, {0xbfcde000},
- {0xbfce0000}, {0xbfce2000}, {0xbfce4000}, {0xbfce6000},
- {0xbfce8000}, {0xbfcea000}, {0xbfcec000}, {0xbfcee000},
- {0xbfcf0000}, {0xbfcf2000}, {0xbfcf4000}, {0xbfcf6000},
- {0xbfcf8000}, {0xbfcfa000}, {0xbfcfc000}, {0xbfcfe000},
- {0xbfd00000}, {0xbfd02000}, {0xbfd04000}, {0xbfd06000},
- {0xbfd08000}, {0xbfd0a000}, {0xbfd0c000}, {0xbfd0e000},
- {0xbfd10000}, {0xbfd12000}, {0xbfd14000}, {0xbfd16000},
- {0xbfd18000}, {0xbfd1a000}, {0xbfd1c000}, {0xbfd1e000},
- {0xbfd20000}, {0xbfd22000}, {0xbfd24000}, {0xbfd26000},
- {0xbfd28000}, {0xbfd2a000}, {0xbfd2c000}, {0xbfd2e000},
- {0xbfd30000}, {0xbfd32000}, {0xbfd34000}, {0xbfd36000},
- {0xbfd38000}, {0xbfd3a000}, {0xbfd3c000}, {0xbfd3e000},
- {0xbfd40000}, {0xbfd42000}, {0xbfd44000}, {0xbfd46000},
- {0xbfd48000}, {0xbfd4a000}, {0xbfd4c000}, {0xbfd4e000},
- {0xbfd50000}, {0xbfd52000}, {0xbfd54000}, {0xbfd56000},
- {0xbfd58000}, {0xbfd5a000}, {0xbfd5c000}, {0xbfd5e000},
- {0xbfd60000}, {0xbfd62000}, {0xbfd64000}, {0xbfd66000},
- {0xbfd68000}, {0xbfd6a000}, {0xbfd6c000}, {0xbfd6e000},
- {0xbfd70000}, {0xbfd72000}, {0xbfd74000}, {0xbfd76000},
- {0xbfd78000}, {0xbfd7a000}, {0xbfd7c000}, {0xbfd7e000},
- {0xbfd80000}, {0xbfd82000}, {0xbfd84000}, {0xbfd86000},
- {0xbfd88000}, {0xbfd8a000}, {0xbfd8c000}, {0xbfd8e000},
- {0xbfd90000}, {0xbfd92000}, {0xbfd94000}, {0xbfd96000},
- {0xbfd98000}, {0xbfd9a000}, {0xbfd9c000}, {0xbfd9e000},
- {0xbfda0000}, {0xbfda2000}, {0xbfda4000}, {0xbfda6000},
- {0xbfda8000}, {0xbfdaa000}, {0xbfdac000}, {0xbfdae000},
- {0xbfdb0000}, {0xbfdb2000}, {0xbfdb4000}, {0xbfdb6000},
- {0xbfdb8000}, {0xbfdba000}, {0xbfdbc000}, {0xbfdbe000},
- {0xbfdc0000}, {0xbfdc2000}, {0xbfdc4000}, {0xbfdc6000},
- {0xbfdc8000}, {0xbfdca000}, {0xbfdcc000}, {0xbfdce000},
- {0xbfdd0000}, {0xbfdd2000}, {0xbfdd4000}, {0xbfdd6000},
- {0xbfdd8000}, {0xbfdda000}, {0xbfddc000}, {0xbfdde000},
- {0xbfde0000}, {0xbfde2000}, {0xbfde4000}, {0xbfde6000},
- {0xbfde8000}, {0xbfdea000}, {0xbfdec000}, {0xbfdee000},
- {0xbfdf0000}, {0xbfdf2000}, {0xbfdf4000}, {0xbfdf6000},
- {0xbfdf8000}, {0xbfdfa000}, {0xbfdfc000}, {0xbfdfe000},
- {0xbfe00000}, {0xbfe02000}, {0xbfe04000}, {0xbfe06000},
- {0xbfe08000}, {0xbfe0a000}, {0xbfe0c000}, {0xbfe0e000},
- {0xbfe10000}, {0xbfe12000}, {0xbfe14000}, {0xbfe16000},
- {0xbfe18000}, {0xbfe1a000}, {0xbfe1c000}, {0xbfe1e000},
- {0xbfe20000}, {0xbfe22000}, {0xbfe24000}, {0xbfe26000},
- {0xbfe28000}, {0xbfe2a000}, {0xbfe2c000}, {0xbfe2e000},
- {0xbfe30000}, {0xbfe32000}, {0xbfe34000}, {0xbfe36000},
- {0xbfe38000}, {0xbfe3a000}, {0xbfe3c000}, {0xbfe3e000},
- {0xbfe40000}, {0xbfe42000}, {0xbfe44000}, {0xbfe46000},
- {0xbfe48000}, {0xbfe4a000}, {0xbfe4c000}, {0xbfe4e000},
- {0xbfe50000}, {0xbfe52000}, {0xbfe54000}, {0xbfe56000},
- {0xbfe58000}, {0xbfe5a000}, {0xbfe5c000}, {0xbfe5e000},
- {0xbfe60000}, {0xbfe62000}, {0xbfe64000}, {0xbfe66000},
- {0xbfe68000}, {0xbfe6a000}, {0xbfe6c000}, {0xbfe6e000},
- {0xbfe70000}, {0xbfe72000}, {0xbfe74000}, {0xbfe76000},
- {0xbfe78000}, {0xbfe7a000}, {0xbfe7c000}, {0xbfe7e000},
- {0xbfe80000}, {0xbfe82000}, {0xbfe84000}, {0xbfe86000},
- {0xbfe88000}, {0xbfe8a000}, {0xbfe8c000}, {0xbfe8e000},
- {0xbfe90000}, {0xbfe92000}, {0xbfe94000}, {0xbfe96000},
- {0xbfe98000}, {0xbfe9a000}, {0xbfe9c000}, {0xbfe9e000},
- {0xbfea0000}, {0xbfea2000}, {0xbfea4000}, {0xbfea6000},
- {0xbfea8000}, {0xbfeaa000}, {0xbfeac000}, {0xbfeae000},
- {0xbfeb0000}, {0xbfeb2000}, {0xbfeb4000}, {0xbfeb6000},
- {0xbfeb8000}, {0xbfeba000}, {0xbfebc000}, {0xbfebe000},
- {0xbfec0000}, {0xbfec2000}, {0xbfec4000}, {0xbfec6000},
- {0xbfec8000}, {0xbfeca000}, {0xbfecc000}, {0xbfece000},
- {0xbfed0000}, {0xbfed2000}, {0xbfed4000}, {0xbfed6000},
- {0xbfed8000}, {0xbfeda000}, {0xbfedc000}, {0xbfede000},
- {0xbfee0000}, {0xbfee2000}, {0xbfee4000}, {0xbfee6000},
- {0xbfee8000}, {0xbfeea000}, {0xbfeec000}, {0xbfeee000},
- {0xbfef0000}, {0xbfef2000}, {0xbfef4000}, {0xbfef6000},
- {0xbfef8000}, {0xbfefa000}, {0xbfefc000}, {0xbfefe000},
- {0xbff00000}, {0xbff02000}, {0xbff04000}, {0xbff06000},
- {0xbff08000}, {0xbff0a000}, {0xbff0c000}, {0xbff0e000},
- {0xbff10000}, {0xbff12000}, {0xbff14000}, {0xbff16000},
- {0xbff18000}, {0xbff1a000}, {0xbff1c000}, {0xbff1e000},
- {0xbff20000}, {0xbff22000}, {0xbff24000}, {0xbff26000},
- {0xbff28000}, {0xbff2a000}, {0xbff2c000}, {0xbff2e000},
- {0xbff30000}, {0xbff32000}, {0xbff34000}, {0xbff36000},
- {0xbff38000}, {0xbff3a000}, {0xbff3c000}, {0xbff3e000},
- {0xbff40000}, {0xbff42000}, {0xbff44000}, {0xbff46000},
- {0xbff48000}, {0xbff4a000}, {0xbff4c000}, {0xbff4e000},
- {0xbff50000}, {0xbff52000}, {0xbff54000}, {0xbff56000},
- {0xbff58000}, {0xbff5a000}, {0xbff5c000}, {0xbff5e000},
- {0xbff60000}, {0xbff62000}, {0xbff64000}, {0xbff66000},
- {0xbff68000}, {0xbff6a000}, {0xbff6c000}, {0xbff6e000},
- {0xbff70000}, {0xbff72000}, {0xbff74000}, {0xbff76000},
- {0xbff78000}, {0xbff7a000}, {0xbff7c000}, {0xbff7e000},
- {0xbff80000}, {0xbff82000}, {0xbff84000}, {0xbff86000},
- {0xbff88000}, {0xbff8a000}, {0xbff8c000}, {0xbff8e000},
- {0xbff90000}, {0xbff92000}, {0xbff94000}, {0xbff96000},
- {0xbff98000}, {0xbff9a000}, {0xbff9c000}, {0xbff9e000},
- {0xbffa0000}, {0xbffa2000}, {0xbffa4000}, {0xbffa6000},
- {0xbffa8000}, {0xbffaa000}, {0xbffac000}, {0xbffae000},
- {0xbffb0000}, {0xbffb2000}, {0xbffb4000}, {0xbffb6000},
- {0xbffb8000}, {0xbffba000}, {0xbffbc000}, {0xbffbe000},
- {0xbffc0000}, {0xbffc2000}, {0xbffc4000}, {0xbffc6000},
- {0xbffc8000}, {0xbffca000}, {0xbffcc000}, {0xbffce000},
- {0xbffd0000}, {0xbffd2000}, {0xbffd4000}, {0xbffd6000},
- {0xbffd8000}, {0xbffda000}, {0xbffdc000}, {0xbffde000},
- {0xbffe0000}, {0xbffe2000}, {0xbffe4000}, {0xbffe6000},
- {0xbffe8000}, {0xbffea000}, {0xbffec000}, {0xbffee000},
- {0xbfff0000}, {0xbfff2000}, {0xbfff4000}, {0xbfff6000},
- {0xbfff8000}, {0xbfffa000}, {0xbfffc000}, {0xbfffe000},
- {0xc0000000}, {0xc0002000}, {0xc0004000}, {0xc0006000},
- {0xc0008000}, {0xc000a000}, {0xc000c000}, {0xc000e000},
- {0xc0010000}, {0xc0012000}, {0xc0014000}, {0xc0016000},
- {0xc0018000}, {0xc001a000}, {0xc001c000}, {0xc001e000},
- {0xc0020000}, {0xc0022000}, {0xc0024000}, {0xc0026000},
- {0xc0028000}, {0xc002a000}, {0xc002c000}, {0xc002e000},
- {0xc0030000}, {0xc0032000}, {0xc0034000}, {0xc0036000},
- {0xc0038000}, {0xc003a000}, {0xc003c000}, {0xc003e000},
- {0xc0040000}, {0xc0042000}, {0xc0044000}, {0xc0046000},
- {0xc0048000}, {0xc004a000}, {0xc004c000}, {0xc004e000},
- {0xc0050000}, {0xc0052000}, {0xc0054000}, {0xc0056000},
- {0xc0058000}, {0xc005a000}, {0xc005c000}, {0xc005e000},
- {0xc0060000}, {0xc0062000}, {0xc0064000}, {0xc0066000},
- {0xc0068000}, {0xc006a000}, {0xc006c000}, {0xc006e000},
- {0xc0070000}, {0xc0072000}, {0xc0074000}, {0xc0076000},
- {0xc0078000}, {0xc007a000}, {0xc007c000}, {0xc007e000},
- {0xc0080000}, {0xc0082000}, {0xc0084000}, {0xc0086000},
- {0xc0088000}, {0xc008a000}, {0xc008c000}, {0xc008e000},
- {0xc0090000}, {0xc0092000}, {0xc0094000}, {0xc0096000},
- {0xc0098000}, {0xc009a000}, {0xc009c000}, {0xc009e000},
- {0xc00a0000}, {0xc00a2000}, {0xc00a4000}, {0xc00a6000},
- {0xc00a8000}, {0xc00aa000}, {0xc00ac000}, {0xc00ae000},
- {0xc00b0000}, {0xc00b2000}, {0xc00b4000}, {0xc00b6000},
- {0xc00b8000}, {0xc00ba000}, {0xc00bc000}, {0xc00be000},
- {0xc00c0000}, {0xc00c2000}, {0xc00c4000}, {0xc00c6000},
- {0xc00c8000}, {0xc00ca000}, {0xc00cc000}, {0xc00ce000},
- {0xc00d0000}, {0xc00d2000}, {0xc00d4000}, {0xc00d6000},
- {0xc00d8000}, {0xc00da000}, {0xc00dc000}, {0xc00de000},
- {0xc00e0000}, {0xc00e2000}, {0xc00e4000}, {0xc00e6000},
- {0xc00e8000}, {0xc00ea000}, {0xc00ec000}, {0xc00ee000},
- {0xc00f0000}, {0xc00f2000}, {0xc00f4000}, {0xc00f6000},
- {0xc00f8000}, {0xc00fa000}, {0xc00fc000}, {0xc00fe000},
- {0xc0100000}, {0xc0102000}, {0xc0104000}, {0xc0106000},
- {0xc0108000}, {0xc010a000}, {0xc010c000}, {0xc010e000},
- {0xc0110000}, {0xc0112000}, {0xc0114000}, {0xc0116000},
- {0xc0118000}, {0xc011a000}, {0xc011c000}, {0xc011e000},
- {0xc0120000}, {0xc0122000}, {0xc0124000}, {0xc0126000},
- {0xc0128000}, {0xc012a000}, {0xc012c000}, {0xc012e000},
- {0xc0130000}, {0xc0132000}, {0xc0134000}, {0xc0136000},
- {0xc0138000}, {0xc013a000}, {0xc013c000}, {0xc013e000},
- {0xc0140000}, {0xc0142000}, {0xc0144000}, {0xc0146000},
- {0xc0148000}, {0xc014a000}, {0xc014c000}, {0xc014e000},
- {0xc0150000}, {0xc0152000}, {0xc0154000}, {0xc0156000},
- {0xc0158000}, {0xc015a000}, {0xc015c000}, {0xc015e000},
- {0xc0160000}, {0xc0162000}, {0xc0164000}, {0xc0166000},
- {0xc0168000}, {0xc016a000}, {0xc016c000}, {0xc016e000},
- {0xc0170000}, {0xc0172000}, {0xc0174000}, {0xc0176000},
- {0xc0178000}, {0xc017a000}, {0xc017c000}, {0xc017e000},
- {0xc0180000}, {0xc0182000}, {0xc0184000}, {0xc0186000},
- {0xc0188000}, {0xc018a000}, {0xc018c000}, {0xc018e000},
- {0xc0190000}, {0xc0192000}, {0xc0194000}, {0xc0196000},
- {0xc0198000}, {0xc019a000}, {0xc019c000}, {0xc019e000},
- {0xc01a0000}, {0xc01a2000}, {0xc01a4000}, {0xc01a6000},
- {0xc01a8000}, {0xc01aa000}, {0xc01ac000}, {0xc01ae000},
- {0xc01b0000}, {0xc01b2000}, {0xc01b4000}, {0xc01b6000},
- {0xc01b8000}, {0xc01ba000}, {0xc01bc000}, {0xc01be000},
- {0xc01c0000}, {0xc01c2000}, {0xc01c4000}, {0xc01c6000},
- {0xc01c8000}, {0xc01ca000}, {0xc01cc000}, {0xc01ce000},
- {0xc01d0000}, {0xc01d2000}, {0xc01d4000}, {0xc01d6000},
- {0xc01d8000}, {0xc01da000}, {0xc01dc000}, {0xc01de000},
- {0xc01e0000}, {0xc01e2000}, {0xc01e4000}, {0xc01e6000},
- {0xc01e8000}, {0xc01ea000}, {0xc01ec000}, {0xc01ee000},
- {0xc01f0000}, {0xc01f2000}, {0xc01f4000}, {0xc01f6000},
- {0xc01f8000}, {0xc01fa000}, {0xc01fc000}, {0xc01fe000},
- {0xc0200000}, {0xc0202000}, {0xc0204000}, {0xc0206000},
- {0xc0208000}, {0xc020a000}, {0xc020c000}, {0xc020e000},
- {0xc0210000}, {0xc0212000}, {0xc0214000}, {0xc0216000},
- {0xc0218000}, {0xc021a000}, {0xc021c000}, {0xc021e000},
- {0xc0220000}, {0xc0222000}, {0xc0224000}, {0xc0226000},
- {0xc0228000}, {0xc022a000}, {0xc022c000}, {0xc022e000},
- {0xc0230000}, {0xc0232000}, {0xc0234000}, {0xc0236000},
- {0xc0238000}, {0xc023a000}, {0xc023c000}, {0xc023e000},
- {0xc0240000}, {0xc0242000}, {0xc0244000}, {0xc0246000},
- {0xc0248000}, {0xc024a000}, {0xc024c000}, {0xc024e000},
- {0xc0250000}, {0xc0252000}, {0xc0254000}, {0xc0256000},
- {0xc0258000}, {0xc025a000}, {0xc025c000}, {0xc025e000},
- {0xc0260000}, {0xc0262000}, {0xc0264000}, {0xc0266000},
- {0xc0268000}, {0xc026a000}, {0xc026c000}, {0xc026e000},
- {0xc0270000}, {0xc0272000}, {0xc0274000}, {0xc0276000},
- {0xc0278000}, {0xc027a000}, {0xc027c000}, {0xc027e000},
- {0xc0280000}, {0xc0282000}, {0xc0284000}, {0xc0286000},
- {0xc0288000}, {0xc028a000}, {0xc028c000}, {0xc028e000},
- {0xc0290000}, {0xc0292000}, {0xc0294000}, {0xc0296000},
- {0xc0298000}, {0xc029a000}, {0xc029c000}, {0xc029e000},
- {0xc02a0000}, {0xc02a2000}, {0xc02a4000}, {0xc02a6000},
- {0xc02a8000}, {0xc02aa000}, {0xc02ac000}, {0xc02ae000},
- {0xc02b0000}, {0xc02b2000}, {0xc02b4000}, {0xc02b6000},
- {0xc02b8000}, {0xc02ba000}, {0xc02bc000}, {0xc02be000},
- {0xc02c0000}, {0xc02c2000}, {0xc02c4000}, {0xc02c6000},
- {0xc02c8000}, {0xc02ca000}, {0xc02cc000}, {0xc02ce000},
- {0xc02d0000}, {0xc02d2000}, {0xc02d4000}, {0xc02d6000},
- {0xc02d8000}, {0xc02da000}, {0xc02dc000}, {0xc02de000},
- {0xc02e0000}, {0xc02e2000}, {0xc02e4000}, {0xc02e6000},
- {0xc02e8000}, {0xc02ea000}, {0xc02ec000}, {0xc02ee000},
- {0xc02f0000}, {0xc02f2000}, {0xc02f4000}, {0xc02f6000},
- {0xc02f8000}, {0xc02fa000}, {0xc02fc000}, {0xc02fe000},
- {0xc0300000}, {0xc0302000}, {0xc0304000}, {0xc0306000},
- {0xc0308000}, {0xc030a000}, {0xc030c000}, {0xc030e000},
- {0xc0310000}, {0xc0312000}, {0xc0314000}, {0xc0316000},
- {0xc0318000}, {0xc031a000}, {0xc031c000}, {0xc031e000},
- {0xc0320000}, {0xc0322000}, {0xc0324000}, {0xc0326000},
- {0xc0328000}, {0xc032a000}, {0xc032c000}, {0xc032e000},
- {0xc0330000}, {0xc0332000}, {0xc0334000}, {0xc0336000},
- {0xc0338000}, {0xc033a000}, {0xc033c000}, {0xc033e000},
- {0xc0340000}, {0xc0342000}, {0xc0344000}, {0xc0346000},
- {0xc0348000}, {0xc034a000}, {0xc034c000}, {0xc034e000},
- {0xc0350000}, {0xc0352000}, {0xc0354000}, {0xc0356000},
- {0xc0358000}, {0xc035a000}, {0xc035c000}, {0xc035e000},
- {0xc0360000}, {0xc0362000}, {0xc0364000}, {0xc0366000},
- {0xc0368000}, {0xc036a000}, {0xc036c000}, {0xc036e000},
- {0xc0370000}, {0xc0372000}, {0xc0374000}, {0xc0376000},
- {0xc0378000}, {0xc037a000}, {0xc037c000}, {0xc037e000},
- {0xc0380000}, {0xc0382000}, {0xc0384000}, {0xc0386000},
- {0xc0388000}, {0xc038a000}, {0xc038c000}, {0xc038e000},
- {0xc0390000}, {0xc0392000}, {0xc0394000}, {0xc0396000},
- {0xc0398000}, {0xc039a000}, {0xc039c000}, {0xc039e000},
- {0xc03a0000}, {0xc03a2000}, {0xc03a4000}, {0xc03a6000},
- {0xc03a8000}, {0xc03aa000}, {0xc03ac000}, {0xc03ae000},
- {0xc03b0000}, {0xc03b2000}, {0xc03b4000}, {0xc03b6000},
- {0xc03b8000}, {0xc03ba000}, {0xc03bc000}, {0xc03be000},
- {0xc03c0000}, {0xc03c2000}, {0xc03c4000}, {0xc03c6000},
- {0xc03c8000}, {0xc03ca000}, {0xc03cc000}, {0xc03ce000},
- {0xc03d0000}, {0xc03d2000}, {0xc03d4000}, {0xc03d6000},
- {0xc03d8000}, {0xc03da000}, {0xc03dc000}, {0xc03de000},
- {0xc03e0000}, {0xc03e2000}, {0xc03e4000}, {0xc03e6000},
- {0xc03e8000}, {0xc03ea000}, {0xc03ec000}, {0xc03ee000},
- {0xc03f0000}, {0xc03f2000}, {0xc03f4000}, {0xc03f6000},
- {0xc03f8000}, {0xc03fa000}, {0xc03fc000}, {0xc03fe000},
- {0xc0400000}, {0xc0402000}, {0xc0404000}, {0xc0406000},
- {0xc0408000}, {0xc040a000}, {0xc040c000}, {0xc040e000},
- {0xc0410000}, {0xc0412000}, {0xc0414000}, {0xc0416000},
- {0xc0418000}, {0xc041a000}, {0xc041c000}, {0xc041e000},
- {0xc0420000}, {0xc0422000}, {0xc0424000}, {0xc0426000},
- {0xc0428000}, {0xc042a000}, {0xc042c000}, {0xc042e000},
- {0xc0430000}, {0xc0432000}, {0xc0434000}, {0xc0436000},
- {0xc0438000}, {0xc043a000}, {0xc043c000}, {0xc043e000},
- {0xc0440000}, {0xc0442000}, {0xc0444000}, {0xc0446000},
- {0xc0448000}, {0xc044a000}, {0xc044c000}, {0xc044e000},
- {0xc0450000}, {0xc0452000}, {0xc0454000}, {0xc0456000},
- {0xc0458000}, {0xc045a000}, {0xc045c000}, {0xc045e000},
- {0xc0460000}, {0xc0462000}, {0xc0464000}, {0xc0466000},
- {0xc0468000}, {0xc046a000}, {0xc046c000}, {0xc046e000},
- {0xc0470000}, {0xc0472000}, {0xc0474000}, {0xc0476000},
- {0xc0478000}, {0xc047a000}, {0xc047c000}, {0xc047e000},
- {0xc0480000}, {0xc0482000}, {0xc0484000}, {0xc0486000},
- {0xc0488000}, {0xc048a000}, {0xc048c000}, {0xc048e000},
- {0xc0490000}, {0xc0492000}, {0xc0494000}, {0xc0496000},
- {0xc0498000}, {0xc049a000}, {0xc049c000}, {0xc049e000},
- {0xc04a0000}, {0xc04a2000}, {0xc04a4000}, {0xc04a6000},
- {0xc04a8000}, {0xc04aa000}, {0xc04ac000}, {0xc04ae000},
- {0xc04b0000}, {0xc04b2000}, {0xc04b4000}, {0xc04b6000},
- {0xc04b8000}, {0xc04ba000}, {0xc04bc000}, {0xc04be000},
- {0xc04c0000}, {0xc04c2000}, {0xc04c4000}, {0xc04c6000},
- {0xc04c8000}, {0xc04ca000}, {0xc04cc000}, {0xc04ce000},
- {0xc04d0000}, {0xc04d2000}, {0xc04d4000}, {0xc04d6000},
- {0xc04d8000}, {0xc04da000}, {0xc04dc000}, {0xc04de000},
- {0xc04e0000}, {0xc04e2000}, {0xc04e4000}, {0xc04e6000},
- {0xc04e8000}, {0xc04ea000}, {0xc04ec000}, {0xc04ee000},
- {0xc04f0000}, {0xc04f2000}, {0xc04f4000}, {0xc04f6000},
- {0xc04f8000}, {0xc04fa000}, {0xc04fc000}, {0xc04fe000},
- {0xc0500000}, {0xc0502000}, {0xc0504000}, {0xc0506000},
- {0xc0508000}, {0xc050a000}, {0xc050c000}, {0xc050e000},
- {0xc0510000}, {0xc0512000}, {0xc0514000}, {0xc0516000},
- {0xc0518000}, {0xc051a000}, {0xc051c000}, {0xc051e000},
- {0xc0520000}, {0xc0522000}, {0xc0524000}, {0xc0526000},
- {0xc0528000}, {0xc052a000}, {0xc052c000}, {0xc052e000},
- {0xc0530000}, {0xc0532000}, {0xc0534000}, {0xc0536000},
- {0xc0538000}, {0xc053a000}, {0xc053c000}, {0xc053e000},
- {0xc0540000}, {0xc0542000}, {0xc0544000}, {0xc0546000},
- {0xc0548000}, {0xc054a000}, {0xc054c000}, {0xc054e000},
- {0xc0550000}, {0xc0552000}, {0xc0554000}, {0xc0556000},
- {0xc0558000}, {0xc055a000}, {0xc055c000}, {0xc055e000},
- {0xc0560000}, {0xc0562000}, {0xc0564000}, {0xc0566000},
- {0xc0568000}, {0xc056a000}, {0xc056c000}, {0xc056e000},
- {0xc0570000}, {0xc0572000}, {0xc0574000}, {0xc0576000},
- {0xc0578000}, {0xc057a000}, {0xc057c000}, {0xc057e000},
- {0xc0580000}, {0xc0582000}, {0xc0584000}, {0xc0586000},
- {0xc0588000}, {0xc058a000}, {0xc058c000}, {0xc058e000},
- {0xc0590000}, {0xc0592000}, {0xc0594000}, {0xc0596000},
- {0xc0598000}, {0xc059a000}, {0xc059c000}, {0xc059e000},
- {0xc05a0000}, {0xc05a2000}, {0xc05a4000}, {0xc05a6000},
- {0xc05a8000}, {0xc05aa000}, {0xc05ac000}, {0xc05ae000},
- {0xc05b0000}, {0xc05b2000}, {0xc05b4000}, {0xc05b6000},
- {0xc05b8000}, {0xc05ba000}, {0xc05bc000}, {0xc05be000},
- {0xc05c0000}, {0xc05c2000}, {0xc05c4000}, {0xc05c6000},
- {0xc05c8000}, {0xc05ca000}, {0xc05cc000}, {0xc05ce000},
- {0xc05d0000}, {0xc05d2000}, {0xc05d4000}, {0xc05d6000},
- {0xc05d8000}, {0xc05da000}, {0xc05dc000}, {0xc05de000},
- {0xc05e0000}, {0xc05e2000}, {0xc05e4000}, {0xc05e6000},
- {0xc05e8000}, {0xc05ea000}, {0xc05ec000}, {0xc05ee000},
- {0xc05f0000}, {0xc05f2000}, {0xc05f4000}, {0xc05f6000},
- {0xc05f8000}, {0xc05fa000}, {0xc05fc000}, {0xc05fe000},
- {0xc0600000}, {0xc0602000}, {0xc0604000}, {0xc0606000},
- {0xc0608000}, {0xc060a000}, {0xc060c000}, {0xc060e000},
- {0xc0610000}, {0xc0612000}, {0xc0614000}, {0xc0616000},
- {0xc0618000}, {0xc061a000}, {0xc061c000}, {0xc061e000},
- {0xc0620000}, {0xc0622000}, {0xc0624000}, {0xc0626000},
- {0xc0628000}, {0xc062a000}, {0xc062c000}, {0xc062e000},
- {0xc0630000}, {0xc0632000}, {0xc0634000}, {0xc0636000},
- {0xc0638000}, {0xc063a000}, {0xc063c000}, {0xc063e000},
- {0xc0640000}, {0xc0642000}, {0xc0644000}, {0xc0646000},
- {0xc0648000}, {0xc064a000}, {0xc064c000}, {0xc064e000},
- {0xc0650000}, {0xc0652000}, {0xc0654000}, {0xc0656000},
- {0xc0658000}, {0xc065a000}, {0xc065c000}, {0xc065e000},
- {0xc0660000}, {0xc0662000}, {0xc0664000}, {0xc0666000},
- {0xc0668000}, {0xc066a000}, {0xc066c000}, {0xc066e000},
- {0xc0670000}, {0xc0672000}, {0xc0674000}, {0xc0676000},
- {0xc0678000}, {0xc067a000}, {0xc067c000}, {0xc067e000},
- {0xc0680000}, {0xc0682000}, {0xc0684000}, {0xc0686000},
- {0xc0688000}, {0xc068a000}, {0xc068c000}, {0xc068e000},
- {0xc0690000}, {0xc0692000}, {0xc0694000}, {0xc0696000},
- {0xc0698000}, {0xc069a000}, {0xc069c000}, {0xc069e000},
- {0xc06a0000}, {0xc06a2000}, {0xc06a4000}, {0xc06a6000},
- {0xc06a8000}, {0xc06aa000}, {0xc06ac000}, {0xc06ae000},
- {0xc06b0000}, {0xc06b2000}, {0xc06b4000}, {0xc06b6000},
- {0xc06b8000}, {0xc06ba000}, {0xc06bc000}, {0xc06be000},
- {0xc06c0000}, {0xc06c2000}, {0xc06c4000}, {0xc06c6000},
- {0xc06c8000}, {0xc06ca000}, {0xc06cc000}, {0xc06ce000},
- {0xc06d0000}, {0xc06d2000}, {0xc06d4000}, {0xc06d6000},
- {0xc06d8000}, {0xc06da000}, {0xc06dc000}, {0xc06de000},
- {0xc06e0000}, {0xc06e2000}, {0xc06e4000}, {0xc06e6000},
- {0xc06e8000}, {0xc06ea000}, {0xc06ec000}, {0xc06ee000},
- {0xc06f0000}, {0xc06f2000}, {0xc06f4000}, {0xc06f6000},
- {0xc06f8000}, {0xc06fa000}, {0xc06fc000}, {0xc06fe000},
- {0xc0700000}, {0xc0702000}, {0xc0704000}, {0xc0706000},
- {0xc0708000}, {0xc070a000}, {0xc070c000}, {0xc070e000},
- {0xc0710000}, {0xc0712000}, {0xc0714000}, {0xc0716000},
- {0xc0718000}, {0xc071a000}, {0xc071c000}, {0xc071e000},
- {0xc0720000}, {0xc0722000}, {0xc0724000}, {0xc0726000},
- {0xc0728000}, {0xc072a000}, {0xc072c000}, {0xc072e000},
- {0xc0730000}, {0xc0732000}, {0xc0734000}, {0xc0736000},
- {0xc0738000}, {0xc073a000}, {0xc073c000}, {0xc073e000},
- {0xc0740000}, {0xc0742000}, {0xc0744000}, {0xc0746000},
- {0xc0748000}, {0xc074a000}, {0xc074c000}, {0xc074e000},
- {0xc0750000}, {0xc0752000}, {0xc0754000}, {0xc0756000},
- {0xc0758000}, {0xc075a000}, {0xc075c000}, {0xc075e000},
- {0xc0760000}, {0xc0762000}, {0xc0764000}, {0xc0766000},
- {0xc0768000}, {0xc076a000}, {0xc076c000}, {0xc076e000},
- {0xc0770000}, {0xc0772000}, {0xc0774000}, {0xc0776000},
- {0xc0778000}, {0xc077a000}, {0xc077c000}, {0xc077e000},
- {0xc0780000}, {0xc0782000}, {0xc0784000}, {0xc0786000},
- {0xc0788000}, {0xc078a000}, {0xc078c000}, {0xc078e000},
- {0xc0790000}, {0xc0792000}, {0xc0794000}, {0xc0796000},
- {0xc0798000}, {0xc079a000}, {0xc079c000}, {0xc079e000},
- {0xc07a0000}, {0xc07a2000}, {0xc07a4000}, {0xc07a6000},
- {0xc07a8000}, {0xc07aa000}, {0xc07ac000}, {0xc07ae000},
- {0xc07b0000}, {0xc07b2000}, {0xc07b4000}, {0xc07b6000},
- {0xc07b8000}, {0xc07ba000}, {0xc07bc000}, {0xc07be000},
- {0xc07c0000}, {0xc07c2000}, {0xc07c4000}, {0xc07c6000},
- {0xc07c8000}, {0xc07ca000}, {0xc07cc000}, {0xc07ce000},
- {0xc07d0000}, {0xc07d2000}, {0xc07d4000}, {0xc07d6000},
- {0xc07d8000}, {0xc07da000}, {0xc07dc000}, {0xc07de000},
- {0xc07e0000}, {0xc07e2000}, {0xc07e4000}, {0xc07e6000},
- {0xc07e8000}, {0xc07ea000}, {0xc07ec000}, {0xc07ee000},
- {0xc07f0000}, {0xc07f2000}, {0xc07f4000}, {0xc07f6000},
- {0xc07f8000}, {0xc07fa000}, {0xc07fc000}, {0xc07fe000},
- {0xc0800000}, {0xc0802000}, {0xc0804000}, {0xc0806000},
- {0xc0808000}, {0xc080a000}, {0xc080c000}, {0xc080e000},
- {0xc0810000}, {0xc0812000}, {0xc0814000}, {0xc0816000},
- {0xc0818000}, {0xc081a000}, {0xc081c000}, {0xc081e000},
- {0xc0820000}, {0xc0822000}, {0xc0824000}, {0xc0826000},
- {0xc0828000}, {0xc082a000}, {0xc082c000}, {0xc082e000},
- {0xc0830000}, {0xc0832000}, {0xc0834000}, {0xc0836000},
- {0xc0838000}, {0xc083a000}, {0xc083c000}, {0xc083e000},
- {0xc0840000}, {0xc0842000}, {0xc0844000}, {0xc0846000},
- {0xc0848000}, {0xc084a000}, {0xc084c000}, {0xc084e000},
- {0xc0850000}, {0xc0852000}, {0xc0854000}, {0xc0856000},
- {0xc0858000}, {0xc085a000}, {0xc085c000}, {0xc085e000},
- {0xc0860000}, {0xc0862000}, {0xc0864000}, {0xc0866000},
- {0xc0868000}, {0xc086a000}, {0xc086c000}, {0xc086e000},
- {0xc0870000}, {0xc0872000}, {0xc0874000}, {0xc0876000},
- {0xc0878000}, {0xc087a000}, {0xc087c000}, {0xc087e000},
- {0xc0880000}, {0xc0882000}, {0xc0884000}, {0xc0886000},
- {0xc0888000}, {0xc088a000}, {0xc088c000}, {0xc088e000},
- {0xc0890000}, {0xc0892000}, {0xc0894000}, {0xc0896000},
- {0xc0898000}, {0xc089a000}, {0xc089c000}, {0xc089e000},
- {0xc08a0000}, {0xc08a2000}, {0xc08a4000}, {0xc08a6000},
- {0xc08a8000}, {0xc08aa000}, {0xc08ac000}, {0xc08ae000},
- {0xc08b0000}, {0xc08b2000}, {0xc08b4000}, {0xc08b6000},
- {0xc08b8000}, {0xc08ba000}, {0xc08bc000}, {0xc08be000},
- {0xc08c0000}, {0xc08c2000}, {0xc08c4000}, {0xc08c6000},
- {0xc08c8000}, {0xc08ca000}, {0xc08cc000}, {0xc08ce000},
- {0xc08d0000}, {0xc08d2000}, {0xc08d4000}, {0xc08d6000},
- {0xc08d8000}, {0xc08da000}, {0xc08dc000}, {0xc08de000},
- {0xc08e0000}, {0xc08e2000}, {0xc08e4000}, {0xc08e6000},
- {0xc08e8000}, {0xc08ea000}, {0xc08ec000}, {0xc08ee000},
- {0xc08f0000}, {0xc08f2000}, {0xc08f4000}, {0xc08f6000},
- {0xc08f8000}, {0xc08fa000}, {0xc08fc000}, {0xc08fe000},
- {0xc0900000}, {0xc0902000}, {0xc0904000}, {0xc0906000},
- {0xc0908000}, {0xc090a000}, {0xc090c000}, {0xc090e000},
- {0xc0910000}, {0xc0912000}, {0xc0914000}, {0xc0916000},
- {0xc0918000}, {0xc091a000}, {0xc091c000}, {0xc091e000},
- {0xc0920000}, {0xc0922000}, {0xc0924000}, {0xc0926000},
- {0xc0928000}, {0xc092a000}, {0xc092c000}, {0xc092e000},
- {0xc0930000}, {0xc0932000}, {0xc0934000}, {0xc0936000},
- {0xc0938000}, {0xc093a000}, {0xc093c000}, {0xc093e000},
- {0xc0940000}, {0xc0942000}, {0xc0944000}, {0xc0946000},
- {0xc0948000}, {0xc094a000}, {0xc094c000}, {0xc094e000},
- {0xc0950000}, {0xc0952000}, {0xc0954000}, {0xc0956000},
- {0xc0958000}, {0xc095a000}, {0xc095c000}, {0xc095e000},
- {0xc0960000}, {0xc0962000}, {0xc0964000}, {0xc0966000},
- {0xc0968000}, {0xc096a000}, {0xc096c000}, {0xc096e000},
- {0xc0970000}, {0xc0972000}, {0xc0974000}, {0xc0976000},
- {0xc0978000}, {0xc097a000}, {0xc097c000}, {0xc097e000},
- {0xc0980000}, {0xc0982000}, {0xc0984000}, {0xc0986000},
- {0xc0988000}, {0xc098a000}, {0xc098c000}, {0xc098e000},
- {0xc0990000}, {0xc0992000}, {0xc0994000}, {0xc0996000},
- {0xc0998000}, {0xc099a000}, {0xc099c000}, {0xc099e000},
- {0xc09a0000}, {0xc09a2000}, {0xc09a4000}, {0xc09a6000},
- {0xc09a8000}, {0xc09aa000}, {0xc09ac000}, {0xc09ae000},
- {0xc09b0000}, {0xc09b2000}, {0xc09b4000}, {0xc09b6000},
- {0xc09b8000}, {0xc09ba000}, {0xc09bc000}, {0xc09be000},
- {0xc09c0000}, {0xc09c2000}, {0xc09c4000}, {0xc09c6000},
- {0xc09c8000}, {0xc09ca000}, {0xc09cc000}, {0xc09ce000},
- {0xc09d0000}, {0xc09d2000}, {0xc09d4000}, {0xc09d6000},
- {0xc09d8000}, {0xc09da000}, {0xc09dc000}, {0xc09de000},
- {0xc09e0000}, {0xc09e2000}, {0xc09e4000}, {0xc09e6000},
- {0xc09e8000}, {0xc09ea000}, {0xc09ec000}, {0xc09ee000},
- {0xc09f0000}, {0xc09f2000}, {0xc09f4000}, {0xc09f6000},
- {0xc09f8000}, {0xc09fa000}, {0xc09fc000}, {0xc09fe000},
- {0xc0a00000}, {0xc0a02000}, {0xc0a04000}, {0xc0a06000},
- {0xc0a08000}, {0xc0a0a000}, {0xc0a0c000}, {0xc0a0e000},
- {0xc0a10000}, {0xc0a12000}, {0xc0a14000}, {0xc0a16000},
- {0xc0a18000}, {0xc0a1a000}, {0xc0a1c000}, {0xc0a1e000},
- {0xc0a20000}, {0xc0a22000}, {0xc0a24000}, {0xc0a26000},
- {0xc0a28000}, {0xc0a2a000}, {0xc0a2c000}, {0xc0a2e000},
- {0xc0a30000}, {0xc0a32000}, {0xc0a34000}, {0xc0a36000},
- {0xc0a38000}, {0xc0a3a000}, {0xc0a3c000}, {0xc0a3e000},
- {0xc0a40000}, {0xc0a42000}, {0xc0a44000}, {0xc0a46000},
- {0xc0a48000}, {0xc0a4a000}, {0xc0a4c000}, {0xc0a4e000},
- {0xc0a50000}, {0xc0a52000}, {0xc0a54000}, {0xc0a56000},
- {0xc0a58000}, {0xc0a5a000}, {0xc0a5c000}, {0xc0a5e000},
- {0xc0a60000}, {0xc0a62000}, {0xc0a64000}, {0xc0a66000},
- {0xc0a68000}, {0xc0a6a000}, {0xc0a6c000}, {0xc0a6e000},
- {0xc0a70000}, {0xc0a72000}, {0xc0a74000}, {0xc0a76000},
- {0xc0a78000}, {0xc0a7a000}, {0xc0a7c000}, {0xc0a7e000},
- {0xc0a80000}, {0xc0a82000}, {0xc0a84000}, {0xc0a86000},
- {0xc0a88000}, {0xc0a8a000}, {0xc0a8c000}, {0xc0a8e000},
- {0xc0a90000}, {0xc0a92000}, {0xc0a94000}, {0xc0a96000},
- {0xc0a98000}, {0xc0a9a000}, {0xc0a9c000}, {0xc0a9e000},
- {0xc0aa0000}, {0xc0aa2000}, {0xc0aa4000}, {0xc0aa6000},
- {0xc0aa8000}, {0xc0aaa000}, {0xc0aac000}, {0xc0aae000},
- {0xc0ab0000}, {0xc0ab2000}, {0xc0ab4000}, {0xc0ab6000},
- {0xc0ab8000}, {0xc0aba000}, {0xc0abc000}, {0xc0abe000},
- {0xc0ac0000}, {0xc0ac2000}, {0xc0ac4000}, {0xc0ac6000},
- {0xc0ac8000}, {0xc0aca000}, {0xc0acc000}, {0xc0ace000},
- {0xc0ad0000}, {0xc0ad2000}, {0xc0ad4000}, {0xc0ad6000},
- {0xc0ad8000}, {0xc0ada000}, {0xc0adc000}, {0xc0ade000},
- {0xc0ae0000}, {0xc0ae2000}, {0xc0ae4000}, {0xc0ae6000},
- {0xc0ae8000}, {0xc0aea000}, {0xc0aec000}, {0xc0aee000},
- {0xc0af0000}, {0xc0af2000}, {0xc0af4000}, {0xc0af6000},
- {0xc0af8000}, {0xc0afa000}, {0xc0afc000}, {0xc0afe000},
- {0xc0b00000}, {0xc0b02000}, {0xc0b04000}, {0xc0b06000},
- {0xc0b08000}, {0xc0b0a000}, {0xc0b0c000}, {0xc0b0e000},
- {0xc0b10000}, {0xc0b12000}, {0xc0b14000}, {0xc0b16000},
- {0xc0b18000}, {0xc0b1a000}, {0xc0b1c000}, {0xc0b1e000},
- {0xc0b20000}, {0xc0b22000}, {0xc0b24000}, {0xc0b26000},
- {0xc0b28000}, {0xc0b2a000}, {0xc0b2c000}, {0xc0b2e000},
- {0xc0b30000}, {0xc0b32000}, {0xc0b34000}, {0xc0b36000},
- {0xc0b38000}, {0xc0b3a000}, {0xc0b3c000}, {0xc0b3e000},
- {0xc0b40000}, {0xc0b42000}, {0xc0b44000}, {0xc0b46000},
- {0xc0b48000}, {0xc0b4a000}, {0xc0b4c000}, {0xc0b4e000},
- {0xc0b50000}, {0xc0b52000}, {0xc0b54000}, {0xc0b56000},
- {0xc0b58000}, {0xc0b5a000}, {0xc0b5c000}, {0xc0b5e000},
- {0xc0b60000}, {0xc0b62000}, {0xc0b64000}, {0xc0b66000},
- {0xc0b68000}, {0xc0b6a000}, {0xc0b6c000}, {0xc0b6e000},
- {0xc0b70000}, {0xc0b72000}, {0xc0b74000}, {0xc0b76000},
- {0xc0b78000}, {0xc0b7a000}, {0xc0b7c000}, {0xc0b7e000},
- {0xc0b80000}, {0xc0b82000}, {0xc0b84000}, {0xc0b86000},
- {0xc0b88000}, {0xc0b8a000}, {0xc0b8c000}, {0xc0b8e000},
- {0xc0b90000}, {0xc0b92000}, {0xc0b94000}, {0xc0b96000},
- {0xc0b98000}, {0xc0b9a000}, {0xc0b9c000}, {0xc0b9e000},
- {0xc0ba0000}, {0xc0ba2000}, {0xc0ba4000}, {0xc0ba6000},
- {0xc0ba8000}, {0xc0baa000}, {0xc0bac000}, {0xc0bae000},
- {0xc0bb0000}, {0xc0bb2000}, {0xc0bb4000}, {0xc0bb6000},
- {0xc0bb8000}, {0xc0bba000}, {0xc0bbc000}, {0xc0bbe000},
- {0xc0bc0000}, {0xc0bc2000}, {0xc0bc4000}, {0xc0bc6000},
- {0xc0bc8000}, {0xc0bca000}, {0xc0bcc000}, {0xc0bce000},
- {0xc0bd0000}, {0xc0bd2000}, {0xc0bd4000}, {0xc0bd6000},
- {0xc0bd8000}, {0xc0bda000}, {0xc0bdc000}, {0xc0bde000},
- {0xc0be0000}, {0xc0be2000}, {0xc0be4000}, {0xc0be6000},
- {0xc0be8000}, {0xc0bea000}, {0xc0bec000}, {0xc0bee000},
- {0xc0bf0000}, {0xc0bf2000}, {0xc0bf4000}, {0xc0bf6000},
- {0xc0bf8000}, {0xc0bfa000}, {0xc0bfc000}, {0xc0bfe000},
- {0xc0c00000}, {0xc0c02000}, {0xc0c04000}, {0xc0c06000},
- {0xc0c08000}, {0xc0c0a000}, {0xc0c0c000}, {0xc0c0e000},
- {0xc0c10000}, {0xc0c12000}, {0xc0c14000}, {0xc0c16000},
- {0xc0c18000}, {0xc0c1a000}, {0xc0c1c000}, {0xc0c1e000},
- {0xc0c20000}, {0xc0c22000}, {0xc0c24000}, {0xc0c26000},
- {0xc0c28000}, {0xc0c2a000}, {0xc0c2c000}, {0xc0c2e000},
- {0xc0c30000}, {0xc0c32000}, {0xc0c34000}, {0xc0c36000},
- {0xc0c38000}, {0xc0c3a000}, {0xc0c3c000}, {0xc0c3e000},
- {0xc0c40000}, {0xc0c42000}, {0xc0c44000}, {0xc0c46000},
- {0xc0c48000}, {0xc0c4a000}, {0xc0c4c000}, {0xc0c4e000},
- {0xc0c50000}, {0xc0c52000}, {0xc0c54000}, {0xc0c56000},
- {0xc0c58000}, {0xc0c5a000}, {0xc0c5c000}, {0xc0c5e000},
- {0xc0c60000}, {0xc0c62000}, {0xc0c64000}, {0xc0c66000},
- {0xc0c68000}, {0xc0c6a000}, {0xc0c6c000}, {0xc0c6e000},
- {0xc0c70000}, {0xc0c72000}, {0xc0c74000}, {0xc0c76000},
- {0xc0c78000}, {0xc0c7a000}, {0xc0c7c000}, {0xc0c7e000},
- {0xc0c80000}, {0xc0c82000}, {0xc0c84000}, {0xc0c86000},
- {0xc0c88000}, {0xc0c8a000}, {0xc0c8c000}, {0xc0c8e000},
- {0xc0c90000}, {0xc0c92000}, {0xc0c94000}, {0xc0c96000},
- {0xc0c98000}, {0xc0c9a000}, {0xc0c9c000}, {0xc0c9e000},
- {0xc0ca0000}, {0xc0ca2000}, {0xc0ca4000}, {0xc0ca6000},
- {0xc0ca8000}, {0xc0caa000}, {0xc0cac000}, {0xc0cae000},
- {0xc0cb0000}, {0xc0cb2000}, {0xc0cb4000}, {0xc0cb6000},
- {0xc0cb8000}, {0xc0cba000}, {0xc0cbc000}, {0xc0cbe000},
- {0xc0cc0000}, {0xc0cc2000}, {0xc0cc4000}, {0xc0cc6000},
- {0xc0cc8000}, {0xc0cca000}, {0xc0ccc000}, {0xc0cce000},
- {0xc0cd0000}, {0xc0cd2000}, {0xc0cd4000}, {0xc0cd6000},
- {0xc0cd8000}, {0xc0cda000}, {0xc0cdc000}, {0xc0cde000},
- {0xc0ce0000}, {0xc0ce2000}, {0xc0ce4000}, {0xc0ce6000},
- {0xc0ce8000}, {0xc0cea000}, {0xc0cec000}, {0xc0cee000},
- {0xc0cf0000}, {0xc0cf2000}, {0xc0cf4000}, {0xc0cf6000},
- {0xc0cf8000}, {0xc0cfa000}, {0xc0cfc000}, {0xc0cfe000},
- {0xc0d00000}, {0xc0d02000}, {0xc0d04000}, {0xc0d06000},
- {0xc0d08000}, {0xc0d0a000}, {0xc0d0c000}, {0xc0d0e000},
- {0xc0d10000}, {0xc0d12000}, {0xc0d14000}, {0xc0d16000},
- {0xc0d18000}, {0xc0d1a000}, {0xc0d1c000}, {0xc0d1e000},
- {0xc0d20000}, {0xc0d22000}, {0xc0d24000}, {0xc0d26000},
- {0xc0d28000}, {0xc0d2a000}, {0xc0d2c000}, {0xc0d2e000},
- {0xc0d30000}, {0xc0d32000}, {0xc0d34000}, {0xc0d36000},
- {0xc0d38000}, {0xc0d3a000}, {0xc0d3c000}, {0xc0d3e000},
- {0xc0d40000}, {0xc0d42000}, {0xc0d44000}, {0xc0d46000},
- {0xc0d48000}, {0xc0d4a000}, {0xc0d4c000}, {0xc0d4e000},
- {0xc0d50000}, {0xc0d52000}, {0xc0d54000}, {0xc0d56000},
- {0xc0d58000}, {0xc0d5a000}, {0xc0d5c000}, {0xc0d5e000},
- {0xc0d60000}, {0xc0d62000}, {0xc0d64000}, {0xc0d66000},
- {0xc0d68000}, {0xc0d6a000}, {0xc0d6c000}, {0xc0d6e000},
- {0xc0d70000}, {0xc0d72000}, {0xc0d74000}, {0xc0d76000},
- {0xc0d78000}, {0xc0d7a000}, {0xc0d7c000}, {0xc0d7e000},
- {0xc0d80000}, {0xc0d82000}, {0xc0d84000}, {0xc0d86000},
- {0xc0d88000}, {0xc0d8a000}, {0xc0d8c000}, {0xc0d8e000},
- {0xc0d90000}, {0xc0d92000}, {0xc0d94000}, {0xc0d96000},
- {0xc0d98000}, {0xc0d9a000}, {0xc0d9c000}, {0xc0d9e000},
- {0xc0da0000}, {0xc0da2000}, {0xc0da4000}, {0xc0da6000},
- {0xc0da8000}, {0xc0daa000}, {0xc0dac000}, {0xc0dae000},
- {0xc0db0000}, {0xc0db2000}, {0xc0db4000}, {0xc0db6000},
- {0xc0db8000}, {0xc0dba000}, {0xc0dbc000}, {0xc0dbe000},
- {0xc0dc0000}, {0xc0dc2000}, {0xc0dc4000}, {0xc0dc6000},
- {0xc0dc8000}, {0xc0dca000}, {0xc0dcc000}, {0xc0dce000},
- {0xc0dd0000}, {0xc0dd2000}, {0xc0dd4000}, {0xc0dd6000},
- {0xc0dd8000}, {0xc0dda000}, {0xc0ddc000}, {0xc0dde000},
- {0xc0de0000}, {0xc0de2000}, {0xc0de4000}, {0xc0de6000},
- {0xc0de8000}, {0xc0dea000}, {0xc0dec000}, {0xc0dee000},
- {0xc0df0000}, {0xc0df2000}, {0xc0df4000}, {0xc0df6000},
- {0xc0df8000}, {0xc0dfa000}, {0xc0dfc000}, {0xc0dfe000},
- {0xc0e00000}, {0xc0e02000}, {0xc0e04000}, {0xc0e06000},
- {0xc0e08000}, {0xc0e0a000}, {0xc0e0c000}, {0xc0e0e000},
- {0xc0e10000}, {0xc0e12000}, {0xc0e14000}, {0xc0e16000},
- {0xc0e18000}, {0xc0e1a000}, {0xc0e1c000}, {0xc0e1e000},
- {0xc0e20000}, {0xc0e22000}, {0xc0e24000}, {0xc0e26000},
- {0xc0e28000}, {0xc0e2a000}, {0xc0e2c000}, {0xc0e2e000},
- {0xc0e30000}, {0xc0e32000}, {0xc0e34000}, {0xc0e36000},
- {0xc0e38000}, {0xc0e3a000}, {0xc0e3c000}, {0xc0e3e000},
- {0xc0e40000}, {0xc0e42000}, {0xc0e44000}, {0xc0e46000},
- {0xc0e48000}, {0xc0e4a000}, {0xc0e4c000}, {0xc0e4e000},
- {0xc0e50000}, {0xc0e52000}, {0xc0e54000}, {0xc0e56000},
- {0xc0e58000}, {0xc0e5a000}, {0xc0e5c000}, {0xc0e5e000},
- {0xc0e60000}, {0xc0e62000}, {0xc0e64000}, {0xc0e66000},
- {0xc0e68000}, {0xc0e6a000}, {0xc0e6c000}, {0xc0e6e000},
- {0xc0e70000}, {0xc0e72000}, {0xc0e74000}, {0xc0e76000},
- {0xc0e78000}, {0xc0e7a000}, {0xc0e7c000}, {0xc0e7e000},
- {0xc0e80000}, {0xc0e82000}, {0xc0e84000}, {0xc0e86000},
- {0xc0e88000}, {0xc0e8a000}, {0xc0e8c000}, {0xc0e8e000},
- {0xc0e90000}, {0xc0e92000}, {0xc0e94000}, {0xc0e96000},
- {0xc0e98000}, {0xc0e9a000}, {0xc0e9c000}, {0xc0e9e000},
- {0xc0ea0000}, {0xc0ea2000}, {0xc0ea4000}, {0xc0ea6000},
- {0xc0ea8000}, {0xc0eaa000}, {0xc0eac000}, {0xc0eae000},
- {0xc0eb0000}, {0xc0eb2000}, {0xc0eb4000}, {0xc0eb6000},
- {0xc0eb8000}, {0xc0eba000}, {0xc0ebc000}, {0xc0ebe000},
- {0xc0ec0000}, {0xc0ec2000}, {0xc0ec4000}, {0xc0ec6000},
- {0xc0ec8000}, {0xc0eca000}, {0xc0ecc000}, {0xc0ece000},
- {0xc0ed0000}, {0xc0ed2000}, {0xc0ed4000}, {0xc0ed6000},
- {0xc0ed8000}, {0xc0eda000}, {0xc0edc000}, {0xc0ede000},
- {0xc0ee0000}, {0xc0ee2000}, {0xc0ee4000}, {0xc0ee6000},
- {0xc0ee8000}, {0xc0eea000}, {0xc0eec000}, {0xc0eee000},
- {0xc0ef0000}, {0xc0ef2000}, {0xc0ef4000}, {0xc0ef6000},
- {0xc0ef8000}, {0xc0efa000}, {0xc0efc000}, {0xc0efe000},
- {0xc0f00000}, {0xc0f02000}, {0xc0f04000}, {0xc0f06000},
- {0xc0f08000}, {0xc0f0a000}, {0xc0f0c000}, {0xc0f0e000},
- {0xc0f10000}, {0xc0f12000}, {0xc0f14000}, {0xc0f16000},
- {0xc0f18000}, {0xc0f1a000}, {0xc0f1c000}, {0xc0f1e000},
- {0xc0f20000}, {0xc0f22000}, {0xc0f24000}, {0xc0f26000},
- {0xc0f28000}, {0xc0f2a000}, {0xc0f2c000}, {0xc0f2e000},
- {0xc0f30000}, {0xc0f32000}, {0xc0f34000}, {0xc0f36000},
- {0xc0f38000}, {0xc0f3a000}, {0xc0f3c000}, {0xc0f3e000},
- {0xc0f40000}, {0xc0f42000}, {0xc0f44000}, {0xc0f46000},
- {0xc0f48000}, {0xc0f4a000}, {0xc0f4c000}, {0xc0f4e000},
- {0xc0f50000}, {0xc0f52000}, {0xc0f54000}, {0xc0f56000},
- {0xc0f58000}, {0xc0f5a000}, {0xc0f5c000}, {0xc0f5e000},
- {0xc0f60000}, {0xc0f62000}, {0xc0f64000}, {0xc0f66000},
- {0xc0f68000}, {0xc0f6a000}, {0xc0f6c000}, {0xc0f6e000},
- {0xc0f70000}, {0xc0f72000}, {0xc0f74000}, {0xc0f76000},
- {0xc0f78000}, {0xc0f7a000}, {0xc0f7c000}, {0xc0f7e000},
- {0xc0f80000}, {0xc0f82000}, {0xc0f84000}, {0xc0f86000},
- {0xc0f88000}, {0xc0f8a000}, {0xc0f8c000}, {0xc0f8e000},
- {0xc0f90000}, {0xc0f92000}, {0xc0f94000}, {0xc0f96000},
- {0xc0f98000}, {0xc0f9a000}, {0xc0f9c000}, {0xc0f9e000},
- {0xc0fa0000}, {0xc0fa2000}, {0xc0fa4000}, {0xc0fa6000},
- {0xc0fa8000}, {0xc0faa000}, {0xc0fac000}, {0xc0fae000},
- {0xc0fb0000}, {0xc0fb2000}, {0xc0fb4000}, {0xc0fb6000},
- {0xc0fb8000}, {0xc0fba000}, {0xc0fbc000}, {0xc0fbe000},
- {0xc0fc0000}, {0xc0fc2000}, {0xc0fc4000}, {0xc0fc6000},
- {0xc0fc8000}, {0xc0fca000}, {0xc0fcc000}, {0xc0fce000},
- {0xc0fd0000}, {0xc0fd2000}, {0xc0fd4000}, {0xc0fd6000},
- {0xc0fd8000}, {0xc0fda000}, {0xc0fdc000}, {0xc0fde000},
- {0xc0fe0000}, {0xc0fe2000}, {0xc0fe4000}, {0xc0fe6000},
- {0xc0fe8000}, {0xc0fea000}, {0xc0fec000}, {0xc0fee000},
- {0xc0ff0000}, {0xc0ff2000}, {0xc0ff4000}, {0xc0ff6000},
- {0xc0ff8000}, {0xc0ffa000}, {0xc0ffc000}, {0xc0ffe000},
- {0xc1000000}, {0xc1002000}, {0xc1004000}, {0xc1006000},
- {0xc1008000}, {0xc100a000}, {0xc100c000}, {0xc100e000},
- {0xc1010000}, {0xc1012000}, {0xc1014000}, {0xc1016000},
- {0xc1018000}, {0xc101a000}, {0xc101c000}, {0xc101e000},
- {0xc1020000}, {0xc1022000}, {0xc1024000}, {0xc1026000},
- {0xc1028000}, {0xc102a000}, {0xc102c000}, {0xc102e000},
- {0xc1030000}, {0xc1032000}, {0xc1034000}, {0xc1036000},
- {0xc1038000}, {0xc103a000}, {0xc103c000}, {0xc103e000},
- {0xc1040000}, {0xc1042000}, {0xc1044000}, {0xc1046000},
- {0xc1048000}, {0xc104a000}, {0xc104c000}, {0xc104e000},
- {0xc1050000}, {0xc1052000}, {0xc1054000}, {0xc1056000},
- {0xc1058000}, {0xc105a000}, {0xc105c000}, {0xc105e000},
- {0xc1060000}, {0xc1062000}, {0xc1064000}, {0xc1066000},
- {0xc1068000}, {0xc106a000}, {0xc106c000}, {0xc106e000},
- {0xc1070000}, {0xc1072000}, {0xc1074000}, {0xc1076000},
- {0xc1078000}, {0xc107a000}, {0xc107c000}, {0xc107e000},
- {0xc1080000}, {0xc1082000}, {0xc1084000}, {0xc1086000},
- {0xc1088000}, {0xc108a000}, {0xc108c000}, {0xc108e000},
- {0xc1090000}, {0xc1092000}, {0xc1094000}, {0xc1096000},
- {0xc1098000}, {0xc109a000}, {0xc109c000}, {0xc109e000},
- {0xc10a0000}, {0xc10a2000}, {0xc10a4000}, {0xc10a6000},
- {0xc10a8000}, {0xc10aa000}, {0xc10ac000}, {0xc10ae000},
- {0xc10b0000}, {0xc10b2000}, {0xc10b4000}, {0xc10b6000},
- {0xc10b8000}, {0xc10ba000}, {0xc10bc000}, {0xc10be000},
- {0xc10c0000}, {0xc10c2000}, {0xc10c4000}, {0xc10c6000},
- {0xc10c8000}, {0xc10ca000}, {0xc10cc000}, {0xc10ce000},
- {0xc10d0000}, {0xc10d2000}, {0xc10d4000}, {0xc10d6000},
- {0xc10d8000}, {0xc10da000}, {0xc10dc000}, {0xc10de000},
- {0xc10e0000}, {0xc10e2000}, {0xc10e4000}, {0xc10e6000},
- {0xc10e8000}, {0xc10ea000}, {0xc10ec000}, {0xc10ee000},
- {0xc10f0000}, {0xc10f2000}, {0xc10f4000}, {0xc10f6000},
- {0xc10f8000}, {0xc10fa000}, {0xc10fc000}, {0xc10fe000},
- {0xc1100000}, {0xc1102000}, {0xc1104000}, {0xc1106000},
- {0xc1108000}, {0xc110a000}, {0xc110c000}, {0xc110e000},
- {0xc1110000}, {0xc1112000}, {0xc1114000}, {0xc1116000},
- {0xc1118000}, {0xc111a000}, {0xc111c000}, {0xc111e000},
- {0xc1120000}, {0xc1122000}, {0xc1124000}, {0xc1126000},
- {0xc1128000}, {0xc112a000}, {0xc112c000}, {0xc112e000},
- {0xc1130000}, {0xc1132000}, {0xc1134000}, {0xc1136000},
- {0xc1138000}, {0xc113a000}, {0xc113c000}, {0xc113e000},
- {0xc1140000}, {0xc1142000}, {0xc1144000}, {0xc1146000},
- {0xc1148000}, {0xc114a000}, {0xc114c000}, {0xc114e000},
- {0xc1150000}, {0xc1152000}, {0xc1154000}, {0xc1156000},
- {0xc1158000}, {0xc115a000}, {0xc115c000}, {0xc115e000},
- {0xc1160000}, {0xc1162000}, {0xc1164000}, {0xc1166000},
- {0xc1168000}, {0xc116a000}, {0xc116c000}, {0xc116e000},
- {0xc1170000}, {0xc1172000}, {0xc1174000}, {0xc1176000},
- {0xc1178000}, {0xc117a000}, {0xc117c000}, {0xc117e000},
- {0xc1180000}, {0xc1182000}, {0xc1184000}, {0xc1186000},
- {0xc1188000}, {0xc118a000}, {0xc118c000}, {0xc118e000},
- {0xc1190000}, {0xc1192000}, {0xc1194000}, {0xc1196000},
- {0xc1198000}, {0xc119a000}, {0xc119c000}, {0xc119e000},
- {0xc11a0000}, {0xc11a2000}, {0xc11a4000}, {0xc11a6000},
- {0xc11a8000}, {0xc11aa000}, {0xc11ac000}, {0xc11ae000},
- {0xc11b0000}, {0xc11b2000}, {0xc11b4000}, {0xc11b6000},
- {0xc11b8000}, {0xc11ba000}, {0xc11bc000}, {0xc11be000},
- {0xc11c0000}, {0xc11c2000}, {0xc11c4000}, {0xc11c6000},
- {0xc11c8000}, {0xc11ca000}, {0xc11cc000}, {0xc11ce000},
- {0xc11d0000}, {0xc11d2000}, {0xc11d4000}, {0xc11d6000},
- {0xc11d8000}, {0xc11da000}, {0xc11dc000}, {0xc11de000},
- {0xc11e0000}, {0xc11e2000}, {0xc11e4000}, {0xc11e6000},
- {0xc11e8000}, {0xc11ea000}, {0xc11ec000}, {0xc11ee000},
- {0xc11f0000}, {0xc11f2000}, {0xc11f4000}, {0xc11f6000},
- {0xc11f8000}, {0xc11fa000}, {0xc11fc000}, {0xc11fe000},
- {0xc1200000}, {0xc1202000}, {0xc1204000}, {0xc1206000},
- {0xc1208000}, {0xc120a000}, {0xc120c000}, {0xc120e000},
- {0xc1210000}, {0xc1212000}, {0xc1214000}, {0xc1216000},
- {0xc1218000}, {0xc121a000}, {0xc121c000}, {0xc121e000},
- {0xc1220000}, {0xc1222000}, {0xc1224000}, {0xc1226000},
- {0xc1228000}, {0xc122a000}, {0xc122c000}, {0xc122e000},
- {0xc1230000}, {0xc1232000}, {0xc1234000}, {0xc1236000},
- {0xc1238000}, {0xc123a000}, {0xc123c000}, {0xc123e000},
- {0xc1240000}, {0xc1242000}, {0xc1244000}, {0xc1246000},
- {0xc1248000}, {0xc124a000}, {0xc124c000}, {0xc124e000},
- {0xc1250000}, {0xc1252000}, {0xc1254000}, {0xc1256000},
- {0xc1258000}, {0xc125a000}, {0xc125c000}, {0xc125e000},
- {0xc1260000}, {0xc1262000}, {0xc1264000}, {0xc1266000},
- {0xc1268000}, {0xc126a000}, {0xc126c000}, {0xc126e000},
- {0xc1270000}, {0xc1272000}, {0xc1274000}, {0xc1276000},
- {0xc1278000}, {0xc127a000}, {0xc127c000}, {0xc127e000},
- {0xc1280000}, {0xc1282000}, {0xc1284000}, {0xc1286000},
- {0xc1288000}, {0xc128a000}, {0xc128c000}, {0xc128e000},
- {0xc1290000}, {0xc1292000}, {0xc1294000}, {0xc1296000},
- {0xc1298000}, {0xc129a000}, {0xc129c000}, {0xc129e000},
- {0xc12a0000}, {0xc12a2000}, {0xc12a4000}, {0xc12a6000},
- {0xc12a8000}, {0xc12aa000}, {0xc12ac000}, {0xc12ae000},
- {0xc12b0000}, {0xc12b2000}, {0xc12b4000}, {0xc12b6000},
- {0xc12b8000}, {0xc12ba000}, {0xc12bc000}, {0xc12be000},
- {0xc12c0000}, {0xc12c2000}, {0xc12c4000}, {0xc12c6000},
- {0xc12c8000}, {0xc12ca000}, {0xc12cc000}, {0xc12ce000},
- {0xc12d0000}, {0xc12d2000}, {0xc12d4000}, {0xc12d6000},
- {0xc12d8000}, {0xc12da000}, {0xc12dc000}, {0xc12de000},
- {0xc12e0000}, {0xc12e2000}, {0xc12e4000}, {0xc12e6000},
- {0xc12e8000}, {0xc12ea000}, {0xc12ec000}, {0xc12ee000},
- {0xc12f0000}, {0xc12f2000}, {0xc12f4000}, {0xc12f6000},
- {0xc12f8000}, {0xc12fa000}, {0xc12fc000}, {0xc12fe000},
- {0xc1300000}, {0xc1302000}, {0xc1304000}, {0xc1306000},
- {0xc1308000}, {0xc130a000}, {0xc130c000}, {0xc130e000},
- {0xc1310000}, {0xc1312000}, {0xc1314000}, {0xc1316000},
- {0xc1318000}, {0xc131a000}, {0xc131c000}, {0xc131e000},
- {0xc1320000}, {0xc1322000}, {0xc1324000}, {0xc1326000},
- {0xc1328000}, {0xc132a000}, {0xc132c000}, {0xc132e000},
- {0xc1330000}, {0xc1332000}, {0xc1334000}, {0xc1336000},
- {0xc1338000}, {0xc133a000}, {0xc133c000}, {0xc133e000},
- {0xc1340000}, {0xc1342000}, {0xc1344000}, {0xc1346000},
- {0xc1348000}, {0xc134a000}, {0xc134c000}, {0xc134e000},
- {0xc1350000}, {0xc1352000}, {0xc1354000}, {0xc1356000},
- {0xc1358000}, {0xc135a000}, {0xc135c000}, {0xc135e000},
- {0xc1360000}, {0xc1362000}, {0xc1364000}, {0xc1366000},
- {0xc1368000}, {0xc136a000}, {0xc136c000}, {0xc136e000},
- {0xc1370000}, {0xc1372000}, {0xc1374000}, {0xc1376000},
- {0xc1378000}, {0xc137a000}, {0xc137c000}, {0xc137e000},
- {0xc1380000}, {0xc1382000}, {0xc1384000}, {0xc1386000},
- {0xc1388000}, {0xc138a000}, {0xc138c000}, {0xc138e000},
- {0xc1390000}, {0xc1392000}, {0xc1394000}, {0xc1396000},
- {0xc1398000}, {0xc139a000}, {0xc139c000}, {0xc139e000},
- {0xc13a0000}, {0xc13a2000}, {0xc13a4000}, {0xc13a6000},
- {0xc13a8000}, {0xc13aa000}, {0xc13ac000}, {0xc13ae000},
- {0xc13b0000}, {0xc13b2000}, {0xc13b4000}, {0xc13b6000},
- {0xc13b8000}, {0xc13ba000}, {0xc13bc000}, {0xc13be000},
- {0xc13c0000}, {0xc13c2000}, {0xc13c4000}, {0xc13c6000},
- {0xc13c8000}, {0xc13ca000}, {0xc13cc000}, {0xc13ce000},
- {0xc13d0000}, {0xc13d2000}, {0xc13d4000}, {0xc13d6000},
- {0xc13d8000}, {0xc13da000}, {0xc13dc000}, {0xc13de000},
- {0xc13e0000}, {0xc13e2000}, {0xc13e4000}, {0xc13e6000},
- {0xc13e8000}, {0xc13ea000}, {0xc13ec000}, {0xc13ee000},
- {0xc13f0000}, {0xc13f2000}, {0xc13f4000}, {0xc13f6000},
- {0xc13f8000}, {0xc13fa000}, {0xc13fc000}, {0xc13fe000},
- {0xc1400000}, {0xc1402000}, {0xc1404000}, {0xc1406000},
- {0xc1408000}, {0xc140a000}, {0xc140c000}, {0xc140e000},
- {0xc1410000}, {0xc1412000}, {0xc1414000}, {0xc1416000},
- {0xc1418000}, {0xc141a000}, {0xc141c000}, {0xc141e000},
- {0xc1420000}, {0xc1422000}, {0xc1424000}, {0xc1426000},
- {0xc1428000}, {0xc142a000}, {0xc142c000}, {0xc142e000},
- {0xc1430000}, {0xc1432000}, {0xc1434000}, {0xc1436000},
- {0xc1438000}, {0xc143a000}, {0xc143c000}, {0xc143e000},
- {0xc1440000}, {0xc1442000}, {0xc1444000}, {0xc1446000},
- {0xc1448000}, {0xc144a000}, {0xc144c000}, {0xc144e000},
- {0xc1450000}, {0xc1452000}, {0xc1454000}, {0xc1456000},
- {0xc1458000}, {0xc145a000}, {0xc145c000}, {0xc145e000},
- {0xc1460000}, {0xc1462000}, {0xc1464000}, {0xc1466000},
- {0xc1468000}, {0xc146a000}, {0xc146c000}, {0xc146e000},
- {0xc1470000}, {0xc1472000}, {0xc1474000}, {0xc1476000},
- {0xc1478000}, {0xc147a000}, {0xc147c000}, {0xc147e000},
- {0xc1480000}, {0xc1482000}, {0xc1484000}, {0xc1486000},
- {0xc1488000}, {0xc148a000}, {0xc148c000}, {0xc148e000},
- {0xc1490000}, {0xc1492000}, {0xc1494000}, {0xc1496000},
- {0xc1498000}, {0xc149a000}, {0xc149c000}, {0xc149e000},
- {0xc14a0000}, {0xc14a2000}, {0xc14a4000}, {0xc14a6000},
- {0xc14a8000}, {0xc14aa000}, {0xc14ac000}, {0xc14ae000},
- {0xc14b0000}, {0xc14b2000}, {0xc14b4000}, {0xc14b6000},
- {0xc14b8000}, {0xc14ba000}, {0xc14bc000}, {0xc14be000},
- {0xc14c0000}, {0xc14c2000}, {0xc14c4000}, {0xc14c6000},
- {0xc14c8000}, {0xc14ca000}, {0xc14cc000}, {0xc14ce000},
- {0xc14d0000}, {0xc14d2000}, {0xc14d4000}, {0xc14d6000},
- {0xc14d8000}, {0xc14da000}, {0xc14dc000}, {0xc14de000},
- {0xc14e0000}, {0xc14e2000}, {0xc14e4000}, {0xc14e6000},
- {0xc14e8000}, {0xc14ea000}, {0xc14ec000}, {0xc14ee000},
- {0xc14f0000}, {0xc14f2000}, {0xc14f4000}, {0xc14f6000},
- {0xc14f8000}, {0xc14fa000}, {0xc14fc000}, {0xc14fe000},
- {0xc1500000}, {0xc1502000}, {0xc1504000}, {0xc1506000},
- {0xc1508000}, {0xc150a000}, {0xc150c000}, {0xc150e000},
- {0xc1510000}, {0xc1512000}, {0xc1514000}, {0xc1516000},
- {0xc1518000}, {0xc151a000}, {0xc151c000}, {0xc151e000},
- {0xc1520000}, {0xc1522000}, {0xc1524000}, {0xc1526000},
- {0xc1528000}, {0xc152a000}, {0xc152c000}, {0xc152e000},
- {0xc1530000}, {0xc1532000}, {0xc1534000}, {0xc1536000},
- {0xc1538000}, {0xc153a000}, {0xc153c000}, {0xc153e000},
- {0xc1540000}, {0xc1542000}, {0xc1544000}, {0xc1546000},
- {0xc1548000}, {0xc154a000}, {0xc154c000}, {0xc154e000},
- {0xc1550000}, {0xc1552000}, {0xc1554000}, {0xc1556000},
- {0xc1558000}, {0xc155a000}, {0xc155c000}, {0xc155e000},
- {0xc1560000}, {0xc1562000}, {0xc1564000}, {0xc1566000},
- {0xc1568000}, {0xc156a000}, {0xc156c000}, {0xc156e000},
- {0xc1570000}, {0xc1572000}, {0xc1574000}, {0xc1576000},
- {0xc1578000}, {0xc157a000}, {0xc157c000}, {0xc157e000},
- {0xc1580000}, {0xc1582000}, {0xc1584000}, {0xc1586000},
- {0xc1588000}, {0xc158a000}, {0xc158c000}, {0xc158e000},
- {0xc1590000}, {0xc1592000}, {0xc1594000}, {0xc1596000},
- {0xc1598000}, {0xc159a000}, {0xc159c000}, {0xc159e000},
- {0xc15a0000}, {0xc15a2000}, {0xc15a4000}, {0xc15a6000},
- {0xc15a8000}, {0xc15aa000}, {0xc15ac000}, {0xc15ae000},
- {0xc15b0000}, {0xc15b2000}, {0xc15b4000}, {0xc15b6000},
- {0xc15b8000}, {0xc15ba000}, {0xc15bc000}, {0xc15be000},
- {0xc15c0000}, {0xc15c2000}, {0xc15c4000}, {0xc15c6000},
- {0xc15c8000}, {0xc15ca000}, {0xc15cc000}, {0xc15ce000},
- {0xc15d0000}, {0xc15d2000}, {0xc15d4000}, {0xc15d6000},
- {0xc15d8000}, {0xc15da000}, {0xc15dc000}, {0xc15de000},
- {0xc15e0000}, {0xc15e2000}, {0xc15e4000}, {0xc15e6000},
- {0xc15e8000}, {0xc15ea000}, {0xc15ec000}, {0xc15ee000},
- {0xc15f0000}, {0xc15f2000}, {0xc15f4000}, {0xc15f6000},
- {0xc15f8000}, {0xc15fa000}, {0xc15fc000}, {0xc15fe000},
- {0xc1600000}, {0xc1602000}, {0xc1604000}, {0xc1606000},
- {0xc1608000}, {0xc160a000}, {0xc160c000}, {0xc160e000},
- {0xc1610000}, {0xc1612000}, {0xc1614000}, {0xc1616000},
- {0xc1618000}, {0xc161a000}, {0xc161c000}, {0xc161e000},
- {0xc1620000}, {0xc1622000}, {0xc1624000}, {0xc1626000},
- {0xc1628000}, {0xc162a000}, {0xc162c000}, {0xc162e000},
- {0xc1630000}, {0xc1632000}, {0xc1634000}, {0xc1636000},
- {0xc1638000}, {0xc163a000}, {0xc163c000}, {0xc163e000},
- {0xc1640000}, {0xc1642000}, {0xc1644000}, {0xc1646000},
- {0xc1648000}, {0xc164a000}, {0xc164c000}, {0xc164e000},
- {0xc1650000}, {0xc1652000}, {0xc1654000}, {0xc1656000},
- {0xc1658000}, {0xc165a000}, {0xc165c000}, {0xc165e000},
- {0xc1660000}, {0xc1662000}, {0xc1664000}, {0xc1666000},
- {0xc1668000}, {0xc166a000}, {0xc166c000}, {0xc166e000},
- {0xc1670000}, {0xc1672000}, {0xc1674000}, {0xc1676000},
- {0xc1678000}, {0xc167a000}, {0xc167c000}, {0xc167e000},
- {0xc1680000}, {0xc1682000}, {0xc1684000}, {0xc1686000},
- {0xc1688000}, {0xc168a000}, {0xc168c000}, {0xc168e000},
- {0xc1690000}, {0xc1692000}, {0xc1694000}, {0xc1696000},
- {0xc1698000}, {0xc169a000}, {0xc169c000}, {0xc169e000},
- {0xc16a0000}, {0xc16a2000}, {0xc16a4000}, {0xc16a6000},
- {0xc16a8000}, {0xc16aa000}, {0xc16ac000}, {0xc16ae000},
- {0xc16b0000}, {0xc16b2000}, {0xc16b4000}, {0xc16b6000},
- {0xc16b8000}, {0xc16ba000}, {0xc16bc000}, {0xc16be000},
- {0xc16c0000}, {0xc16c2000}, {0xc16c4000}, {0xc16c6000},
- {0xc16c8000}, {0xc16ca000}, {0xc16cc000}, {0xc16ce000},
- {0xc16d0000}, {0xc16d2000}, {0xc16d4000}, {0xc16d6000},
- {0xc16d8000}, {0xc16da000}, {0xc16dc000}, {0xc16de000},
- {0xc16e0000}, {0xc16e2000}, {0xc16e4000}, {0xc16e6000},
- {0xc16e8000}, {0xc16ea000}, {0xc16ec000}, {0xc16ee000},
- {0xc16f0000}, {0xc16f2000}, {0xc16f4000}, {0xc16f6000},
- {0xc16f8000}, {0xc16fa000}, {0xc16fc000}, {0xc16fe000},
- {0xc1700000}, {0xc1702000}, {0xc1704000}, {0xc1706000},
- {0xc1708000}, {0xc170a000}, {0xc170c000}, {0xc170e000},
- {0xc1710000}, {0xc1712000}, {0xc1714000}, {0xc1716000},
- {0xc1718000}, {0xc171a000}, {0xc171c000}, {0xc171e000},
- {0xc1720000}, {0xc1722000}, {0xc1724000}, {0xc1726000},
- {0xc1728000}, {0xc172a000}, {0xc172c000}, {0xc172e000},
- {0xc1730000}, {0xc1732000}, {0xc1734000}, {0xc1736000},
- {0xc1738000}, {0xc173a000}, {0xc173c000}, {0xc173e000},
- {0xc1740000}, {0xc1742000}, {0xc1744000}, {0xc1746000},
- {0xc1748000}, {0xc174a000}, {0xc174c000}, {0xc174e000},
- {0xc1750000}, {0xc1752000}, {0xc1754000}, {0xc1756000},
- {0xc1758000}, {0xc175a000}, {0xc175c000}, {0xc175e000},
- {0xc1760000}, {0xc1762000}, {0xc1764000}, {0xc1766000},
- {0xc1768000}, {0xc176a000}, {0xc176c000}, {0xc176e000},
- {0xc1770000}, {0xc1772000}, {0xc1774000}, {0xc1776000},
- {0xc1778000}, {0xc177a000}, {0xc177c000}, {0xc177e000},
- {0xc1780000}, {0xc1782000}, {0xc1784000}, {0xc1786000},
- {0xc1788000}, {0xc178a000}, {0xc178c000}, {0xc178e000},
- {0xc1790000}, {0xc1792000}, {0xc1794000}, {0xc1796000},
- {0xc1798000}, {0xc179a000}, {0xc179c000}, {0xc179e000},
- {0xc17a0000}, {0xc17a2000}, {0xc17a4000}, {0xc17a6000},
- {0xc17a8000}, {0xc17aa000}, {0xc17ac000}, {0xc17ae000},
- {0xc17b0000}, {0xc17b2000}, {0xc17b4000}, {0xc17b6000},
- {0xc17b8000}, {0xc17ba000}, {0xc17bc000}, {0xc17be000},
- {0xc17c0000}, {0xc17c2000}, {0xc17c4000}, {0xc17c6000},
- {0xc17c8000}, {0xc17ca000}, {0xc17cc000}, {0xc17ce000},
- {0xc17d0000}, {0xc17d2000}, {0xc17d4000}, {0xc17d6000},
- {0xc17d8000}, {0xc17da000}, {0xc17dc000}, {0xc17de000},
- {0xc17e0000}, {0xc17e2000}, {0xc17e4000}, {0xc17e6000},
- {0xc17e8000}, {0xc17ea000}, {0xc17ec000}, {0xc17ee000},
- {0xc17f0000}, {0xc17f2000}, {0xc17f4000}, {0xc17f6000},
- {0xc17f8000}, {0xc17fa000}, {0xc17fc000}, {0xc17fe000},
- {0xc1800000}, {0xc1802000}, {0xc1804000}, {0xc1806000},
- {0xc1808000}, {0xc180a000}, {0xc180c000}, {0xc180e000},
- {0xc1810000}, {0xc1812000}, {0xc1814000}, {0xc1816000},
- {0xc1818000}, {0xc181a000}, {0xc181c000}, {0xc181e000},
- {0xc1820000}, {0xc1822000}, {0xc1824000}, {0xc1826000},
- {0xc1828000}, {0xc182a000}, {0xc182c000}, {0xc182e000},
- {0xc1830000}, {0xc1832000}, {0xc1834000}, {0xc1836000},
- {0xc1838000}, {0xc183a000}, {0xc183c000}, {0xc183e000},
- {0xc1840000}, {0xc1842000}, {0xc1844000}, {0xc1846000},
- {0xc1848000}, {0xc184a000}, {0xc184c000}, {0xc184e000},
- {0xc1850000}, {0xc1852000}, {0xc1854000}, {0xc1856000},
- {0xc1858000}, {0xc185a000}, {0xc185c000}, {0xc185e000},
- {0xc1860000}, {0xc1862000}, {0xc1864000}, {0xc1866000},
- {0xc1868000}, {0xc186a000}, {0xc186c000}, {0xc186e000},
- {0xc1870000}, {0xc1872000}, {0xc1874000}, {0xc1876000},
- {0xc1878000}, {0xc187a000}, {0xc187c000}, {0xc187e000},
- {0xc1880000}, {0xc1882000}, {0xc1884000}, {0xc1886000},
- {0xc1888000}, {0xc188a000}, {0xc188c000}, {0xc188e000},
- {0xc1890000}, {0xc1892000}, {0xc1894000}, {0xc1896000},
- {0xc1898000}, {0xc189a000}, {0xc189c000}, {0xc189e000},
- {0xc18a0000}, {0xc18a2000}, {0xc18a4000}, {0xc18a6000},
- {0xc18a8000}, {0xc18aa000}, {0xc18ac000}, {0xc18ae000},
- {0xc18b0000}, {0xc18b2000}, {0xc18b4000}, {0xc18b6000},
- {0xc18b8000}, {0xc18ba000}, {0xc18bc000}, {0xc18be000},
- {0xc18c0000}, {0xc18c2000}, {0xc18c4000}, {0xc18c6000},
- {0xc18c8000}, {0xc18ca000}, {0xc18cc000}, {0xc18ce000},
- {0xc18d0000}, {0xc18d2000}, {0xc18d4000}, {0xc18d6000},
- {0xc18d8000}, {0xc18da000}, {0xc18dc000}, {0xc18de000},
- {0xc18e0000}, {0xc18e2000}, {0xc18e4000}, {0xc18e6000},
- {0xc18e8000}, {0xc18ea000}, {0xc18ec000}, {0xc18ee000},
- {0xc18f0000}, {0xc18f2000}, {0xc18f4000}, {0xc18f6000},
- {0xc18f8000}, {0xc18fa000}, {0xc18fc000}, {0xc18fe000},
- {0xc1900000}, {0xc1902000}, {0xc1904000}, {0xc1906000},
- {0xc1908000}, {0xc190a000}, {0xc190c000}, {0xc190e000},
- {0xc1910000}, {0xc1912000}, {0xc1914000}, {0xc1916000},
- {0xc1918000}, {0xc191a000}, {0xc191c000}, {0xc191e000},
- {0xc1920000}, {0xc1922000}, {0xc1924000}, {0xc1926000},
- {0xc1928000}, {0xc192a000}, {0xc192c000}, {0xc192e000},
- {0xc1930000}, {0xc1932000}, {0xc1934000}, {0xc1936000},
- {0xc1938000}, {0xc193a000}, {0xc193c000}, {0xc193e000},
- {0xc1940000}, {0xc1942000}, {0xc1944000}, {0xc1946000},
- {0xc1948000}, {0xc194a000}, {0xc194c000}, {0xc194e000},
- {0xc1950000}, {0xc1952000}, {0xc1954000}, {0xc1956000},
- {0xc1958000}, {0xc195a000}, {0xc195c000}, {0xc195e000},
- {0xc1960000}, {0xc1962000}, {0xc1964000}, {0xc1966000},
- {0xc1968000}, {0xc196a000}, {0xc196c000}, {0xc196e000},
- {0xc1970000}, {0xc1972000}, {0xc1974000}, {0xc1976000},
- {0xc1978000}, {0xc197a000}, {0xc197c000}, {0xc197e000},
- {0xc1980000}, {0xc1982000}, {0xc1984000}, {0xc1986000},
- {0xc1988000}, {0xc198a000}, {0xc198c000}, {0xc198e000},
- {0xc1990000}, {0xc1992000}, {0xc1994000}, {0xc1996000},
- {0xc1998000}, {0xc199a000}, {0xc199c000}, {0xc199e000},
- {0xc19a0000}, {0xc19a2000}, {0xc19a4000}, {0xc19a6000},
- {0xc19a8000}, {0xc19aa000}, {0xc19ac000}, {0xc19ae000},
- {0xc19b0000}, {0xc19b2000}, {0xc19b4000}, {0xc19b6000},
- {0xc19b8000}, {0xc19ba000}, {0xc19bc000}, {0xc19be000},
- {0xc19c0000}, {0xc19c2000}, {0xc19c4000}, {0xc19c6000},
- {0xc19c8000}, {0xc19ca000}, {0xc19cc000}, {0xc19ce000},
- {0xc19d0000}, {0xc19d2000}, {0xc19d4000}, {0xc19d6000},
- {0xc19d8000}, {0xc19da000}, {0xc19dc000}, {0xc19de000},
- {0xc19e0000}, {0xc19e2000}, {0xc19e4000}, {0xc19e6000},
- {0xc19e8000}, {0xc19ea000}, {0xc19ec000}, {0xc19ee000},
- {0xc19f0000}, {0xc19f2000}, {0xc19f4000}, {0xc19f6000},
- {0xc19f8000}, {0xc19fa000}, {0xc19fc000}, {0xc19fe000},
- {0xc1a00000}, {0xc1a02000}, {0xc1a04000}, {0xc1a06000},
- {0xc1a08000}, {0xc1a0a000}, {0xc1a0c000}, {0xc1a0e000},
- {0xc1a10000}, {0xc1a12000}, {0xc1a14000}, {0xc1a16000},
- {0xc1a18000}, {0xc1a1a000}, {0xc1a1c000}, {0xc1a1e000},
- {0xc1a20000}, {0xc1a22000}, {0xc1a24000}, {0xc1a26000},
- {0xc1a28000}, {0xc1a2a000}, {0xc1a2c000}, {0xc1a2e000},
- {0xc1a30000}, {0xc1a32000}, {0xc1a34000}, {0xc1a36000},
- {0xc1a38000}, {0xc1a3a000}, {0xc1a3c000}, {0xc1a3e000},
- {0xc1a40000}, {0xc1a42000}, {0xc1a44000}, {0xc1a46000},
- {0xc1a48000}, {0xc1a4a000}, {0xc1a4c000}, {0xc1a4e000},
- {0xc1a50000}, {0xc1a52000}, {0xc1a54000}, {0xc1a56000},
- {0xc1a58000}, {0xc1a5a000}, {0xc1a5c000}, {0xc1a5e000},
- {0xc1a60000}, {0xc1a62000}, {0xc1a64000}, {0xc1a66000},
- {0xc1a68000}, {0xc1a6a000}, {0xc1a6c000}, {0xc1a6e000},
- {0xc1a70000}, {0xc1a72000}, {0xc1a74000}, {0xc1a76000},
- {0xc1a78000}, {0xc1a7a000}, {0xc1a7c000}, {0xc1a7e000},
- {0xc1a80000}, {0xc1a82000}, {0xc1a84000}, {0xc1a86000},
- {0xc1a88000}, {0xc1a8a000}, {0xc1a8c000}, {0xc1a8e000},
- {0xc1a90000}, {0xc1a92000}, {0xc1a94000}, {0xc1a96000},
- {0xc1a98000}, {0xc1a9a000}, {0xc1a9c000}, {0xc1a9e000},
- {0xc1aa0000}, {0xc1aa2000}, {0xc1aa4000}, {0xc1aa6000},
- {0xc1aa8000}, {0xc1aaa000}, {0xc1aac000}, {0xc1aae000},
- {0xc1ab0000}, {0xc1ab2000}, {0xc1ab4000}, {0xc1ab6000},
- {0xc1ab8000}, {0xc1aba000}, {0xc1abc000}, {0xc1abe000},
- {0xc1ac0000}, {0xc1ac2000}, {0xc1ac4000}, {0xc1ac6000},
- {0xc1ac8000}, {0xc1aca000}, {0xc1acc000}, {0xc1ace000},
- {0xc1ad0000}, {0xc1ad2000}, {0xc1ad4000}, {0xc1ad6000},
- {0xc1ad8000}, {0xc1ada000}, {0xc1adc000}, {0xc1ade000},
- {0xc1ae0000}, {0xc1ae2000}, {0xc1ae4000}, {0xc1ae6000},
- {0xc1ae8000}, {0xc1aea000}, {0xc1aec000}, {0xc1aee000},
- {0xc1af0000}, {0xc1af2000}, {0xc1af4000}, {0xc1af6000},
- {0xc1af8000}, {0xc1afa000}, {0xc1afc000}, {0xc1afe000},
- {0xc1b00000}, {0xc1b02000}, {0xc1b04000}, {0xc1b06000},
- {0xc1b08000}, {0xc1b0a000}, {0xc1b0c000}, {0xc1b0e000},
- {0xc1b10000}, {0xc1b12000}, {0xc1b14000}, {0xc1b16000},
- {0xc1b18000}, {0xc1b1a000}, {0xc1b1c000}, {0xc1b1e000},
- {0xc1b20000}, {0xc1b22000}, {0xc1b24000}, {0xc1b26000},
- {0xc1b28000}, {0xc1b2a000}, {0xc1b2c000}, {0xc1b2e000},
- {0xc1b30000}, {0xc1b32000}, {0xc1b34000}, {0xc1b36000},
- {0xc1b38000}, {0xc1b3a000}, {0xc1b3c000}, {0xc1b3e000},
- {0xc1b40000}, {0xc1b42000}, {0xc1b44000}, {0xc1b46000},
- {0xc1b48000}, {0xc1b4a000}, {0xc1b4c000}, {0xc1b4e000},
- {0xc1b50000}, {0xc1b52000}, {0xc1b54000}, {0xc1b56000},
- {0xc1b58000}, {0xc1b5a000}, {0xc1b5c000}, {0xc1b5e000},
- {0xc1b60000}, {0xc1b62000}, {0xc1b64000}, {0xc1b66000},
- {0xc1b68000}, {0xc1b6a000}, {0xc1b6c000}, {0xc1b6e000},
- {0xc1b70000}, {0xc1b72000}, {0xc1b74000}, {0xc1b76000},
- {0xc1b78000}, {0xc1b7a000}, {0xc1b7c000}, {0xc1b7e000},
- {0xc1b80000}, {0xc1b82000}, {0xc1b84000}, {0xc1b86000},
- {0xc1b88000}, {0xc1b8a000}, {0xc1b8c000}, {0xc1b8e000},
- {0xc1b90000}, {0xc1b92000}, {0xc1b94000}, {0xc1b96000},
- {0xc1b98000}, {0xc1b9a000}, {0xc1b9c000}, {0xc1b9e000},
- {0xc1ba0000}, {0xc1ba2000}, {0xc1ba4000}, {0xc1ba6000},
- {0xc1ba8000}, {0xc1baa000}, {0xc1bac000}, {0xc1bae000},
- {0xc1bb0000}, {0xc1bb2000}, {0xc1bb4000}, {0xc1bb6000},
- {0xc1bb8000}, {0xc1bba000}, {0xc1bbc000}, {0xc1bbe000},
- {0xc1bc0000}, {0xc1bc2000}, {0xc1bc4000}, {0xc1bc6000},
- {0xc1bc8000}, {0xc1bca000}, {0xc1bcc000}, {0xc1bce000},
- {0xc1bd0000}, {0xc1bd2000}, {0xc1bd4000}, {0xc1bd6000},
- {0xc1bd8000}, {0xc1bda000}, {0xc1bdc000}, {0xc1bde000},
- {0xc1be0000}, {0xc1be2000}, {0xc1be4000}, {0xc1be6000},
- {0xc1be8000}, {0xc1bea000}, {0xc1bec000}, {0xc1bee000},
- {0xc1bf0000}, {0xc1bf2000}, {0xc1bf4000}, {0xc1bf6000},
- {0xc1bf8000}, {0xc1bfa000}, {0xc1bfc000}, {0xc1bfe000},
- {0xc1c00000}, {0xc1c02000}, {0xc1c04000}, {0xc1c06000},
- {0xc1c08000}, {0xc1c0a000}, {0xc1c0c000}, {0xc1c0e000},
- {0xc1c10000}, {0xc1c12000}, {0xc1c14000}, {0xc1c16000},
- {0xc1c18000}, {0xc1c1a000}, {0xc1c1c000}, {0xc1c1e000},
- {0xc1c20000}, {0xc1c22000}, {0xc1c24000}, {0xc1c26000},
- {0xc1c28000}, {0xc1c2a000}, {0xc1c2c000}, {0xc1c2e000},
- {0xc1c30000}, {0xc1c32000}, {0xc1c34000}, {0xc1c36000},
- {0xc1c38000}, {0xc1c3a000}, {0xc1c3c000}, {0xc1c3e000},
- {0xc1c40000}, {0xc1c42000}, {0xc1c44000}, {0xc1c46000},
- {0xc1c48000}, {0xc1c4a000}, {0xc1c4c000}, {0xc1c4e000},
- {0xc1c50000}, {0xc1c52000}, {0xc1c54000}, {0xc1c56000},
- {0xc1c58000}, {0xc1c5a000}, {0xc1c5c000}, {0xc1c5e000},
- {0xc1c60000}, {0xc1c62000}, {0xc1c64000}, {0xc1c66000},
- {0xc1c68000}, {0xc1c6a000}, {0xc1c6c000}, {0xc1c6e000},
- {0xc1c70000}, {0xc1c72000}, {0xc1c74000}, {0xc1c76000},
- {0xc1c78000}, {0xc1c7a000}, {0xc1c7c000}, {0xc1c7e000},
- {0xc1c80000}, {0xc1c82000}, {0xc1c84000}, {0xc1c86000},
- {0xc1c88000}, {0xc1c8a000}, {0xc1c8c000}, {0xc1c8e000},
- {0xc1c90000}, {0xc1c92000}, {0xc1c94000}, {0xc1c96000},
- {0xc1c98000}, {0xc1c9a000}, {0xc1c9c000}, {0xc1c9e000},
- {0xc1ca0000}, {0xc1ca2000}, {0xc1ca4000}, {0xc1ca6000},
- {0xc1ca8000}, {0xc1caa000}, {0xc1cac000}, {0xc1cae000},
- {0xc1cb0000}, {0xc1cb2000}, {0xc1cb4000}, {0xc1cb6000},
- {0xc1cb8000}, {0xc1cba000}, {0xc1cbc000}, {0xc1cbe000},
- {0xc1cc0000}, {0xc1cc2000}, {0xc1cc4000}, {0xc1cc6000},
- {0xc1cc8000}, {0xc1cca000}, {0xc1ccc000}, {0xc1cce000},
- {0xc1cd0000}, {0xc1cd2000}, {0xc1cd4000}, {0xc1cd6000},
- {0xc1cd8000}, {0xc1cda000}, {0xc1cdc000}, {0xc1cde000},
- {0xc1ce0000}, {0xc1ce2000}, {0xc1ce4000}, {0xc1ce6000},
- {0xc1ce8000}, {0xc1cea000}, {0xc1cec000}, {0xc1cee000},
- {0xc1cf0000}, {0xc1cf2000}, {0xc1cf4000}, {0xc1cf6000},
- {0xc1cf8000}, {0xc1cfa000}, {0xc1cfc000}, {0xc1cfe000},
- {0xc1d00000}, {0xc1d02000}, {0xc1d04000}, {0xc1d06000},
- {0xc1d08000}, {0xc1d0a000}, {0xc1d0c000}, {0xc1d0e000},
- {0xc1d10000}, {0xc1d12000}, {0xc1d14000}, {0xc1d16000},
- {0xc1d18000}, {0xc1d1a000}, {0xc1d1c000}, {0xc1d1e000},
- {0xc1d20000}, {0xc1d22000}, {0xc1d24000}, {0xc1d26000},
- {0xc1d28000}, {0xc1d2a000}, {0xc1d2c000}, {0xc1d2e000},
- {0xc1d30000}, {0xc1d32000}, {0xc1d34000}, {0xc1d36000},
- {0xc1d38000}, {0xc1d3a000}, {0xc1d3c000}, {0xc1d3e000},
- {0xc1d40000}, {0xc1d42000}, {0xc1d44000}, {0xc1d46000},
- {0xc1d48000}, {0xc1d4a000}, {0xc1d4c000}, {0xc1d4e000},
- {0xc1d50000}, {0xc1d52000}, {0xc1d54000}, {0xc1d56000},
- {0xc1d58000}, {0xc1d5a000}, {0xc1d5c000}, {0xc1d5e000},
- {0xc1d60000}, {0xc1d62000}, {0xc1d64000}, {0xc1d66000},
- {0xc1d68000}, {0xc1d6a000}, {0xc1d6c000}, {0xc1d6e000},
- {0xc1d70000}, {0xc1d72000}, {0xc1d74000}, {0xc1d76000},
- {0xc1d78000}, {0xc1d7a000}, {0xc1d7c000}, {0xc1d7e000},
- {0xc1d80000}, {0xc1d82000}, {0xc1d84000}, {0xc1d86000},
- {0xc1d88000}, {0xc1d8a000}, {0xc1d8c000}, {0xc1d8e000},
- {0xc1d90000}, {0xc1d92000}, {0xc1d94000}, {0xc1d96000},
- {0xc1d98000}, {0xc1d9a000}, {0xc1d9c000}, {0xc1d9e000},
- {0xc1da0000}, {0xc1da2000}, {0xc1da4000}, {0xc1da6000},
- {0xc1da8000}, {0xc1daa000}, {0xc1dac000}, {0xc1dae000},
- {0xc1db0000}, {0xc1db2000}, {0xc1db4000}, {0xc1db6000},
- {0xc1db8000}, {0xc1dba000}, {0xc1dbc000}, {0xc1dbe000},
- {0xc1dc0000}, {0xc1dc2000}, {0xc1dc4000}, {0xc1dc6000},
- {0xc1dc8000}, {0xc1dca000}, {0xc1dcc000}, {0xc1dce000},
- {0xc1dd0000}, {0xc1dd2000}, {0xc1dd4000}, {0xc1dd6000},
- {0xc1dd8000}, {0xc1dda000}, {0xc1ddc000}, {0xc1dde000},
- {0xc1de0000}, {0xc1de2000}, {0xc1de4000}, {0xc1de6000},
- {0xc1de8000}, {0xc1dea000}, {0xc1dec000}, {0xc1dee000},
- {0xc1df0000}, {0xc1df2000}, {0xc1df4000}, {0xc1df6000},
- {0xc1df8000}, {0xc1dfa000}, {0xc1dfc000}, {0xc1dfe000},
- {0xc1e00000}, {0xc1e02000}, {0xc1e04000}, {0xc1e06000},
- {0xc1e08000}, {0xc1e0a000}, {0xc1e0c000}, {0xc1e0e000},
- {0xc1e10000}, {0xc1e12000}, {0xc1e14000}, {0xc1e16000},
- {0xc1e18000}, {0xc1e1a000}, {0xc1e1c000}, {0xc1e1e000},
- {0xc1e20000}, {0xc1e22000}, {0xc1e24000}, {0xc1e26000},
- {0xc1e28000}, {0xc1e2a000}, {0xc1e2c000}, {0xc1e2e000},
- {0xc1e30000}, {0xc1e32000}, {0xc1e34000}, {0xc1e36000},
- {0xc1e38000}, {0xc1e3a000}, {0xc1e3c000}, {0xc1e3e000},
- {0xc1e40000}, {0xc1e42000}, {0xc1e44000}, {0xc1e46000},
- {0xc1e48000}, {0xc1e4a000}, {0xc1e4c000}, {0xc1e4e000},
- {0xc1e50000}, {0xc1e52000}, {0xc1e54000}, {0xc1e56000},
- {0xc1e58000}, {0xc1e5a000}, {0xc1e5c000}, {0xc1e5e000},
- {0xc1e60000}, {0xc1e62000}, {0xc1e64000}, {0xc1e66000},
- {0xc1e68000}, {0xc1e6a000}, {0xc1e6c000}, {0xc1e6e000},
- {0xc1e70000}, {0xc1e72000}, {0xc1e74000}, {0xc1e76000},
- {0xc1e78000}, {0xc1e7a000}, {0xc1e7c000}, {0xc1e7e000},
- {0xc1e80000}, {0xc1e82000}, {0xc1e84000}, {0xc1e86000},
- {0xc1e88000}, {0xc1e8a000}, {0xc1e8c000}, {0xc1e8e000},
- {0xc1e90000}, {0xc1e92000}, {0xc1e94000}, {0xc1e96000},
- {0xc1e98000}, {0xc1e9a000}, {0xc1e9c000}, {0xc1e9e000},
- {0xc1ea0000}, {0xc1ea2000}, {0xc1ea4000}, {0xc1ea6000},
- {0xc1ea8000}, {0xc1eaa000}, {0xc1eac000}, {0xc1eae000},
- {0xc1eb0000}, {0xc1eb2000}, {0xc1eb4000}, {0xc1eb6000},
- {0xc1eb8000}, {0xc1eba000}, {0xc1ebc000}, {0xc1ebe000},
- {0xc1ec0000}, {0xc1ec2000}, {0xc1ec4000}, {0xc1ec6000},
- {0xc1ec8000}, {0xc1eca000}, {0xc1ecc000}, {0xc1ece000},
- {0xc1ed0000}, {0xc1ed2000}, {0xc1ed4000}, {0xc1ed6000},
- {0xc1ed8000}, {0xc1eda000}, {0xc1edc000}, {0xc1ede000},
- {0xc1ee0000}, {0xc1ee2000}, {0xc1ee4000}, {0xc1ee6000},
- {0xc1ee8000}, {0xc1eea000}, {0xc1eec000}, {0xc1eee000},
- {0xc1ef0000}, {0xc1ef2000}, {0xc1ef4000}, {0xc1ef6000},
- {0xc1ef8000}, {0xc1efa000}, {0xc1efc000}, {0xc1efe000},
- {0xc1f00000}, {0xc1f02000}, {0xc1f04000}, {0xc1f06000},
- {0xc1f08000}, {0xc1f0a000}, {0xc1f0c000}, {0xc1f0e000},
- {0xc1f10000}, {0xc1f12000}, {0xc1f14000}, {0xc1f16000},
- {0xc1f18000}, {0xc1f1a000}, {0xc1f1c000}, {0xc1f1e000},
- {0xc1f20000}, {0xc1f22000}, {0xc1f24000}, {0xc1f26000},
- {0xc1f28000}, {0xc1f2a000}, {0xc1f2c000}, {0xc1f2e000},
- {0xc1f30000}, {0xc1f32000}, {0xc1f34000}, {0xc1f36000},
- {0xc1f38000}, {0xc1f3a000}, {0xc1f3c000}, {0xc1f3e000},
- {0xc1f40000}, {0xc1f42000}, {0xc1f44000}, {0xc1f46000},
- {0xc1f48000}, {0xc1f4a000}, {0xc1f4c000}, {0xc1f4e000},
- {0xc1f50000}, {0xc1f52000}, {0xc1f54000}, {0xc1f56000},
- {0xc1f58000}, {0xc1f5a000}, {0xc1f5c000}, {0xc1f5e000},
- {0xc1f60000}, {0xc1f62000}, {0xc1f64000}, {0xc1f66000},
- {0xc1f68000}, {0xc1f6a000}, {0xc1f6c000}, {0xc1f6e000},
- {0xc1f70000}, {0xc1f72000}, {0xc1f74000}, {0xc1f76000},
- {0xc1f78000}, {0xc1f7a000}, {0xc1f7c000}, {0xc1f7e000},
- {0xc1f80000}, {0xc1f82000}, {0xc1f84000}, {0xc1f86000},
- {0xc1f88000}, {0xc1f8a000}, {0xc1f8c000}, {0xc1f8e000},
- {0xc1f90000}, {0xc1f92000}, {0xc1f94000}, {0xc1f96000},
- {0xc1f98000}, {0xc1f9a000}, {0xc1f9c000}, {0xc1f9e000},
- {0xc1fa0000}, {0xc1fa2000}, {0xc1fa4000}, {0xc1fa6000},
- {0xc1fa8000}, {0xc1faa000}, {0xc1fac000}, {0xc1fae000},
- {0xc1fb0000}, {0xc1fb2000}, {0xc1fb4000}, {0xc1fb6000},
- {0xc1fb8000}, {0xc1fba000}, {0xc1fbc000}, {0xc1fbe000},
- {0xc1fc0000}, {0xc1fc2000}, {0xc1fc4000}, {0xc1fc6000},
- {0xc1fc8000}, {0xc1fca000}, {0xc1fcc000}, {0xc1fce000},
- {0xc1fd0000}, {0xc1fd2000}, {0xc1fd4000}, {0xc1fd6000},
- {0xc1fd8000}, {0xc1fda000}, {0xc1fdc000}, {0xc1fde000},
- {0xc1fe0000}, {0xc1fe2000}, {0xc1fe4000}, {0xc1fe6000},
- {0xc1fe8000}, {0xc1fea000}, {0xc1fec000}, {0xc1fee000},
- {0xc1ff0000}, {0xc1ff2000}, {0xc1ff4000}, {0xc1ff6000},
- {0xc1ff8000}, {0xc1ffa000}, {0xc1ffc000}, {0xc1ffe000},
- {0xc2000000}, {0xc2002000}, {0xc2004000}, {0xc2006000},
- {0xc2008000}, {0xc200a000}, {0xc200c000}, {0xc200e000},
- {0xc2010000}, {0xc2012000}, {0xc2014000}, {0xc2016000},
- {0xc2018000}, {0xc201a000}, {0xc201c000}, {0xc201e000},
- {0xc2020000}, {0xc2022000}, {0xc2024000}, {0xc2026000},
- {0xc2028000}, {0xc202a000}, {0xc202c000}, {0xc202e000},
- {0xc2030000}, {0xc2032000}, {0xc2034000}, {0xc2036000},
- {0xc2038000}, {0xc203a000}, {0xc203c000}, {0xc203e000},
- {0xc2040000}, {0xc2042000}, {0xc2044000}, {0xc2046000},
- {0xc2048000}, {0xc204a000}, {0xc204c000}, {0xc204e000},
- {0xc2050000}, {0xc2052000}, {0xc2054000}, {0xc2056000},
- {0xc2058000}, {0xc205a000}, {0xc205c000}, {0xc205e000},
- {0xc2060000}, {0xc2062000}, {0xc2064000}, {0xc2066000},
- {0xc2068000}, {0xc206a000}, {0xc206c000}, {0xc206e000},
- {0xc2070000}, {0xc2072000}, {0xc2074000}, {0xc2076000},
- {0xc2078000}, {0xc207a000}, {0xc207c000}, {0xc207e000},
- {0xc2080000}, {0xc2082000}, {0xc2084000}, {0xc2086000},
- {0xc2088000}, {0xc208a000}, {0xc208c000}, {0xc208e000},
- {0xc2090000}, {0xc2092000}, {0xc2094000}, {0xc2096000},
- {0xc2098000}, {0xc209a000}, {0xc209c000}, {0xc209e000},
- {0xc20a0000}, {0xc20a2000}, {0xc20a4000}, {0xc20a6000},
- {0xc20a8000}, {0xc20aa000}, {0xc20ac000}, {0xc20ae000},
- {0xc20b0000}, {0xc20b2000}, {0xc20b4000}, {0xc20b6000},
- {0xc20b8000}, {0xc20ba000}, {0xc20bc000}, {0xc20be000},
- {0xc20c0000}, {0xc20c2000}, {0xc20c4000}, {0xc20c6000},
- {0xc20c8000}, {0xc20ca000}, {0xc20cc000}, {0xc20ce000},
- {0xc20d0000}, {0xc20d2000}, {0xc20d4000}, {0xc20d6000},
- {0xc20d8000}, {0xc20da000}, {0xc20dc000}, {0xc20de000},
- {0xc20e0000}, {0xc20e2000}, {0xc20e4000}, {0xc20e6000},
- {0xc20e8000}, {0xc20ea000}, {0xc20ec000}, {0xc20ee000},
- {0xc20f0000}, {0xc20f2000}, {0xc20f4000}, {0xc20f6000},
- {0xc20f8000}, {0xc20fa000}, {0xc20fc000}, {0xc20fe000},
- {0xc2100000}, {0xc2102000}, {0xc2104000}, {0xc2106000},
- {0xc2108000}, {0xc210a000}, {0xc210c000}, {0xc210e000},
- {0xc2110000}, {0xc2112000}, {0xc2114000}, {0xc2116000},
- {0xc2118000}, {0xc211a000}, {0xc211c000}, {0xc211e000},
- {0xc2120000}, {0xc2122000}, {0xc2124000}, {0xc2126000},
- {0xc2128000}, {0xc212a000}, {0xc212c000}, {0xc212e000},
- {0xc2130000}, {0xc2132000}, {0xc2134000}, {0xc2136000},
- {0xc2138000}, {0xc213a000}, {0xc213c000}, {0xc213e000},
- {0xc2140000}, {0xc2142000}, {0xc2144000}, {0xc2146000},
- {0xc2148000}, {0xc214a000}, {0xc214c000}, {0xc214e000},
- {0xc2150000}, {0xc2152000}, {0xc2154000}, {0xc2156000},
- {0xc2158000}, {0xc215a000}, {0xc215c000}, {0xc215e000},
- {0xc2160000}, {0xc2162000}, {0xc2164000}, {0xc2166000},
- {0xc2168000}, {0xc216a000}, {0xc216c000}, {0xc216e000},
- {0xc2170000}, {0xc2172000}, {0xc2174000}, {0xc2176000},
- {0xc2178000}, {0xc217a000}, {0xc217c000}, {0xc217e000},
- {0xc2180000}, {0xc2182000}, {0xc2184000}, {0xc2186000},
- {0xc2188000}, {0xc218a000}, {0xc218c000}, {0xc218e000},
- {0xc2190000}, {0xc2192000}, {0xc2194000}, {0xc2196000},
- {0xc2198000}, {0xc219a000}, {0xc219c000}, {0xc219e000},
- {0xc21a0000}, {0xc21a2000}, {0xc21a4000}, {0xc21a6000},
- {0xc21a8000}, {0xc21aa000}, {0xc21ac000}, {0xc21ae000},
- {0xc21b0000}, {0xc21b2000}, {0xc21b4000}, {0xc21b6000},
- {0xc21b8000}, {0xc21ba000}, {0xc21bc000}, {0xc21be000},
- {0xc21c0000}, {0xc21c2000}, {0xc21c4000}, {0xc21c6000},
- {0xc21c8000}, {0xc21ca000}, {0xc21cc000}, {0xc21ce000},
- {0xc21d0000}, {0xc21d2000}, {0xc21d4000}, {0xc21d6000},
- {0xc21d8000}, {0xc21da000}, {0xc21dc000}, {0xc21de000},
- {0xc21e0000}, {0xc21e2000}, {0xc21e4000}, {0xc21e6000},
- {0xc21e8000}, {0xc21ea000}, {0xc21ec000}, {0xc21ee000},
- {0xc21f0000}, {0xc21f2000}, {0xc21f4000}, {0xc21f6000},
- {0xc21f8000}, {0xc21fa000}, {0xc21fc000}, {0xc21fe000},
- {0xc2200000}, {0xc2202000}, {0xc2204000}, {0xc2206000},
- {0xc2208000}, {0xc220a000}, {0xc220c000}, {0xc220e000},
- {0xc2210000}, {0xc2212000}, {0xc2214000}, {0xc2216000},
- {0xc2218000}, {0xc221a000}, {0xc221c000}, {0xc221e000},
- {0xc2220000}, {0xc2222000}, {0xc2224000}, {0xc2226000},
- {0xc2228000}, {0xc222a000}, {0xc222c000}, {0xc222e000},
- {0xc2230000}, {0xc2232000}, {0xc2234000}, {0xc2236000},
- {0xc2238000}, {0xc223a000}, {0xc223c000}, {0xc223e000},
- {0xc2240000}, {0xc2242000}, {0xc2244000}, {0xc2246000},
- {0xc2248000}, {0xc224a000}, {0xc224c000}, {0xc224e000},
- {0xc2250000}, {0xc2252000}, {0xc2254000}, {0xc2256000},
- {0xc2258000}, {0xc225a000}, {0xc225c000}, {0xc225e000},
- {0xc2260000}, {0xc2262000}, {0xc2264000}, {0xc2266000},
- {0xc2268000}, {0xc226a000}, {0xc226c000}, {0xc226e000},
- {0xc2270000}, {0xc2272000}, {0xc2274000}, {0xc2276000},
- {0xc2278000}, {0xc227a000}, {0xc227c000}, {0xc227e000},
- {0xc2280000}, {0xc2282000}, {0xc2284000}, {0xc2286000},
- {0xc2288000}, {0xc228a000}, {0xc228c000}, {0xc228e000},
- {0xc2290000}, {0xc2292000}, {0xc2294000}, {0xc2296000},
- {0xc2298000}, {0xc229a000}, {0xc229c000}, {0xc229e000},
- {0xc22a0000}, {0xc22a2000}, {0xc22a4000}, {0xc22a6000},
- {0xc22a8000}, {0xc22aa000}, {0xc22ac000}, {0xc22ae000},
- {0xc22b0000}, {0xc22b2000}, {0xc22b4000}, {0xc22b6000},
- {0xc22b8000}, {0xc22ba000}, {0xc22bc000}, {0xc22be000},
- {0xc22c0000}, {0xc22c2000}, {0xc22c4000}, {0xc22c6000},
- {0xc22c8000}, {0xc22ca000}, {0xc22cc000}, {0xc22ce000},
- {0xc22d0000}, {0xc22d2000}, {0xc22d4000}, {0xc22d6000},
- {0xc22d8000}, {0xc22da000}, {0xc22dc000}, {0xc22de000},
- {0xc22e0000}, {0xc22e2000}, {0xc22e4000}, {0xc22e6000},
- {0xc22e8000}, {0xc22ea000}, {0xc22ec000}, {0xc22ee000},
- {0xc22f0000}, {0xc22f2000}, {0xc22f4000}, {0xc22f6000},
- {0xc22f8000}, {0xc22fa000}, {0xc22fc000}, {0xc22fe000},
- {0xc2300000}, {0xc2302000}, {0xc2304000}, {0xc2306000},
- {0xc2308000}, {0xc230a000}, {0xc230c000}, {0xc230e000},
- {0xc2310000}, {0xc2312000}, {0xc2314000}, {0xc2316000},
- {0xc2318000}, {0xc231a000}, {0xc231c000}, {0xc231e000},
- {0xc2320000}, {0xc2322000}, {0xc2324000}, {0xc2326000},
- {0xc2328000}, {0xc232a000}, {0xc232c000}, {0xc232e000},
- {0xc2330000}, {0xc2332000}, {0xc2334000}, {0xc2336000},
- {0xc2338000}, {0xc233a000}, {0xc233c000}, {0xc233e000},
- {0xc2340000}, {0xc2342000}, {0xc2344000}, {0xc2346000},
- {0xc2348000}, {0xc234a000}, {0xc234c000}, {0xc234e000},
- {0xc2350000}, {0xc2352000}, {0xc2354000}, {0xc2356000},
- {0xc2358000}, {0xc235a000}, {0xc235c000}, {0xc235e000},
- {0xc2360000}, {0xc2362000}, {0xc2364000}, {0xc2366000},
- {0xc2368000}, {0xc236a000}, {0xc236c000}, {0xc236e000},
- {0xc2370000}, {0xc2372000}, {0xc2374000}, {0xc2376000},
- {0xc2378000}, {0xc237a000}, {0xc237c000}, {0xc237e000},
- {0xc2380000}, {0xc2382000}, {0xc2384000}, {0xc2386000},
- {0xc2388000}, {0xc238a000}, {0xc238c000}, {0xc238e000},
- {0xc2390000}, {0xc2392000}, {0xc2394000}, {0xc2396000},
- {0xc2398000}, {0xc239a000}, {0xc239c000}, {0xc239e000},
- {0xc23a0000}, {0xc23a2000}, {0xc23a4000}, {0xc23a6000},
- {0xc23a8000}, {0xc23aa000}, {0xc23ac000}, {0xc23ae000},
- {0xc23b0000}, {0xc23b2000}, {0xc23b4000}, {0xc23b6000},
- {0xc23b8000}, {0xc23ba000}, {0xc23bc000}, {0xc23be000},
- {0xc23c0000}, {0xc23c2000}, {0xc23c4000}, {0xc23c6000},
- {0xc23c8000}, {0xc23ca000}, {0xc23cc000}, {0xc23ce000},
- {0xc23d0000}, {0xc23d2000}, {0xc23d4000}, {0xc23d6000},
- {0xc23d8000}, {0xc23da000}, {0xc23dc000}, {0xc23de000},
- {0xc23e0000}, {0xc23e2000}, {0xc23e4000}, {0xc23e6000},
- {0xc23e8000}, {0xc23ea000}, {0xc23ec000}, {0xc23ee000},
- {0xc23f0000}, {0xc23f2000}, {0xc23f4000}, {0xc23f6000},
- {0xc23f8000}, {0xc23fa000}, {0xc23fc000}, {0xc23fe000},
- {0xc2400000}, {0xc2402000}, {0xc2404000}, {0xc2406000},
- {0xc2408000}, {0xc240a000}, {0xc240c000}, {0xc240e000},
- {0xc2410000}, {0xc2412000}, {0xc2414000}, {0xc2416000},
- {0xc2418000}, {0xc241a000}, {0xc241c000}, {0xc241e000},
- {0xc2420000}, {0xc2422000}, {0xc2424000}, {0xc2426000},
- {0xc2428000}, {0xc242a000}, {0xc242c000}, {0xc242e000},
- {0xc2430000}, {0xc2432000}, {0xc2434000}, {0xc2436000},
- {0xc2438000}, {0xc243a000}, {0xc243c000}, {0xc243e000},
- {0xc2440000}, {0xc2442000}, {0xc2444000}, {0xc2446000},
- {0xc2448000}, {0xc244a000}, {0xc244c000}, {0xc244e000},
- {0xc2450000}, {0xc2452000}, {0xc2454000}, {0xc2456000},
- {0xc2458000}, {0xc245a000}, {0xc245c000}, {0xc245e000},
- {0xc2460000}, {0xc2462000}, {0xc2464000}, {0xc2466000},
- {0xc2468000}, {0xc246a000}, {0xc246c000}, {0xc246e000},
- {0xc2470000}, {0xc2472000}, {0xc2474000}, {0xc2476000},
- {0xc2478000}, {0xc247a000}, {0xc247c000}, {0xc247e000},
- {0xc2480000}, {0xc2482000}, {0xc2484000}, {0xc2486000},
- {0xc2488000}, {0xc248a000}, {0xc248c000}, {0xc248e000},
- {0xc2490000}, {0xc2492000}, {0xc2494000}, {0xc2496000},
- {0xc2498000}, {0xc249a000}, {0xc249c000}, {0xc249e000},
- {0xc24a0000}, {0xc24a2000}, {0xc24a4000}, {0xc24a6000},
- {0xc24a8000}, {0xc24aa000}, {0xc24ac000}, {0xc24ae000},
- {0xc24b0000}, {0xc24b2000}, {0xc24b4000}, {0xc24b6000},
- {0xc24b8000}, {0xc24ba000}, {0xc24bc000}, {0xc24be000},
- {0xc24c0000}, {0xc24c2000}, {0xc24c4000}, {0xc24c6000},
- {0xc24c8000}, {0xc24ca000}, {0xc24cc000}, {0xc24ce000},
- {0xc24d0000}, {0xc24d2000}, {0xc24d4000}, {0xc24d6000},
- {0xc24d8000}, {0xc24da000}, {0xc24dc000}, {0xc24de000},
- {0xc24e0000}, {0xc24e2000}, {0xc24e4000}, {0xc24e6000},
- {0xc24e8000}, {0xc24ea000}, {0xc24ec000}, {0xc24ee000},
- {0xc24f0000}, {0xc24f2000}, {0xc24f4000}, {0xc24f6000},
- {0xc24f8000}, {0xc24fa000}, {0xc24fc000}, {0xc24fe000},
- {0xc2500000}, {0xc2502000}, {0xc2504000}, {0xc2506000},
- {0xc2508000}, {0xc250a000}, {0xc250c000}, {0xc250e000},
- {0xc2510000}, {0xc2512000}, {0xc2514000}, {0xc2516000},
- {0xc2518000}, {0xc251a000}, {0xc251c000}, {0xc251e000},
- {0xc2520000}, {0xc2522000}, {0xc2524000}, {0xc2526000},
- {0xc2528000}, {0xc252a000}, {0xc252c000}, {0xc252e000},
- {0xc2530000}, {0xc2532000}, {0xc2534000}, {0xc2536000},
- {0xc2538000}, {0xc253a000}, {0xc253c000}, {0xc253e000},
- {0xc2540000}, {0xc2542000}, {0xc2544000}, {0xc2546000},
- {0xc2548000}, {0xc254a000}, {0xc254c000}, {0xc254e000},
- {0xc2550000}, {0xc2552000}, {0xc2554000}, {0xc2556000},
- {0xc2558000}, {0xc255a000}, {0xc255c000}, {0xc255e000},
- {0xc2560000}, {0xc2562000}, {0xc2564000}, {0xc2566000},
- {0xc2568000}, {0xc256a000}, {0xc256c000}, {0xc256e000},
- {0xc2570000}, {0xc2572000}, {0xc2574000}, {0xc2576000},
- {0xc2578000}, {0xc257a000}, {0xc257c000}, {0xc257e000},
- {0xc2580000}, {0xc2582000}, {0xc2584000}, {0xc2586000},
- {0xc2588000}, {0xc258a000}, {0xc258c000}, {0xc258e000},
- {0xc2590000}, {0xc2592000}, {0xc2594000}, {0xc2596000},
- {0xc2598000}, {0xc259a000}, {0xc259c000}, {0xc259e000},
- {0xc25a0000}, {0xc25a2000}, {0xc25a4000}, {0xc25a6000},
- {0xc25a8000}, {0xc25aa000}, {0xc25ac000}, {0xc25ae000},
- {0xc25b0000}, {0xc25b2000}, {0xc25b4000}, {0xc25b6000},
- {0xc25b8000}, {0xc25ba000}, {0xc25bc000}, {0xc25be000},
- {0xc25c0000}, {0xc25c2000}, {0xc25c4000}, {0xc25c6000},
- {0xc25c8000}, {0xc25ca000}, {0xc25cc000}, {0xc25ce000},
- {0xc25d0000}, {0xc25d2000}, {0xc25d4000}, {0xc25d6000},
- {0xc25d8000}, {0xc25da000}, {0xc25dc000}, {0xc25de000},
- {0xc25e0000}, {0xc25e2000}, {0xc25e4000}, {0xc25e6000},
- {0xc25e8000}, {0xc25ea000}, {0xc25ec000}, {0xc25ee000},
- {0xc25f0000}, {0xc25f2000}, {0xc25f4000}, {0xc25f6000},
- {0xc25f8000}, {0xc25fa000}, {0xc25fc000}, {0xc25fe000},
- {0xc2600000}, {0xc2602000}, {0xc2604000}, {0xc2606000},
- {0xc2608000}, {0xc260a000}, {0xc260c000}, {0xc260e000},
- {0xc2610000}, {0xc2612000}, {0xc2614000}, {0xc2616000},
- {0xc2618000}, {0xc261a000}, {0xc261c000}, {0xc261e000},
- {0xc2620000}, {0xc2622000}, {0xc2624000}, {0xc2626000},
- {0xc2628000}, {0xc262a000}, {0xc262c000}, {0xc262e000},
- {0xc2630000}, {0xc2632000}, {0xc2634000}, {0xc2636000},
- {0xc2638000}, {0xc263a000}, {0xc263c000}, {0xc263e000},
- {0xc2640000}, {0xc2642000}, {0xc2644000}, {0xc2646000},
- {0xc2648000}, {0xc264a000}, {0xc264c000}, {0xc264e000},
- {0xc2650000}, {0xc2652000}, {0xc2654000}, {0xc2656000},
- {0xc2658000}, {0xc265a000}, {0xc265c000}, {0xc265e000},
- {0xc2660000}, {0xc2662000}, {0xc2664000}, {0xc2666000},
- {0xc2668000}, {0xc266a000}, {0xc266c000}, {0xc266e000},
- {0xc2670000}, {0xc2672000}, {0xc2674000}, {0xc2676000},
- {0xc2678000}, {0xc267a000}, {0xc267c000}, {0xc267e000},
- {0xc2680000}, {0xc2682000}, {0xc2684000}, {0xc2686000},
- {0xc2688000}, {0xc268a000}, {0xc268c000}, {0xc268e000},
- {0xc2690000}, {0xc2692000}, {0xc2694000}, {0xc2696000},
- {0xc2698000}, {0xc269a000}, {0xc269c000}, {0xc269e000},
- {0xc26a0000}, {0xc26a2000}, {0xc26a4000}, {0xc26a6000},
- {0xc26a8000}, {0xc26aa000}, {0xc26ac000}, {0xc26ae000},
- {0xc26b0000}, {0xc26b2000}, {0xc26b4000}, {0xc26b6000},
- {0xc26b8000}, {0xc26ba000}, {0xc26bc000}, {0xc26be000},
- {0xc26c0000}, {0xc26c2000}, {0xc26c4000}, {0xc26c6000},
- {0xc26c8000}, {0xc26ca000}, {0xc26cc000}, {0xc26ce000},
- {0xc26d0000}, {0xc26d2000}, {0xc26d4000}, {0xc26d6000},
- {0xc26d8000}, {0xc26da000}, {0xc26dc000}, {0xc26de000},
- {0xc26e0000}, {0xc26e2000}, {0xc26e4000}, {0xc26e6000},
- {0xc26e8000}, {0xc26ea000}, {0xc26ec000}, {0xc26ee000},
- {0xc26f0000}, {0xc26f2000}, {0xc26f4000}, {0xc26f6000},
- {0xc26f8000}, {0xc26fa000}, {0xc26fc000}, {0xc26fe000},
- {0xc2700000}, {0xc2702000}, {0xc2704000}, {0xc2706000},
- {0xc2708000}, {0xc270a000}, {0xc270c000}, {0xc270e000},
- {0xc2710000}, {0xc2712000}, {0xc2714000}, {0xc2716000},
- {0xc2718000}, {0xc271a000}, {0xc271c000}, {0xc271e000},
- {0xc2720000}, {0xc2722000}, {0xc2724000}, {0xc2726000},
- {0xc2728000}, {0xc272a000}, {0xc272c000}, {0xc272e000},
- {0xc2730000}, {0xc2732000}, {0xc2734000}, {0xc2736000},
- {0xc2738000}, {0xc273a000}, {0xc273c000}, {0xc273e000},
- {0xc2740000}, {0xc2742000}, {0xc2744000}, {0xc2746000},
- {0xc2748000}, {0xc274a000}, {0xc274c000}, {0xc274e000},
- {0xc2750000}, {0xc2752000}, {0xc2754000}, {0xc2756000},
- {0xc2758000}, {0xc275a000}, {0xc275c000}, {0xc275e000},
- {0xc2760000}, {0xc2762000}, {0xc2764000}, {0xc2766000},
- {0xc2768000}, {0xc276a000}, {0xc276c000}, {0xc276e000},
- {0xc2770000}, {0xc2772000}, {0xc2774000}, {0xc2776000},
- {0xc2778000}, {0xc277a000}, {0xc277c000}, {0xc277e000},
- {0xc2780000}, {0xc2782000}, {0xc2784000}, {0xc2786000},
- {0xc2788000}, {0xc278a000}, {0xc278c000}, {0xc278e000},
- {0xc2790000}, {0xc2792000}, {0xc2794000}, {0xc2796000},
- {0xc2798000}, {0xc279a000}, {0xc279c000}, {0xc279e000},
- {0xc27a0000}, {0xc27a2000}, {0xc27a4000}, {0xc27a6000},
- {0xc27a8000}, {0xc27aa000}, {0xc27ac000}, {0xc27ae000},
- {0xc27b0000}, {0xc27b2000}, {0xc27b4000}, {0xc27b6000},
- {0xc27b8000}, {0xc27ba000}, {0xc27bc000}, {0xc27be000},
- {0xc27c0000}, {0xc27c2000}, {0xc27c4000}, {0xc27c6000},
- {0xc27c8000}, {0xc27ca000}, {0xc27cc000}, {0xc27ce000},
- {0xc27d0000}, {0xc27d2000}, {0xc27d4000}, {0xc27d6000},
- {0xc27d8000}, {0xc27da000}, {0xc27dc000}, {0xc27de000},
- {0xc27e0000}, {0xc27e2000}, {0xc27e4000}, {0xc27e6000},
- {0xc27e8000}, {0xc27ea000}, {0xc27ec000}, {0xc27ee000},
- {0xc27f0000}, {0xc27f2000}, {0xc27f4000}, {0xc27f6000},
- {0xc27f8000}, {0xc27fa000}, {0xc27fc000}, {0xc27fe000},
- {0xc2800000}, {0xc2802000}, {0xc2804000}, {0xc2806000},
- {0xc2808000}, {0xc280a000}, {0xc280c000}, {0xc280e000},
- {0xc2810000}, {0xc2812000}, {0xc2814000}, {0xc2816000},
- {0xc2818000}, {0xc281a000}, {0xc281c000}, {0xc281e000},
- {0xc2820000}, {0xc2822000}, {0xc2824000}, {0xc2826000},
- {0xc2828000}, {0xc282a000}, {0xc282c000}, {0xc282e000},
- {0xc2830000}, {0xc2832000}, {0xc2834000}, {0xc2836000},
- {0xc2838000}, {0xc283a000}, {0xc283c000}, {0xc283e000},
- {0xc2840000}, {0xc2842000}, {0xc2844000}, {0xc2846000},
- {0xc2848000}, {0xc284a000}, {0xc284c000}, {0xc284e000},
- {0xc2850000}, {0xc2852000}, {0xc2854000}, {0xc2856000},
- {0xc2858000}, {0xc285a000}, {0xc285c000}, {0xc285e000},
- {0xc2860000}, {0xc2862000}, {0xc2864000}, {0xc2866000},
- {0xc2868000}, {0xc286a000}, {0xc286c000}, {0xc286e000},
- {0xc2870000}, {0xc2872000}, {0xc2874000}, {0xc2876000},
- {0xc2878000}, {0xc287a000}, {0xc287c000}, {0xc287e000},
- {0xc2880000}, {0xc2882000}, {0xc2884000}, {0xc2886000},
- {0xc2888000}, {0xc288a000}, {0xc288c000}, {0xc288e000},
- {0xc2890000}, {0xc2892000}, {0xc2894000}, {0xc2896000},
- {0xc2898000}, {0xc289a000}, {0xc289c000}, {0xc289e000},
- {0xc28a0000}, {0xc28a2000}, {0xc28a4000}, {0xc28a6000},
- {0xc28a8000}, {0xc28aa000}, {0xc28ac000}, {0xc28ae000},
- {0xc28b0000}, {0xc28b2000}, {0xc28b4000}, {0xc28b6000},
- {0xc28b8000}, {0xc28ba000}, {0xc28bc000}, {0xc28be000},
- {0xc28c0000}, {0xc28c2000}, {0xc28c4000}, {0xc28c6000},
- {0xc28c8000}, {0xc28ca000}, {0xc28cc000}, {0xc28ce000},
- {0xc28d0000}, {0xc28d2000}, {0xc28d4000}, {0xc28d6000},
- {0xc28d8000}, {0xc28da000}, {0xc28dc000}, {0xc28de000},
- {0xc28e0000}, {0xc28e2000}, {0xc28e4000}, {0xc28e6000},
- {0xc28e8000}, {0xc28ea000}, {0xc28ec000}, {0xc28ee000},
- {0xc28f0000}, {0xc28f2000}, {0xc28f4000}, {0xc28f6000},
- {0xc28f8000}, {0xc28fa000}, {0xc28fc000}, {0xc28fe000},
- {0xc2900000}, {0xc2902000}, {0xc2904000}, {0xc2906000},
- {0xc2908000}, {0xc290a000}, {0xc290c000}, {0xc290e000},
- {0xc2910000}, {0xc2912000}, {0xc2914000}, {0xc2916000},
- {0xc2918000}, {0xc291a000}, {0xc291c000}, {0xc291e000},
- {0xc2920000}, {0xc2922000}, {0xc2924000}, {0xc2926000},
- {0xc2928000}, {0xc292a000}, {0xc292c000}, {0xc292e000},
- {0xc2930000}, {0xc2932000}, {0xc2934000}, {0xc2936000},
- {0xc2938000}, {0xc293a000}, {0xc293c000}, {0xc293e000},
- {0xc2940000}, {0xc2942000}, {0xc2944000}, {0xc2946000},
- {0xc2948000}, {0xc294a000}, {0xc294c000}, {0xc294e000},
- {0xc2950000}, {0xc2952000}, {0xc2954000}, {0xc2956000},
- {0xc2958000}, {0xc295a000}, {0xc295c000}, {0xc295e000},
- {0xc2960000}, {0xc2962000}, {0xc2964000}, {0xc2966000},
- {0xc2968000}, {0xc296a000}, {0xc296c000}, {0xc296e000},
- {0xc2970000}, {0xc2972000}, {0xc2974000}, {0xc2976000},
- {0xc2978000}, {0xc297a000}, {0xc297c000}, {0xc297e000},
- {0xc2980000}, {0xc2982000}, {0xc2984000}, {0xc2986000},
- {0xc2988000}, {0xc298a000}, {0xc298c000}, {0xc298e000},
- {0xc2990000}, {0xc2992000}, {0xc2994000}, {0xc2996000},
- {0xc2998000}, {0xc299a000}, {0xc299c000}, {0xc299e000},
- {0xc29a0000}, {0xc29a2000}, {0xc29a4000}, {0xc29a6000},
- {0xc29a8000}, {0xc29aa000}, {0xc29ac000}, {0xc29ae000},
- {0xc29b0000}, {0xc29b2000}, {0xc29b4000}, {0xc29b6000},
- {0xc29b8000}, {0xc29ba000}, {0xc29bc000}, {0xc29be000},
- {0xc29c0000}, {0xc29c2000}, {0xc29c4000}, {0xc29c6000},
- {0xc29c8000}, {0xc29ca000}, {0xc29cc000}, {0xc29ce000},
- {0xc29d0000}, {0xc29d2000}, {0xc29d4000}, {0xc29d6000},
- {0xc29d8000}, {0xc29da000}, {0xc29dc000}, {0xc29de000},
- {0xc29e0000}, {0xc29e2000}, {0xc29e4000}, {0xc29e6000},
- {0xc29e8000}, {0xc29ea000}, {0xc29ec000}, {0xc29ee000},
- {0xc29f0000}, {0xc29f2000}, {0xc29f4000}, {0xc29f6000},
- {0xc29f8000}, {0xc29fa000}, {0xc29fc000}, {0xc29fe000},
- {0xc2a00000}, {0xc2a02000}, {0xc2a04000}, {0xc2a06000},
- {0xc2a08000}, {0xc2a0a000}, {0xc2a0c000}, {0xc2a0e000},
- {0xc2a10000}, {0xc2a12000}, {0xc2a14000}, {0xc2a16000},
- {0xc2a18000}, {0xc2a1a000}, {0xc2a1c000}, {0xc2a1e000},
- {0xc2a20000}, {0xc2a22000}, {0xc2a24000}, {0xc2a26000},
- {0xc2a28000}, {0xc2a2a000}, {0xc2a2c000}, {0xc2a2e000},
- {0xc2a30000}, {0xc2a32000}, {0xc2a34000}, {0xc2a36000},
- {0xc2a38000}, {0xc2a3a000}, {0xc2a3c000}, {0xc2a3e000},
- {0xc2a40000}, {0xc2a42000}, {0xc2a44000}, {0xc2a46000},
- {0xc2a48000}, {0xc2a4a000}, {0xc2a4c000}, {0xc2a4e000},
- {0xc2a50000}, {0xc2a52000}, {0xc2a54000}, {0xc2a56000},
- {0xc2a58000}, {0xc2a5a000}, {0xc2a5c000}, {0xc2a5e000},
- {0xc2a60000}, {0xc2a62000}, {0xc2a64000}, {0xc2a66000},
- {0xc2a68000}, {0xc2a6a000}, {0xc2a6c000}, {0xc2a6e000},
- {0xc2a70000}, {0xc2a72000}, {0xc2a74000}, {0xc2a76000},
- {0xc2a78000}, {0xc2a7a000}, {0xc2a7c000}, {0xc2a7e000},
- {0xc2a80000}, {0xc2a82000}, {0xc2a84000}, {0xc2a86000},
- {0xc2a88000}, {0xc2a8a000}, {0xc2a8c000}, {0xc2a8e000},
- {0xc2a90000}, {0xc2a92000}, {0xc2a94000}, {0xc2a96000},
- {0xc2a98000}, {0xc2a9a000}, {0xc2a9c000}, {0xc2a9e000},
- {0xc2aa0000}, {0xc2aa2000}, {0xc2aa4000}, {0xc2aa6000},
- {0xc2aa8000}, {0xc2aaa000}, {0xc2aac000}, {0xc2aae000},
- {0xc2ab0000}, {0xc2ab2000}, {0xc2ab4000}, {0xc2ab6000},
- {0xc2ab8000}, {0xc2aba000}, {0xc2abc000}, {0xc2abe000},
- {0xc2ac0000}, {0xc2ac2000}, {0xc2ac4000}, {0xc2ac6000},
- {0xc2ac8000}, {0xc2aca000}, {0xc2acc000}, {0xc2ace000},
- {0xc2ad0000}, {0xc2ad2000}, {0xc2ad4000}, {0xc2ad6000},
- {0xc2ad8000}, {0xc2ada000}, {0xc2adc000}, {0xc2ade000},
- {0xc2ae0000}, {0xc2ae2000}, {0xc2ae4000}, {0xc2ae6000},
- {0xc2ae8000}, {0xc2aea000}, {0xc2aec000}, {0xc2aee000},
- {0xc2af0000}, {0xc2af2000}, {0xc2af4000}, {0xc2af6000},
- {0xc2af8000}, {0xc2afa000}, {0xc2afc000}, {0xc2afe000},
- {0xc2b00000}, {0xc2b02000}, {0xc2b04000}, {0xc2b06000},
- {0xc2b08000}, {0xc2b0a000}, {0xc2b0c000}, {0xc2b0e000},
- {0xc2b10000}, {0xc2b12000}, {0xc2b14000}, {0xc2b16000},
- {0xc2b18000}, {0xc2b1a000}, {0xc2b1c000}, {0xc2b1e000},
- {0xc2b20000}, {0xc2b22000}, {0xc2b24000}, {0xc2b26000},
- {0xc2b28000}, {0xc2b2a000}, {0xc2b2c000}, {0xc2b2e000},
- {0xc2b30000}, {0xc2b32000}, {0xc2b34000}, {0xc2b36000},
- {0xc2b38000}, {0xc2b3a000}, {0xc2b3c000}, {0xc2b3e000},
- {0xc2b40000}, {0xc2b42000}, {0xc2b44000}, {0xc2b46000},
- {0xc2b48000}, {0xc2b4a000}, {0xc2b4c000}, {0xc2b4e000},
- {0xc2b50000}, {0xc2b52000}, {0xc2b54000}, {0xc2b56000},
- {0xc2b58000}, {0xc2b5a000}, {0xc2b5c000}, {0xc2b5e000},
- {0xc2b60000}, {0xc2b62000}, {0xc2b64000}, {0xc2b66000},
- {0xc2b68000}, {0xc2b6a000}, {0xc2b6c000}, {0xc2b6e000},
- {0xc2b70000}, {0xc2b72000}, {0xc2b74000}, {0xc2b76000},
- {0xc2b78000}, {0xc2b7a000}, {0xc2b7c000}, {0xc2b7e000},
- {0xc2b80000}, {0xc2b82000}, {0xc2b84000}, {0xc2b86000},
- {0xc2b88000}, {0xc2b8a000}, {0xc2b8c000}, {0xc2b8e000},
- {0xc2b90000}, {0xc2b92000}, {0xc2b94000}, {0xc2b96000},
- {0xc2b98000}, {0xc2b9a000}, {0xc2b9c000}, {0xc2b9e000},
- {0xc2ba0000}, {0xc2ba2000}, {0xc2ba4000}, {0xc2ba6000},
- {0xc2ba8000}, {0xc2baa000}, {0xc2bac000}, {0xc2bae000},
- {0xc2bb0000}, {0xc2bb2000}, {0xc2bb4000}, {0xc2bb6000},
- {0xc2bb8000}, {0xc2bba000}, {0xc2bbc000}, {0xc2bbe000},
- {0xc2bc0000}, {0xc2bc2000}, {0xc2bc4000}, {0xc2bc6000},
- {0xc2bc8000}, {0xc2bca000}, {0xc2bcc000}, {0xc2bce000},
- {0xc2bd0000}, {0xc2bd2000}, {0xc2bd4000}, {0xc2bd6000},
- {0xc2bd8000}, {0xc2bda000}, {0xc2bdc000}, {0xc2bde000},
- {0xc2be0000}, {0xc2be2000}, {0xc2be4000}, {0xc2be6000},
- {0xc2be8000}, {0xc2bea000}, {0xc2bec000}, {0xc2bee000},
- {0xc2bf0000}, {0xc2bf2000}, {0xc2bf4000}, {0xc2bf6000},
- {0xc2bf8000}, {0xc2bfa000}, {0xc2bfc000}, {0xc2bfe000},
- {0xc2c00000}, {0xc2c02000}, {0xc2c04000}, {0xc2c06000},
- {0xc2c08000}, {0xc2c0a000}, {0xc2c0c000}, {0xc2c0e000},
- {0xc2c10000}, {0xc2c12000}, {0xc2c14000}, {0xc2c16000},
- {0xc2c18000}, {0xc2c1a000}, {0xc2c1c000}, {0xc2c1e000},
- {0xc2c20000}, {0xc2c22000}, {0xc2c24000}, {0xc2c26000},
- {0xc2c28000}, {0xc2c2a000}, {0xc2c2c000}, {0xc2c2e000},
- {0xc2c30000}, {0xc2c32000}, {0xc2c34000}, {0xc2c36000},
- {0xc2c38000}, {0xc2c3a000}, {0xc2c3c000}, {0xc2c3e000},
- {0xc2c40000}, {0xc2c42000}, {0xc2c44000}, {0xc2c46000},
- {0xc2c48000}, {0xc2c4a000}, {0xc2c4c000}, {0xc2c4e000},
- {0xc2c50000}, {0xc2c52000}, {0xc2c54000}, {0xc2c56000},
- {0xc2c58000}, {0xc2c5a000}, {0xc2c5c000}, {0xc2c5e000},
- {0xc2c60000}, {0xc2c62000}, {0xc2c64000}, {0xc2c66000},
- {0xc2c68000}, {0xc2c6a000}, {0xc2c6c000}, {0xc2c6e000},
- {0xc2c70000}, {0xc2c72000}, {0xc2c74000}, {0xc2c76000},
- {0xc2c78000}, {0xc2c7a000}, {0xc2c7c000}, {0xc2c7e000},
- {0xc2c80000}, {0xc2c82000}, {0xc2c84000}, {0xc2c86000},
- {0xc2c88000}, {0xc2c8a000}, {0xc2c8c000}, {0xc2c8e000},
- {0xc2c90000}, {0xc2c92000}, {0xc2c94000}, {0xc2c96000},
- {0xc2c98000}, {0xc2c9a000}, {0xc2c9c000}, {0xc2c9e000},
- {0xc2ca0000}, {0xc2ca2000}, {0xc2ca4000}, {0xc2ca6000},
- {0xc2ca8000}, {0xc2caa000}, {0xc2cac000}, {0xc2cae000},
- {0xc2cb0000}, {0xc2cb2000}, {0xc2cb4000}, {0xc2cb6000},
- {0xc2cb8000}, {0xc2cba000}, {0xc2cbc000}, {0xc2cbe000},
- {0xc2cc0000}, {0xc2cc2000}, {0xc2cc4000}, {0xc2cc6000},
- {0xc2cc8000}, {0xc2cca000}, {0xc2ccc000}, {0xc2cce000},
- {0xc2cd0000}, {0xc2cd2000}, {0xc2cd4000}, {0xc2cd6000},
- {0xc2cd8000}, {0xc2cda000}, {0xc2cdc000}, {0xc2cde000},
- {0xc2ce0000}, {0xc2ce2000}, {0xc2ce4000}, {0xc2ce6000},
- {0xc2ce8000}, {0xc2cea000}, {0xc2cec000}, {0xc2cee000},
- {0xc2cf0000}, {0xc2cf2000}, {0xc2cf4000}, {0xc2cf6000},
- {0xc2cf8000}, {0xc2cfa000}, {0xc2cfc000}, {0xc2cfe000},
- {0xc2d00000}, {0xc2d02000}, {0xc2d04000}, {0xc2d06000},
- {0xc2d08000}, {0xc2d0a000}, {0xc2d0c000}, {0xc2d0e000},
- {0xc2d10000}, {0xc2d12000}, {0xc2d14000}, {0xc2d16000},
- {0xc2d18000}, {0xc2d1a000}, {0xc2d1c000}, {0xc2d1e000},
- {0xc2d20000}, {0xc2d22000}, {0xc2d24000}, {0xc2d26000},
- {0xc2d28000}, {0xc2d2a000}, {0xc2d2c000}, {0xc2d2e000},
- {0xc2d30000}, {0xc2d32000}, {0xc2d34000}, {0xc2d36000},
- {0xc2d38000}, {0xc2d3a000}, {0xc2d3c000}, {0xc2d3e000},
- {0xc2d40000}, {0xc2d42000}, {0xc2d44000}, {0xc2d46000},
- {0xc2d48000}, {0xc2d4a000}, {0xc2d4c000}, {0xc2d4e000},
- {0xc2d50000}, {0xc2d52000}, {0xc2d54000}, {0xc2d56000},
- {0xc2d58000}, {0xc2d5a000}, {0xc2d5c000}, {0xc2d5e000},
- {0xc2d60000}, {0xc2d62000}, {0xc2d64000}, {0xc2d66000},
- {0xc2d68000}, {0xc2d6a000}, {0xc2d6c000}, {0xc2d6e000},
- {0xc2d70000}, {0xc2d72000}, {0xc2d74000}, {0xc2d76000},
- {0xc2d78000}, {0xc2d7a000}, {0xc2d7c000}, {0xc2d7e000},
- {0xc2d80000}, {0xc2d82000}, {0xc2d84000}, {0xc2d86000},
- {0xc2d88000}, {0xc2d8a000}, {0xc2d8c000}, {0xc2d8e000},
- {0xc2d90000}, {0xc2d92000}, {0xc2d94000}, {0xc2d96000},
- {0xc2d98000}, {0xc2d9a000}, {0xc2d9c000}, {0xc2d9e000},
- {0xc2da0000}, {0xc2da2000}, {0xc2da4000}, {0xc2da6000},
- {0xc2da8000}, {0xc2daa000}, {0xc2dac000}, {0xc2dae000},
- {0xc2db0000}, {0xc2db2000}, {0xc2db4000}, {0xc2db6000},
- {0xc2db8000}, {0xc2dba000}, {0xc2dbc000}, {0xc2dbe000},
- {0xc2dc0000}, {0xc2dc2000}, {0xc2dc4000}, {0xc2dc6000},
- {0xc2dc8000}, {0xc2dca000}, {0xc2dcc000}, {0xc2dce000},
- {0xc2dd0000}, {0xc2dd2000}, {0xc2dd4000}, {0xc2dd6000},
- {0xc2dd8000}, {0xc2dda000}, {0xc2ddc000}, {0xc2dde000},
- {0xc2de0000}, {0xc2de2000}, {0xc2de4000}, {0xc2de6000},
- {0xc2de8000}, {0xc2dea000}, {0xc2dec000}, {0xc2dee000},
- {0xc2df0000}, {0xc2df2000}, {0xc2df4000}, {0xc2df6000},
- {0xc2df8000}, {0xc2dfa000}, {0xc2dfc000}, {0xc2dfe000},
- {0xc2e00000}, {0xc2e02000}, {0xc2e04000}, {0xc2e06000},
- {0xc2e08000}, {0xc2e0a000}, {0xc2e0c000}, {0xc2e0e000},
- {0xc2e10000}, {0xc2e12000}, {0xc2e14000}, {0xc2e16000},
- {0xc2e18000}, {0xc2e1a000}, {0xc2e1c000}, {0xc2e1e000},
- {0xc2e20000}, {0xc2e22000}, {0xc2e24000}, {0xc2e26000},
- {0xc2e28000}, {0xc2e2a000}, {0xc2e2c000}, {0xc2e2e000},
- {0xc2e30000}, {0xc2e32000}, {0xc2e34000}, {0xc2e36000},
- {0xc2e38000}, {0xc2e3a000}, {0xc2e3c000}, {0xc2e3e000},
- {0xc2e40000}, {0xc2e42000}, {0xc2e44000}, {0xc2e46000},
- {0xc2e48000}, {0xc2e4a000}, {0xc2e4c000}, {0xc2e4e000},
- {0xc2e50000}, {0xc2e52000}, {0xc2e54000}, {0xc2e56000},
- {0xc2e58000}, {0xc2e5a000}, {0xc2e5c000}, {0xc2e5e000},
- {0xc2e60000}, {0xc2e62000}, {0xc2e64000}, {0xc2e66000},
- {0xc2e68000}, {0xc2e6a000}, {0xc2e6c000}, {0xc2e6e000},
- {0xc2e70000}, {0xc2e72000}, {0xc2e74000}, {0xc2e76000},
- {0xc2e78000}, {0xc2e7a000}, {0xc2e7c000}, {0xc2e7e000},
- {0xc2e80000}, {0xc2e82000}, {0xc2e84000}, {0xc2e86000},
- {0xc2e88000}, {0xc2e8a000}, {0xc2e8c000}, {0xc2e8e000},
- {0xc2e90000}, {0xc2e92000}, {0xc2e94000}, {0xc2e96000},
- {0xc2e98000}, {0xc2e9a000}, {0xc2e9c000}, {0xc2e9e000},
- {0xc2ea0000}, {0xc2ea2000}, {0xc2ea4000}, {0xc2ea6000},
- {0xc2ea8000}, {0xc2eaa000}, {0xc2eac000}, {0xc2eae000},
- {0xc2eb0000}, {0xc2eb2000}, {0xc2eb4000}, {0xc2eb6000},
- {0xc2eb8000}, {0xc2eba000}, {0xc2ebc000}, {0xc2ebe000},
- {0xc2ec0000}, {0xc2ec2000}, {0xc2ec4000}, {0xc2ec6000},
- {0xc2ec8000}, {0xc2eca000}, {0xc2ecc000}, {0xc2ece000},
- {0xc2ed0000}, {0xc2ed2000}, {0xc2ed4000}, {0xc2ed6000},
- {0xc2ed8000}, {0xc2eda000}, {0xc2edc000}, {0xc2ede000},
- {0xc2ee0000}, {0xc2ee2000}, {0xc2ee4000}, {0xc2ee6000},
- {0xc2ee8000}, {0xc2eea000}, {0xc2eec000}, {0xc2eee000},
- {0xc2ef0000}, {0xc2ef2000}, {0xc2ef4000}, {0xc2ef6000},
- {0xc2ef8000}, {0xc2efa000}, {0xc2efc000}, {0xc2efe000},
- {0xc2f00000}, {0xc2f02000}, {0xc2f04000}, {0xc2f06000},
- {0xc2f08000}, {0xc2f0a000}, {0xc2f0c000}, {0xc2f0e000},
- {0xc2f10000}, {0xc2f12000}, {0xc2f14000}, {0xc2f16000},
- {0xc2f18000}, {0xc2f1a000}, {0xc2f1c000}, {0xc2f1e000},
- {0xc2f20000}, {0xc2f22000}, {0xc2f24000}, {0xc2f26000},
- {0xc2f28000}, {0xc2f2a000}, {0xc2f2c000}, {0xc2f2e000},
- {0xc2f30000}, {0xc2f32000}, {0xc2f34000}, {0xc2f36000},
- {0xc2f38000}, {0xc2f3a000}, {0xc2f3c000}, {0xc2f3e000},
- {0xc2f40000}, {0xc2f42000}, {0xc2f44000}, {0xc2f46000},
- {0xc2f48000}, {0xc2f4a000}, {0xc2f4c000}, {0xc2f4e000},
- {0xc2f50000}, {0xc2f52000}, {0xc2f54000}, {0xc2f56000},
- {0xc2f58000}, {0xc2f5a000}, {0xc2f5c000}, {0xc2f5e000},
- {0xc2f60000}, {0xc2f62000}, {0xc2f64000}, {0xc2f66000},
- {0xc2f68000}, {0xc2f6a000}, {0xc2f6c000}, {0xc2f6e000},
- {0xc2f70000}, {0xc2f72000}, {0xc2f74000}, {0xc2f76000},
- {0xc2f78000}, {0xc2f7a000}, {0xc2f7c000}, {0xc2f7e000},
- {0xc2f80000}, {0xc2f82000}, {0xc2f84000}, {0xc2f86000},
- {0xc2f88000}, {0xc2f8a000}, {0xc2f8c000}, {0xc2f8e000},
- {0xc2f90000}, {0xc2f92000}, {0xc2f94000}, {0xc2f96000},
- {0xc2f98000}, {0xc2f9a000}, {0xc2f9c000}, {0xc2f9e000},
- {0xc2fa0000}, {0xc2fa2000}, {0xc2fa4000}, {0xc2fa6000},
- {0xc2fa8000}, {0xc2faa000}, {0xc2fac000}, {0xc2fae000},
- {0xc2fb0000}, {0xc2fb2000}, {0xc2fb4000}, {0xc2fb6000},
- {0xc2fb8000}, {0xc2fba000}, {0xc2fbc000}, {0xc2fbe000},
- {0xc2fc0000}, {0xc2fc2000}, {0xc2fc4000}, {0xc2fc6000},
- {0xc2fc8000}, {0xc2fca000}, {0xc2fcc000}, {0xc2fce000},
- {0xc2fd0000}, {0xc2fd2000}, {0xc2fd4000}, {0xc2fd6000},
- {0xc2fd8000}, {0xc2fda000}, {0xc2fdc000}, {0xc2fde000},
- {0xc2fe0000}, {0xc2fe2000}, {0xc2fe4000}, {0xc2fe6000},
- {0xc2fe8000}, {0xc2fea000}, {0xc2fec000}, {0xc2fee000},
- {0xc2ff0000}, {0xc2ff2000}, {0xc2ff4000}, {0xc2ff6000},
- {0xc2ff8000}, {0xc2ffa000}, {0xc2ffc000}, {0xc2ffe000},
- {0xc3000000}, {0xc3002000}, {0xc3004000}, {0xc3006000},
- {0xc3008000}, {0xc300a000}, {0xc300c000}, {0xc300e000},
- {0xc3010000}, {0xc3012000}, {0xc3014000}, {0xc3016000},
- {0xc3018000}, {0xc301a000}, {0xc301c000}, {0xc301e000},
- {0xc3020000}, {0xc3022000}, {0xc3024000}, {0xc3026000},
- {0xc3028000}, {0xc302a000}, {0xc302c000}, {0xc302e000},
- {0xc3030000}, {0xc3032000}, {0xc3034000}, {0xc3036000},
- {0xc3038000}, {0xc303a000}, {0xc303c000}, {0xc303e000},
- {0xc3040000}, {0xc3042000}, {0xc3044000}, {0xc3046000},
- {0xc3048000}, {0xc304a000}, {0xc304c000}, {0xc304e000},
- {0xc3050000}, {0xc3052000}, {0xc3054000}, {0xc3056000},
- {0xc3058000}, {0xc305a000}, {0xc305c000}, {0xc305e000},
- {0xc3060000}, {0xc3062000}, {0xc3064000}, {0xc3066000},
- {0xc3068000}, {0xc306a000}, {0xc306c000}, {0xc306e000},
- {0xc3070000}, {0xc3072000}, {0xc3074000}, {0xc3076000},
- {0xc3078000}, {0xc307a000}, {0xc307c000}, {0xc307e000},
- {0xc3080000}, {0xc3082000}, {0xc3084000}, {0xc3086000},
- {0xc3088000}, {0xc308a000}, {0xc308c000}, {0xc308e000},
- {0xc3090000}, {0xc3092000}, {0xc3094000}, {0xc3096000},
- {0xc3098000}, {0xc309a000}, {0xc309c000}, {0xc309e000},
- {0xc30a0000}, {0xc30a2000}, {0xc30a4000}, {0xc30a6000},
- {0xc30a8000}, {0xc30aa000}, {0xc30ac000}, {0xc30ae000},
- {0xc30b0000}, {0xc30b2000}, {0xc30b4000}, {0xc30b6000},
- {0xc30b8000}, {0xc30ba000}, {0xc30bc000}, {0xc30be000},
- {0xc30c0000}, {0xc30c2000}, {0xc30c4000}, {0xc30c6000},
- {0xc30c8000}, {0xc30ca000}, {0xc30cc000}, {0xc30ce000},
- {0xc30d0000}, {0xc30d2000}, {0xc30d4000}, {0xc30d6000},
- {0xc30d8000}, {0xc30da000}, {0xc30dc000}, {0xc30de000},
- {0xc30e0000}, {0xc30e2000}, {0xc30e4000}, {0xc30e6000},
- {0xc30e8000}, {0xc30ea000}, {0xc30ec000}, {0xc30ee000},
- {0xc30f0000}, {0xc30f2000}, {0xc30f4000}, {0xc30f6000},
- {0xc30f8000}, {0xc30fa000}, {0xc30fc000}, {0xc30fe000},
- {0xc3100000}, {0xc3102000}, {0xc3104000}, {0xc3106000},
- {0xc3108000}, {0xc310a000}, {0xc310c000}, {0xc310e000},
- {0xc3110000}, {0xc3112000}, {0xc3114000}, {0xc3116000},
- {0xc3118000}, {0xc311a000}, {0xc311c000}, {0xc311e000},
- {0xc3120000}, {0xc3122000}, {0xc3124000}, {0xc3126000},
- {0xc3128000}, {0xc312a000}, {0xc312c000}, {0xc312e000},
- {0xc3130000}, {0xc3132000}, {0xc3134000}, {0xc3136000},
- {0xc3138000}, {0xc313a000}, {0xc313c000}, {0xc313e000},
- {0xc3140000}, {0xc3142000}, {0xc3144000}, {0xc3146000},
- {0xc3148000}, {0xc314a000}, {0xc314c000}, {0xc314e000},
- {0xc3150000}, {0xc3152000}, {0xc3154000}, {0xc3156000},
- {0xc3158000}, {0xc315a000}, {0xc315c000}, {0xc315e000},
- {0xc3160000}, {0xc3162000}, {0xc3164000}, {0xc3166000},
- {0xc3168000}, {0xc316a000}, {0xc316c000}, {0xc316e000},
- {0xc3170000}, {0xc3172000}, {0xc3174000}, {0xc3176000},
- {0xc3178000}, {0xc317a000}, {0xc317c000}, {0xc317e000},
- {0xc3180000}, {0xc3182000}, {0xc3184000}, {0xc3186000},
- {0xc3188000}, {0xc318a000}, {0xc318c000}, {0xc318e000},
- {0xc3190000}, {0xc3192000}, {0xc3194000}, {0xc3196000},
- {0xc3198000}, {0xc319a000}, {0xc319c000}, {0xc319e000},
- {0xc31a0000}, {0xc31a2000}, {0xc31a4000}, {0xc31a6000},
- {0xc31a8000}, {0xc31aa000}, {0xc31ac000}, {0xc31ae000},
- {0xc31b0000}, {0xc31b2000}, {0xc31b4000}, {0xc31b6000},
- {0xc31b8000}, {0xc31ba000}, {0xc31bc000}, {0xc31be000},
- {0xc31c0000}, {0xc31c2000}, {0xc31c4000}, {0xc31c6000},
- {0xc31c8000}, {0xc31ca000}, {0xc31cc000}, {0xc31ce000},
- {0xc31d0000}, {0xc31d2000}, {0xc31d4000}, {0xc31d6000},
- {0xc31d8000}, {0xc31da000}, {0xc31dc000}, {0xc31de000},
- {0xc31e0000}, {0xc31e2000}, {0xc31e4000}, {0xc31e6000},
- {0xc31e8000}, {0xc31ea000}, {0xc31ec000}, {0xc31ee000},
- {0xc31f0000}, {0xc31f2000}, {0xc31f4000}, {0xc31f6000},
- {0xc31f8000}, {0xc31fa000}, {0xc31fc000}, {0xc31fe000},
- {0xc3200000}, {0xc3202000}, {0xc3204000}, {0xc3206000},
- {0xc3208000}, {0xc320a000}, {0xc320c000}, {0xc320e000},
- {0xc3210000}, {0xc3212000}, {0xc3214000}, {0xc3216000},
- {0xc3218000}, {0xc321a000}, {0xc321c000}, {0xc321e000},
- {0xc3220000}, {0xc3222000}, {0xc3224000}, {0xc3226000},
- {0xc3228000}, {0xc322a000}, {0xc322c000}, {0xc322e000},
- {0xc3230000}, {0xc3232000}, {0xc3234000}, {0xc3236000},
- {0xc3238000}, {0xc323a000}, {0xc323c000}, {0xc323e000},
- {0xc3240000}, {0xc3242000}, {0xc3244000}, {0xc3246000},
- {0xc3248000}, {0xc324a000}, {0xc324c000}, {0xc324e000},
- {0xc3250000}, {0xc3252000}, {0xc3254000}, {0xc3256000},
- {0xc3258000}, {0xc325a000}, {0xc325c000}, {0xc325e000},
- {0xc3260000}, {0xc3262000}, {0xc3264000}, {0xc3266000},
- {0xc3268000}, {0xc326a000}, {0xc326c000}, {0xc326e000},
- {0xc3270000}, {0xc3272000}, {0xc3274000}, {0xc3276000},
- {0xc3278000}, {0xc327a000}, {0xc327c000}, {0xc327e000},
- {0xc3280000}, {0xc3282000}, {0xc3284000}, {0xc3286000},
- {0xc3288000}, {0xc328a000}, {0xc328c000}, {0xc328e000},
- {0xc3290000}, {0xc3292000}, {0xc3294000}, {0xc3296000},
- {0xc3298000}, {0xc329a000}, {0xc329c000}, {0xc329e000},
- {0xc32a0000}, {0xc32a2000}, {0xc32a4000}, {0xc32a6000},
- {0xc32a8000}, {0xc32aa000}, {0xc32ac000}, {0xc32ae000},
- {0xc32b0000}, {0xc32b2000}, {0xc32b4000}, {0xc32b6000},
- {0xc32b8000}, {0xc32ba000}, {0xc32bc000}, {0xc32be000},
- {0xc32c0000}, {0xc32c2000}, {0xc32c4000}, {0xc32c6000},
- {0xc32c8000}, {0xc32ca000}, {0xc32cc000}, {0xc32ce000},
- {0xc32d0000}, {0xc32d2000}, {0xc32d4000}, {0xc32d6000},
- {0xc32d8000}, {0xc32da000}, {0xc32dc000}, {0xc32de000},
- {0xc32e0000}, {0xc32e2000}, {0xc32e4000}, {0xc32e6000},
- {0xc32e8000}, {0xc32ea000}, {0xc32ec000}, {0xc32ee000},
- {0xc32f0000}, {0xc32f2000}, {0xc32f4000}, {0xc32f6000},
- {0xc32f8000}, {0xc32fa000}, {0xc32fc000}, {0xc32fe000},
- {0xc3300000}, {0xc3302000}, {0xc3304000}, {0xc3306000},
- {0xc3308000}, {0xc330a000}, {0xc330c000}, {0xc330e000},
- {0xc3310000}, {0xc3312000}, {0xc3314000}, {0xc3316000},
- {0xc3318000}, {0xc331a000}, {0xc331c000}, {0xc331e000},
- {0xc3320000}, {0xc3322000}, {0xc3324000}, {0xc3326000},
- {0xc3328000}, {0xc332a000}, {0xc332c000}, {0xc332e000},
- {0xc3330000}, {0xc3332000}, {0xc3334000}, {0xc3336000},
- {0xc3338000}, {0xc333a000}, {0xc333c000}, {0xc333e000},
- {0xc3340000}, {0xc3342000}, {0xc3344000}, {0xc3346000},
- {0xc3348000}, {0xc334a000}, {0xc334c000}, {0xc334e000},
- {0xc3350000}, {0xc3352000}, {0xc3354000}, {0xc3356000},
- {0xc3358000}, {0xc335a000}, {0xc335c000}, {0xc335e000},
- {0xc3360000}, {0xc3362000}, {0xc3364000}, {0xc3366000},
- {0xc3368000}, {0xc336a000}, {0xc336c000}, {0xc336e000},
- {0xc3370000}, {0xc3372000}, {0xc3374000}, {0xc3376000},
- {0xc3378000}, {0xc337a000}, {0xc337c000}, {0xc337e000},
- {0xc3380000}, {0xc3382000}, {0xc3384000}, {0xc3386000},
- {0xc3388000}, {0xc338a000}, {0xc338c000}, {0xc338e000},
- {0xc3390000}, {0xc3392000}, {0xc3394000}, {0xc3396000},
- {0xc3398000}, {0xc339a000}, {0xc339c000}, {0xc339e000},
- {0xc33a0000}, {0xc33a2000}, {0xc33a4000}, {0xc33a6000},
- {0xc33a8000}, {0xc33aa000}, {0xc33ac000}, {0xc33ae000},
- {0xc33b0000}, {0xc33b2000}, {0xc33b4000}, {0xc33b6000},
- {0xc33b8000}, {0xc33ba000}, {0xc33bc000}, {0xc33be000},
- {0xc33c0000}, {0xc33c2000}, {0xc33c4000}, {0xc33c6000},
- {0xc33c8000}, {0xc33ca000}, {0xc33cc000}, {0xc33ce000},
- {0xc33d0000}, {0xc33d2000}, {0xc33d4000}, {0xc33d6000},
- {0xc33d8000}, {0xc33da000}, {0xc33dc000}, {0xc33de000},
- {0xc33e0000}, {0xc33e2000}, {0xc33e4000}, {0xc33e6000},
- {0xc33e8000}, {0xc33ea000}, {0xc33ec000}, {0xc33ee000},
- {0xc33f0000}, {0xc33f2000}, {0xc33f4000}, {0xc33f6000},
- {0xc33f8000}, {0xc33fa000}, {0xc33fc000}, {0xc33fe000},
- {0xc3400000}, {0xc3402000}, {0xc3404000}, {0xc3406000},
- {0xc3408000}, {0xc340a000}, {0xc340c000}, {0xc340e000},
- {0xc3410000}, {0xc3412000}, {0xc3414000}, {0xc3416000},
- {0xc3418000}, {0xc341a000}, {0xc341c000}, {0xc341e000},
- {0xc3420000}, {0xc3422000}, {0xc3424000}, {0xc3426000},
- {0xc3428000}, {0xc342a000}, {0xc342c000}, {0xc342e000},
- {0xc3430000}, {0xc3432000}, {0xc3434000}, {0xc3436000},
- {0xc3438000}, {0xc343a000}, {0xc343c000}, {0xc343e000},
- {0xc3440000}, {0xc3442000}, {0xc3444000}, {0xc3446000},
- {0xc3448000}, {0xc344a000}, {0xc344c000}, {0xc344e000},
- {0xc3450000}, {0xc3452000}, {0xc3454000}, {0xc3456000},
- {0xc3458000}, {0xc345a000}, {0xc345c000}, {0xc345e000},
- {0xc3460000}, {0xc3462000}, {0xc3464000}, {0xc3466000},
- {0xc3468000}, {0xc346a000}, {0xc346c000}, {0xc346e000},
- {0xc3470000}, {0xc3472000}, {0xc3474000}, {0xc3476000},
- {0xc3478000}, {0xc347a000}, {0xc347c000}, {0xc347e000},
- {0xc3480000}, {0xc3482000}, {0xc3484000}, {0xc3486000},
- {0xc3488000}, {0xc348a000}, {0xc348c000}, {0xc348e000},
- {0xc3490000}, {0xc3492000}, {0xc3494000}, {0xc3496000},
- {0xc3498000}, {0xc349a000}, {0xc349c000}, {0xc349e000},
- {0xc34a0000}, {0xc34a2000}, {0xc34a4000}, {0xc34a6000},
- {0xc34a8000}, {0xc34aa000}, {0xc34ac000}, {0xc34ae000},
- {0xc34b0000}, {0xc34b2000}, {0xc34b4000}, {0xc34b6000},
- {0xc34b8000}, {0xc34ba000}, {0xc34bc000}, {0xc34be000},
- {0xc34c0000}, {0xc34c2000}, {0xc34c4000}, {0xc34c6000},
- {0xc34c8000}, {0xc34ca000}, {0xc34cc000}, {0xc34ce000},
- {0xc34d0000}, {0xc34d2000}, {0xc34d4000}, {0xc34d6000},
- {0xc34d8000}, {0xc34da000}, {0xc34dc000}, {0xc34de000},
- {0xc34e0000}, {0xc34e2000}, {0xc34e4000}, {0xc34e6000},
- {0xc34e8000}, {0xc34ea000}, {0xc34ec000}, {0xc34ee000},
- {0xc34f0000}, {0xc34f2000}, {0xc34f4000}, {0xc34f6000},
- {0xc34f8000}, {0xc34fa000}, {0xc34fc000}, {0xc34fe000},
- {0xc3500000}, {0xc3502000}, {0xc3504000}, {0xc3506000},
- {0xc3508000}, {0xc350a000}, {0xc350c000}, {0xc350e000},
- {0xc3510000}, {0xc3512000}, {0xc3514000}, {0xc3516000},
- {0xc3518000}, {0xc351a000}, {0xc351c000}, {0xc351e000},
- {0xc3520000}, {0xc3522000}, {0xc3524000}, {0xc3526000},
- {0xc3528000}, {0xc352a000}, {0xc352c000}, {0xc352e000},
- {0xc3530000}, {0xc3532000}, {0xc3534000}, {0xc3536000},
- {0xc3538000}, {0xc353a000}, {0xc353c000}, {0xc353e000},
- {0xc3540000}, {0xc3542000}, {0xc3544000}, {0xc3546000},
- {0xc3548000}, {0xc354a000}, {0xc354c000}, {0xc354e000},
- {0xc3550000}, {0xc3552000}, {0xc3554000}, {0xc3556000},
- {0xc3558000}, {0xc355a000}, {0xc355c000}, {0xc355e000},
- {0xc3560000}, {0xc3562000}, {0xc3564000}, {0xc3566000},
- {0xc3568000}, {0xc356a000}, {0xc356c000}, {0xc356e000},
- {0xc3570000}, {0xc3572000}, {0xc3574000}, {0xc3576000},
- {0xc3578000}, {0xc357a000}, {0xc357c000}, {0xc357e000},
- {0xc3580000}, {0xc3582000}, {0xc3584000}, {0xc3586000},
- {0xc3588000}, {0xc358a000}, {0xc358c000}, {0xc358e000},
- {0xc3590000}, {0xc3592000}, {0xc3594000}, {0xc3596000},
- {0xc3598000}, {0xc359a000}, {0xc359c000}, {0xc359e000},
- {0xc35a0000}, {0xc35a2000}, {0xc35a4000}, {0xc35a6000},
- {0xc35a8000}, {0xc35aa000}, {0xc35ac000}, {0xc35ae000},
- {0xc35b0000}, {0xc35b2000}, {0xc35b4000}, {0xc35b6000},
- {0xc35b8000}, {0xc35ba000}, {0xc35bc000}, {0xc35be000},
- {0xc35c0000}, {0xc35c2000}, {0xc35c4000}, {0xc35c6000},
- {0xc35c8000}, {0xc35ca000}, {0xc35cc000}, {0xc35ce000},
- {0xc35d0000}, {0xc35d2000}, {0xc35d4000}, {0xc35d6000},
- {0xc35d8000}, {0xc35da000}, {0xc35dc000}, {0xc35de000},
- {0xc35e0000}, {0xc35e2000}, {0xc35e4000}, {0xc35e6000},
- {0xc35e8000}, {0xc35ea000}, {0xc35ec000}, {0xc35ee000},
- {0xc35f0000}, {0xc35f2000}, {0xc35f4000}, {0xc35f6000},
- {0xc35f8000}, {0xc35fa000}, {0xc35fc000}, {0xc35fe000},
- {0xc3600000}, {0xc3602000}, {0xc3604000}, {0xc3606000},
- {0xc3608000}, {0xc360a000}, {0xc360c000}, {0xc360e000},
- {0xc3610000}, {0xc3612000}, {0xc3614000}, {0xc3616000},
- {0xc3618000}, {0xc361a000}, {0xc361c000}, {0xc361e000},
- {0xc3620000}, {0xc3622000}, {0xc3624000}, {0xc3626000},
- {0xc3628000}, {0xc362a000}, {0xc362c000}, {0xc362e000},
- {0xc3630000}, {0xc3632000}, {0xc3634000}, {0xc3636000},
- {0xc3638000}, {0xc363a000}, {0xc363c000}, {0xc363e000},
- {0xc3640000}, {0xc3642000}, {0xc3644000}, {0xc3646000},
- {0xc3648000}, {0xc364a000}, {0xc364c000}, {0xc364e000},
- {0xc3650000}, {0xc3652000}, {0xc3654000}, {0xc3656000},
- {0xc3658000}, {0xc365a000}, {0xc365c000}, {0xc365e000},
- {0xc3660000}, {0xc3662000}, {0xc3664000}, {0xc3666000},
- {0xc3668000}, {0xc366a000}, {0xc366c000}, {0xc366e000},
- {0xc3670000}, {0xc3672000}, {0xc3674000}, {0xc3676000},
- {0xc3678000}, {0xc367a000}, {0xc367c000}, {0xc367e000},
- {0xc3680000}, {0xc3682000}, {0xc3684000}, {0xc3686000},
- {0xc3688000}, {0xc368a000}, {0xc368c000}, {0xc368e000},
- {0xc3690000}, {0xc3692000}, {0xc3694000}, {0xc3696000},
- {0xc3698000}, {0xc369a000}, {0xc369c000}, {0xc369e000},
- {0xc36a0000}, {0xc36a2000}, {0xc36a4000}, {0xc36a6000},
- {0xc36a8000}, {0xc36aa000}, {0xc36ac000}, {0xc36ae000},
- {0xc36b0000}, {0xc36b2000}, {0xc36b4000}, {0xc36b6000},
- {0xc36b8000}, {0xc36ba000}, {0xc36bc000}, {0xc36be000},
- {0xc36c0000}, {0xc36c2000}, {0xc36c4000}, {0xc36c6000},
- {0xc36c8000}, {0xc36ca000}, {0xc36cc000}, {0xc36ce000},
- {0xc36d0000}, {0xc36d2000}, {0xc36d4000}, {0xc36d6000},
- {0xc36d8000}, {0xc36da000}, {0xc36dc000}, {0xc36de000},
- {0xc36e0000}, {0xc36e2000}, {0xc36e4000}, {0xc36e6000},
- {0xc36e8000}, {0xc36ea000}, {0xc36ec000}, {0xc36ee000},
- {0xc36f0000}, {0xc36f2000}, {0xc36f4000}, {0xc36f6000},
- {0xc36f8000}, {0xc36fa000}, {0xc36fc000}, {0xc36fe000},
- {0xc3700000}, {0xc3702000}, {0xc3704000}, {0xc3706000},
- {0xc3708000}, {0xc370a000}, {0xc370c000}, {0xc370e000},
- {0xc3710000}, {0xc3712000}, {0xc3714000}, {0xc3716000},
- {0xc3718000}, {0xc371a000}, {0xc371c000}, {0xc371e000},
- {0xc3720000}, {0xc3722000}, {0xc3724000}, {0xc3726000},
- {0xc3728000}, {0xc372a000}, {0xc372c000}, {0xc372e000},
- {0xc3730000}, {0xc3732000}, {0xc3734000}, {0xc3736000},
- {0xc3738000}, {0xc373a000}, {0xc373c000}, {0xc373e000},
- {0xc3740000}, {0xc3742000}, {0xc3744000}, {0xc3746000},
- {0xc3748000}, {0xc374a000}, {0xc374c000}, {0xc374e000},
- {0xc3750000}, {0xc3752000}, {0xc3754000}, {0xc3756000},
- {0xc3758000}, {0xc375a000}, {0xc375c000}, {0xc375e000},
- {0xc3760000}, {0xc3762000}, {0xc3764000}, {0xc3766000},
- {0xc3768000}, {0xc376a000}, {0xc376c000}, {0xc376e000},
- {0xc3770000}, {0xc3772000}, {0xc3774000}, {0xc3776000},
- {0xc3778000}, {0xc377a000}, {0xc377c000}, {0xc377e000},
- {0xc3780000}, {0xc3782000}, {0xc3784000}, {0xc3786000},
- {0xc3788000}, {0xc378a000}, {0xc378c000}, {0xc378e000},
- {0xc3790000}, {0xc3792000}, {0xc3794000}, {0xc3796000},
- {0xc3798000}, {0xc379a000}, {0xc379c000}, {0xc379e000},
- {0xc37a0000}, {0xc37a2000}, {0xc37a4000}, {0xc37a6000},
- {0xc37a8000}, {0xc37aa000}, {0xc37ac000}, {0xc37ae000},
- {0xc37b0000}, {0xc37b2000}, {0xc37b4000}, {0xc37b6000},
- {0xc37b8000}, {0xc37ba000}, {0xc37bc000}, {0xc37be000},
- {0xc37c0000}, {0xc37c2000}, {0xc37c4000}, {0xc37c6000},
- {0xc37c8000}, {0xc37ca000}, {0xc37cc000}, {0xc37ce000},
- {0xc37d0000}, {0xc37d2000}, {0xc37d4000}, {0xc37d6000},
- {0xc37d8000}, {0xc37da000}, {0xc37dc000}, {0xc37de000},
- {0xc37e0000}, {0xc37e2000}, {0xc37e4000}, {0xc37e6000},
- {0xc37e8000}, {0xc37ea000}, {0xc37ec000}, {0xc37ee000},
- {0xc37f0000}, {0xc37f2000}, {0xc37f4000}, {0xc37f6000},
- {0xc37f8000}, {0xc37fa000}, {0xc37fc000}, {0xc37fe000},
- {0xc3800000}, {0xc3802000}, {0xc3804000}, {0xc3806000},
- {0xc3808000}, {0xc380a000}, {0xc380c000}, {0xc380e000},
- {0xc3810000}, {0xc3812000}, {0xc3814000}, {0xc3816000},
- {0xc3818000}, {0xc381a000}, {0xc381c000}, {0xc381e000},
- {0xc3820000}, {0xc3822000}, {0xc3824000}, {0xc3826000},
- {0xc3828000}, {0xc382a000}, {0xc382c000}, {0xc382e000},
- {0xc3830000}, {0xc3832000}, {0xc3834000}, {0xc3836000},
- {0xc3838000}, {0xc383a000}, {0xc383c000}, {0xc383e000},
- {0xc3840000}, {0xc3842000}, {0xc3844000}, {0xc3846000},
- {0xc3848000}, {0xc384a000}, {0xc384c000}, {0xc384e000},
- {0xc3850000}, {0xc3852000}, {0xc3854000}, {0xc3856000},
- {0xc3858000}, {0xc385a000}, {0xc385c000}, {0xc385e000},
- {0xc3860000}, {0xc3862000}, {0xc3864000}, {0xc3866000},
- {0xc3868000}, {0xc386a000}, {0xc386c000}, {0xc386e000},
- {0xc3870000}, {0xc3872000}, {0xc3874000}, {0xc3876000},
- {0xc3878000}, {0xc387a000}, {0xc387c000}, {0xc387e000},
- {0xc3880000}, {0xc3882000}, {0xc3884000}, {0xc3886000},
- {0xc3888000}, {0xc388a000}, {0xc388c000}, {0xc388e000},
- {0xc3890000}, {0xc3892000}, {0xc3894000}, {0xc3896000},
- {0xc3898000}, {0xc389a000}, {0xc389c000}, {0xc389e000},
- {0xc38a0000}, {0xc38a2000}, {0xc38a4000}, {0xc38a6000},
- {0xc38a8000}, {0xc38aa000}, {0xc38ac000}, {0xc38ae000},
- {0xc38b0000}, {0xc38b2000}, {0xc38b4000}, {0xc38b6000},
- {0xc38b8000}, {0xc38ba000}, {0xc38bc000}, {0xc38be000},
- {0xc38c0000}, {0xc38c2000}, {0xc38c4000}, {0xc38c6000},
- {0xc38c8000}, {0xc38ca000}, {0xc38cc000}, {0xc38ce000},
- {0xc38d0000}, {0xc38d2000}, {0xc38d4000}, {0xc38d6000},
- {0xc38d8000}, {0xc38da000}, {0xc38dc000}, {0xc38de000},
- {0xc38e0000}, {0xc38e2000}, {0xc38e4000}, {0xc38e6000},
- {0xc38e8000}, {0xc38ea000}, {0xc38ec000}, {0xc38ee000},
- {0xc38f0000}, {0xc38f2000}, {0xc38f4000}, {0xc38f6000},
- {0xc38f8000}, {0xc38fa000}, {0xc38fc000}, {0xc38fe000},
- {0xc3900000}, {0xc3902000}, {0xc3904000}, {0xc3906000},
- {0xc3908000}, {0xc390a000}, {0xc390c000}, {0xc390e000},
- {0xc3910000}, {0xc3912000}, {0xc3914000}, {0xc3916000},
- {0xc3918000}, {0xc391a000}, {0xc391c000}, {0xc391e000},
- {0xc3920000}, {0xc3922000}, {0xc3924000}, {0xc3926000},
- {0xc3928000}, {0xc392a000}, {0xc392c000}, {0xc392e000},
- {0xc3930000}, {0xc3932000}, {0xc3934000}, {0xc3936000},
- {0xc3938000}, {0xc393a000}, {0xc393c000}, {0xc393e000},
- {0xc3940000}, {0xc3942000}, {0xc3944000}, {0xc3946000},
- {0xc3948000}, {0xc394a000}, {0xc394c000}, {0xc394e000},
- {0xc3950000}, {0xc3952000}, {0xc3954000}, {0xc3956000},
- {0xc3958000}, {0xc395a000}, {0xc395c000}, {0xc395e000},
- {0xc3960000}, {0xc3962000}, {0xc3964000}, {0xc3966000},
- {0xc3968000}, {0xc396a000}, {0xc396c000}, {0xc396e000},
- {0xc3970000}, {0xc3972000}, {0xc3974000}, {0xc3976000},
- {0xc3978000}, {0xc397a000}, {0xc397c000}, {0xc397e000},
- {0xc3980000}, {0xc3982000}, {0xc3984000}, {0xc3986000},
- {0xc3988000}, {0xc398a000}, {0xc398c000}, {0xc398e000},
- {0xc3990000}, {0xc3992000}, {0xc3994000}, {0xc3996000},
- {0xc3998000}, {0xc399a000}, {0xc399c000}, {0xc399e000},
- {0xc39a0000}, {0xc39a2000}, {0xc39a4000}, {0xc39a6000},
- {0xc39a8000}, {0xc39aa000}, {0xc39ac000}, {0xc39ae000},
- {0xc39b0000}, {0xc39b2000}, {0xc39b4000}, {0xc39b6000},
- {0xc39b8000}, {0xc39ba000}, {0xc39bc000}, {0xc39be000},
- {0xc39c0000}, {0xc39c2000}, {0xc39c4000}, {0xc39c6000},
- {0xc39c8000}, {0xc39ca000}, {0xc39cc000}, {0xc39ce000},
- {0xc39d0000}, {0xc39d2000}, {0xc39d4000}, {0xc39d6000},
- {0xc39d8000}, {0xc39da000}, {0xc39dc000}, {0xc39de000},
- {0xc39e0000}, {0xc39e2000}, {0xc39e4000}, {0xc39e6000},
- {0xc39e8000}, {0xc39ea000}, {0xc39ec000}, {0xc39ee000},
- {0xc39f0000}, {0xc39f2000}, {0xc39f4000}, {0xc39f6000},
- {0xc39f8000}, {0xc39fa000}, {0xc39fc000}, {0xc39fe000},
- {0xc3a00000}, {0xc3a02000}, {0xc3a04000}, {0xc3a06000},
- {0xc3a08000}, {0xc3a0a000}, {0xc3a0c000}, {0xc3a0e000},
- {0xc3a10000}, {0xc3a12000}, {0xc3a14000}, {0xc3a16000},
- {0xc3a18000}, {0xc3a1a000}, {0xc3a1c000}, {0xc3a1e000},
- {0xc3a20000}, {0xc3a22000}, {0xc3a24000}, {0xc3a26000},
- {0xc3a28000}, {0xc3a2a000}, {0xc3a2c000}, {0xc3a2e000},
- {0xc3a30000}, {0xc3a32000}, {0xc3a34000}, {0xc3a36000},
- {0xc3a38000}, {0xc3a3a000}, {0xc3a3c000}, {0xc3a3e000},
- {0xc3a40000}, {0xc3a42000}, {0xc3a44000}, {0xc3a46000},
- {0xc3a48000}, {0xc3a4a000}, {0xc3a4c000}, {0xc3a4e000},
- {0xc3a50000}, {0xc3a52000}, {0xc3a54000}, {0xc3a56000},
- {0xc3a58000}, {0xc3a5a000}, {0xc3a5c000}, {0xc3a5e000},
- {0xc3a60000}, {0xc3a62000}, {0xc3a64000}, {0xc3a66000},
- {0xc3a68000}, {0xc3a6a000}, {0xc3a6c000}, {0xc3a6e000},
- {0xc3a70000}, {0xc3a72000}, {0xc3a74000}, {0xc3a76000},
- {0xc3a78000}, {0xc3a7a000}, {0xc3a7c000}, {0xc3a7e000},
- {0xc3a80000}, {0xc3a82000}, {0xc3a84000}, {0xc3a86000},
- {0xc3a88000}, {0xc3a8a000}, {0xc3a8c000}, {0xc3a8e000},
- {0xc3a90000}, {0xc3a92000}, {0xc3a94000}, {0xc3a96000},
- {0xc3a98000}, {0xc3a9a000}, {0xc3a9c000}, {0xc3a9e000},
- {0xc3aa0000}, {0xc3aa2000}, {0xc3aa4000}, {0xc3aa6000},
- {0xc3aa8000}, {0xc3aaa000}, {0xc3aac000}, {0xc3aae000},
- {0xc3ab0000}, {0xc3ab2000}, {0xc3ab4000}, {0xc3ab6000},
- {0xc3ab8000}, {0xc3aba000}, {0xc3abc000}, {0xc3abe000},
- {0xc3ac0000}, {0xc3ac2000}, {0xc3ac4000}, {0xc3ac6000},
- {0xc3ac8000}, {0xc3aca000}, {0xc3acc000}, {0xc3ace000},
- {0xc3ad0000}, {0xc3ad2000}, {0xc3ad4000}, {0xc3ad6000},
- {0xc3ad8000}, {0xc3ada000}, {0xc3adc000}, {0xc3ade000},
- {0xc3ae0000}, {0xc3ae2000}, {0xc3ae4000}, {0xc3ae6000},
- {0xc3ae8000}, {0xc3aea000}, {0xc3aec000}, {0xc3aee000},
- {0xc3af0000}, {0xc3af2000}, {0xc3af4000}, {0xc3af6000},
- {0xc3af8000}, {0xc3afa000}, {0xc3afc000}, {0xc3afe000},
- {0xc3b00000}, {0xc3b02000}, {0xc3b04000}, {0xc3b06000},
- {0xc3b08000}, {0xc3b0a000}, {0xc3b0c000}, {0xc3b0e000},
- {0xc3b10000}, {0xc3b12000}, {0xc3b14000}, {0xc3b16000},
- {0xc3b18000}, {0xc3b1a000}, {0xc3b1c000}, {0xc3b1e000},
- {0xc3b20000}, {0xc3b22000}, {0xc3b24000}, {0xc3b26000},
- {0xc3b28000}, {0xc3b2a000}, {0xc3b2c000}, {0xc3b2e000},
- {0xc3b30000}, {0xc3b32000}, {0xc3b34000}, {0xc3b36000},
- {0xc3b38000}, {0xc3b3a000}, {0xc3b3c000}, {0xc3b3e000},
- {0xc3b40000}, {0xc3b42000}, {0xc3b44000}, {0xc3b46000},
- {0xc3b48000}, {0xc3b4a000}, {0xc3b4c000}, {0xc3b4e000},
- {0xc3b50000}, {0xc3b52000}, {0xc3b54000}, {0xc3b56000},
- {0xc3b58000}, {0xc3b5a000}, {0xc3b5c000}, {0xc3b5e000},
- {0xc3b60000}, {0xc3b62000}, {0xc3b64000}, {0xc3b66000},
- {0xc3b68000}, {0xc3b6a000}, {0xc3b6c000}, {0xc3b6e000},
- {0xc3b70000}, {0xc3b72000}, {0xc3b74000}, {0xc3b76000},
- {0xc3b78000}, {0xc3b7a000}, {0xc3b7c000}, {0xc3b7e000},
- {0xc3b80000}, {0xc3b82000}, {0xc3b84000}, {0xc3b86000},
- {0xc3b88000}, {0xc3b8a000}, {0xc3b8c000}, {0xc3b8e000},
- {0xc3b90000}, {0xc3b92000}, {0xc3b94000}, {0xc3b96000},
- {0xc3b98000}, {0xc3b9a000}, {0xc3b9c000}, {0xc3b9e000},
- {0xc3ba0000}, {0xc3ba2000}, {0xc3ba4000}, {0xc3ba6000},
- {0xc3ba8000}, {0xc3baa000}, {0xc3bac000}, {0xc3bae000},
- {0xc3bb0000}, {0xc3bb2000}, {0xc3bb4000}, {0xc3bb6000},
- {0xc3bb8000}, {0xc3bba000}, {0xc3bbc000}, {0xc3bbe000},
- {0xc3bc0000}, {0xc3bc2000}, {0xc3bc4000}, {0xc3bc6000},
- {0xc3bc8000}, {0xc3bca000}, {0xc3bcc000}, {0xc3bce000},
- {0xc3bd0000}, {0xc3bd2000}, {0xc3bd4000}, {0xc3bd6000},
- {0xc3bd8000}, {0xc3bda000}, {0xc3bdc000}, {0xc3bde000},
- {0xc3be0000}, {0xc3be2000}, {0xc3be4000}, {0xc3be6000},
- {0xc3be8000}, {0xc3bea000}, {0xc3bec000}, {0xc3bee000},
- {0xc3bf0000}, {0xc3bf2000}, {0xc3bf4000}, {0xc3bf6000},
- {0xc3bf8000}, {0xc3bfa000}, {0xc3bfc000}, {0xc3bfe000},
- {0xc3c00000}, {0xc3c02000}, {0xc3c04000}, {0xc3c06000},
- {0xc3c08000}, {0xc3c0a000}, {0xc3c0c000}, {0xc3c0e000},
- {0xc3c10000}, {0xc3c12000}, {0xc3c14000}, {0xc3c16000},
- {0xc3c18000}, {0xc3c1a000}, {0xc3c1c000}, {0xc3c1e000},
- {0xc3c20000}, {0xc3c22000}, {0xc3c24000}, {0xc3c26000},
- {0xc3c28000}, {0xc3c2a000}, {0xc3c2c000}, {0xc3c2e000},
- {0xc3c30000}, {0xc3c32000}, {0xc3c34000}, {0xc3c36000},
- {0xc3c38000}, {0xc3c3a000}, {0xc3c3c000}, {0xc3c3e000},
- {0xc3c40000}, {0xc3c42000}, {0xc3c44000}, {0xc3c46000},
- {0xc3c48000}, {0xc3c4a000}, {0xc3c4c000}, {0xc3c4e000},
- {0xc3c50000}, {0xc3c52000}, {0xc3c54000}, {0xc3c56000},
- {0xc3c58000}, {0xc3c5a000}, {0xc3c5c000}, {0xc3c5e000},
- {0xc3c60000}, {0xc3c62000}, {0xc3c64000}, {0xc3c66000},
- {0xc3c68000}, {0xc3c6a000}, {0xc3c6c000}, {0xc3c6e000},
- {0xc3c70000}, {0xc3c72000}, {0xc3c74000}, {0xc3c76000},
- {0xc3c78000}, {0xc3c7a000}, {0xc3c7c000}, {0xc3c7e000},
- {0xc3c80000}, {0xc3c82000}, {0xc3c84000}, {0xc3c86000},
- {0xc3c88000}, {0xc3c8a000}, {0xc3c8c000}, {0xc3c8e000},
- {0xc3c90000}, {0xc3c92000}, {0xc3c94000}, {0xc3c96000},
- {0xc3c98000}, {0xc3c9a000}, {0xc3c9c000}, {0xc3c9e000},
- {0xc3ca0000}, {0xc3ca2000}, {0xc3ca4000}, {0xc3ca6000},
- {0xc3ca8000}, {0xc3caa000}, {0xc3cac000}, {0xc3cae000},
- {0xc3cb0000}, {0xc3cb2000}, {0xc3cb4000}, {0xc3cb6000},
- {0xc3cb8000}, {0xc3cba000}, {0xc3cbc000}, {0xc3cbe000},
- {0xc3cc0000}, {0xc3cc2000}, {0xc3cc4000}, {0xc3cc6000},
- {0xc3cc8000}, {0xc3cca000}, {0xc3ccc000}, {0xc3cce000},
- {0xc3cd0000}, {0xc3cd2000}, {0xc3cd4000}, {0xc3cd6000},
- {0xc3cd8000}, {0xc3cda000}, {0xc3cdc000}, {0xc3cde000},
- {0xc3ce0000}, {0xc3ce2000}, {0xc3ce4000}, {0xc3ce6000},
- {0xc3ce8000}, {0xc3cea000}, {0xc3cec000}, {0xc3cee000},
- {0xc3cf0000}, {0xc3cf2000}, {0xc3cf4000}, {0xc3cf6000},
- {0xc3cf8000}, {0xc3cfa000}, {0xc3cfc000}, {0xc3cfe000},
- {0xc3d00000}, {0xc3d02000}, {0xc3d04000}, {0xc3d06000},
- {0xc3d08000}, {0xc3d0a000}, {0xc3d0c000}, {0xc3d0e000},
- {0xc3d10000}, {0xc3d12000}, {0xc3d14000}, {0xc3d16000},
- {0xc3d18000}, {0xc3d1a000}, {0xc3d1c000}, {0xc3d1e000},
- {0xc3d20000}, {0xc3d22000}, {0xc3d24000}, {0xc3d26000},
- {0xc3d28000}, {0xc3d2a000}, {0xc3d2c000}, {0xc3d2e000},
- {0xc3d30000}, {0xc3d32000}, {0xc3d34000}, {0xc3d36000},
- {0xc3d38000}, {0xc3d3a000}, {0xc3d3c000}, {0xc3d3e000},
- {0xc3d40000}, {0xc3d42000}, {0xc3d44000}, {0xc3d46000},
- {0xc3d48000}, {0xc3d4a000}, {0xc3d4c000}, {0xc3d4e000},
- {0xc3d50000}, {0xc3d52000}, {0xc3d54000}, {0xc3d56000},
- {0xc3d58000}, {0xc3d5a000}, {0xc3d5c000}, {0xc3d5e000},
- {0xc3d60000}, {0xc3d62000}, {0xc3d64000}, {0xc3d66000},
- {0xc3d68000}, {0xc3d6a000}, {0xc3d6c000}, {0xc3d6e000},
- {0xc3d70000}, {0xc3d72000}, {0xc3d74000}, {0xc3d76000},
- {0xc3d78000}, {0xc3d7a000}, {0xc3d7c000}, {0xc3d7e000},
- {0xc3d80000}, {0xc3d82000}, {0xc3d84000}, {0xc3d86000},
- {0xc3d88000}, {0xc3d8a000}, {0xc3d8c000}, {0xc3d8e000},
- {0xc3d90000}, {0xc3d92000}, {0xc3d94000}, {0xc3d96000},
- {0xc3d98000}, {0xc3d9a000}, {0xc3d9c000}, {0xc3d9e000},
- {0xc3da0000}, {0xc3da2000}, {0xc3da4000}, {0xc3da6000},
- {0xc3da8000}, {0xc3daa000}, {0xc3dac000}, {0xc3dae000},
- {0xc3db0000}, {0xc3db2000}, {0xc3db4000}, {0xc3db6000},
- {0xc3db8000}, {0xc3dba000}, {0xc3dbc000}, {0xc3dbe000},
- {0xc3dc0000}, {0xc3dc2000}, {0xc3dc4000}, {0xc3dc6000},
- {0xc3dc8000}, {0xc3dca000}, {0xc3dcc000}, {0xc3dce000},
- {0xc3dd0000}, {0xc3dd2000}, {0xc3dd4000}, {0xc3dd6000},
- {0xc3dd8000}, {0xc3dda000}, {0xc3ddc000}, {0xc3dde000},
- {0xc3de0000}, {0xc3de2000}, {0xc3de4000}, {0xc3de6000},
- {0xc3de8000}, {0xc3dea000}, {0xc3dec000}, {0xc3dee000},
- {0xc3df0000}, {0xc3df2000}, {0xc3df4000}, {0xc3df6000},
- {0xc3df8000}, {0xc3dfa000}, {0xc3dfc000}, {0xc3dfe000},
- {0xc3e00000}, {0xc3e02000}, {0xc3e04000}, {0xc3e06000},
- {0xc3e08000}, {0xc3e0a000}, {0xc3e0c000}, {0xc3e0e000},
- {0xc3e10000}, {0xc3e12000}, {0xc3e14000}, {0xc3e16000},
- {0xc3e18000}, {0xc3e1a000}, {0xc3e1c000}, {0xc3e1e000},
- {0xc3e20000}, {0xc3e22000}, {0xc3e24000}, {0xc3e26000},
- {0xc3e28000}, {0xc3e2a000}, {0xc3e2c000}, {0xc3e2e000},
- {0xc3e30000}, {0xc3e32000}, {0xc3e34000}, {0xc3e36000},
- {0xc3e38000}, {0xc3e3a000}, {0xc3e3c000}, {0xc3e3e000},
- {0xc3e40000}, {0xc3e42000}, {0xc3e44000}, {0xc3e46000},
- {0xc3e48000}, {0xc3e4a000}, {0xc3e4c000}, {0xc3e4e000},
- {0xc3e50000}, {0xc3e52000}, {0xc3e54000}, {0xc3e56000},
- {0xc3e58000}, {0xc3e5a000}, {0xc3e5c000}, {0xc3e5e000},
- {0xc3e60000}, {0xc3e62000}, {0xc3e64000}, {0xc3e66000},
- {0xc3e68000}, {0xc3e6a000}, {0xc3e6c000}, {0xc3e6e000},
- {0xc3e70000}, {0xc3e72000}, {0xc3e74000}, {0xc3e76000},
- {0xc3e78000}, {0xc3e7a000}, {0xc3e7c000}, {0xc3e7e000},
- {0xc3e80000}, {0xc3e82000}, {0xc3e84000}, {0xc3e86000},
- {0xc3e88000}, {0xc3e8a000}, {0xc3e8c000}, {0xc3e8e000},
- {0xc3e90000}, {0xc3e92000}, {0xc3e94000}, {0xc3e96000},
- {0xc3e98000}, {0xc3e9a000}, {0xc3e9c000}, {0xc3e9e000},
- {0xc3ea0000}, {0xc3ea2000}, {0xc3ea4000}, {0xc3ea6000},
- {0xc3ea8000}, {0xc3eaa000}, {0xc3eac000}, {0xc3eae000},
- {0xc3eb0000}, {0xc3eb2000}, {0xc3eb4000}, {0xc3eb6000},
- {0xc3eb8000}, {0xc3eba000}, {0xc3ebc000}, {0xc3ebe000},
- {0xc3ec0000}, {0xc3ec2000}, {0xc3ec4000}, {0xc3ec6000},
- {0xc3ec8000}, {0xc3eca000}, {0xc3ecc000}, {0xc3ece000},
- {0xc3ed0000}, {0xc3ed2000}, {0xc3ed4000}, {0xc3ed6000},
- {0xc3ed8000}, {0xc3eda000}, {0xc3edc000}, {0xc3ede000},
- {0xc3ee0000}, {0xc3ee2000}, {0xc3ee4000}, {0xc3ee6000},
- {0xc3ee8000}, {0xc3eea000}, {0xc3eec000}, {0xc3eee000},
- {0xc3ef0000}, {0xc3ef2000}, {0xc3ef4000}, {0xc3ef6000},
- {0xc3ef8000}, {0xc3efa000}, {0xc3efc000}, {0xc3efe000},
- {0xc3f00000}, {0xc3f02000}, {0xc3f04000}, {0xc3f06000},
- {0xc3f08000}, {0xc3f0a000}, {0xc3f0c000}, {0xc3f0e000},
- {0xc3f10000}, {0xc3f12000}, {0xc3f14000}, {0xc3f16000},
- {0xc3f18000}, {0xc3f1a000}, {0xc3f1c000}, {0xc3f1e000},
- {0xc3f20000}, {0xc3f22000}, {0xc3f24000}, {0xc3f26000},
- {0xc3f28000}, {0xc3f2a000}, {0xc3f2c000}, {0xc3f2e000},
- {0xc3f30000}, {0xc3f32000}, {0xc3f34000}, {0xc3f36000},
- {0xc3f38000}, {0xc3f3a000}, {0xc3f3c000}, {0xc3f3e000},
- {0xc3f40000}, {0xc3f42000}, {0xc3f44000}, {0xc3f46000},
- {0xc3f48000}, {0xc3f4a000}, {0xc3f4c000}, {0xc3f4e000},
- {0xc3f50000}, {0xc3f52000}, {0xc3f54000}, {0xc3f56000},
- {0xc3f58000}, {0xc3f5a000}, {0xc3f5c000}, {0xc3f5e000},
- {0xc3f60000}, {0xc3f62000}, {0xc3f64000}, {0xc3f66000},
- {0xc3f68000}, {0xc3f6a000}, {0xc3f6c000}, {0xc3f6e000},
- {0xc3f70000}, {0xc3f72000}, {0xc3f74000}, {0xc3f76000},
- {0xc3f78000}, {0xc3f7a000}, {0xc3f7c000}, {0xc3f7e000},
- {0xc3f80000}, {0xc3f82000}, {0xc3f84000}, {0xc3f86000},
- {0xc3f88000}, {0xc3f8a000}, {0xc3f8c000}, {0xc3f8e000},
- {0xc3f90000}, {0xc3f92000}, {0xc3f94000}, {0xc3f96000},
- {0xc3f98000}, {0xc3f9a000}, {0xc3f9c000}, {0xc3f9e000},
- {0xc3fa0000}, {0xc3fa2000}, {0xc3fa4000}, {0xc3fa6000},
- {0xc3fa8000}, {0xc3faa000}, {0xc3fac000}, {0xc3fae000},
- {0xc3fb0000}, {0xc3fb2000}, {0xc3fb4000}, {0xc3fb6000},
- {0xc3fb8000}, {0xc3fba000}, {0xc3fbc000}, {0xc3fbe000},
- {0xc3fc0000}, {0xc3fc2000}, {0xc3fc4000}, {0xc3fc6000},
- {0xc3fc8000}, {0xc3fca000}, {0xc3fcc000}, {0xc3fce000},
- {0xc3fd0000}, {0xc3fd2000}, {0xc3fd4000}, {0xc3fd6000},
- {0xc3fd8000}, {0xc3fda000}, {0xc3fdc000}, {0xc3fde000},
- {0xc3fe0000}, {0xc3fe2000}, {0xc3fe4000}, {0xc3fe6000},
- {0xc3fe8000}, {0xc3fea000}, {0xc3fec000}, {0xc3fee000},
- {0xc3ff0000}, {0xc3ff2000}, {0xc3ff4000}, {0xc3ff6000},
- {0xc3ff8000}, {0xc3ffa000}, {0xc3ffc000}, {0xc3ffe000},
- {0xc4000000}, {0xc4002000}, {0xc4004000}, {0xc4006000},
- {0xc4008000}, {0xc400a000}, {0xc400c000}, {0xc400e000},
- {0xc4010000}, {0xc4012000}, {0xc4014000}, {0xc4016000},
- {0xc4018000}, {0xc401a000}, {0xc401c000}, {0xc401e000},
- {0xc4020000}, {0xc4022000}, {0xc4024000}, {0xc4026000},
- {0xc4028000}, {0xc402a000}, {0xc402c000}, {0xc402e000},
- {0xc4030000}, {0xc4032000}, {0xc4034000}, {0xc4036000},
- {0xc4038000}, {0xc403a000}, {0xc403c000}, {0xc403e000},
- {0xc4040000}, {0xc4042000}, {0xc4044000}, {0xc4046000},
- {0xc4048000}, {0xc404a000}, {0xc404c000}, {0xc404e000},
- {0xc4050000}, {0xc4052000}, {0xc4054000}, {0xc4056000},
- {0xc4058000}, {0xc405a000}, {0xc405c000}, {0xc405e000},
- {0xc4060000}, {0xc4062000}, {0xc4064000}, {0xc4066000},
- {0xc4068000}, {0xc406a000}, {0xc406c000}, {0xc406e000},
- {0xc4070000}, {0xc4072000}, {0xc4074000}, {0xc4076000},
- {0xc4078000}, {0xc407a000}, {0xc407c000}, {0xc407e000},
- {0xc4080000}, {0xc4082000}, {0xc4084000}, {0xc4086000},
- {0xc4088000}, {0xc408a000}, {0xc408c000}, {0xc408e000},
- {0xc4090000}, {0xc4092000}, {0xc4094000}, {0xc4096000},
- {0xc4098000}, {0xc409a000}, {0xc409c000}, {0xc409e000},
- {0xc40a0000}, {0xc40a2000}, {0xc40a4000}, {0xc40a6000},
- {0xc40a8000}, {0xc40aa000}, {0xc40ac000}, {0xc40ae000},
- {0xc40b0000}, {0xc40b2000}, {0xc40b4000}, {0xc40b6000},
- {0xc40b8000}, {0xc40ba000}, {0xc40bc000}, {0xc40be000},
- {0xc40c0000}, {0xc40c2000}, {0xc40c4000}, {0xc40c6000},
- {0xc40c8000}, {0xc40ca000}, {0xc40cc000}, {0xc40ce000},
- {0xc40d0000}, {0xc40d2000}, {0xc40d4000}, {0xc40d6000},
- {0xc40d8000}, {0xc40da000}, {0xc40dc000}, {0xc40de000},
- {0xc40e0000}, {0xc40e2000}, {0xc40e4000}, {0xc40e6000},
- {0xc40e8000}, {0xc40ea000}, {0xc40ec000}, {0xc40ee000},
- {0xc40f0000}, {0xc40f2000}, {0xc40f4000}, {0xc40f6000},
- {0xc40f8000}, {0xc40fa000}, {0xc40fc000}, {0xc40fe000},
- {0xc4100000}, {0xc4102000}, {0xc4104000}, {0xc4106000},
- {0xc4108000}, {0xc410a000}, {0xc410c000}, {0xc410e000},
- {0xc4110000}, {0xc4112000}, {0xc4114000}, {0xc4116000},
- {0xc4118000}, {0xc411a000}, {0xc411c000}, {0xc411e000},
- {0xc4120000}, {0xc4122000}, {0xc4124000}, {0xc4126000},
- {0xc4128000}, {0xc412a000}, {0xc412c000}, {0xc412e000},
- {0xc4130000}, {0xc4132000}, {0xc4134000}, {0xc4136000},
- {0xc4138000}, {0xc413a000}, {0xc413c000}, {0xc413e000},
- {0xc4140000}, {0xc4142000}, {0xc4144000}, {0xc4146000},
- {0xc4148000}, {0xc414a000}, {0xc414c000}, {0xc414e000},
- {0xc4150000}, {0xc4152000}, {0xc4154000}, {0xc4156000},
- {0xc4158000}, {0xc415a000}, {0xc415c000}, {0xc415e000},
- {0xc4160000}, {0xc4162000}, {0xc4164000}, {0xc4166000},
- {0xc4168000}, {0xc416a000}, {0xc416c000}, {0xc416e000},
- {0xc4170000}, {0xc4172000}, {0xc4174000}, {0xc4176000},
- {0xc4178000}, {0xc417a000}, {0xc417c000}, {0xc417e000},
- {0xc4180000}, {0xc4182000}, {0xc4184000}, {0xc4186000},
- {0xc4188000}, {0xc418a000}, {0xc418c000}, {0xc418e000},
- {0xc4190000}, {0xc4192000}, {0xc4194000}, {0xc4196000},
- {0xc4198000}, {0xc419a000}, {0xc419c000}, {0xc419e000},
- {0xc41a0000}, {0xc41a2000}, {0xc41a4000}, {0xc41a6000},
- {0xc41a8000}, {0xc41aa000}, {0xc41ac000}, {0xc41ae000},
- {0xc41b0000}, {0xc41b2000}, {0xc41b4000}, {0xc41b6000},
- {0xc41b8000}, {0xc41ba000}, {0xc41bc000}, {0xc41be000},
- {0xc41c0000}, {0xc41c2000}, {0xc41c4000}, {0xc41c6000},
- {0xc41c8000}, {0xc41ca000}, {0xc41cc000}, {0xc41ce000},
- {0xc41d0000}, {0xc41d2000}, {0xc41d4000}, {0xc41d6000},
- {0xc41d8000}, {0xc41da000}, {0xc41dc000}, {0xc41de000},
- {0xc41e0000}, {0xc41e2000}, {0xc41e4000}, {0xc41e6000},
- {0xc41e8000}, {0xc41ea000}, {0xc41ec000}, {0xc41ee000},
- {0xc41f0000}, {0xc41f2000}, {0xc41f4000}, {0xc41f6000},
- {0xc41f8000}, {0xc41fa000}, {0xc41fc000}, {0xc41fe000},
- {0xc4200000}, {0xc4202000}, {0xc4204000}, {0xc4206000},
- {0xc4208000}, {0xc420a000}, {0xc420c000}, {0xc420e000},
- {0xc4210000}, {0xc4212000}, {0xc4214000}, {0xc4216000},
- {0xc4218000}, {0xc421a000}, {0xc421c000}, {0xc421e000},
- {0xc4220000}, {0xc4222000}, {0xc4224000}, {0xc4226000},
- {0xc4228000}, {0xc422a000}, {0xc422c000}, {0xc422e000},
- {0xc4230000}, {0xc4232000}, {0xc4234000}, {0xc4236000},
- {0xc4238000}, {0xc423a000}, {0xc423c000}, {0xc423e000},
- {0xc4240000}, {0xc4242000}, {0xc4244000}, {0xc4246000},
- {0xc4248000}, {0xc424a000}, {0xc424c000}, {0xc424e000},
- {0xc4250000}, {0xc4252000}, {0xc4254000}, {0xc4256000},
- {0xc4258000}, {0xc425a000}, {0xc425c000}, {0xc425e000},
- {0xc4260000}, {0xc4262000}, {0xc4264000}, {0xc4266000},
- {0xc4268000}, {0xc426a000}, {0xc426c000}, {0xc426e000},
- {0xc4270000}, {0xc4272000}, {0xc4274000}, {0xc4276000},
- {0xc4278000}, {0xc427a000}, {0xc427c000}, {0xc427e000},
- {0xc4280000}, {0xc4282000}, {0xc4284000}, {0xc4286000},
- {0xc4288000}, {0xc428a000}, {0xc428c000}, {0xc428e000},
- {0xc4290000}, {0xc4292000}, {0xc4294000}, {0xc4296000},
- {0xc4298000}, {0xc429a000}, {0xc429c000}, {0xc429e000},
- {0xc42a0000}, {0xc42a2000}, {0xc42a4000}, {0xc42a6000},
- {0xc42a8000}, {0xc42aa000}, {0xc42ac000}, {0xc42ae000},
- {0xc42b0000}, {0xc42b2000}, {0xc42b4000}, {0xc42b6000},
- {0xc42b8000}, {0xc42ba000}, {0xc42bc000}, {0xc42be000},
- {0xc42c0000}, {0xc42c2000}, {0xc42c4000}, {0xc42c6000},
- {0xc42c8000}, {0xc42ca000}, {0xc42cc000}, {0xc42ce000},
- {0xc42d0000}, {0xc42d2000}, {0xc42d4000}, {0xc42d6000},
- {0xc42d8000}, {0xc42da000}, {0xc42dc000}, {0xc42de000},
- {0xc42e0000}, {0xc42e2000}, {0xc42e4000}, {0xc42e6000},
- {0xc42e8000}, {0xc42ea000}, {0xc42ec000}, {0xc42ee000},
- {0xc42f0000}, {0xc42f2000}, {0xc42f4000}, {0xc42f6000},
- {0xc42f8000}, {0xc42fa000}, {0xc42fc000}, {0xc42fe000},
- {0xc4300000}, {0xc4302000}, {0xc4304000}, {0xc4306000},
- {0xc4308000}, {0xc430a000}, {0xc430c000}, {0xc430e000},
- {0xc4310000}, {0xc4312000}, {0xc4314000}, {0xc4316000},
- {0xc4318000}, {0xc431a000}, {0xc431c000}, {0xc431e000},
- {0xc4320000}, {0xc4322000}, {0xc4324000}, {0xc4326000},
- {0xc4328000}, {0xc432a000}, {0xc432c000}, {0xc432e000},
- {0xc4330000}, {0xc4332000}, {0xc4334000}, {0xc4336000},
- {0xc4338000}, {0xc433a000}, {0xc433c000}, {0xc433e000},
- {0xc4340000}, {0xc4342000}, {0xc4344000}, {0xc4346000},
- {0xc4348000}, {0xc434a000}, {0xc434c000}, {0xc434e000},
- {0xc4350000}, {0xc4352000}, {0xc4354000}, {0xc4356000},
- {0xc4358000}, {0xc435a000}, {0xc435c000}, {0xc435e000},
- {0xc4360000}, {0xc4362000}, {0xc4364000}, {0xc4366000},
- {0xc4368000}, {0xc436a000}, {0xc436c000}, {0xc436e000},
- {0xc4370000}, {0xc4372000}, {0xc4374000}, {0xc4376000},
- {0xc4378000}, {0xc437a000}, {0xc437c000}, {0xc437e000},
- {0xc4380000}, {0xc4382000}, {0xc4384000}, {0xc4386000},
- {0xc4388000}, {0xc438a000}, {0xc438c000}, {0xc438e000},
- {0xc4390000}, {0xc4392000}, {0xc4394000}, {0xc4396000},
- {0xc4398000}, {0xc439a000}, {0xc439c000}, {0xc439e000},
- {0xc43a0000}, {0xc43a2000}, {0xc43a4000}, {0xc43a6000},
- {0xc43a8000}, {0xc43aa000}, {0xc43ac000}, {0xc43ae000},
- {0xc43b0000}, {0xc43b2000}, {0xc43b4000}, {0xc43b6000},
- {0xc43b8000}, {0xc43ba000}, {0xc43bc000}, {0xc43be000},
- {0xc43c0000}, {0xc43c2000}, {0xc43c4000}, {0xc43c6000},
- {0xc43c8000}, {0xc43ca000}, {0xc43cc000}, {0xc43ce000},
- {0xc43d0000}, {0xc43d2000}, {0xc43d4000}, {0xc43d6000},
- {0xc43d8000}, {0xc43da000}, {0xc43dc000}, {0xc43de000},
- {0xc43e0000}, {0xc43e2000}, {0xc43e4000}, {0xc43e6000},
- {0xc43e8000}, {0xc43ea000}, {0xc43ec000}, {0xc43ee000},
- {0xc43f0000}, {0xc43f2000}, {0xc43f4000}, {0xc43f6000},
- {0xc43f8000}, {0xc43fa000}, {0xc43fc000}, {0xc43fe000},
- {0xc4400000}, {0xc4402000}, {0xc4404000}, {0xc4406000},
- {0xc4408000}, {0xc440a000}, {0xc440c000}, {0xc440e000},
- {0xc4410000}, {0xc4412000}, {0xc4414000}, {0xc4416000},
- {0xc4418000}, {0xc441a000}, {0xc441c000}, {0xc441e000},
- {0xc4420000}, {0xc4422000}, {0xc4424000}, {0xc4426000},
- {0xc4428000}, {0xc442a000}, {0xc442c000}, {0xc442e000},
- {0xc4430000}, {0xc4432000}, {0xc4434000}, {0xc4436000},
- {0xc4438000}, {0xc443a000}, {0xc443c000}, {0xc443e000},
- {0xc4440000}, {0xc4442000}, {0xc4444000}, {0xc4446000},
- {0xc4448000}, {0xc444a000}, {0xc444c000}, {0xc444e000},
- {0xc4450000}, {0xc4452000}, {0xc4454000}, {0xc4456000},
- {0xc4458000}, {0xc445a000}, {0xc445c000}, {0xc445e000},
- {0xc4460000}, {0xc4462000}, {0xc4464000}, {0xc4466000},
- {0xc4468000}, {0xc446a000}, {0xc446c000}, {0xc446e000},
- {0xc4470000}, {0xc4472000}, {0xc4474000}, {0xc4476000},
- {0xc4478000}, {0xc447a000}, {0xc447c000}, {0xc447e000},
- {0xc4480000}, {0xc4482000}, {0xc4484000}, {0xc4486000},
- {0xc4488000}, {0xc448a000}, {0xc448c000}, {0xc448e000},
- {0xc4490000}, {0xc4492000}, {0xc4494000}, {0xc4496000},
- {0xc4498000}, {0xc449a000}, {0xc449c000}, {0xc449e000},
- {0xc44a0000}, {0xc44a2000}, {0xc44a4000}, {0xc44a6000},
- {0xc44a8000}, {0xc44aa000}, {0xc44ac000}, {0xc44ae000},
- {0xc44b0000}, {0xc44b2000}, {0xc44b4000}, {0xc44b6000},
- {0xc44b8000}, {0xc44ba000}, {0xc44bc000}, {0xc44be000},
- {0xc44c0000}, {0xc44c2000}, {0xc44c4000}, {0xc44c6000},
- {0xc44c8000}, {0xc44ca000}, {0xc44cc000}, {0xc44ce000},
- {0xc44d0000}, {0xc44d2000}, {0xc44d4000}, {0xc44d6000},
- {0xc44d8000}, {0xc44da000}, {0xc44dc000}, {0xc44de000},
- {0xc44e0000}, {0xc44e2000}, {0xc44e4000}, {0xc44e6000},
- {0xc44e8000}, {0xc44ea000}, {0xc44ec000}, {0xc44ee000},
- {0xc44f0000}, {0xc44f2000}, {0xc44f4000}, {0xc44f6000},
- {0xc44f8000}, {0xc44fa000}, {0xc44fc000}, {0xc44fe000},
- {0xc4500000}, {0xc4502000}, {0xc4504000}, {0xc4506000},
- {0xc4508000}, {0xc450a000}, {0xc450c000}, {0xc450e000},
- {0xc4510000}, {0xc4512000}, {0xc4514000}, {0xc4516000},
- {0xc4518000}, {0xc451a000}, {0xc451c000}, {0xc451e000},
- {0xc4520000}, {0xc4522000}, {0xc4524000}, {0xc4526000},
- {0xc4528000}, {0xc452a000}, {0xc452c000}, {0xc452e000},
- {0xc4530000}, {0xc4532000}, {0xc4534000}, {0xc4536000},
- {0xc4538000}, {0xc453a000}, {0xc453c000}, {0xc453e000},
- {0xc4540000}, {0xc4542000}, {0xc4544000}, {0xc4546000},
- {0xc4548000}, {0xc454a000}, {0xc454c000}, {0xc454e000},
- {0xc4550000}, {0xc4552000}, {0xc4554000}, {0xc4556000},
- {0xc4558000}, {0xc455a000}, {0xc455c000}, {0xc455e000},
- {0xc4560000}, {0xc4562000}, {0xc4564000}, {0xc4566000},
- {0xc4568000}, {0xc456a000}, {0xc456c000}, {0xc456e000},
- {0xc4570000}, {0xc4572000}, {0xc4574000}, {0xc4576000},
- {0xc4578000}, {0xc457a000}, {0xc457c000}, {0xc457e000},
- {0xc4580000}, {0xc4582000}, {0xc4584000}, {0xc4586000},
- {0xc4588000}, {0xc458a000}, {0xc458c000}, {0xc458e000},
- {0xc4590000}, {0xc4592000}, {0xc4594000}, {0xc4596000},
- {0xc4598000}, {0xc459a000}, {0xc459c000}, {0xc459e000},
- {0xc45a0000}, {0xc45a2000}, {0xc45a4000}, {0xc45a6000},
- {0xc45a8000}, {0xc45aa000}, {0xc45ac000}, {0xc45ae000},
- {0xc45b0000}, {0xc45b2000}, {0xc45b4000}, {0xc45b6000},
- {0xc45b8000}, {0xc45ba000}, {0xc45bc000}, {0xc45be000},
- {0xc45c0000}, {0xc45c2000}, {0xc45c4000}, {0xc45c6000},
- {0xc45c8000}, {0xc45ca000}, {0xc45cc000}, {0xc45ce000},
- {0xc45d0000}, {0xc45d2000}, {0xc45d4000}, {0xc45d6000},
- {0xc45d8000}, {0xc45da000}, {0xc45dc000}, {0xc45de000},
- {0xc45e0000}, {0xc45e2000}, {0xc45e4000}, {0xc45e6000},
- {0xc45e8000}, {0xc45ea000}, {0xc45ec000}, {0xc45ee000},
- {0xc45f0000}, {0xc45f2000}, {0xc45f4000}, {0xc45f6000},
- {0xc45f8000}, {0xc45fa000}, {0xc45fc000}, {0xc45fe000},
- {0xc4600000}, {0xc4602000}, {0xc4604000}, {0xc4606000},
- {0xc4608000}, {0xc460a000}, {0xc460c000}, {0xc460e000},
- {0xc4610000}, {0xc4612000}, {0xc4614000}, {0xc4616000},
- {0xc4618000}, {0xc461a000}, {0xc461c000}, {0xc461e000},
- {0xc4620000}, {0xc4622000}, {0xc4624000}, {0xc4626000},
- {0xc4628000}, {0xc462a000}, {0xc462c000}, {0xc462e000},
- {0xc4630000}, {0xc4632000}, {0xc4634000}, {0xc4636000},
- {0xc4638000}, {0xc463a000}, {0xc463c000}, {0xc463e000},
- {0xc4640000}, {0xc4642000}, {0xc4644000}, {0xc4646000},
- {0xc4648000}, {0xc464a000}, {0xc464c000}, {0xc464e000},
- {0xc4650000}, {0xc4652000}, {0xc4654000}, {0xc4656000},
- {0xc4658000}, {0xc465a000}, {0xc465c000}, {0xc465e000},
- {0xc4660000}, {0xc4662000}, {0xc4664000}, {0xc4666000},
- {0xc4668000}, {0xc466a000}, {0xc466c000}, {0xc466e000},
- {0xc4670000}, {0xc4672000}, {0xc4674000}, {0xc4676000},
- {0xc4678000}, {0xc467a000}, {0xc467c000}, {0xc467e000},
- {0xc4680000}, {0xc4682000}, {0xc4684000}, {0xc4686000},
- {0xc4688000}, {0xc468a000}, {0xc468c000}, {0xc468e000},
- {0xc4690000}, {0xc4692000}, {0xc4694000}, {0xc4696000},
- {0xc4698000}, {0xc469a000}, {0xc469c000}, {0xc469e000},
- {0xc46a0000}, {0xc46a2000}, {0xc46a4000}, {0xc46a6000},
- {0xc46a8000}, {0xc46aa000}, {0xc46ac000}, {0xc46ae000},
- {0xc46b0000}, {0xc46b2000}, {0xc46b4000}, {0xc46b6000},
- {0xc46b8000}, {0xc46ba000}, {0xc46bc000}, {0xc46be000},
- {0xc46c0000}, {0xc46c2000}, {0xc46c4000}, {0xc46c6000},
- {0xc46c8000}, {0xc46ca000}, {0xc46cc000}, {0xc46ce000},
- {0xc46d0000}, {0xc46d2000}, {0xc46d4000}, {0xc46d6000},
- {0xc46d8000}, {0xc46da000}, {0xc46dc000}, {0xc46de000},
- {0xc46e0000}, {0xc46e2000}, {0xc46e4000}, {0xc46e6000},
- {0xc46e8000}, {0xc46ea000}, {0xc46ec000}, {0xc46ee000},
- {0xc46f0000}, {0xc46f2000}, {0xc46f4000}, {0xc46f6000},
- {0xc46f8000}, {0xc46fa000}, {0xc46fc000}, {0xc46fe000},
- {0xc4700000}, {0xc4702000}, {0xc4704000}, {0xc4706000},
- {0xc4708000}, {0xc470a000}, {0xc470c000}, {0xc470e000},
- {0xc4710000}, {0xc4712000}, {0xc4714000}, {0xc4716000},
- {0xc4718000}, {0xc471a000}, {0xc471c000}, {0xc471e000},
- {0xc4720000}, {0xc4722000}, {0xc4724000}, {0xc4726000},
- {0xc4728000}, {0xc472a000}, {0xc472c000}, {0xc472e000},
- {0xc4730000}, {0xc4732000}, {0xc4734000}, {0xc4736000},
- {0xc4738000}, {0xc473a000}, {0xc473c000}, {0xc473e000},
- {0xc4740000}, {0xc4742000}, {0xc4744000}, {0xc4746000},
- {0xc4748000}, {0xc474a000}, {0xc474c000}, {0xc474e000},
- {0xc4750000}, {0xc4752000}, {0xc4754000}, {0xc4756000},
- {0xc4758000}, {0xc475a000}, {0xc475c000}, {0xc475e000},
- {0xc4760000}, {0xc4762000}, {0xc4764000}, {0xc4766000},
- {0xc4768000}, {0xc476a000}, {0xc476c000}, {0xc476e000},
- {0xc4770000}, {0xc4772000}, {0xc4774000}, {0xc4776000},
- {0xc4778000}, {0xc477a000}, {0xc477c000}, {0xc477e000},
- {0xc4780000}, {0xc4782000}, {0xc4784000}, {0xc4786000},
- {0xc4788000}, {0xc478a000}, {0xc478c000}, {0xc478e000},
- {0xc4790000}, {0xc4792000}, {0xc4794000}, {0xc4796000},
- {0xc4798000}, {0xc479a000}, {0xc479c000}, {0xc479e000},
- {0xc47a0000}, {0xc47a2000}, {0xc47a4000}, {0xc47a6000},
- {0xc47a8000}, {0xc47aa000}, {0xc47ac000}, {0xc47ae000},
- {0xc47b0000}, {0xc47b2000}, {0xc47b4000}, {0xc47b6000},
- {0xc47b8000}, {0xc47ba000}, {0xc47bc000}, {0xc47be000},
- {0xc47c0000}, {0xc47c2000}, {0xc47c4000}, {0xc47c6000},
- {0xc47c8000}, {0xc47ca000}, {0xc47cc000}, {0xc47ce000},
- {0xc47d0000}, {0xc47d2000}, {0xc47d4000}, {0xc47d6000},
- {0xc47d8000}, {0xc47da000}, {0xc47dc000}, {0xc47de000},
- {0xc47e0000}, {0xc47e2000}, {0xc47e4000}, {0xc47e6000},
- {0xc47e8000}, {0xc47ea000}, {0xc47ec000}, {0xc47ee000},
- {0xc47f0000}, {0xc47f2000}, {0xc47f4000}, {0xc47f6000},
- {0xc47f8000}, {0xc47fa000}, {0xc47fc000}, {0xc47fe000},
- {0xc4800000}, {0xc4802000}, {0xc4804000}, {0xc4806000},
- {0xc4808000}, {0xc480a000}, {0xc480c000}, {0xc480e000},
- {0xc4810000}, {0xc4812000}, {0xc4814000}, {0xc4816000},
- {0xc4818000}, {0xc481a000}, {0xc481c000}, {0xc481e000},
- {0xc4820000}, {0xc4822000}, {0xc4824000}, {0xc4826000},
- {0xc4828000}, {0xc482a000}, {0xc482c000}, {0xc482e000},
- {0xc4830000}, {0xc4832000}, {0xc4834000}, {0xc4836000},
- {0xc4838000}, {0xc483a000}, {0xc483c000}, {0xc483e000},
- {0xc4840000}, {0xc4842000}, {0xc4844000}, {0xc4846000},
- {0xc4848000}, {0xc484a000}, {0xc484c000}, {0xc484e000},
- {0xc4850000}, {0xc4852000}, {0xc4854000}, {0xc4856000},
- {0xc4858000}, {0xc485a000}, {0xc485c000}, {0xc485e000},
- {0xc4860000}, {0xc4862000}, {0xc4864000}, {0xc4866000},
- {0xc4868000}, {0xc486a000}, {0xc486c000}, {0xc486e000},
- {0xc4870000}, {0xc4872000}, {0xc4874000}, {0xc4876000},
- {0xc4878000}, {0xc487a000}, {0xc487c000}, {0xc487e000},
- {0xc4880000}, {0xc4882000}, {0xc4884000}, {0xc4886000},
- {0xc4888000}, {0xc488a000}, {0xc488c000}, {0xc488e000},
- {0xc4890000}, {0xc4892000}, {0xc4894000}, {0xc4896000},
- {0xc4898000}, {0xc489a000}, {0xc489c000}, {0xc489e000},
- {0xc48a0000}, {0xc48a2000}, {0xc48a4000}, {0xc48a6000},
- {0xc48a8000}, {0xc48aa000}, {0xc48ac000}, {0xc48ae000},
- {0xc48b0000}, {0xc48b2000}, {0xc48b4000}, {0xc48b6000},
- {0xc48b8000}, {0xc48ba000}, {0xc48bc000}, {0xc48be000},
- {0xc48c0000}, {0xc48c2000}, {0xc48c4000}, {0xc48c6000},
- {0xc48c8000}, {0xc48ca000}, {0xc48cc000}, {0xc48ce000},
- {0xc48d0000}, {0xc48d2000}, {0xc48d4000}, {0xc48d6000},
- {0xc48d8000}, {0xc48da000}, {0xc48dc000}, {0xc48de000},
- {0xc48e0000}, {0xc48e2000}, {0xc48e4000}, {0xc48e6000},
- {0xc48e8000}, {0xc48ea000}, {0xc48ec000}, {0xc48ee000},
- {0xc48f0000}, {0xc48f2000}, {0xc48f4000}, {0xc48f6000},
- {0xc48f8000}, {0xc48fa000}, {0xc48fc000}, {0xc48fe000},
- {0xc4900000}, {0xc4902000}, {0xc4904000}, {0xc4906000},
- {0xc4908000}, {0xc490a000}, {0xc490c000}, {0xc490e000},
- {0xc4910000}, {0xc4912000}, {0xc4914000}, {0xc4916000},
- {0xc4918000}, {0xc491a000}, {0xc491c000}, {0xc491e000},
- {0xc4920000}, {0xc4922000}, {0xc4924000}, {0xc4926000},
- {0xc4928000}, {0xc492a000}, {0xc492c000}, {0xc492e000},
- {0xc4930000}, {0xc4932000}, {0xc4934000}, {0xc4936000},
- {0xc4938000}, {0xc493a000}, {0xc493c000}, {0xc493e000},
- {0xc4940000}, {0xc4942000}, {0xc4944000}, {0xc4946000},
- {0xc4948000}, {0xc494a000}, {0xc494c000}, {0xc494e000},
- {0xc4950000}, {0xc4952000}, {0xc4954000}, {0xc4956000},
- {0xc4958000}, {0xc495a000}, {0xc495c000}, {0xc495e000},
- {0xc4960000}, {0xc4962000}, {0xc4964000}, {0xc4966000},
- {0xc4968000}, {0xc496a000}, {0xc496c000}, {0xc496e000},
- {0xc4970000}, {0xc4972000}, {0xc4974000}, {0xc4976000},
- {0xc4978000}, {0xc497a000}, {0xc497c000}, {0xc497e000},
- {0xc4980000}, {0xc4982000}, {0xc4984000}, {0xc4986000},
- {0xc4988000}, {0xc498a000}, {0xc498c000}, {0xc498e000},
- {0xc4990000}, {0xc4992000}, {0xc4994000}, {0xc4996000},
- {0xc4998000}, {0xc499a000}, {0xc499c000}, {0xc499e000},
- {0xc49a0000}, {0xc49a2000}, {0xc49a4000}, {0xc49a6000},
- {0xc49a8000}, {0xc49aa000}, {0xc49ac000}, {0xc49ae000},
- {0xc49b0000}, {0xc49b2000}, {0xc49b4000}, {0xc49b6000},
- {0xc49b8000}, {0xc49ba000}, {0xc49bc000}, {0xc49be000},
- {0xc49c0000}, {0xc49c2000}, {0xc49c4000}, {0xc49c6000},
- {0xc49c8000}, {0xc49ca000}, {0xc49cc000}, {0xc49ce000},
- {0xc49d0000}, {0xc49d2000}, {0xc49d4000}, {0xc49d6000},
- {0xc49d8000}, {0xc49da000}, {0xc49dc000}, {0xc49de000},
- {0xc49e0000}, {0xc49e2000}, {0xc49e4000}, {0xc49e6000},
- {0xc49e8000}, {0xc49ea000}, {0xc49ec000}, {0xc49ee000},
- {0xc49f0000}, {0xc49f2000}, {0xc49f4000}, {0xc49f6000},
- {0xc49f8000}, {0xc49fa000}, {0xc49fc000}, {0xc49fe000},
- {0xc4a00000}, {0xc4a02000}, {0xc4a04000}, {0xc4a06000},
- {0xc4a08000}, {0xc4a0a000}, {0xc4a0c000}, {0xc4a0e000},
- {0xc4a10000}, {0xc4a12000}, {0xc4a14000}, {0xc4a16000},
- {0xc4a18000}, {0xc4a1a000}, {0xc4a1c000}, {0xc4a1e000},
- {0xc4a20000}, {0xc4a22000}, {0xc4a24000}, {0xc4a26000},
- {0xc4a28000}, {0xc4a2a000}, {0xc4a2c000}, {0xc4a2e000},
- {0xc4a30000}, {0xc4a32000}, {0xc4a34000}, {0xc4a36000},
- {0xc4a38000}, {0xc4a3a000}, {0xc4a3c000}, {0xc4a3e000},
- {0xc4a40000}, {0xc4a42000}, {0xc4a44000}, {0xc4a46000},
- {0xc4a48000}, {0xc4a4a000}, {0xc4a4c000}, {0xc4a4e000},
- {0xc4a50000}, {0xc4a52000}, {0xc4a54000}, {0xc4a56000},
- {0xc4a58000}, {0xc4a5a000}, {0xc4a5c000}, {0xc4a5e000},
- {0xc4a60000}, {0xc4a62000}, {0xc4a64000}, {0xc4a66000},
- {0xc4a68000}, {0xc4a6a000}, {0xc4a6c000}, {0xc4a6e000},
- {0xc4a70000}, {0xc4a72000}, {0xc4a74000}, {0xc4a76000},
- {0xc4a78000}, {0xc4a7a000}, {0xc4a7c000}, {0xc4a7e000},
- {0xc4a80000}, {0xc4a82000}, {0xc4a84000}, {0xc4a86000},
- {0xc4a88000}, {0xc4a8a000}, {0xc4a8c000}, {0xc4a8e000},
- {0xc4a90000}, {0xc4a92000}, {0xc4a94000}, {0xc4a96000},
- {0xc4a98000}, {0xc4a9a000}, {0xc4a9c000}, {0xc4a9e000},
- {0xc4aa0000}, {0xc4aa2000}, {0xc4aa4000}, {0xc4aa6000},
- {0xc4aa8000}, {0xc4aaa000}, {0xc4aac000}, {0xc4aae000},
- {0xc4ab0000}, {0xc4ab2000}, {0xc4ab4000}, {0xc4ab6000},
- {0xc4ab8000}, {0xc4aba000}, {0xc4abc000}, {0xc4abe000},
- {0xc4ac0000}, {0xc4ac2000}, {0xc4ac4000}, {0xc4ac6000},
- {0xc4ac8000}, {0xc4aca000}, {0xc4acc000}, {0xc4ace000},
- {0xc4ad0000}, {0xc4ad2000}, {0xc4ad4000}, {0xc4ad6000},
- {0xc4ad8000}, {0xc4ada000}, {0xc4adc000}, {0xc4ade000},
- {0xc4ae0000}, {0xc4ae2000}, {0xc4ae4000}, {0xc4ae6000},
- {0xc4ae8000}, {0xc4aea000}, {0xc4aec000}, {0xc4aee000},
- {0xc4af0000}, {0xc4af2000}, {0xc4af4000}, {0xc4af6000},
- {0xc4af8000}, {0xc4afa000}, {0xc4afc000}, {0xc4afe000},
- {0xc4b00000}, {0xc4b02000}, {0xc4b04000}, {0xc4b06000},
- {0xc4b08000}, {0xc4b0a000}, {0xc4b0c000}, {0xc4b0e000},
- {0xc4b10000}, {0xc4b12000}, {0xc4b14000}, {0xc4b16000},
- {0xc4b18000}, {0xc4b1a000}, {0xc4b1c000}, {0xc4b1e000},
- {0xc4b20000}, {0xc4b22000}, {0xc4b24000}, {0xc4b26000},
- {0xc4b28000}, {0xc4b2a000}, {0xc4b2c000}, {0xc4b2e000},
- {0xc4b30000}, {0xc4b32000}, {0xc4b34000}, {0xc4b36000},
- {0xc4b38000}, {0xc4b3a000}, {0xc4b3c000}, {0xc4b3e000},
- {0xc4b40000}, {0xc4b42000}, {0xc4b44000}, {0xc4b46000},
- {0xc4b48000}, {0xc4b4a000}, {0xc4b4c000}, {0xc4b4e000},
- {0xc4b50000}, {0xc4b52000}, {0xc4b54000}, {0xc4b56000},
- {0xc4b58000}, {0xc4b5a000}, {0xc4b5c000}, {0xc4b5e000},
- {0xc4b60000}, {0xc4b62000}, {0xc4b64000}, {0xc4b66000},
- {0xc4b68000}, {0xc4b6a000}, {0xc4b6c000}, {0xc4b6e000},
- {0xc4b70000}, {0xc4b72000}, {0xc4b74000}, {0xc4b76000},
- {0xc4b78000}, {0xc4b7a000}, {0xc4b7c000}, {0xc4b7e000},
- {0xc4b80000}, {0xc4b82000}, {0xc4b84000}, {0xc4b86000},
- {0xc4b88000}, {0xc4b8a000}, {0xc4b8c000}, {0xc4b8e000},
- {0xc4b90000}, {0xc4b92000}, {0xc4b94000}, {0xc4b96000},
- {0xc4b98000}, {0xc4b9a000}, {0xc4b9c000}, {0xc4b9e000},
- {0xc4ba0000}, {0xc4ba2000}, {0xc4ba4000}, {0xc4ba6000},
- {0xc4ba8000}, {0xc4baa000}, {0xc4bac000}, {0xc4bae000},
- {0xc4bb0000}, {0xc4bb2000}, {0xc4bb4000}, {0xc4bb6000},
- {0xc4bb8000}, {0xc4bba000}, {0xc4bbc000}, {0xc4bbe000},
- {0xc4bc0000}, {0xc4bc2000}, {0xc4bc4000}, {0xc4bc6000},
- {0xc4bc8000}, {0xc4bca000}, {0xc4bcc000}, {0xc4bce000},
- {0xc4bd0000}, {0xc4bd2000}, {0xc4bd4000}, {0xc4bd6000},
- {0xc4bd8000}, {0xc4bda000}, {0xc4bdc000}, {0xc4bde000},
- {0xc4be0000}, {0xc4be2000}, {0xc4be4000}, {0xc4be6000},
- {0xc4be8000}, {0xc4bea000}, {0xc4bec000}, {0xc4bee000},
- {0xc4bf0000}, {0xc4bf2000}, {0xc4bf4000}, {0xc4bf6000},
- {0xc4bf8000}, {0xc4bfa000}, {0xc4bfc000}, {0xc4bfe000},
- {0xc4c00000}, {0xc4c02000}, {0xc4c04000}, {0xc4c06000},
- {0xc4c08000}, {0xc4c0a000}, {0xc4c0c000}, {0xc4c0e000},
- {0xc4c10000}, {0xc4c12000}, {0xc4c14000}, {0xc4c16000},
- {0xc4c18000}, {0xc4c1a000}, {0xc4c1c000}, {0xc4c1e000},
- {0xc4c20000}, {0xc4c22000}, {0xc4c24000}, {0xc4c26000},
- {0xc4c28000}, {0xc4c2a000}, {0xc4c2c000}, {0xc4c2e000},
- {0xc4c30000}, {0xc4c32000}, {0xc4c34000}, {0xc4c36000},
- {0xc4c38000}, {0xc4c3a000}, {0xc4c3c000}, {0xc4c3e000},
- {0xc4c40000}, {0xc4c42000}, {0xc4c44000}, {0xc4c46000},
- {0xc4c48000}, {0xc4c4a000}, {0xc4c4c000}, {0xc4c4e000},
- {0xc4c50000}, {0xc4c52000}, {0xc4c54000}, {0xc4c56000},
- {0xc4c58000}, {0xc4c5a000}, {0xc4c5c000}, {0xc4c5e000},
- {0xc4c60000}, {0xc4c62000}, {0xc4c64000}, {0xc4c66000},
- {0xc4c68000}, {0xc4c6a000}, {0xc4c6c000}, {0xc4c6e000},
- {0xc4c70000}, {0xc4c72000}, {0xc4c74000}, {0xc4c76000},
- {0xc4c78000}, {0xc4c7a000}, {0xc4c7c000}, {0xc4c7e000},
- {0xc4c80000}, {0xc4c82000}, {0xc4c84000}, {0xc4c86000},
- {0xc4c88000}, {0xc4c8a000}, {0xc4c8c000}, {0xc4c8e000},
- {0xc4c90000}, {0xc4c92000}, {0xc4c94000}, {0xc4c96000},
- {0xc4c98000}, {0xc4c9a000}, {0xc4c9c000}, {0xc4c9e000},
- {0xc4ca0000}, {0xc4ca2000}, {0xc4ca4000}, {0xc4ca6000},
- {0xc4ca8000}, {0xc4caa000}, {0xc4cac000}, {0xc4cae000},
- {0xc4cb0000}, {0xc4cb2000}, {0xc4cb4000}, {0xc4cb6000},
- {0xc4cb8000}, {0xc4cba000}, {0xc4cbc000}, {0xc4cbe000},
- {0xc4cc0000}, {0xc4cc2000}, {0xc4cc4000}, {0xc4cc6000},
- {0xc4cc8000}, {0xc4cca000}, {0xc4ccc000}, {0xc4cce000},
- {0xc4cd0000}, {0xc4cd2000}, {0xc4cd4000}, {0xc4cd6000},
- {0xc4cd8000}, {0xc4cda000}, {0xc4cdc000}, {0xc4cde000},
- {0xc4ce0000}, {0xc4ce2000}, {0xc4ce4000}, {0xc4ce6000},
- {0xc4ce8000}, {0xc4cea000}, {0xc4cec000}, {0xc4cee000},
- {0xc4cf0000}, {0xc4cf2000}, {0xc4cf4000}, {0xc4cf6000},
- {0xc4cf8000}, {0xc4cfa000}, {0xc4cfc000}, {0xc4cfe000},
- {0xc4d00000}, {0xc4d02000}, {0xc4d04000}, {0xc4d06000},
- {0xc4d08000}, {0xc4d0a000}, {0xc4d0c000}, {0xc4d0e000},
- {0xc4d10000}, {0xc4d12000}, {0xc4d14000}, {0xc4d16000},
- {0xc4d18000}, {0xc4d1a000}, {0xc4d1c000}, {0xc4d1e000},
- {0xc4d20000}, {0xc4d22000}, {0xc4d24000}, {0xc4d26000},
- {0xc4d28000}, {0xc4d2a000}, {0xc4d2c000}, {0xc4d2e000},
- {0xc4d30000}, {0xc4d32000}, {0xc4d34000}, {0xc4d36000},
- {0xc4d38000}, {0xc4d3a000}, {0xc4d3c000}, {0xc4d3e000},
- {0xc4d40000}, {0xc4d42000}, {0xc4d44000}, {0xc4d46000},
- {0xc4d48000}, {0xc4d4a000}, {0xc4d4c000}, {0xc4d4e000},
- {0xc4d50000}, {0xc4d52000}, {0xc4d54000}, {0xc4d56000},
- {0xc4d58000}, {0xc4d5a000}, {0xc4d5c000}, {0xc4d5e000},
- {0xc4d60000}, {0xc4d62000}, {0xc4d64000}, {0xc4d66000},
- {0xc4d68000}, {0xc4d6a000}, {0xc4d6c000}, {0xc4d6e000},
- {0xc4d70000}, {0xc4d72000}, {0xc4d74000}, {0xc4d76000},
- {0xc4d78000}, {0xc4d7a000}, {0xc4d7c000}, {0xc4d7e000},
- {0xc4d80000}, {0xc4d82000}, {0xc4d84000}, {0xc4d86000},
- {0xc4d88000}, {0xc4d8a000}, {0xc4d8c000}, {0xc4d8e000},
- {0xc4d90000}, {0xc4d92000}, {0xc4d94000}, {0xc4d96000},
- {0xc4d98000}, {0xc4d9a000}, {0xc4d9c000}, {0xc4d9e000},
- {0xc4da0000}, {0xc4da2000}, {0xc4da4000}, {0xc4da6000},
- {0xc4da8000}, {0xc4daa000}, {0xc4dac000}, {0xc4dae000},
- {0xc4db0000}, {0xc4db2000}, {0xc4db4000}, {0xc4db6000},
- {0xc4db8000}, {0xc4dba000}, {0xc4dbc000}, {0xc4dbe000},
- {0xc4dc0000}, {0xc4dc2000}, {0xc4dc4000}, {0xc4dc6000},
- {0xc4dc8000}, {0xc4dca000}, {0xc4dcc000}, {0xc4dce000},
- {0xc4dd0000}, {0xc4dd2000}, {0xc4dd4000}, {0xc4dd6000},
- {0xc4dd8000}, {0xc4dda000}, {0xc4ddc000}, {0xc4dde000},
- {0xc4de0000}, {0xc4de2000}, {0xc4de4000}, {0xc4de6000},
- {0xc4de8000}, {0xc4dea000}, {0xc4dec000}, {0xc4dee000},
- {0xc4df0000}, {0xc4df2000}, {0xc4df4000}, {0xc4df6000},
- {0xc4df8000}, {0xc4dfa000}, {0xc4dfc000}, {0xc4dfe000},
- {0xc4e00000}, {0xc4e02000}, {0xc4e04000}, {0xc4e06000},
- {0xc4e08000}, {0xc4e0a000}, {0xc4e0c000}, {0xc4e0e000},
- {0xc4e10000}, {0xc4e12000}, {0xc4e14000}, {0xc4e16000},
- {0xc4e18000}, {0xc4e1a000}, {0xc4e1c000}, {0xc4e1e000},
- {0xc4e20000}, {0xc4e22000}, {0xc4e24000}, {0xc4e26000},
- {0xc4e28000}, {0xc4e2a000}, {0xc4e2c000}, {0xc4e2e000},
- {0xc4e30000}, {0xc4e32000}, {0xc4e34000}, {0xc4e36000},
- {0xc4e38000}, {0xc4e3a000}, {0xc4e3c000}, {0xc4e3e000},
- {0xc4e40000}, {0xc4e42000}, {0xc4e44000}, {0xc4e46000},
- {0xc4e48000}, {0xc4e4a000}, {0xc4e4c000}, {0xc4e4e000},
- {0xc4e50000}, {0xc4e52000}, {0xc4e54000}, {0xc4e56000},
- {0xc4e58000}, {0xc4e5a000}, {0xc4e5c000}, {0xc4e5e000},
- {0xc4e60000}, {0xc4e62000}, {0xc4e64000}, {0xc4e66000},
- {0xc4e68000}, {0xc4e6a000}, {0xc4e6c000}, {0xc4e6e000},
- {0xc4e70000}, {0xc4e72000}, {0xc4e74000}, {0xc4e76000},
- {0xc4e78000}, {0xc4e7a000}, {0xc4e7c000}, {0xc4e7e000},
- {0xc4e80000}, {0xc4e82000}, {0xc4e84000}, {0xc4e86000},
- {0xc4e88000}, {0xc4e8a000}, {0xc4e8c000}, {0xc4e8e000},
- {0xc4e90000}, {0xc4e92000}, {0xc4e94000}, {0xc4e96000},
- {0xc4e98000}, {0xc4e9a000}, {0xc4e9c000}, {0xc4e9e000},
- {0xc4ea0000}, {0xc4ea2000}, {0xc4ea4000}, {0xc4ea6000},
- {0xc4ea8000}, {0xc4eaa000}, {0xc4eac000}, {0xc4eae000},
- {0xc4eb0000}, {0xc4eb2000}, {0xc4eb4000}, {0xc4eb6000},
- {0xc4eb8000}, {0xc4eba000}, {0xc4ebc000}, {0xc4ebe000},
- {0xc4ec0000}, {0xc4ec2000}, {0xc4ec4000}, {0xc4ec6000},
- {0xc4ec8000}, {0xc4eca000}, {0xc4ecc000}, {0xc4ece000},
- {0xc4ed0000}, {0xc4ed2000}, {0xc4ed4000}, {0xc4ed6000},
- {0xc4ed8000}, {0xc4eda000}, {0xc4edc000}, {0xc4ede000},
- {0xc4ee0000}, {0xc4ee2000}, {0xc4ee4000}, {0xc4ee6000},
- {0xc4ee8000}, {0xc4eea000}, {0xc4eec000}, {0xc4eee000},
- {0xc4ef0000}, {0xc4ef2000}, {0xc4ef4000}, {0xc4ef6000},
- {0xc4ef8000}, {0xc4efa000}, {0xc4efc000}, {0xc4efe000},
- {0xc4f00000}, {0xc4f02000}, {0xc4f04000}, {0xc4f06000},
- {0xc4f08000}, {0xc4f0a000}, {0xc4f0c000}, {0xc4f0e000},
- {0xc4f10000}, {0xc4f12000}, {0xc4f14000}, {0xc4f16000},
- {0xc4f18000}, {0xc4f1a000}, {0xc4f1c000}, {0xc4f1e000},
- {0xc4f20000}, {0xc4f22000}, {0xc4f24000}, {0xc4f26000},
- {0xc4f28000}, {0xc4f2a000}, {0xc4f2c000}, {0xc4f2e000},
- {0xc4f30000}, {0xc4f32000}, {0xc4f34000}, {0xc4f36000},
- {0xc4f38000}, {0xc4f3a000}, {0xc4f3c000}, {0xc4f3e000},
- {0xc4f40000}, {0xc4f42000}, {0xc4f44000}, {0xc4f46000},
- {0xc4f48000}, {0xc4f4a000}, {0xc4f4c000}, {0xc4f4e000},
- {0xc4f50000}, {0xc4f52000}, {0xc4f54000}, {0xc4f56000},
- {0xc4f58000}, {0xc4f5a000}, {0xc4f5c000}, {0xc4f5e000},
- {0xc4f60000}, {0xc4f62000}, {0xc4f64000}, {0xc4f66000},
- {0xc4f68000}, {0xc4f6a000}, {0xc4f6c000}, {0xc4f6e000},
- {0xc4f70000}, {0xc4f72000}, {0xc4f74000}, {0xc4f76000},
- {0xc4f78000}, {0xc4f7a000}, {0xc4f7c000}, {0xc4f7e000},
- {0xc4f80000}, {0xc4f82000}, {0xc4f84000}, {0xc4f86000},
- {0xc4f88000}, {0xc4f8a000}, {0xc4f8c000}, {0xc4f8e000},
- {0xc4f90000}, {0xc4f92000}, {0xc4f94000}, {0xc4f96000},
- {0xc4f98000}, {0xc4f9a000}, {0xc4f9c000}, {0xc4f9e000},
- {0xc4fa0000}, {0xc4fa2000}, {0xc4fa4000}, {0xc4fa6000},
- {0xc4fa8000}, {0xc4faa000}, {0xc4fac000}, {0xc4fae000},
- {0xc4fb0000}, {0xc4fb2000}, {0xc4fb4000}, {0xc4fb6000},
- {0xc4fb8000}, {0xc4fba000}, {0xc4fbc000}, {0xc4fbe000},
- {0xc4fc0000}, {0xc4fc2000}, {0xc4fc4000}, {0xc4fc6000},
- {0xc4fc8000}, {0xc4fca000}, {0xc4fcc000}, {0xc4fce000},
- {0xc4fd0000}, {0xc4fd2000}, {0xc4fd4000}, {0xc4fd6000},
- {0xc4fd8000}, {0xc4fda000}, {0xc4fdc000}, {0xc4fde000},
- {0xc4fe0000}, {0xc4fe2000}, {0xc4fe4000}, {0xc4fe6000},
- {0xc4fe8000}, {0xc4fea000}, {0xc4fec000}, {0xc4fee000},
- {0xc4ff0000}, {0xc4ff2000}, {0xc4ff4000}, {0xc4ff6000},
- {0xc4ff8000}, {0xc4ffa000}, {0xc4ffc000}, {0xc4ffe000},
- {0xc5000000}, {0xc5002000}, {0xc5004000}, {0xc5006000},
- {0xc5008000}, {0xc500a000}, {0xc500c000}, {0xc500e000},
- {0xc5010000}, {0xc5012000}, {0xc5014000}, {0xc5016000},
- {0xc5018000}, {0xc501a000}, {0xc501c000}, {0xc501e000},
- {0xc5020000}, {0xc5022000}, {0xc5024000}, {0xc5026000},
- {0xc5028000}, {0xc502a000}, {0xc502c000}, {0xc502e000},
- {0xc5030000}, {0xc5032000}, {0xc5034000}, {0xc5036000},
- {0xc5038000}, {0xc503a000}, {0xc503c000}, {0xc503e000},
- {0xc5040000}, {0xc5042000}, {0xc5044000}, {0xc5046000},
- {0xc5048000}, {0xc504a000}, {0xc504c000}, {0xc504e000},
- {0xc5050000}, {0xc5052000}, {0xc5054000}, {0xc5056000},
- {0xc5058000}, {0xc505a000}, {0xc505c000}, {0xc505e000},
- {0xc5060000}, {0xc5062000}, {0xc5064000}, {0xc5066000},
- {0xc5068000}, {0xc506a000}, {0xc506c000}, {0xc506e000},
- {0xc5070000}, {0xc5072000}, {0xc5074000}, {0xc5076000},
- {0xc5078000}, {0xc507a000}, {0xc507c000}, {0xc507e000},
- {0xc5080000}, {0xc5082000}, {0xc5084000}, {0xc5086000},
- {0xc5088000}, {0xc508a000}, {0xc508c000}, {0xc508e000},
- {0xc5090000}, {0xc5092000}, {0xc5094000}, {0xc5096000},
- {0xc5098000}, {0xc509a000}, {0xc509c000}, {0xc509e000},
- {0xc50a0000}, {0xc50a2000}, {0xc50a4000}, {0xc50a6000},
- {0xc50a8000}, {0xc50aa000}, {0xc50ac000}, {0xc50ae000},
- {0xc50b0000}, {0xc50b2000}, {0xc50b4000}, {0xc50b6000},
- {0xc50b8000}, {0xc50ba000}, {0xc50bc000}, {0xc50be000},
- {0xc50c0000}, {0xc50c2000}, {0xc50c4000}, {0xc50c6000},
- {0xc50c8000}, {0xc50ca000}, {0xc50cc000}, {0xc50ce000},
- {0xc50d0000}, {0xc50d2000}, {0xc50d4000}, {0xc50d6000},
- {0xc50d8000}, {0xc50da000}, {0xc50dc000}, {0xc50de000},
- {0xc50e0000}, {0xc50e2000}, {0xc50e4000}, {0xc50e6000},
- {0xc50e8000}, {0xc50ea000}, {0xc50ec000}, {0xc50ee000},
- {0xc50f0000}, {0xc50f2000}, {0xc50f4000}, {0xc50f6000},
- {0xc50f8000}, {0xc50fa000}, {0xc50fc000}, {0xc50fe000},
- {0xc5100000}, {0xc5102000}, {0xc5104000}, {0xc5106000},
- {0xc5108000}, {0xc510a000}, {0xc510c000}, {0xc510e000},
- {0xc5110000}, {0xc5112000}, {0xc5114000}, {0xc5116000},
- {0xc5118000}, {0xc511a000}, {0xc511c000}, {0xc511e000},
- {0xc5120000}, {0xc5122000}, {0xc5124000}, {0xc5126000},
- {0xc5128000}, {0xc512a000}, {0xc512c000}, {0xc512e000},
- {0xc5130000}, {0xc5132000}, {0xc5134000}, {0xc5136000},
- {0xc5138000}, {0xc513a000}, {0xc513c000}, {0xc513e000},
- {0xc5140000}, {0xc5142000}, {0xc5144000}, {0xc5146000},
- {0xc5148000}, {0xc514a000}, {0xc514c000}, {0xc514e000},
- {0xc5150000}, {0xc5152000}, {0xc5154000}, {0xc5156000},
- {0xc5158000}, {0xc515a000}, {0xc515c000}, {0xc515e000},
- {0xc5160000}, {0xc5162000}, {0xc5164000}, {0xc5166000},
- {0xc5168000}, {0xc516a000}, {0xc516c000}, {0xc516e000},
- {0xc5170000}, {0xc5172000}, {0xc5174000}, {0xc5176000},
- {0xc5178000}, {0xc517a000}, {0xc517c000}, {0xc517e000},
- {0xc5180000}, {0xc5182000}, {0xc5184000}, {0xc5186000},
- {0xc5188000}, {0xc518a000}, {0xc518c000}, {0xc518e000},
- {0xc5190000}, {0xc5192000}, {0xc5194000}, {0xc5196000},
- {0xc5198000}, {0xc519a000}, {0xc519c000}, {0xc519e000},
- {0xc51a0000}, {0xc51a2000}, {0xc51a4000}, {0xc51a6000},
- {0xc51a8000}, {0xc51aa000}, {0xc51ac000}, {0xc51ae000},
- {0xc51b0000}, {0xc51b2000}, {0xc51b4000}, {0xc51b6000},
- {0xc51b8000}, {0xc51ba000}, {0xc51bc000}, {0xc51be000},
- {0xc51c0000}, {0xc51c2000}, {0xc51c4000}, {0xc51c6000},
- {0xc51c8000}, {0xc51ca000}, {0xc51cc000}, {0xc51ce000},
- {0xc51d0000}, {0xc51d2000}, {0xc51d4000}, {0xc51d6000},
- {0xc51d8000}, {0xc51da000}, {0xc51dc000}, {0xc51de000},
- {0xc51e0000}, {0xc51e2000}, {0xc51e4000}, {0xc51e6000},
- {0xc51e8000}, {0xc51ea000}, {0xc51ec000}, {0xc51ee000},
- {0xc51f0000}, {0xc51f2000}, {0xc51f4000}, {0xc51f6000},
- {0xc51f8000}, {0xc51fa000}, {0xc51fc000}, {0xc51fe000},
- {0xc5200000}, {0xc5202000}, {0xc5204000}, {0xc5206000},
- {0xc5208000}, {0xc520a000}, {0xc520c000}, {0xc520e000},
- {0xc5210000}, {0xc5212000}, {0xc5214000}, {0xc5216000},
- {0xc5218000}, {0xc521a000}, {0xc521c000}, {0xc521e000},
- {0xc5220000}, {0xc5222000}, {0xc5224000}, {0xc5226000},
- {0xc5228000}, {0xc522a000}, {0xc522c000}, {0xc522e000},
- {0xc5230000}, {0xc5232000}, {0xc5234000}, {0xc5236000},
- {0xc5238000}, {0xc523a000}, {0xc523c000}, {0xc523e000},
- {0xc5240000}, {0xc5242000}, {0xc5244000}, {0xc5246000},
- {0xc5248000}, {0xc524a000}, {0xc524c000}, {0xc524e000},
- {0xc5250000}, {0xc5252000}, {0xc5254000}, {0xc5256000},
- {0xc5258000}, {0xc525a000}, {0xc525c000}, {0xc525e000},
- {0xc5260000}, {0xc5262000}, {0xc5264000}, {0xc5266000},
- {0xc5268000}, {0xc526a000}, {0xc526c000}, {0xc526e000},
- {0xc5270000}, {0xc5272000}, {0xc5274000}, {0xc5276000},
- {0xc5278000}, {0xc527a000}, {0xc527c000}, {0xc527e000},
- {0xc5280000}, {0xc5282000}, {0xc5284000}, {0xc5286000},
- {0xc5288000}, {0xc528a000}, {0xc528c000}, {0xc528e000},
- {0xc5290000}, {0xc5292000}, {0xc5294000}, {0xc5296000},
- {0xc5298000}, {0xc529a000}, {0xc529c000}, {0xc529e000},
- {0xc52a0000}, {0xc52a2000}, {0xc52a4000}, {0xc52a6000},
- {0xc52a8000}, {0xc52aa000}, {0xc52ac000}, {0xc52ae000},
- {0xc52b0000}, {0xc52b2000}, {0xc52b4000}, {0xc52b6000},
- {0xc52b8000}, {0xc52ba000}, {0xc52bc000}, {0xc52be000},
- {0xc52c0000}, {0xc52c2000}, {0xc52c4000}, {0xc52c6000},
- {0xc52c8000}, {0xc52ca000}, {0xc52cc000}, {0xc52ce000},
- {0xc52d0000}, {0xc52d2000}, {0xc52d4000}, {0xc52d6000},
- {0xc52d8000}, {0xc52da000}, {0xc52dc000}, {0xc52de000},
- {0xc52e0000}, {0xc52e2000}, {0xc52e4000}, {0xc52e6000},
- {0xc52e8000}, {0xc52ea000}, {0xc52ec000}, {0xc52ee000},
- {0xc52f0000}, {0xc52f2000}, {0xc52f4000}, {0xc52f6000},
- {0xc52f8000}, {0xc52fa000}, {0xc52fc000}, {0xc52fe000},
- {0xc5300000}, {0xc5302000}, {0xc5304000}, {0xc5306000},
- {0xc5308000}, {0xc530a000}, {0xc530c000}, {0xc530e000},
- {0xc5310000}, {0xc5312000}, {0xc5314000}, {0xc5316000},
- {0xc5318000}, {0xc531a000}, {0xc531c000}, {0xc531e000},
- {0xc5320000}, {0xc5322000}, {0xc5324000}, {0xc5326000},
- {0xc5328000}, {0xc532a000}, {0xc532c000}, {0xc532e000},
- {0xc5330000}, {0xc5332000}, {0xc5334000}, {0xc5336000},
- {0xc5338000}, {0xc533a000}, {0xc533c000}, {0xc533e000},
- {0xc5340000}, {0xc5342000}, {0xc5344000}, {0xc5346000},
- {0xc5348000}, {0xc534a000}, {0xc534c000}, {0xc534e000},
- {0xc5350000}, {0xc5352000}, {0xc5354000}, {0xc5356000},
- {0xc5358000}, {0xc535a000}, {0xc535c000}, {0xc535e000},
- {0xc5360000}, {0xc5362000}, {0xc5364000}, {0xc5366000},
- {0xc5368000}, {0xc536a000}, {0xc536c000}, {0xc536e000},
- {0xc5370000}, {0xc5372000}, {0xc5374000}, {0xc5376000},
- {0xc5378000}, {0xc537a000}, {0xc537c000}, {0xc537e000},
- {0xc5380000}, {0xc5382000}, {0xc5384000}, {0xc5386000},
- {0xc5388000}, {0xc538a000}, {0xc538c000}, {0xc538e000},
- {0xc5390000}, {0xc5392000}, {0xc5394000}, {0xc5396000},
- {0xc5398000}, {0xc539a000}, {0xc539c000}, {0xc539e000},
- {0xc53a0000}, {0xc53a2000}, {0xc53a4000}, {0xc53a6000},
- {0xc53a8000}, {0xc53aa000}, {0xc53ac000}, {0xc53ae000},
- {0xc53b0000}, {0xc53b2000}, {0xc53b4000}, {0xc53b6000},
- {0xc53b8000}, {0xc53ba000}, {0xc53bc000}, {0xc53be000},
- {0xc53c0000}, {0xc53c2000}, {0xc53c4000}, {0xc53c6000},
- {0xc53c8000}, {0xc53ca000}, {0xc53cc000}, {0xc53ce000},
- {0xc53d0000}, {0xc53d2000}, {0xc53d4000}, {0xc53d6000},
- {0xc53d8000}, {0xc53da000}, {0xc53dc000}, {0xc53de000},
- {0xc53e0000}, {0xc53e2000}, {0xc53e4000}, {0xc53e6000},
- {0xc53e8000}, {0xc53ea000}, {0xc53ec000}, {0xc53ee000},
- {0xc53f0000}, {0xc53f2000}, {0xc53f4000}, {0xc53f6000},
- {0xc53f8000}, {0xc53fa000}, {0xc53fc000}, {0xc53fe000},
- {0xc5400000}, {0xc5402000}, {0xc5404000}, {0xc5406000},
- {0xc5408000}, {0xc540a000}, {0xc540c000}, {0xc540e000},
- {0xc5410000}, {0xc5412000}, {0xc5414000}, {0xc5416000},
- {0xc5418000}, {0xc541a000}, {0xc541c000}, {0xc541e000},
- {0xc5420000}, {0xc5422000}, {0xc5424000}, {0xc5426000},
- {0xc5428000}, {0xc542a000}, {0xc542c000}, {0xc542e000},
- {0xc5430000}, {0xc5432000}, {0xc5434000}, {0xc5436000},
- {0xc5438000}, {0xc543a000}, {0xc543c000}, {0xc543e000},
- {0xc5440000}, {0xc5442000}, {0xc5444000}, {0xc5446000},
- {0xc5448000}, {0xc544a000}, {0xc544c000}, {0xc544e000},
- {0xc5450000}, {0xc5452000}, {0xc5454000}, {0xc5456000},
- {0xc5458000}, {0xc545a000}, {0xc545c000}, {0xc545e000},
- {0xc5460000}, {0xc5462000}, {0xc5464000}, {0xc5466000},
- {0xc5468000}, {0xc546a000}, {0xc546c000}, {0xc546e000},
- {0xc5470000}, {0xc5472000}, {0xc5474000}, {0xc5476000},
- {0xc5478000}, {0xc547a000}, {0xc547c000}, {0xc547e000},
- {0xc5480000}, {0xc5482000}, {0xc5484000}, {0xc5486000},
- {0xc5488000}, {0xc548a000}, {0xc548c000}, {0xc548e000},
- {0xc5490000}, {0xc5492000}, {0xc5494000}, {0xc5496000},
- {0xc5498000}, {0xc549a000}, {0xc549c000}, {0xc549e000},
- {0xc54a0000}, {0xc54a2000}, {0xc54a4000}, {0xc54a6000},
- {0xc54a8000}, {0xc54aa000}, {0xc54ac000}, {0xc54ae000},
- {0xc54b0000}, {0xc54b2000}, {0xc54b4000}, {0xc54b6000},
- {0xc54b8000}, {0xc54ba000}, {0xc54bc000}, {0xc54be000},
- {0xc54c0000}, {0xc54c2000}, {0xc54c4000}, {0xc54c6000},
- {0xc54c8000}, {0xc54ca000}, {0xc54cc000}, {0xc54ce000},
- {0xc54d0000}, {0xc54d2000}, {0xc54d4000}, {0xc54d6000},
- {0xc54d8000}, {0xc54da000}, {0xc54dc000}, {0xc54de000},
- {0xc54e0000}, {0xc54e2000}, {0xc54e4000}, {0xc54e6000},
- {0xc54e8000}, {0xc54ea000}, {0xc54ec000}, {0xc54ee000},
- {0xc54f0000}, {0xc54f2000}, {0xc54f4000}, {0xc54f6000},
- {0xc54f8000}, {0xc54fa000}, {0xc54fc000}, {0xc54fe000},
- {0xc5500000}, {0xc5502000}, {0xc5504000}, {0xc5506000},
- {0xc5508000}, {0xc550a000}, {0xc550c000}, {0xc550e000},
- {0xc5510000}, {0xc5512000}, {0xc5514000}, {0xc5516000},
- {0xc5518000}, {0xc551a000}, {0xc551c000}, {0xc551e000},
- {0xc5520000}, {0xc5522000}, {0xc5524000}, {0xc5526000},
- {0xc5528000}, {0xc552a000}, {0xc552c000}, {0xc552e000},
- {0xc5530000}, {0xc5532000}, {0xc5534000}, {0xc5536000},
- {0xc5538000}, {0xc553a000}, {0xc553c000}, {0xc553e000},
- {0xc5540000}, {0xc5542000}, {0xc5544000}, {0xc5546000},
- {0xc5548000}, {0xc554a000}, {0xc554c000}, {0xc554e000},
- {0xc5550000}, {0xc5552000}, {0xc5554000}, {0xc5556000},
- {0xc5558000}, {0xc555a000}, {0xc555c000}, {0xc555e000},
- {0xc5560000}, {0xc5562000}, {0xc5564000}, {0xc5566000},
- {0xc5568000}, {0xc556a000}, {0xc556c000}, {0xc556e000},
- {0xc5570000}, {0xc5572000}, {0xc5574000}, {0xc5576000},
- {0xc5578000}, {0xc557a000}, {0xc557c000}, {0xc557e000},
- {0xc5580000}, {0xc5582000}, {0xc5584000}, {0xc5586000},
- {0xc5588000}, {0xc558a000}, {0xc558c000}, {0xc558e000},
- {0xc5590000}, {0xc5592000}, {0xc5594000}, {0xc5596000},
- {0xc5598000}, {0xc559a000}, {0xc559c000}, {0xc559e000},
- {0xc55a0000}, {0xc55a2000}, {0xc55a4000}, {0xc55a6000},
- {0xc55a8000}, {0xc55aa000}, {0xc55ac000}, {0xc55ae000},
- {0xc55b0000}, {0xc55b2000}, {0xc55b4000}, {0xc55b6000},
- {0xc55b8000}, {0xc55ba000}, {0xc55bc000}, {0xc55be000},
- {0xc55c0000}, {0xc55c2000}, {0xc55c4000}, {0xc55c6000},
- {0xc55c8000}, {0xc55ca000}, {0xc55cc000}, {0xc55ce000},
- {0xc55d0000}, {0xc55d2000}, {0xc55d4000}, {0xc55d6000},
- {0xc55d8000}, {0xc55da000}, {0xc55dc000}, {0xc55de000},
- {0xc55e0000}, {0xc55e2000}, {0xc55e4000}, {0xc55e6000},
- {0xc55e8000}, {0xc55ea000}, {0xc55ec000}, {0xc55ee000},
- {0xc55f0000}, {0xc55f2000}, {0xc55f4000}, {0xc55f6000},
- {0xc55f8000}, {0xc55fa000}, {0xc55fc000}, {0xc55fe000},
- {0xc5600000}, {0xc5602000}, {0xc5604000}, {0xc5606000},
- {0xc5608000}, {0xc560a000}, {0xc560c000}, {0xc560e000},
- {0xc5610000}, {0xc5612000}, {0xc5614000}, {0xc5616000},
- {0xc5618000}, {0xc561a000}, {0xc561c000}, {0xc561e000},
- {0xc5620000}, {0xc5622000}, {0xc5624000}, {0xc5626000},
- {0xc5628000}, {0xc562a000}, {0xc562c000}, {0xc562e000},
- {0xc5630000}, {0xc5632000}, {0xc5634000}, {0xc5636000},
- {0xc5638000}, {0xc563a000}, {0xc563c000}, {0xc563e000},
- {0xc5640000}, {0xc5642000}, {0xc5644000}, {0xc5646000},
- {0xc5648000}, {0xc564a000}, {0xc564c000}, {0xc564e000},
- {0xc5650000}, {0xc5652000}, {0xc5654000}, {0xc5656000},
- {0xc5658000}, {0xc565a000}, {0xc565c000}, {0xc565e000},
- {0xc5660000}, {0xc5662000}, {0xc5664000}, {0xc5666000},
- {0xc5668000}, {0xc566a000}, {0xc566c000}, {0xc566e000},
- {0xc5670000}, {0xc5672000}, {0xc5674000}, {0xc5676000},
- {0xc5678000}, {0xc567a000}, {0xc567c000}, {0xc567e000},
- {0xc5680000}, {0xc5682000}, {0xc5684000}, {0xc5686000},
- {0xc5688000}, {0xc568a000}, {0xc568c000}, {0xc568e000},
- {0xc5690000}, {0xc5692000}, {0xc5694000}, {0xc5696000},
- {0xc5698000}, {0xc569a000}, {0xc569c000}, {0xc569e000},
- {0xc56a0000}, {0xc56a2000}, {0xc56a4000}, {0xc56a6000},
- {0xc56a8000}, {0xc56aa000}, {0xc56ac000}, {0xc56ae000},
- {0xc56b0000}, {0xc56b2000}, {0xc56b4000}, {0xc56b6000},
- {0xc56b8000}, {0xc56ba000}, {0xc56bc000}, {0xc56be000},
- {0xc56c0000}, {0xc56c2000}, {0xc56c4000}, {0xc56c6000},
- {0xc56c8000}, {0xc56ca000}, {0xc56cc000}, {0xc56ce000},
- {0xc56d0000}, {0xc56d2000}, {0xc56d4000}, {0xc56d6000},
- {0xc56d8000}, {0xc56da000}, {0xc56dc000}, {0xc56de000},
- {0xc56e0000}, {0xc56e2000}, {0xc56e4000}, {0xc56e6000},
- {0xc56e8000}, {0xc56ea000}, {0xc56ec000}, {0xc56ee000},
- {0xc56f0000}, {0xc56f2000}, {0xc56f4000}, {0xc56f6000},
- {0xc56f8000}, {0xc56fa000}, {0xc56fc000}, {0xc56fe000},
- {0xc5700000}, {0xc5702000}, {0xc5704000}, {0xc5706000},
- {0xc5708000}, {0xc570a000}, {0xc570c000}, {0xc570e000},
- {0xc5710000}, {0xc5712000}, {0xc5714000}, {0xc5716000},
- {0xc5718000}, {0xc571a000}, {0xc571c000}, {0xc571e000},
- {0xc5720000}, {0xc5722000}, {0xc5724000}, {0xc5726000},
- {0xc5728000}, {0xc572a000}, {0xc572c000}, {0xc572e000},
- {0xc5730000}, {0xc5732000}, {0xc5734000}, {0xc5736000},
- {0xc5738000}, {0xc573a000}, {0xc573c000}, {0xc573e000},
- {0xc5740000}, {0xc5742000}, {0xc5744000}, {0xc5746000},
- {0xc5748000}, {0xc574a000}, {0xc574c000}, {0xc574e000},
- {0xc5750000}, {0xc5752000}, {0xc5754000}, {0xc5756000},
- {0xc5758000}, {0xc575a000}, {0xc575c000}, {0xc575e000},
- {0xc5760000}, {0xc5762000}, {0xc5764000}, {0xc5766000},
- {0xc5768000}, {0xc576a000}, {0xc576c000}, {0xc576e000},
- {0xc5770000}, {0xc5772000}, {0xc5774000}, {0xc5776000},
- {0xc5778000}, {0xc577a000}, {0xc577c000}, {0xc577e000},
- {0xc5780000}, {0xc5782000}, {0xc5784000}, {0xc5786000},
- {0xc5788000}, {0xc578a000}, {0xc578c000}, {0xc578e000},
- {0xc5790000}, {0xc5792000}, {0xc5794000}, {0xc5796000},
- {0xc5798000}, {0xc579a000}, {0xc579c000}, {0xc579e000},
- {0xc57a0000}, {0xc57a2000}, {0xc57a4000}, {0xc57a6000},
- {0xc57a8000}, {0xc57aa000}, {0xc57ac000}, {0xc57ae000},
- {0xc57b0000}, {0xc57b2000}, {0xc57b4000}, {0xc57b6000},
- {0xc57b8000}, {0xc57ba000}, {0xc57bc000}, {0xc57be000},
- {0xc57c0000}, {0xc57c2000}, {0xc57c4000}, {0xc57c6000},
- {0xc57c8000}, {0xc57ca000}, {0xc57cc000}, {0xc57ce000},
- {0xc57d0000}, {0xc57d2000}, {0xc57d4000}, {0xc57d6000},
- {0xc57d8000}, {0xc57da000}, {0xc57dc000}, {0xc57de000},
- {0xc57e0000}, {0xc57e2000}, {0xc57e4000}, {0xc57e6000},
- {0xc57e8000}, {0xc57ea000}, {0xc57ec000}, {0xc57ee000},
- {0xc57f0000}, {0xc57f2000}, {0xc57f4000}, {0xc57f6000},
- {0xc57f8000}, {0xc57fa000}, {0xc57fc000}, {0xc57fe000},
- {0xc5800000}, {0xc5802000}, {0xc5804000}, {0xc5806000},
- {0xc5808000}, {0xc580a000}, {0xc580c000}, {0xc580e000},
- {0xc5810000}, {0xc5812000}, {0xc5814000}, {0xc5816000},
- {0xc5818000}, {0xc581a000}, {0xc581c000}, {0xc581e000},
- {0xc5820000}, {0xc5822000}, {0xc5824000}, {0xc5826000},
- {0xc5828000}, {0xc582a000}, {0xc582c000}, {0xc582e000},
- {0xc5830000}, {0xc5832000}, {0xc5834000}, {0xc5836000},
- {0xc5838000}, {0xc583a000}, {0xc583c000}, {0xc583e000},
- {0xc5840000}, {0xc5842000}, {0xc5844000}, {0xc5846000},
- {0xc5848000}, {0xc584a000}, {0xc584c000}, {0xc584e000},
- {0xc5850000}, {0xc5852000}, {0xc5854000}, {0xc5856000},
- {0xc5858000}, {0xc585a000}, {0xc585c000}, {0xc585e000},
- {0xc5860000}, {0xc5862000}, {0xc5864000}, {0xc5866000},
- {0xc5868000}, {0xc586a000}, {0xc586c000}, {0xc586e000},
- {0xc5870000}, {0xc5872000}, {0xc5874000}, {0xc5876000},
- {0xc5878000}, {0xc587a000}, {0xc587c000}, {0xc587e000},
- {0xc5880000}, {0xc5882000}, {0xc5884000}, {0xc5886000},
- {0xc5888000}, {0xc588a000}, {0xc588c000}, {0xc588e000},
- {0xc5890000}, {0xc5892000}, {0xc5894000}, {0xc5896000},
- {0xc5898000}, {0xc589a000}, {0xc589c000}, {0xc589e000},
- {0xc58a0000}, {0xc58a2000}, {0xc58a4000}, {0xc58a6000},
- {0xc58a8000}, {0xc58aa000}, {0xc58ac000}, {0xc58ae000},
- {0xc58b0000}, {0xc58b2000}, {0xc58b4000}, {0xc58b6000},
- {0xc58b8000}, {0xc58ba000}, {0xc58bc000}, {0xc58be000},
- {0xc58c0000}, {0xc58c2000}, {0xc58c4000}, {0xc58c6000},
- {0xc58c8000}, {0xc58ca000}, {0xc58cc000}, {0xc58ce000},
- {0xc58d0000}, {0xc58d2000}, {0xc58d4000}, {0xc58d6000},
- {0xc58d8000}, {0xc58da000}, {0xc58dc000}, {0xc58de000},
- {0xc58e0000}, {0xc58e2000}, {0xc58e4000}, {0xc58e6000},
- {0xc58e8000}, {0xc58ea000}, {0xc58ec000}, {0xc58ee000},
- {0xc58f0000}, {0xc58f2000}, {0xc58f4000}, {0xc58f6000},
- {0xc58f8000}, {0xc58fa000}, {0xc58fc000}, {0xc58fe000},
- {0xc5900000}, {0xc5902000}, {0xc5904000}, {0xc5906000},
- {0xc5908000}, {0xc590a000}, {0xc590c000}, {0xc590e000},
- {0xc5910000}, {0xc5912000}, {0xc5914000}, {0xc5916000},
- {0xc5918000}, {0xc591a000}, {0xc591c000}, {0xc591e000},
- {0xc5920000}, {0xc5922000}, {0xc5924000}, {0xc5926000},
- {0xc5928000}, {0xc592a000}, {0xc592c000}, {0xc592e000},
- {0xc5930000}, {0xc5932000}, {0xc5934000}, {0xc5936000},
- {0xc5938000}, {0xc593a000}, {0xc593c000}, {0xc593e000},
- {0xc5940000}, {0xc5942000}, {0xc5944000}, {0xc5946000},
- {0xc5948000}, {0xc594a000}, {0xc594c000}, {0xc594e000},
- {0xc5950000}, {0xc5952000}, {0xc5954000}, {0xc5956000},
- {0xc5958000}, {0xc595a000}, {0xc595c000}, {0xc595e000},
- {0xc5960000}, {0xc5962000}, {0xc5964000}, {0xc5966000},
- {0xc5968000}, {0xc596a000}, {0xc596c000}, {0xc596e000},
- {0xc5970000}, {0xc5972000}, {0xc5974000}, {0xc5976000},
- {0xc5978000}, {0xc597a000}, {0xc597c000}, {0xc597e000},
- {0xc5980000}, {0xc5982000}, {0xc5984000}, {0xc5986000},
- {0xc5988000}, {0xc598a000}, {0xc598c000}, {0xc598e000},
- {0xc5990000}, {0xc5992000}, {0xc5994000}, {0xc5996000},
- {0xc5998000}, {0xc599a000}, {0xc599c000}, {0xc599e000},
- {0xc59a0000}, {0xc59a2000}, {0xc59a4000}, {0xc59a6000},
- {0xc59a8000}, {0xc59aa000}, {0xc59ac000}, {0xc59ae000},
- {0xc59b0000}, {0xc59b2000}, {0xc59b4000}, {0xc59b6000},
- {0xc59b8000}, {0xc59ba000}, {0xc59bc000}, {0xc59be000},
- {0xc59c0000}, {0xc59c2000}, {0xc59c4000}, {0xc59c6000},
- {0xc59c8000}, {0xc59ca000}, {0xc59cc000}, {0xc59ce000},
- {0xc59d0000}, {0xc59d2000}, {0xc59d4000}, {0xc59d6000},
- {0xc59d8000}, {0xc59da000}, {0xc59dc000}, {0xc59de000},
- {0xc59e0000}, {0xc59e2000}, {0xc59e4000}, {0xc59e6000},
- {0xc59e8000}, {0xc59ea000}, {0xc59ec000}, {0xc59ee000},
- {0xc59f0000}, {0xc59f2000}, {0xc59f4000}, {0xc59f6000},
- {0xc59f8000}, {0xc59fa000}, {0xc59fc000}, {0xc59fe000},
- {0xc5a00000}, {0xc5a02000}, {0xc5a04000}, {0xc5a06000},
- {0xc5a08000}, {0xc5a0a000}, {0xc5a0c000}, {0xc5a0e000},
- {0xc5a10000}, {0xc5a12000}, {0xc5a14000}, {0xc5a16000},
- {0xc5a18000}, {0xc5a1a000}, {0xc5a1c000}, {0xc5a1e000},
- {0xc5a20000}, {0xc5a22000}, {0xc5a24000}, {0xc5a26000},
- {0xc5a28000}, {0xc5a2a000}, {0xc5a2c000}, {0xc5a2e000},
- {0xc5a30000}, {0xc5a32000}, {0xc5a34000}, {0xc5a36000},
- {0xc5a38000}, {0xc5a3a000}, {0xc5a3c000}, {0xc5a3e000},
- {0xc5a40000}, {0xc5a42000}, {0xc5a44000}, {0xc5a46000},
- {0xc5a48000}, {0xc5a4a000}, {0xc5a4c000}, {0xc5a4e000},
- {0xc5a50000}, {0xc5a52000}, {0xc5a54000}, {0xc5a56000},
- {0xc5a58000}, {0xc5a5a000}, {0xc5a5c000}, {0xc5a5e000},
- {0xc5a60000}, {0xc5a62000}, {0xc5a64000}, {0xc5a66000},
- {0xc5a68000}, {0xc5a6a000}, {0xc5a6c000}, {0xc5a6e000},
- {0xc5a70000}, {0xc5a72000}, {0xc5a74000}, {0xc5a76000},
- {0xc5a78000}, {0xc5a7a000}, {0xc5a7c000}, {0xc5a7e000},
- {0xc5a80000}, {0xc5a82000}, {0xc5a84000}, {0xc5a86000},
- {0xc5a88000}, {0xc5a8a000}, {0xc5a8c000}, {0xc5a8e000},
- {0xc5a90000}, {0xc5a92000}, {0xc5a94000}, {0xc5a96000},
- {0xc5a98000}, {0xc5a9a000}, {0xc5a9c000}, {0xc5a9e000},
- {0xc5aa0000}, {0xc5aa2000}, {0xc5aa4000}, {0xc5aa6000},
- {0xc5aa8000}, {0xc5aaa000}, {0xc5aac000}, {0xc5aae000},
- {0xc5ab0000}, {0xc5ab2000}, {0xc5ab4000}, {0xc5ab6000},
- {0xc5ab8000}, {0xc5aba000}, {0xc5abc000}, {0xc5abe000},
- {0xc5ac0000}, {0xc5ac2000}, {0xc5ac4000}, {0xc5ac6000},
- {0xc5ac8000}, {0xc5aca000}, {0xc5acc000}, {0xc5ace000},
- {0xc5ad0000}, {0xc5ad2000}, {0xc5ad4000}, {0xc5ad6000},
- {0xc5ad8000}, {0xc5ada000}, {0xc5adc000}, {0xc5ade000},
- {0xc5ae0000}, {0xc5ae2000}, {0xc5ae4000}, {0xc5ae6000},
- {0xc5ae8000}, {0xc5aea000}, {0xc5aec000}, {0xc5aee000},
- {0xc5af0000}, {0xc5af2000}, {0xc5af4000}, {0xc5af6000},
- {0xc5af8000}, {0xc5afa000}, {0xc5afc000}, {0xc5afe000},
- {0xc5b00000}, {0xc5b02000}, {0xc5b04000}, {0xc5b06000},
- {0xc5b08000}, {0xc5b0a000}, {0xc5b0c000}, {0xc5b0e000},
- {0xc5b10000}, {0xc5b12000}, {0xc5b14000}, {0xc5b16000},
- {0xc5b18000}, {0xc5b1a000}, {0xc5b1c000}, {0xc5b1e000},
- {0xc5b20000}, {0xc5b22000}, {0xc5b24000}, {0xc5b26000},
- {0xc5b28000}, {0xc5b2a000}, {0xc5b2c000}, {0xc5b2e000},
- {0xc5b30000}, {0xc5b32000}, {0xc5b34000}, {0xc5b36000},
- {0xc5b38000}, {0xc5b3a000}, {0xc5b3c000}, {0xc5b3e000},
- {0xc5b40000}, {0xc5b42000}, {0xc5b44000}, {0xc5b46000},
- {0xc5b48000}, {0xc5b4a000}, {0xc5b4c000}, {0xc5b4e000},
- {0xc5b50000}, {0xc5b52000}, {0xc5b54000}, {0xc5b56000},
- {0xc5b58000}, {0xc5b5a000}, {0xc5b5c000}, {0xc5b5e000},
- {0xc5b60000}, {0xc5b62000}, {0xc5b64000}, {0xc5b66000},
- {0xc5b68000}, {0xc5b6a000}, {0xc5b6c000}, {0xc5b6e000},
- {0xc5b70000}, {0xc5b72000}, {0xc5b74000}, {0xc5b76000},
- {0xc5b78000}, {0xc5b7a000}, {0xc5b7c000}, {0xc5b7e000},
- {0xc5b80000}, {0xc5b82000}, {0xc5b84000}, {0xc5b86000},
- {0xc5b88000}, {0xc5b8a000}, {0xc5b8c000}, {0xc5b8e000},
- {0xc5b90000}, {0xc5b92000}, {0xc5b94000}, {0xc5b96000},
- {0xc5b98000}, {0xc5b9a000}, {0xc5b9c000}, {0xc5b9e000},
- {0xc5ba0000}, {0xc5ba2000}, {0xc5ba4000}, {0xc5ba6000},
- {0xc5ba8000}, {0xc5baa000}, {0xc5bac000}, {0xc5bae000},
- {0xc5bb0000}, {0xc5bb2000}, {0xc5bb4000}, {0xc5bb6000},
- {0xc5bb8000}, {0xc5bba000}, {0xc5bbc000}, {0xc5bbe000},
- {0xc5bc0000}, {0xc5bc2000}, {0xc5bc4000}, {0xc5bc6000},
- {0xc5bc8000}, {0xc5bca000}, {0xc5bcc000}, {0xc5bce000},
- {0xc5bd0000}, {0xc5bd2000}, {0xc5bd4000}, {0xc5bd6000},
- {0xc5bd8000}, {0xc5bda000}, {0xc5bdc000}, {0xc5bde000},
- {0xc5be0000}, {0xc5be2000}, {0xc5be4000}, {0xc5be6000},
- {0xc5be8000}, {0xc5bea000}, {0xc5bec000}, {0xc5bee000},
- {0xc5bf0000}, {0xc5bf2000}, {0xc5bf4000}, {0xc5bf6000},
- {0xc5bf8000}, {0xc5bfa000}, {0xc5bfc000}, {0xc5bfe000},
- {0xc5c00000}, {0xc5c02000}, {0xc5c04000}, {0xc5c06000},
- {0xc5c08000}, {0xc5c0a000}, {0xc5c0c000}, {0xc5c0e000},
- {0xc5c10000}, {0xc5c12000}, {0xc5c14000}, {0xc5c16000},
- {0xc5c18000}, {0xc5c1a000}, {0xc5c1c000}, {0xc5c1e000},
- {0xc5c20000}, {0xc5c22000}, {0xc5c24000}, {0xc5c26000},
- {0xc5c28000}, {0xc5c2a000}, {0xc5c2c000}, {0xc5c2e000},
- {0xc5c30000}, {0xc5c32000}, {0xc5c34000}, {0xc5c36000},
- {0xc5c38000}, {0xc5c3a000}, {0xc5c3c000}, {0xc5c3e000},
- {0xc5c40000}, {0xc5c42000}, {0xc5c44000}, {0xc5c46000},
- {0xc5c48000}, {0xc5c4a000}, {0xc5c4c000}, {0xc5c4e000},
- {0xc5c50000}, {0xc5c52000}, {0xc5c54000}, {0xc5c56000},
- {0xc5c58000}, {0xc5c5a000}, {0xc5c5c000}, {0xc5c5e000},
- {0xc5c60000}, {0xc5c62000}, {0xc5c64000}, {0xc5c66000},
- {0xc5c68000}, {0xc5c6a000}, {0xc5c6c000}, {0xc5c6e000},
- {0xc5c70000}, {0xc5c72000}, {0xc5c74000}, {0xc5c76000},
- {0xc5c78000}, {0xc5c7a000}, {0xc5c7c000}, {0xc5c7e000},
- {0xc5c80000}, {0xc5c82000}, {0xc5c84000}, {0xc5c86000},
- {0xc5c88000}, {0xc5c8a000}, {0xc5c8c000}, {0xc5c8e000},
- {0xc5c90000}, {0xc5c92000}, {0xc5c94000}, {0xc5c96000},
- {0xc5c98000}, {0xc5c9a000}, {0xc5c9c000}, {0xc5c9e000},
- {0xc5ca0000}, {0xc5ca2000}, {0xc5ca4000}, {0xc5ca6000},
- {0xc5ca8000}, {0xc5caa000}, {0xc5cac000}, {0xc5cae000},
- {0xc5cb0000}, {0xc5cb2000}, {0xc5cb4000}, {0xc5cb6000},
- {0xc5cb8000}, {0xc5cba000}, {0xc5cbc000}, {0xc5cbe000},
- {0xc5cc0000}, {0xc5cc2000}, {0xc5cc4000}, {0xc5cc6000},
- {0xc5cc8000}, {0xc5cca000}, {0xc5ccc000}, {0xc5cce000},
- {0xc5cd0000}, {0xc5cd2000}, {0xc5cd4000}, {0xc5cd6000},
- {0xc5cd8000}, {0xc5cda000}, {0xc5cdc000}, {0xc5cde000},
- {0xc5ce0000}, {0xc5ce2000}, {0xc5ce4000}, {0xc5ce6000},
- {0xc5ce8000}, {0xc5cea000}, {0xc5cec000}, {0xc5cee000},
- {0xc5cf0000}, {0xc5cf2000}, {0xc5cf4000}, {0xc5cf6000},
- {0xc5cf8000}, {0xc5cfa000}, {0xc5cfc000}, {0xc5cfe000},
- {0xc5d00000}, {0xc5d02000}, {0xc5d04000}, {0xc5d06000},
- {0xc5d08000}, {0xc5d0a000}, {0xc5d0c000}, {0xc5d0e000},
- {0xc5d10000}, {0xc5d12000}, {0xc5d14000}, {0xc5d16000},
- {0xc5d18000}, {0xc5d1a000}, {0xc5d1c000}, {0xc5d1e000},
- {0xc5d20000}, {0xc5d22000}, {0xc5d24000}, {0xc5d26000},
- {0xc5d28000}, {0xc5d2a000}, {0xc5d2c000}, {0xc5d2e000},
- {0xc5d30000}, {0xc5d32000}, {0xc5d34000}, {0xc5d36000},
- {0xc5d38000}, {0xc5d3a000}, {0xc5d3c000}, {0xc5d3e000},
- {0xc5d40000}, {0xc5d42000}, {0xc5d44000}, {0xc5d46000},
- {0xc5d48000}, {0xc5d4a000}, {0xc5d4c000}, {0xc5d4e000},
- {0xc5d50000}, {0xc5d52000}, {0xc5d54000}, {0xc5d56000},
- {0xc5d58000}, {0xc5d5a000}, {0xc5d5c000}, {0xc5d5e000},
- {0xc5d60000}, {0xc5d62000}, {0xc5d64000}, {0xc5d66000},
- {0xc5d68000}, {0xc5d6a000}, {0xc5d6c000}, {0xc5d6e000},
- {0xc5d70000}, {0xc5d72000}, {0xc5d74000}, {0xc5d76000},
- {0xc5d78000}, {0xc5d7a000}, {0xc5d7c000}, {0xc5d7e000},
- {0xc5d80000}, {0xc5d82000}, {0xc5d84000}, {0xc5d86000},
- {0xc5d88000}, {0xc5d8a000}, {0xc5d8c000}, {0xc5d8e000},
- {0xc5d90000}, {0xc5d92000}, {0xc5d94000}, {0xc5d96000},
- {0xc5d98000}, {0xc5d9a000}, {0xc5d9c000}, {0xc5d9e000},
- {0xc5da0000}, {0xc5da2000}, {0xc5da4000}, {0xc5da6000},
- {0xc5da8000}, {0xc5daa000}, {0xc5dac000}, {0xc5dae000},
- {0xc5db0000}, {0xc5db2000}, {0xc5db4000}, {0xc5db6000},
- {0xc5db8000}, {0xc5dba000}, {0xc5dbc000}, {0xc5dbe000},
- {0xc5dc0000}, {0xc5dc2000}, {0xc5dc4000}, {0xc5dc6000},
- {0xc5dc8000}, {0xc5dca000}, {0xc5dcc000}, {0xc5dce000},
- {0xc5dd0000}, {0xc5dd2000}, {0xc5dd4000}, {0xc5dd6000},
- {0xc5dd8000}, {0xc5dda000}, {0xc5ddc000}, {0xc5dde000},
- {0xc5de0000}, {0xc5de2000}, {0xc5de4000}, {0xc5de6000},
- {0xc5de8000}, {0xc5dea000}, {0xc5dec000}, {0xc5dee000},
- {0xc5df0000}, {0xc5df2000}, {0xc5df4000}, {0xc5df6000},
- {0xc5df8000}, {0xc5dfa000}, {0xc5dfc000}, {0xc5dfe000},
- {0xc5e00000}, {0xc5e02000}, {0xc5e04000}, {0xc5e06000},
- {0xc5e08000}, {0xc5e0a000}, {0xc5e0c000}, {0xc5e0e000},
- {0xc5e10000}, {0xc5e12000}, {0xc5e14000}, {0xc5e16000},
- {0xc5e18000}, {0xc5e1a000}, {0xc5e1c000}, {0xc5e1e000},
- {0xc5e20000}, {0xc5e22000}, {0xc5e24000}, {0xc5e26000},
- {0xc5e28000}, {0xc5e2a000}, {0xc5e2c000}, {0xc5e2e000},
- {0xc5e30000}, {0xc5e32000}, {0xc5e34000}, {0xc5e36000},
- {0xc5e38000}, {0xc5e3a000}, {0xc5e3c000}, {0xc5e3e000},
- {0xc5e40000}, {0xc5e42000}, {0xc5e44000}, {0xc5e46000},
- {0xc5e48000}, {0xc5e4a000}, {0xc5e4c000}, {0xc5e4e000},
- {0xc5e50000}, {0xc5e52000}, {0xc5e54000}, {0xc5e56000},
- {0xc5e58000}, {0xc5e5a000}, {0xc5e5c000}, {0xc5e5e000},
- {0xc5e60000}, {0xc5e62000}, {0xc5e64000}, {0xc5e66000},
- {0xc5e68000}, {0xc5e6a000}, {0xc5e6c000}, {0xc5e6e000},
- {0xc5e70000}, {0xc5e72000}, {0xc5e74000}, {0xc5e76000},
- {0xc5e78000}, {0xc5e7a000}, {0xc5e7c000}, {0xc5e7e000},
- {0xc5e80000}, {0xc5e82000}, {0xc5e84000}, {0xc5e86000},
- {0xc5e88000}, {0xc5e8a000}, {0xc5e8c000}, {0xc5e8e000},
- {0xc5e90000}, {0xc5e92000}, {0xc5e94000}, {0xc5e96000},
- {0xc5e98000}, {0xc5e9a000}, {0xc5e9c000}, {0xc5e9e000},
- {0xc5ea0000}, {0xc5ea2000}, {0xc5ea4000}, {0xc5ea6000},
- {0xc5ea8000}, {0xc5eaa000}, {0xc5eac000}, {0xc5eae000},
- {0xc5eb0000}, {0xc5eb2000}, {0xc5eb4000}, {0xc5eb6000},
- {0xc5eb8000}, {0xc5eba000}, {0xc5ebc000}, {0xc5ebe000},
- {0xc5ec0000}, {0xc5ec2000}, {0xc5ec4000}, {0xc5ec6000},
- {0xc5ec8000}, {0xc5eca000}, {0xc5ecc000}, {0xc5ece000},
- {0xc5ed0000}, {0xc5ed2000}, {0xc5ed4000}, {0xc5ed6000},
- {0xc5ed8000}, {0xc5eda000}, {0xc5edc000}, {0xc5ede000},
- {0xc5ee0000}, {0xc5ee2000}, {0xc5ee4000}, {0xc5ee6000},
- {0xc5ee8000}, {0xc5eea000}, {0xc5eec000}, {0xc5eee000},
- {0xc5ef0000}, {0xc5ef2000}, {0xc5ef4000}, {0xc5ef6000},
- {0xc5ef8000}, {0xc5efa000}, {0xc5efc000}, {0xc5efe000},
- {0xc5f00000}, {0xc5f02000}, {0xc5f04000}, {0xc5f06000},
- {0xc5f08000}, {0xc5f0a000}, {0xc5f0c000}, {0xc5f0e000},
- {0xc5f10000}, {0xc5f12000}, {0xc5f14000}, {0xc5f16000},
- {0xc5f18000}, {0xc5f1a000}, {0xc5f1c000}, {0xc5f1e000},
- {0xc5f20000}, {0xc5f22000}, {0xc5f24000}, {0xc5f26000},
- {0xc5f28000}, {0xc5f2a000}, {0xc5f2c000}, {0xc5f2e000},
- {0xc5f30000}, {0xc5f32000}, {0xc5f34000}, {0xc5f36000},
- {0xc5f38000}, {0xc5f3a000}, {0xc5f3c000}, {0xc5f3e000},
- {0xc5f40000}, {0xc5f42000}, {0xc5f44000}, {0xc5f46000},
- {0xc5f48000}, {0xc5f4a000}, {0xc5f4c000}, {0xc5f4e000},
- {0xc5f50000}, {0xc5f52000}, {0xc5f54000}, {0xc5f56000},
- {0xc5f58000}, {0xc5f5a000}, {0xc5f5c000}, {0xc5f5e000},
- {0xc5f60000}, {0xc5f62000}, {0xc5f64000}, {0xc5f66000},
- {0xc5f68000}, {0xc5f6a000}, {0xc5f6c000}, {0xc5f6e000},
- {0xc5f70000}, {0xc5f72000}, {0xc5f74000}, {0xc5f76000},
- {0xc5f78000}, {0xc5f7a000}, {0xc5f7c000}, {0xc5f7e000},
- {0xc5f80000}, {0xc5f82000}, {0xc5f84000}, {0xc5f86000},
- {0xc5f88000}, {0xc5f8a000}, {0xc5f8c000}, {0xc5f8e000},
- {0xc5f90000}, {0xc5f92000}, {0xc5f94000}, {0xc5f96000},
- {0xc5f98000}, {0xc5f9a000}, {0xc5f9c000}, {0xc5f9e000},
- {0xc5fa0000}, {0xc5fa2000}, {0xc5fa4000}, {0xc5fa6000},
- {0xc5fa8000}, {0xc5faa000}, {0xc5fac000}, {0xc5fae000},
- {0xc5fb0000}, {0xc5fb2000}, {0xc5fb4000}, {0xc5fb6000},
- {0xc5fb8000}, {0xc5fba000}, {0xc5fbc000}, {0xc5fbe000},
- {0xc5fc0000}, {0xc5fc2000}, {0xc5fc4000}, {0xc5fc6000},
- {0xc5fc8000}, {0xc5fca000}, {0xc5fcc000}, {0xc5fce000},
- {0xc5fd0000}, {0xc5fd2000}, {0xc5fd4000}, {0xc5fd6000},
- {0xc5fd8000}, {0xc5fda000}, {0xc5fdc000}, {0xc5fde000},
- {0xc5fe0000}, {0xc5fe2000}, {0xc5fe4000}, {0xc5fe6000},
- {0xc5fe8000}, {0xc5fea000}, {0xc5fec000}, {0xc5fee000},
- {0xc5ff0000}, {0xc5ff2000}, {0xc5ff4000}, {0xc5ff6000},
- {0xc5ff8000}, {0xc5ffa000}, {0xc5ffc000}, {0xc5ffe000},
- {0xc6000000}, {0xc6002000}, {0xc6004000}, {0xc6006000},
- {0xc6008000}, {0xc600a000}, {0xc600c000}, {0xc600e000},
- {0xc6010000}, {0xc6012000}, {0xc6014000}, {0xc6016000},
- {0xc6018000}, {0xc601a000}, {0xc601c000}, {0xc601e000},
- {0xc6020000}, {0xc6022000}, {0xc6024000}, {0xc6026000},
- {0xc6028000}, {0xc602a000}, {0xc602c000}, {0xc602e000},
- {0xc6030000}, {0xc6032000}, {0xc6034000}, {0xc6036000},
- {0xc6038000}, {0xc603a000}, {0xc603c000}, {0xc603e000},
- {0xc6040000}, {0xc6042000}, {0xc6044000}, {0xc6046000},
- {0xc6048000}, {0xc604a000}, {0xc604c000}, {0xc604e000},
- {0xc6050000}, {0xc6052000}, {0xc6054000}, {0xc6056000},
- {0xc6058000}, {0xc605a000}, {0xc605c000}, {0xc605e000},
- {0xc6060000}, {0xc6062000}, {0xc6064000}, {0xc6066000},
- {0xc6068000}, {0xc606a000}, {0xc606c000}, {0xc606e000},
- {0xc6070000}, {0xc6072000}, {0xc6074000}, {0xc6076000},
- {0xc6078000}, {0xc607a000}, {0xc607c000}, {0xc607e000},
- {0xc6080000}, {0xc6082000}, {0xc6084000}, {0xc6086000},
- {0xc6088000}, {0xc608a000}, {0xc608c000}, {0xc608e000},
- {0xc6090000}, {0xc6092000}, {0xc6094000}, {0xc6096000},
- {0xc6098000}, {0xc609a000}, {0xc609c000}, {0xc609e000},
- {0xc60a0000}, {0xc60a2000}, {0xc60a4000}, {0xc60a6000},
- {0xc60a8000}, {0xc60aa000}, {0xc60ac000}, {0xc60ae000},
- {0xc60b0000}, {0xc60b2000}, {0xc60b4000}, {0xc60b6000},
- {0xc60b8000}, {0xc60ba000}, {0xc60bc000}, {0xc60be000},
- {0xc60c0000}, {0xc60c2000}, {0xc60c4000}, {0xc60c6000},
- {0xc60c8000}, {0xc60ca000}, {0xc60cc000}, {0xc60ce000},
- {0xc60d0000}, {0xc60d2000}, {0xc60d4000}, {0xc60d6000},
- {0xc60d8000}, {0xc60da000}, {0xc60dc000}, {0xc60de000},
- {0xc60e0000}, {0xc60e2000}, {0xc60e4000}, {0xc60e6000},
- {0xc60e8000}, {0xc60ea000}, {0xc60ec000}, {0xc60ee000},
- {0xc60f0000}, {0xc60f2000}, {0xc60f4000}, {0xc60f6000},
- {0xc60f8000}, {0xc60fa000}, {0xc60fc000}, {0xc60fe000},
- {0xc6100000}, {0xc6102000}, {0xc6104000}, {0xc6106000},
- {0xc6108000}, {0xc610a000}, {0xc610c000}, {0xc610e000},
- {0xc6110000}, {0xc6112000}, {0xc6114000}, {0xc6116000},
- {0xc6118000}, {0xc611a000}, {0xc611c000}, {0xc611e000},
- {0xc6120000}, {0xc6122000}, {0xc6124000}, {0xc6126000},
- {0xc6128000}, {0xc612a000}, {0xc612c000}, {0xc612e000},
- {0xc6130000}, {0xc6132000}, {0xc6134000}, {0xc6136000},
- {0xc6138000}, {0xc613a000}, {0xc613c000}, {0xc613e000},
- {0xc6140000}, {0xc6142000}, {0xc6144000}, {0xc6146000},
- {0xc6148000}, {0xc614a000}, {0xc614c000}, {0xc614e000},
- {0xc6150000}, {0xc6152000}, {0xc6154000}, {0xc6156000},
- {0xc6158000}, {0xc615a000}, {0xc615c000}, {0xc615e000},
- {0xc6160000}, {0xc6162000}, {0xc6164000}, {0xc6166000},
- {0xc6168000}, {0xc616a000}, {0xc616c000}, {0xc616e000},
- {0xc6170000}, {0xc6172000}, {0xc6174000}, {0xc6176000},
- {0xc6178000}, {0xc617a000}, {0xc617c000}, {0xc617e000},
- {0xc6180000}, {0xc6182000}, {0xc6184000}, {0xc6186000},
- {0xc6188000}, {0xc618a000}, {0xc618c000}, {0xc618e000},
- {0xc6190000}, {0xc6192000}, {0xc6194000}, {0xc6196000},
- {0xc6198000}, {0xc619a000}, {0xc619c000}, {0xc619e000},
- {0xc61a0000}, {0xc61a2000}, {0xc61a4000}, {0xc61a6000},
- {0xc61a8000}, {0xc61aa000}, {0xc61ac000}, {0xc61ae000},
- {0xc61b0000}, {0xc61b2000}, {0xc61b4000}, {0xc61b6000},
- {0xc61b8000}, {0xc61ba000}, {0xc61bc000}, {0xc61be000},
- {0xc61c0000}, {0xc61c2000}, {0xc61c4000}, {0xc61c6000},
- {0xc61c8000}, {0xc61ca000}, {0xc61cc000}, {0xc61ce000},
- {0xc61d0000}, {0xc61d2000}, {0xc61d4000}, {0xc61d6000},
- {0xc61d8000}, {0xc61da000}, {0xc61dc000}, {0xc61de000},
- {0xc61e0000}, {0xc61e2000}, {0xc61e4000}, {0xc61e6000},
- {0xc61e8000}, {0xc61ea000}, {0xc61ec000}, {0xc61ee000},
- {0xc61f0000}, {0xc61f2000}, {0xc61f4000}, {0xc61f6000},
- {0xc61f8000}, {0xc61fa000}, {0xc61fc000}, {0xc61fe000},
- {0xc6200000}, {0xc6202000}, {0xc6204000}, {0xc6206000},
- {0xc6208000}, {0xc620a000}, {0xc620c000}, {0xc620e000},
- {0xc6210000}, {0xc6212000}, {0xc6214000}, {0xc6216000},
- {0xc6218000}, {0xc621a000}, {0xc621c000}, {0xc621e000},
- {0xc6220000}, {0xc6222000}, {0xc6224000}, {0xc6226000},
- {0xc6228000}, {0xc622a000}, {0xc622c000}, {0xc622e000},
- {0xc6230000}, {0xc6232000}, {0xc6234000}, {0xc6236000},
- {0xc6238000}, {0xc623a000}, {0xc623c000}, {0xc623e000},
- {0xc6240000}, {0xc6242000}, {0xc6244000}, {0xc6246000},
- {0xc6248000}, {0xc624a000}, {0xc624c000}, {0xc624e000},
- {0xc6250000}, {0xc6252000}, {0xc6254000}, {0xc6256000},
- {0xc6258000}, {0xc625a000}, {0xc625c000}, {0xc625e000},
- {0xc6260000}, {0xc6262000}, {0xc6264000}, {0xc6266000},
- {0xc6268000}, {0xc626a000}, {0xc626c000}, {0xc626e000},
- {0xc6270000}, {0xc6272000}, {0xc6274000}, {0xc6276000},
- {0xc6278000}, {0xc627a000}, {0xc627c000}, {0xc627e000},
- {0xc6280000}, {0xc6282000}, {0xc6284000}, {0xc6286000},
- {0xc6288000}, {0xc628a000}, {0xc628c000}, {0xc628e000},
- {0xc6290000}, {0xc6292000}, {0xc6294000}, {0xc6296000},
- {0xc6298000}, {0xc629a000}, {0xc629c000}, {0xc629e000},
- {0xc62a0000}, {0xc62a2000}, {0xc62a4000}, {0xc62a6000},
- {0xc62a8000}, {0xc62aa000}, {0xc62ac000}, {0xc62ae000},
- {0xc62b0000}, {0xc62b2000}, {0xc62b4000}, {0xc62b6000},
- {0xc62b8000}, {0xc62ba000}, {0xc62bc000}, {0xc62be000},
- {0xc62c0000}, {0xc62c2000}, {0xc62c4000}, {0xc62c6000},
- {0xc62c8000}, {0xc62ca000}, {0xc62cc000}, {0xc62ce000},
- {0xc62d0000}, {0xc62d2000}, {0xc62d4000}, {0xc62d6000},
- {0xc62d8000}, {0xc62da000}, {0xc62dc000}, {0xc62de000},
- {0xc62e0000}, {0xc62e2000}, {0xc62e4000}, {0xc62e6000},
- {0xc62e8000}, {0xc62ea000}, {0xc62ec000}, {0xc62ee000},
- {0xc62f0000}, {0xc62f2000}, {0xc62f4000}, {0xc62f6000},
- {0xc62f8000}, {0xc62fa000}, {0xc62fc000}, {0xc62fe000},
- {0xc6300000}, {0xc6302000}, {0xc6304000}, {0xc6306000},
- {0xc6308000}, {0xc630a000}, {0xc630c000}, {0xc630e000},
- {0xc6310000}, {0xc6312000}, {0xc6314000}, {0xc6316000},
- {0xc6318000}, {0xc631a000}, {0xc631c000}, {0xc631e000},
- {0xc6320000}, {0xc6322000}, {0xc6324000}, {0xc6326000},
- {0xc6328000}, {0xc632a000}, {0xc632c000}, {0xc632e000},
- {0xc6330000}, {0xc6332000}, {0xc6334000}, {0xc6336000},
- {0xc6338000}, {0xc633a000}, {0xc633c000}, {0xc633e000},
- {0xc6340000}, {0xc6342000}, {0xc6344000}, {0xc6346000},
- {0xc6348000}, {0xc634a000}, {0xc634c000}, {0xc634e000},
- {0xc6350000}, {0xc6352000}, {0xc6354000}, {0xc6356000},
- {0xc6358000}, {0xc635a000}, {0xc635c000}, {0xc635e000},
- {0xc6360000}, {0xc6362000}, {0xc6364000}, {0xc6366000},
- {0xc6368000}, {0xc636a000}, {0xc636c000}, {0xc636e000},
- {0xc6370000}, {0xc6372000}, {0xc6374000}, {0xc6376000},
- {0xc6378000}, {0xc637a000}, {0xc637c000}, {0xc637e000},
- {0xc6380000}, {0xc6382000}, {0xc6384000}, {0xc6386000},
- {0xc6388000}, {0xc638a000}, {0xc638c000}, {0xc638e000},
- {0xc6390000}, {0xc6392000}, {0xc6394000}, {0xc6396000},
- {0xc6398000}, {0xc639a000}, {0xc639c000}, {0xc639e000},
- {0xc63a0000}, {0xc63a2000}, {0xc63a4000}, {0xc63a6000},
- {0xc63a8000}, {0xc63aa000}, {0xc63ac000}, {0xc63ae000},
- {0xc63b0000}, {0xc63b2000}, {0xc63b4000}, {0xc63b6000},
- {0xc63b8000}, {0xc63ba000}, {0xc63bc000}, {0xc63be000},
- {0xc63c0000}, {0xc63c2000}, {0xc63c4000}, {0xc63c6000},
- {0xc63c8000}, {0xc63ca000}, {0xc63cc000}, {0xc63ce000},
- {0xc63d0000}, {0xc63d2000}, {0xc63d4000}, {0xc63d6000},
- {0xc63d8000}, {0xc63da000}, {0xc63dc000}, {0xc63de000},
- {0xc63e0000}, {0xc63e2000}, {0xc63e4000}, {0xc63e6000},
- {0xc63e8000}, {0xc63ea000}, {0xc63ec000}, {0xc63ee000},
- {0xc63f0000}, {0xc63f2000}, {0xc63f4000}, {0xc63f6000},
- {0xc63f8000}, {0xc63fa000}, {0xc63fc000}, {0xc63fe000},
- {0xc6400000}, {0xc6402000}, {0xc6404000}, {0xc6406000},
- {0xc6408000}, {0xc640a000}, {0xc640c000}, {0xc640e000},
- {0xc6410000}, {0xc6412000}, {0xc6414000}, {0xc6416000},
- {0xc6418000}, {0xc641a000}, {0xc641c000}, {0xc641e000},
- {0xc6420000}, {0xc6422000}, {0xc6424000}, {0xc6426000},
- {0xc6428000}, {0xc642a000}, {0xc642c000}, {0xc642e000},
- {0xc6430000}, {0xc6432000}, {0xc6434000}, {0xc6436000},
- {0xc6438000}, {0xc643a000}, {0xc643c000}, {0xc643e000},
- {0xc6440000}, {0xc6442000}, {0xc6444000}, {0xc6446000},
- {0xc6448000}, {0xc644a000}, {0xc644c000}, {0xc644e000},
- {0xc6450000}, {0xc6452000}, {0xc6454000}, {0xc6456000},
- {0xc6458000}, {0xc645a000}, {0xc645c000}, {0xc645e000},
- {0xc6460000}, {0xc6462000}, {0xc6464000}, {0xc6466000},
- {0xc6468000}, {0xc646a000}, {0xc646c000}, {0xc646e000},
- {0xc6470000}, {0xc6472000}, {0xc6474000}, {0xc6476000},
- {0xc6478000}, {0xc647a000}, {0xc647c000}, {0xc647e000},
- {0xc6480000}, {0xc6482000}, {0xc6484000}, {0xc6486000},
- {0xc6488000}, {0xc648a000}, {0xc648c000}, {0xc648e000},
- {0xc6490000}, {0xc6492000}, {0xc6494000}, {0xc6496000},
- {0xc6498000}, {0xc649a000}, {0xc649c000}, {0xc649e000},
- {0xc64a0000}, {0xc64a2000}, {0xc64a4000}, {0xc64a6000},
- {0xc64a8000}, {0xc64aa000}, {0xc64ac000}, {0xc64ae000},
- {0xc64b0000}, {0xc64b2000}, {0xc64b4000}, {0xc64b6000},
- {0xc64b8000}, {0xc64ba000}, {0xc64bc000}, {0xc64be000},
- {0xc64c0000}, {0xc64c2000}, {0xc64c4000}, {0xc64c6000},
- {0xc64c8000}, {0xc64ca000}, {0xc64cc000}, {0xc64ce000},
- {0xc64d0000}, {0xc64d2000}, {0xc64d4000}, {0xc64d6000},
- {0xc64d8000}, {0xc64da000}, {0xc64dc000}, {0xc64de000},
- {0xc64e0000}, {0xc64e2000}, {0xc64e4000}, {0xc64e6000},
- {0xc64e8000}, {0xc64ea000}, {0xc64ec000}, {0xc64ee000},
- {0xc64f0000}, {0xc64f2000}, {0xc64f4000}, {0xc64f6000},
- {0xc64f8000}, {0xc64fa000}, {0xc64fc000}, {0xc64fe000},
- {0xc6500000}, {0xc6502000}, {0xc6504000}, {0xc6506000},
- {0xc6508000}, {0xc650a000}, {0xc650c000}, {0xc650e000},
- {0xc6510000}, {0xc6512000}, {0xc6514000}, {0xc6516000},
- {0xc6518000}, {0xc651a000}, {0xc651c000}, {0xc651e000},
- {0xc6520000}, {0xc6522000}, {0xc6524000}, {0xc6526000},
- {0xc6528000}, {0xc652a000}, {0xc652c000}, {0xc652e000},
- {0xc6530000}, {0xc6532000}, {0xc6534000}, {0xc6536000},
- {0xc6538000}, {0xc653a000}, {0xc653c000}, {0xc653e000},
- {0xc6540000}, {0xc6542000}, {0xc6544000}, {0xc6546000},
- {0xc6548000}, {0xc654a000}, {0xc654c000}, {0xc654e000},
- {0xc6550000}, {0xc6552000}, {0xc6554000}, {0xc6556000},
- {0xc6558000}, {0xc655a000}, {0xc655c000}, {0xc655e000},
- {0xc6560000}, {0xc6562000}, {0xc6564000}, {0xc6566000},
- {0xc6568000}, {0xc656a000}, {0xc656c000}, {0xc656e000},
- {0xc6570000}, {0xc6572000}, {0xc6574000}, {0xc6576000},
- {0xc6578000}, {0xc657a000}, {0xc657c000}, {0xc657e000},
- {0xc6580000}, {0xc6582000}, {0xc6584000}, {0xc6586000},
- {0xc6588000}, {0xc658a000}, {0xc658c000}, {0xc658e000},
- {0xc6590000}, {0xc6592000}, {0xc6594000}, {0xc6596000},
- {0xc6598000}, {0xc659a000}, {0xc659c000}, {0xc659e000},
- {0xc65a0000}, {0xc65a2000}, {0xc65a4000}, {0xc65a6000},
- {0xc65a8000}, {0xc65aa000}, {0xc65ac000}, {0xc65ae000},
- {0xc65b0000}, {0xc65b2000}, {0xc65b4000}, {0xc65b6000},
- {0xc65b8000}, {0xc65ba000}, {0xc65bc000}, {0xc65be000},
- {0xc65c0000}, {0xc65c2000}, {0xc65c4000}, {0xc65c6000},
- {0xc65c8000}, {0xc65ca000}, {0xc65cc000}, {0xc65ce000},
- {0xc65d0000}, {0xc65d2000}, {0xc65d4000}, {0xc65d6000},
- {0xc65d8000}, {0xc65da000}, {0xc65dc000}, {0xc65de000},
- {0xc65e0000}, {0xc65e2000}, {0xc65e4000}, {0xc65e6000},
- {0xc65e8000}, {0xc65ea000}, {0xc65ec000}, {0xc65ee000},
- {0xc65f0000}, {0xc65f2000}, {0xc65f4000}, {0xc65f6000},
- {0xc65f8000}, {0xc65fa000}, {0xc65fc000}, {0xc65fe000},
- {0xc6600000}, {0xc6602000}, {0xc6604000}, {0xc6606000},
- {0xc6608000}, {0xc660a000}, {0xc660c000}, {0xc660e000},
- {0xc6610000}, {0xc6612000}, {0xc6614000}, {0xc6616000},
- {0xc6618000}, {0xc661a000}, {0xc661c000}, {0xc661e000},
- {0xc6620000}, {0xc6622000}, {0xc6624000}, {0xc6626000},
- {0xc6628000}, {0xc662a000}, {0xc662c000}, {0xc662e000},
- {0xc6630000}, {0xc6632000}, {0xc6634000}, {0xc6636000},
- {0xc6638000}, {0xc663a000}, {0xc663c000}, {0xc663e000},
- {0xc6640000}, {0xc6642000}, {0xc6644000}, {0xc6646000},
- {0xc6648000}, {0xc664a000}, {0xc664c000}, {0xc664e000},
- {0xc6650000}, {0xc6652000}, {0xc6654000}, {0xc6656000},
- {0xc6658000}, {0xc665a000}, {0xc665c000}, {0xc665e000},
- {0xc6660000}, {0xc6662000}, {0xc6664000}, {0xc6666000},
- {0xc6668000}, {0xc666a000}, {0xc666c000}, {0xc666e000},
- {0xc6670000}, {0xc6672000}, {0xc6674000}, {0xc6676000},
- {0xc6678000}, {0xc667a000}, {0xc667c000}, {0xc667e000},
- {0xc6680000}, {0xc6682000}, {0xc6684000}, {0xc6686000},
- {0xc6688000}, {0xc668a000}, {0xc668c000}, {0xc668e000},
- {0xc6690000}, {0xc6692000}, {0xc6694000}, {0xc6696000},
- {0xc6698000}, {0xc669a000}, {0xc669c000}, {0xc669e000},
- {0xc66a0000}, {0xc66a2000}, {0xc66a4000}, {0xc66a6000},
- {0xc66a8000}, {0xc66aa000}, {0xc66ac000}, {0xc66ae000},
- {0xc66b0000}, {0xc66b2000}, {0xc66b4000}, {0xc66b6000},
- {0xc66b8000}, {0xc66ba000}, {0xc66bc000}, {0xc66be000},
- {0xc66c0000}, {0xc66c2000}, {0xc66c4000}, {0xc66c6000},
- {0xc66c8000}, {0xc66ca000}, {0xc66cc000}, {0xc66ce000},
- {0xc66d0000}, {0xc66d2000}, {0xc66d4000}, {0xc66d6000},
- {0xc66d8000}, {0xc66da000}, {0xc66dc000}, {0xc66de000},
- {0xc66e0000}, {0xc66e2000}, {0xc66e4000}, {0xc66e6000},
- {0xc66e8000}, {0xc66ea000}, {0xc66ec000}, {0xc66ee000},
- {0xc66f0000}, {0xc66f2000}, {0xc66f4000}, {0xc66f6000},
- {0xc66f8000}, {0xc66fa000}, {0xc66fc000}, {0xc66fe000},
- {0xc6700000}, {0xc6702000}, {0xc6704000}, {0xc6706000},
- {0xc6708000}, {0xc670a000}, {0xc670c000}, {0xc670e000},
- {0xc6710000}, {0xc6712000}, {0xc6714000}, {0xc6716000},
- {0xc6718000}, {0xc671a000}, {0xc671c000}, {0xc671e000},
- {0xc6720000}, {0xc6722000}, {0xc6724000}, {0xc6726000},
- {0xc6728000}, {0xc672a000}, {0xc672c000}, {0xc672e000},
- {0xc6730000}, {0xc6732000}, {0xc6734000}, {0xc6736000},
- {0xc6738000}, {0xc673a000}, {0xc673c000}, {0xc673e000},
- {0xc6740000}, {0xc6742000}, {0xc6744000}, {0xc6746000},
- {0xc6748000}, {0xc674a000}, {0xc674c000}, {0xc674e000},
- {0xc6750000}, {0xc6752000}, {0xc6754000}, {0xc6756000},
- {0xc6758000}, {0xc675a000}, {0xc675c000}, {0xc675e000},
- {0xc6760000}, {0xc6762000}, {0xc6764000}, {0xc6766000},
- {0xc6768000}, {0xc676a000}, {0xc676c000}, {0xc676e000},
- {0xc6770000}, {0xc6772000}, {0xc6774000}, {0xc6776000},
- {0xc6778000}, {0xc677a000}, {0xc677c000}, {0xc677e000},
- {0xc6780000}, {0xc6782000}, {0xc6784000}, {0xc6786000},
- {0xc6788000}, {0xc678a000}, {0xc678c000}, {0xc678e000},
- {0xc6790000}, {0xc6792000}, {0xc6794000}, {0xc6796000},
- {0xc6798000}, {0xc679a000}, {0xc679c000}, {0xc679e000},
- {0xc67a0000}, {0xc67a2000}, {0xc67a4000}, {0xc67a6000},
- {0xc67a8000}, {0xc67aa000}, {0xc67ac000}, {0xc67ae000},
- {0xc67b0000}, {0xc67b2000}, {0xc67b4000}, {0xc67b6000},
- {0xc67b8000}, {0xc67ba000}, {0xc67bc000}, {0xc67be000},
- {0xc67c0000}, {0xc67c2000}, {0xc67c4000}, {0xc67c6000},
- {0xc67c8000}, {0xc67ca000}, {0xc67cc000}, {0xc67ce000},
- {0xc67d0000}, {0xc67d2000}, {0xc67d4000}, {0xc67d6000},
- {0xc67d8000}, {0xc67da000}, {0xc67dc000}, {0xc67de000},
- {0xc67e0000}, {0xc67e2000}, {0xc67e4000}, {0xc67e6000},
- {0xc67e8000}, {0xc67ea000}, {0xc67ec000}, {0xc67ee000},
- {0xc67f0000}, {0xc67f2000}, {0xc67f4000}, {0xc67f6000},
- {0xc67f8000}, {0xc67fa000}, {0xc67fc000}, {0xc67fe000},
- {0xc6800000}, {0xc6802000}, {0xc6804000}, {0xc6806000},
- {0xc6808000}, {0xc680a000}, {0xc680c000}, {0xc680e000},
- {0xc6810000}, {0xc6812000}, {0xc6814000}, {0xc6816000},
- {0xc6818000}, {0xc681a000}, {0xc681c000}, {0xc681e000},
- {0xc6820000}, {0xc6822000}, {0xc6824000}, {0xc6826000},
- {0xc6828000}, {0xc682a000}, {0xc682c000}, {0xc682e000},
- {0xc6830000}, {0xc6832000}, {0xc6834000}, {0xc6836000},
- {0xc6838000}, {0xc683a000}, {0xc683c000}, {0xc683e000},
- {0xc6840000}, {0xc6842000}, {0xc6844000}, {0xc6846000},
- {0xc6848000}, {0xc684a000}, {0xc684c000}, {0xc684e000},
- {0xc6850000}, {0xc6852000}, {0xc6854000}, {0xc6856000},
- {0xc6858000}, {0xc685a000}, {0xc685c000}, {0xc685e000},
- {0xc6860000}, {0xc6862000}, {0xc6864000}, {0xc6866000},
- {0xc6868000}, {0xc686a000}, {0xc686c000}, {0xc686e000},
- {0xc6870000}, {0xc6872000}, {0xc6874000}, {0xc6876000},
- {0xc6878000}, {0xc687a000}, {0xc687c000}, {0xc687e000},
- {0xc6880000}, {0xc6882000}, {0xc6884000}, {0xc6886000},
- {0xc6888000}, {0xc688a000}, {0xc688c000}, {0xc688e000},
- {0xc6890000}, {0xc6892000}, {0xc6894000}, {0xc6896000},
- {0xc6898000}, {0xc689a000}, {0xc689c000}, {0xc689e000},
- {0xc68a0000}, {0xc68a2000}, {0xc68a4000}, {0xc68a6000},
- {0xc68a8000}, {0xc68aa000}, {0xc68ac000}, {0xc68ae000},
- {0xc68b0000}, {0xc68b2000}, {0xc68b4000}, {0xc68b6000},
- {0xc68b8000}, {0xc68ba000}, {0xc68bc000}, {0xc68be000},
- {0xc68c0000}, {0xc68c2000}, {0xc68c4000}, {0xc68c6000},
- {0xc68c8000}, {0xc68ca000}, {0xc68cc000}, {0xc68ce000},
- {0xc68d0000}, {0xc68d2000}, {0xc68d4000}, {0xc68d6000},
- {0xc68d8000}, {0xc68da000}, {0xc68dc000}, {0xc68de000},
- {0xc68e0000}, {0xc68e2000}, {0xc68e4000}, {0xc68e6000},
- {0xc68e8000}, {0xc68ea000}, {0xc68ec000}, {0xc68ee000},
- {0xc68f0000}, {0xc68f2000}, {0xc68f4000}, {0xc68f6000},
- {0xc68f8000}, {0xc68fa000}, {0xc68fc000}, {0xc68fe000},
- {0xc6900000}, {0xc6902000}, {0xc6904000}, {0xc6906000},
- {0xc6908000}, {0xc690a000}, {0xc690c000}, {0xc690e000},
- {0xc6910000}, {0xc6912000}, {0xc6914000}, {0xc6916000},
- {0xc6918000}, {0xc691a000}, {0xc691c000}, {0xc691e000},
- {0xc6920000}, {0xc6922000}, {0xc6924000}, {0xc6926000},
- {0xc6928000}, {0xc692a000}, {0xc692c000}, {0xc692e000},
- {0xc6930000}, {0xc6932000}, {0xc6934000}, {0xc6936000},
- {0xc6938000}, {0xc693a000}, {0xc693c000}, {0xc693e000},
- {0xc6940000}, {0xc6942000}, {0xc6944000}, {0xc6946000},
- {0xc6948000}, {0xc694a000}, {0xc694c000}, {0xc694e000},
- {0xc6950000}, {0xc6952000}, {0xc6954000}, {0xc6956000},
- {0xc6958000}, {0xc695a000}, {0xc695c000}, {0xc695e000},
- {0xc6960000}, {0xc6962000}, {0xc6964000}, {0xc6966000},
- {0xc6968000}, {0xc696a000}, {0xc696c000}, {0xc696e000},
- {0xc6970000}, {0xc6972000}, {0xc6974000}, {0xc6976000},
- {0xc6978000}, {0xc697a000}, {0xc697c000}, {0xc697e000},
- {0xc6980000}, {0xc6982000}, {0xc6984000}, {0xc6986000},
- {0xc6988000}, {0xc698a000}, {0xc698c000}, {0xc698e000},
- {0xc6990000}, {0xc6992000}, {0xc6994000}, {0xc6996000},
- {0xc6998000}, {0xc699a000}, {0xc699c000}, {0xc699e000},
- {0xc69a0000}, {0xc69a2000}, {0xc69a4000}, {0xc69a6000},
- {0xc69a8000}, {0xc69aa000}, {0xc69ac000}, {0xc69ae000},
- {0xc69b0000}, {0xc69b2000}, {0xc69b4000}, {0xc69b6000},
- {0xc69b8000}, {0xc69ba000}, {0xc69bc000}, {0xc69be000},
- {0xc69c0000}, {0xc69c2000}, {0xc69c4000}, {0xc69c6000},
- {0xc69c8000}, {0xc69ca000}, {0xc69cc000}, {0xc69ce000},
- {0xc69d0000}, {0xc69d2000}, {0xc69d4000}, {0xc69d6000},
- {0xc69d8000}, {0xc69da000}, {0xc69dc000}, {0xc69de000},
- {0xc69e0000}, {0xc69e2000}, {0xc69e4000}, {0xc69e6000},
- {0xc69e8000}, {0xc69ea000}, {0xc69ec000}, {0xc69ee000},
- {0xc69f0000}, {0xc69f2000}, {0xc69f4000}, {0xc69f6000},
- {0xc69f8000}, {0xc69fa000}, {0xc69fc000}, {0xc69fe000},
- {0xc6a00000}, {0xc6a02000}, {0xc6a04000}, {0xc6a06000},
- {0xc6a08000}, {0xc6a0a000}, {0xc6a0c000}, {0xc6a0e000},
- {0xc6a10000}, {0xc6a12000}, {0xc6a14000}, {0xc6a16000},
- {0xc6a18000}, {0xc6a1a000}, {0xc6a1c000}, {0xc6a1e000},
- {0xc6a20000}, {0xc6a22000}, {0xc6a24000}, {0xc6a26000},
- {0xc6a28000}, {0xc6a2a000}, {0xc6a2c000}, {0xc6a2e000},
- {0xc6a30000}, {0xc6a32000}, {0xc6a34000}, {0xc6a36000},
- {0xc6a38000}, {0xc6a3a000}, {0xc6a3c000}, {0xc6a3e000},
- {0xc6a40000}, {0xc6a42000}, {0xc6a44000}, {0xc6a46000},
- {0xc6a48000}, {0xc6a4a000}, {0xc6a4c000}, {0xc6a4e000},
- {0xc6a50000}, {0xc6a52000}, {0xc6a54000}, {0xc6a56000},
- {0xc6a58000}, {0xc6a5a000}, {0xc6a5c000}, {0xc6a5e000},
- {0xc6a60000}, {0xc6a62000}, {0xc6a64000}, {0xc6a66000},
- {0xc6a68000}, {0xc6a6a000}, {0xc6a6c000}, {0xc6a6e000},
- {0xc6a70000}, {0xc6a72000}, {0xc6a74000}, {0xc6a76000},
- {0xc6a78000}, {0xc6a7a000}, {0xc6a7c000}, {0xc6a7e000},
- {0xc6a80000}, {0xc6a82000}, {0xc6a84000}, {0xc6a86000},
- {0xc6a88000}, {0xc6a8a000}, {0xc6a8c000}, {0xc6a8e000},
- {0xc6a90000}, {0xc6a92000}, {0xc6a94000}, {0xc6a96000},
- {0xc6a98000}, {0xc6a9a000}, {0xc6a9c000}, {0xc6a9e000},
- {0xc6aa0000}, {0xc6aa2000}, {0xc6aa4000}, {0xc6aa6000},
- {0xc6aa8000}, {0xc6aaa000}, {0xc6aac000}, {0xc6aae000},
- {0xc6ab0000}, {0xc6ab2000}, {0xc6ab4000}, {0xc6ab6000},
- {0xc6ab8000}, {0xc6aba000}, {0xc6abc000}, {0xc6abe000},
- {0xc6ac0000}, {0xc6ac2000}, {0xc6ac4000}, {0xc6ac6000},
- {0xc6ac8000}, {0xc6aca000}, {0xc6acc000}, {0xc6ace000},
- {0xc6ad0000}, {0xc6ad2000}, {0xc6ad4000}, {0xc6ad6000},
- {0xc6ad8000}, {0xc6ada000}, {0xc6adc000}, {0xc6ade000},
- {0xc6ae0000}, {0xc6ae2000}, {0xc6ae4000}, {0xc6ae6000},
- {0xc6ae8000}, {0xc6aea000}, {0xc6aec000}, {0xc6aee000},
- {0xc6af0000}, {0xc6af2000}, {0xc6af4000}, {0xc6af6000},
- {0xc6af8000}, {0xc6afa000}, {0xc6afc000}, {0xc6afe000},
- {0xc6b00000}, {0xc6b02000}, {0xc6b04000}, {0xc6b06000},
- {0xc6b08000}, {0xc6b0a000}, {0xc6b0c000}, {0xc6b0e000},
- {0xc6b10000}, {0xc6b12000}, {0xc6b14000}, {0xc6b16000},
- {0xc6b18000}, {0xc6b1a000}, {0xc6b1c000}, {0xc6b1e000},
- {0xc6b20000}, {0xc6b22000}, {0xc6b24000}, {0xc6b26000},
- {0xc6b28000}, {0xc6b2a000}, {0xc6b2c000}, {0xc6b2e000},
- {0xc6b30000}, {0xc6b32000}, {0xc6b34000}, {0xc6b36000},
- {0xc6b38000}, {0xc6b3a000}, {0xc6b3c000}, {0xc6b3e000},
- {0xc6b40000}, {0xc6b42000}, {0xc6b44000}, {0xc6b46000},
- {0xc6b48000}, {0xc6b4a000}, {0xc6b4c000}, {0xc6b4e000},
- {0xc6b50000}, {0xc6b52000}, {0xc6b54000}, {0xc6b56000},
- {0xc6b58000}, {0xc6b5a000}, {0xc6b5c000}, {0xc6b5e000},
- {0xc6b60000}, {0xc6b62000}, {0xc6b64000}, {0xc6b66000},
- {0xc6b68000}, {0xc6b6a000}, {0xc6b6c000}, {0xc6b6e000},
- {0xc6b70000}, {0xc6b72000}, {0xc6b74000}, {0xc6b76000},
- {0xc6b78000}, {0xc6b7a000}, {0xc6b7c000}, {0xc6b7e000},
- {0xc6b80000}, {0xc6b82000}, {0xc6b84000}, {0xc6b86000},
- {0xc6b88000}, {0xc6b8a000}, {0xc6b8c000}, {0xc6b8e000},
- {0xc6b90000}, {0xc6b92000}, {0xc6b94000}, {0xc6b96000},
- {0xc6b98000}, {0xc6b9a000}, {0xc6b9c000}, {0xc6b9e000},
- {0xc6ba0000}, {0xc6ba2000}, {0xc6ba4000}, {0xc6ba6000},
- {0xc6ba8000}, {0xc6baa000}, {0xc6bac000}, {0xc6bae000},
- {0xc6bb0000}, {0xc6bb2000}, {0xc6bb4000}, {0xc6bb6000},
- {0xc6bb8000}, {0xc6bba000}, {0xc6bbc000}, {0xc6bbe000},
- {0xc6bc0000}, {0xc6bc2000}, {0xc6bc4000}, {0xc6bc6000},
- {0xc6bc8000}, {0xc6bca000}, {0xc6bcc000}, {0xc6bce000},
- {0xc6bd0000}, {0xc6bd2000}, {0xc6bd4000}, {0xc6bd6000},
- {0xc6bd8000}, {0xc6bda000}, {0xc6bdc000}, {0xc6bde000},
- {0xc6be0000}, {0xc6be2000}, {0xc6be4000}, {0xc6be6000},
- {0xc6be8000}, {0xc6bea000}, {0xc6bec000}, {0xc6bee000},
- {0xc6bf0000}, {0xc6bf2000}, {0xc6bf4000}, {0xc6bf6000},
- {0xc6bf8000}, {0xc6bfa000}, {0xc6bfc000}, {0xc6bfe000},
- {0xc6c00000}, {0xc6c02000}, {0xc6c04000}, {0xc6c06000},
- {0xc6c08000}, {0xc6c0a000}, {0xc6c0c000}, {0xc6c0e000},
- {0xc6c10000}, {0xc6c12000}, {0xc6c14000}, {0xc6c16000},
- {0xc6c18000}, {0xc6c1a000}, {0xc6c1c000}, {0xc6c1e000},
- {0xc6c20000}, {0xc6c22000}, {0xc6c24000}, {0xc6c26000},
- {0xc6c28000}, {0xc6c2a000}, {0xc6c2c000}, {0xc6c2e000},
- {0xc6c30000}, {0xc6c32000}, {0xc6c34000}, {0xc6c36000},
- {0xc6c38000}, {0xc6c3a000}, {0xc6c3c000}, {0xc6c3e000},
- {0xc6c40000}, {0xc6c42000}, {0xc6c44000}, {0xc6c46000},
- {0xc6c48000}, {0xc6c4a000}, {0xc6c4c000}, {0xc6c4e000},
- {0xc6c50000}, {0xc6c52000}, {0xc6c54000}, {0xc6c56000},
- {0xc6c58000}, {0xc6c5a000}, {0xc6c5c000}, {0xc6c5e000},
- {0xc6c60000}, {0xc6c62000}, {0xc6c64000}, {0xc6c66000},
- {0xc6c68000}, {0xc6c6a000}, {0xc6c6c000}, {0xc6c6e000},
- {0xc6c70000}, {0xc6c72000}, {0xc6c74000}, {0xc6c76000},
- {0xc6c78000}, {0xc6c7a000}, {0xc6c7c000}, {0xc6c7e000},
- {0xc6c80000}, {0xc6c82000}, {0xc6c84000}, {0xc6c86000},
- {0xc6c88000}, {0xc6c8a000}, {0xc6c8c000}, {0xc6c8e000},
- {0xc6c90000}, {0xc6c92000}, {0xc6c94000}, {0xc6c96000},
- {0xc6c98000}, {0xc6c9a000}, {0xc6c9c000}, {0xc6c9e000},
- {0xc6ca0000}, {0xc6ca2000}, {0xc6ca4000}, {0xc6ca6000},
- {0xc6ca8000}, {0xc6caa000}, {0xc6cac000}, {0xc6cae000},
- {0xc6cb0000}, {0xc6cb2000}, {0xc6cb4000}, {0xc6cb6000},
- {0xc6cb8000}, {0xc6cba000}, {0xc6cbc000}, {0xc6cbe000},
- {0xc6cc0000}, {0xc6cc2000}, {0xc6cc4000}, {0xc6cc6000},
- {0xc6cc8000}, {0xc6cca000}, {0xc6ccc000}, {0xc6cce000},
- {0xc6cd0000}, {0xc6cd2000}, {0xc6cd4000}, {0xc6cd6000},
- {0xc6cd8000}, {0xc6cda000}, {0xc6cdc000}, {0xc6cde000},
- {0xc6ce0000}, {0xc6ce2000}, {0xc6ce4000}, {0xc6ce6000},
- {0xc6ce8000}, {0xc6cea000}, {0xc6cec000}, {0xc6cee000},
- {0xc6cf0000}, {0xc6cf2000}, {0xc6cf4000}, {0xc6cf6000},
- {0xc6cf8000}, {0xc6cfa000}, {0xc6cfc000}, {0xc6cfe000},
- {0xc6d00000}, {0xc6d02000}, {0xc6d04000}, {0xc6d06000},
- {0xc6d08000}, {0xc6d0a000}, {0xc6d0c000}, {0xc6d0e000},
- {0xc6d10000}, {0xc6d12000}, {0xc6d14000}, {0xc6d16000},
- {0xc6d18000}, {0xc6d1a000}, {0xc6d1c000}, {0xc6d1e000},
- {0xc6d20000}, {0xc6d22000}, {0xc6d24000}, {0xc6d26000},
- {0xc6d28000}, {0xc6d2a000}, {0xc6d2c000}, {0xc6d2e000},
- {0xc6d30000}, {0xc6d32000}, {0xc6d34000}, {0xc6d36000},
- {0xc6d38000}, {0xc6d3a000}, {0xc6d3c000}, {0xc6d3e000},
- {0xc6d40000}, {0xc6d42000}, {0xc6d44000}, {0xc6d46000},
- {0xc6d48000}, {0xc6d4a000}, {0xc6d4c000}, {0xc6d4e000},
- {0xc6d50000}, {0xc6d52000}, {0xc6d54000}, {0xc6d56000},
- {0xc6d58000}, {0xc6d5a000}, {0xc6d5c000}, {0xc6d5e000},
- {0xc6d60000}, {0xc6d62000}, {0xc6d64000}, {0xc6d66000},
- {0xc6d68000}, {0xc6d6a000}, {0xc6d6c000}, {0xc6d6e000},
- {0xc6d70000}, {0xc6d72000}, {0xc6d74000}, {0xc6d76000},
- {0xc6d78000}, {0xc6d7a000}, {0xc6d7c000}, {0xc6d7e000},
- {0xc6d80000}, {0xc6d82000}, {0xc6d84000}, {0xc6d86000},
- {0xc6d88000}, {0xc6d8a000}, {0xc6d8c000}, {0xc6d8e000},
- {0xc6d90000}, {0xc6d92000}, {0xc6d94000}, {0xc6d96000},
- {0xc6d98000}, {0xc6d9a000}, {0xc6d9c000}, {0xc6d9e000},
- {0xc6da0000}, {0xc6da2000}, {0xc6da4000}, {0xc6da6000},
- {0xc6da8000}, {0xc6daa000}, {0xc6dac000}, {0xc6dae000},
- {0xc6db0000}, {0xc6db2000}, {0xc6db4000}, {0xc6db6000},
- {0xc6db8000}, {0xc6dba000}, {0xc6dbc000}, {0xc6dbe000},
- {0xc6dc0000}, {0xc6dc2000}, {0xc6dc4000}, {0xc6dc6000},
- {0xc6dc8000}, {0xc6dca000}, {0xc6dcc000}, {0xc6dce000},
- {0xc6dd0000}, {0xc6dd2000}, {0xc6dd4000}, {0xc6dd6000},
- {0xc6dd8000}, {0xc6dda000}, {0xc6ddc000}, {0xc6dde000},
- {0xc6de0000}, {0xc6de2000}, {0xc6de4000}, {0xc6de6000},
- {0xc6de8000}, {0xc6dea000}, {0xc6dec000}, {0xc6dee000},
- {0xc6df0000}, {0xc6df2000}, {0xc6df4000}, {0xc6df6000},
- {0xc6df8000}, {0xc6dfa000}, {0xc6dfc000}, {0xc6dfe000},
- {0xc6e00000}, {0xc6e02000}, {0xc6e04000}, {0xc6e06000},
- {0xc6e08000}, {0xc6e0a000}, {0xc6e0c000}, {0xc6e0e000},
- {0xc6e10000}, {0xc6e12000}, {0xc6e14000}, {0xc6e16000},
- {0xc6e18000}, {0xc6e1a000}, {0xc6e1c000}, {0xc6e1e000},
- {0xc6e20000}, {0xc6e22000}, {0xc6e24000}, {0xc6e26000},
- {0xc6e28000}, {0xc6e2a000}, {0xc6e2c000}, {0xc6e2e000},
- {0xc6e30000}, {0xc6e32000}, {0xc6e34000}, {0xc6e36000},
- {0xc6e38000}, {0xc6e3a000}, {0xc6e3c000}, {0xc6e3e000},
- {0xc6e40000}, {0xc6e42000}, {0xc6e44000}, {0xc6e46000},
- {0xc6e48000}, {0xc6e4a000}, {0xc6e4c000}, {0xc6e4e000},
- {0xc6e50000}, {0xc6e52000}, {0xc6e54000}, {0xc6e56000},
- {0xc6e58000}, {0xc6e5a000}, {0xc6e5c000}, {0xc6e5e000},
- {0xc6e60000}, {0xc6e62000}, {0xc6e64000}, {0xc6e66000},
- {0xc6e68000}, {0xc6e6a000}, {0xc6e6c000}, {0xc6e6e000},
- {0xc6e70000}, {0xc6e72000}, {0xc6e74000}, {0xc6e76000},
- {0xc6e78000}, {0xc6e7a000}, {0xc6e7c000}, {0xc6e7e000},
- {0xc6e80000}, {0xc6e82000}, {0xc6e84000}, {0xc6e86000},
- {0xc6e88000}, {0xc6e8a000}, {0xc6e8c000}, {0xc6e8e000},
- {0xc6e90000}, {0xc6e92000}, {0xc6e94000}, {0xc6e96000},
- {0xc6e98000}, {0xc6e9a000}, {0xc6e9c000}, {0xc6e9e000},
- {0xc6ea0000}, {0xc6ea2000}, {0xc6ea4000}, {0xc6ea6000},
- {0xc6ea8000}, {0xc6eaa000}, {0xc6eac000}, {0xc6eae000},
- {0xc6eb0000}, {0xc6eb2000}, {0xc6eb4000}, {0xc6eb6000},
- {0xc6eb8000}, {0xc6eba000}, {0xc6ebc000}, {0xc6ebe000},
- {0xc6ec0000}, {0xc6ec2000}, {0xc6ec4000}, {0xc6ec6000},
- {0xc6ec8000}, {0xc6eca000}, {0xc6ecc000}, {0xc6ece000},
- {0xc6ed0000}, {0xc6ed2000}, {0xc6ed4000}, {0xc6ed6000},
- {0xc6ed8000}, {0xc6eda000}, {0xc6edc000}, {0xc6ede000},
- {0xc6ee0000}, {0xc6ee2000}, {0xc6ee4000}, {0xc6ee6000},
- {0xc6ee8000}, {0xc6eea000}, {0xc6eec000}, {0xc6eee000},
- {0xc6ef0000}, {0xc6ef2000}, {0xc6ef4000}, {0xc6ef6000},
- {0xc6ef8000}, {0xc6efa000}, {0xc6efc000}, {0xc6efe000},
- {0xc6f00000}, {0xc6f02000}, {0xc6f04000}, {0xc6f06000},
- {0xc6f08000}, {0xc6f0a000}, {0xc6f0c000}, {0xc6f0e000},
- {0xc6f10000}, {0xc6f12000}, {0xc6f14000}, {0xc6f16000},
- {0xc6f18000}, {0xc6f1a000}, {0xc6f1c000}, {0xc6f1e000},
- {0xc6f20000}, {0xc6f22000}, {0xc6f24000}, {0xc6f26000},
- {0xc6f28000}, {0xc6f2a000}, {0xc6f2c000}, {0xc6f2e000},
- {0xc6f30000}, {0xc6f32000}, {0xc6f34000}, {0xc6f36000},
- {0xc6f38000}, {0xc6f3a000}, {0xc6f3c000}, {0xc6f3e000},
- {0xc6f40000}, {0xc6f42000}, {0xc6f44000}, {0xc6f46000},
- {0xc6f48000}, {0xc6f4a000}, {0xc6f4c000}, {0xc6f4e000},
- {0xc6f50000}, {0xc6f52000}, {0xc6f54000}, {0xc6f56000},
- {0xc6f58000}, {0xc6f5a000}, {0xc6f5c000}, {0xc6f5e000},
- {0xc6f60000}, {0xc6f62000}, {0xc6f64000}, {0xc6f66000},
- {0xc6f68000}, {0xc6f6a000}, {0xc6f6c000}, {0xc6f6e000},
- {0xc6f70000}, {0xc6f72000}, {0xc6f74000}, {0xc6f76000},
- {0xc6f78000}, {0xc6f7a000}, {0xc6f7c000}, {0xc6f7e000},
- {0xc6f80000}, {0xc6f82000}, {0xc6f84000}, {0xc6f86000},
- {0xc6f88000}, {0xc6f8a000}, {0xc6f8c000}, {0xc6f8e000},
- {0xc6f90000}, {0xc6f92000}, {0xc6f94000}, {0xc6f96000},
- {0xc6f98000}, {0xc6f9a000}, {0xc6f9c000}, {0xc6f9e000},
- {0xc6fa0000}, {0xc6fa2000}, {0xc6fa4000}, {0xc6fa6000},
- {0xc6fa8000}, {0xc6faa000}, {0xc6fac000}, {0xc6fae000},
- {0xc6fb0000}, {0xc6fb2000}, {0xc6fb4000}, {0xc6fb6000},
- {0xc6fb8000}, {0xc6fba000}, {0xc6fbc000}, {0xc6fbe000},
- {0xc6fc0000}, {0xc6fc2000}, {0xc6fc4000}, {0xc6fc6000},
- {0xc6fc8000}, {0xc6fca000}, {0xc6fcc000}, {0xc6fce000},
- {0xc6fd0000}, {0xc6fd2000}, {0xc6fd4000}, {0xc6fd6000},
- {0xc6fd8000}, {0xc6fda000}, {0xc6fdc000}, {0xc6fde000},
- {0xc6fe0000}, {0xc6fe2000}, {0xc6fe4000}, {0xc6fe6000},
- {0xc6fe8000}, {0xc6fea000}, {0xc6fec000}, {0xc6fee000},
- {0xc6ff0000}, {0xc6ff2000}, {0xc6ff4000}, {0xc6ff6000},
- {0xc6ff8000}, {0xc6ffa000}, {0xc6ffc000}, {0xc6ffe000},
- {0xc7000000}, {0xc7002000}, {0xc7004000}, {0xc7006000},
- {0xc7008000}, {0xc700a000}, {0xc700c000}, {0xc700e000},
- {0xc7010000}, {0xc7012000}, {0xc7014000}, {0xc7016000},
- {0xc7018000}, {0xc701a000}, {0xc701c000}, {0xc701e000},
- {0xc7020000}, {0xc7022000}, {0xc7024000}, {0xc7026000},
- {0xc7028000}, {0xc702a000}, {0xc702c000}, {0xc702e000},
- {0xc7030000}, {0xc7032000}, {0xc7034000}, {0xc7036000},
- {0xc7038000}, {0xc703a000}, {0xc703c000}, {0xc703e000},
- {0xc7040000}, {0xc7042000}, {0xc7044000}, {0xc7046000},
- {0xc7048000}, {0xc704a000}, {0xc704c000}, {0xc704e000},
- {0xc7050000}, {0xc7052000}, {0xc7054000}, {0xc7056000},
- {0xc7058000}, {0xc705a000}, {0xc705c000}, {0xc705e000},
- {0xc7060000}, {0xc7062000}, {0xc7064000}, {0xc7066000},
- {0xc7068000}, {0xc706a000}, {0xc706c000}, {0xc706e000},
- {0xc7070000}, {0xc7072000}, {0xc7074000}, {0xc7076000},
- {0xc7078000}, {0xc707a000}, {0xc707c000}, {0xc707e000},
- {0xc7080000}, {0xc7082000}, {0xc7084000}, {0xc7086000},
- {0xc7088000}, {0xc708a000}, {0xc708c000}, {0xc708e000},
- {0xc7090000}, {0xc7092000}, {0xc7094000}, {0xc7096000},
- {0xc7098000}, {0xc709a000}, {0xc709c000}, {0xc709e000},
- {0xc70a0000}, {0xc70a2000}, {0xc70a4000}, {0xc70a6000},
- {0xc70a8000}, {0xc70aa000}, {0xc70ac000}, {0xc70ae000},
- {0xc70b0000}, {0xc70b2000}, {0xc70b4000}, {0xc70b6000},
- {0xc70b8000}, {0xc70ba000}, {0xc70bc000}, {0xc70be000},
- {0xc70c0000}, {0xc70c2000}, {0xc70c4000}, {0xc70c6000},
- {0xc70c8000}, {0xc70ca000}, {0xc70cc000}, {0xc70ce000},
- {0xc70d0000}, {0xc70d2000}, {0xc70d4000}, {0xc70d6000},
- {0xc70d8000}, {0xc70da000}, {0xc70dc000}, {0xc70de000},
- {0xc70e0000}, {0xc70e2000}, {0xc70e4000}, {0xc70e6000},
- {0xc70e8000}, {0xc70ea000}, {0xc70ec000}, {0xc70ee000},
- {0xc70f0000}, {0xc70f2000}, {0xc70f4000}, {0xc70f6000},
- {0xc70f8000}, {0xc70fa000}, {0xc70fc000}, {0xc70fe000},
- {0xc7100000}, {0xc7102000}, {0xc7104000}, {0xc7106000},
- {0xc7108000}, {0xc710a000}, {0xc710c000}, {0xc710e000},
- {0xc7110000}, {0xc7112000}, {0xc7114000}, {0xc7116000},
- {0xc7118000}, {0xc711a000}, {0xc711c000}, {0xc711e000},
- {0xc7120000}, {0xc7122000}, {0xc7124000}, {0xc7126000},
- {0xc7128000}, {0xc712a000}, {0xc712c000}, {0xc712e000},
- {0xc7130000}, {0xc7132000}, {0xc7134000}, {0xc7136000},
- {0xc7138000}, {0xc713a000}, {0xc713c000}, {0xc713e000},
- {0xc7140000}, {0xc7142000}, {0xc7144000}, {0xc7146000},
- {0xc7148000}, {0xc714a000}, {0xc714c000}, {0xc714e000},
- {0xc7150000}, {0xc7152000}, {0xc7154000}, {0xc7156000},
- {0xc7158000}, {0xc715a000}, {0xc715c000}, {0xc715e000},
- {0xc7160000}, {0xc7162000}, {0xc7164000}, {0xc7166000},
- {0xc7168000}, {0xc716a000}, {0xc716c000}, {0xc716e000},
- {0xc7170000}, {0xc7172000}, {0xc7174000}, {0xc7176000},
- {0xc7178000}, {0xc717a000}, {0xc717c000}, {0xc717e000},
- {0xc7180000}, {0xc7182000}, {0xc7184000}, {0xc7186000},
- {0xc7188000}, {0xc718a000}, {0xc718c000}, {0xc718e000},
- {0xc7190000}, {0xc7192000}, {0xc7194000}, {0xc7196000},
- {0xc7198000}, {0xc719a000}, {0xc719c000}, {0xc719e000},
- {0xc71a0000}, {0xc71a2000}, {0xc71a4000}, {0xc71a6000},
- {0xc71a8000}, {0xc71aa000}, {0xc71ac000}, {0xc71ae000},
- {0xc71b0000}, {0xc71b2000}, {0xc71b4000}, {0xc71b6000},
- {0xc71b8000}, {0xc71ba000}, {0xc71bc000}, {0xc71be000},
- {0xc71c0000}, {0xc71c2000}, {0xc71c4000}, {0xc71c6000},
- {0xc71c8000}, {0xc71ca000}, {0xc71cc000}, {0xc71ce000},
- {0xc71d0000}, {0xc71d2000}, {0xc71d4000}, {0xc71d6000},
- {0xc71d8000}, {0xc71da000}, {0xc71dc000}, {0xc71de000},
- {0xc71e0000}, {0xc71e2000}, {0xc71e4000}, {0xc71e6000},
- {0xc71e8000}, {0xc71ea000}, {0xc71ec000}, {0xc71ee000},
- {0xc71f0000}, {0xc71f2000}, {0xc71f4000}, {0xc71f6000},
- {0xc71f8000}, {0xc71fa000}, {0xc71fc000}, {0xc71fe000},
- {0xc7200000}, {0xc7202000}, {0xc7204000}, {0xc7206000},
- {0xc7208000}, {0xc720a000}, {0xc720c000}, {0xc720e000},
- {0xc7210000}, {0xc7212000}, {0xc7214000}, {0xc7216000},
- {0xc7218000}, {0xc721a000}, {0xc721c000}, {0xc721e000},
- {0xc7220000}, {0xc7222000}, {0xc7224000}, {0xc7226000},
- {0xc7228000}, {0xc722a000}, {0xc722c000}, {0xc722e000},
- {0xc7230000}, {0xc7232000}, {0xc7234000}, {0xc7236000},
- {0xc7238000}, {0xc723a000}, {0xc723c000}, {0xc723e000},
- {0xc7240000}, {0xc7242000}, {0xc7244000}, {0xc7246000},
- {0xc7248000}, {0xc724a000}, {0xc724c000}, {0xc724e000},
- {0xc7250000}, {0xc7252000}, {0xc7254000}, {0xc7256000},
- {0xc7258000}, {0xc725a000}, {0xc725c000}, {0xc725e000},
- {0xc7260000}, {0xc7262000}, {0xc7264000}, {0xc7266000},
- {0xc7268000}, {0xc726a000}, {0xc726c000}, {0xc726e000},
- {0xc7270000}, {0xc7272000}, {0xc7274000}, {0xc7276000},
- {0xc7278000}, {0xc727a000}, {0xc727c000}, {0xc727e000},
- {0xc7280000}, {0xc7282000}, {0xc7284000}, {0xc7286000},
- {0xc7288000}, {0xc728a000}, {0xc728c000}, {0xc728e000},
- {0xc7290000}, {0xc7292000}, {0xc7294000}, {0xc7296000},
- {0xc7298000}, {0xc729a000}, {0xc729c000}, {0xc729e000},
- {0xc72a0000}, {0xc72a2000}, {0xc72a4000}, {0xc72a6000},
- {0xc72a8000}, {0xc72aa000}, {0xc72ac000}, {0xc72ae000},
- {0xc72b0000}, {0xc72b2000}, {0xc72b4000}, {0xc72b6000},
- {0xc72b8000}, {0xc72ba000}, {0xc72bc000}, {0xc72be000},
- {0xc72c0000}, {0xc72c2000}, {0xc72c4000}, {0xc72c6000},
- {0xc72c8000}, {0xc72ca000}, {0xc72cc000}, {0xc72ce000},
- {0xc72d0000}, {0xc72d2000}, {0xc72d4000}, {0xc72d6000},
- {0xc72d8000}, {0xc72da000}, {0xc72dc000}, {0xc72de000},
- {0xc72e0000}, {0xc72e2000}, {0xc72e4000}, {0xc72e6000},
- {0xc72e8000}, {0xc72ea000}, {0xc72ec000}, {0xc72ee000},
- {0xc72f0000}, {0xc72f2000}, {0xc72f4000}, {0xc72f6000},
- {0xc72f8000}, {0xc72fa000}, {0xc72fc000}, {0xc72fe000},
- {0xc7300000}, {0xc7302000}, {0xc7304000}, {0xc7306000},
- {0xc7308000}, {0xc730a000}, {0xc730c000}, {0xc730e000},
- {0xc7310000}, {0xc7312000}, {0xc7314000}, {0xc7316000},
- {0xc7318000}, {0xc731a000}, {0xc731c000}, {0xc731e000},
- {0xc7320000}, {0xc7322000}, {0xc7324000}, {0xc7326000},
- {0xc7328000}, {0xc732a000}, {0xc732c000}, {0xc732e000},
- {0xc7330000}, {0xc7332000}, {0xc7334000}, {0xc7336000},
- {0xc7338000}, {0xc733a000}, {0xc733c000}, {0xc733e000},
- {0xc7340000}, {0xc7342000}, {0xc7344000}, {0xc7346000},
- {0xc7348000}, {0xc734a000}, {0xc734c000}, {0xc734e000},
- {0xc7350000}, {0xc7352000}, {0xc7354000}, {0xc7356000},
- {0xc7358000}, {0xc735a000}, {0xc735c000}, {0xc735e000},
- {0xc7360000}, {0xc7362000}, {0xc7364000}, {0xc7366000},
- {0xc7368000}, {0xc736a000}, {0xc736c000}, {0xc736e000},
- {0xc7370000}, {0xc7372000}, {0xc7374000}, {0xc7376000},
- {0xc7378000}, {0xc737a000}, {0xc737c000}, {0xc737e000},
- {0xc7380000}, {0xc7382000}, {0xc7384000}, {0xc7386000},
- {0xc7388000}, {0xc738a000}, {0xc738c000}, {0xc738e000},
- {0xc7390000}, {0xc7392000}, {0xc7394000}, {0xc7396000},
- {0xc7398000}, {0xc739a000}, {0xc739c000}, {0xc739e000},
- {0xc73a0000}, {0xc73a2000}, {0xc73a4000}, {0xc73a6000},
- {0xc73a8000}, {0xc73aa000}, {0xc73ac000}, {0xc73ae000},
- {0xc73b0000}, {0xc73b2000}, {0xc73b4000}, {0xc73b6000},
- {0xc73b8000}, {0xc73ba000}, {0xc73bc000}, {0xc73be000},
- {0xc73c0000}, {0xc73c2000}, {0xc73c4000}, {0xc73c6000},
- {0xc73c8000}, {0xc73ca000}, {0xc73cc000}, {0xc73ce000},
- {0xc73d0000}, {0xc73d2000}, {0xc73d4000}, {0xc73d6000},
- {0xc73d8000}, {0xc73da000}, {0xc73dc000}, {0xc73de000},
- {0xc73e0000}, {0xc73e2000}, {0xc73e4000}, {0xc73e6000},
- {0xc73e8000}, {0xc73ea000}, {0xc73ec000}, {0xc73ee000},
- {0xc73f0000}, {0xc73f2000}, {0xc73f4000}, {0xc73f6000},
- {0xc73f8000}, {0xc73fa000}, {0xc73fc000}, {0xc73fe000},
- {0xc7400000}, {0xc7402000}, {0xc7404000}, {0xc7406000},
- {0xc7408000}, {0xc740a000}, {0xc740c000}, {0xc740e000},
- {0xc7410000}, {0xc7412000}, {0xc7414000}, {0xc7416000},
- {0xc7418000}, {0xc741a000}, {0xc741c000}, {0xc741e000},
- {0xc7420000}, {0xc7422000}, {0xc7424000}, {0xc7426000},
- {0xc7428000}, {0xc742a000}, {0xc742c000}, {0xc742e000},
- {0xc7430000}, {0xc7432000}, {0xc7434000}, {0xc7436000},
- {0xc7438000}, {0xc743a000}, {0xc743c000}, {0xc743e000},
- {0xc7440000}, {0xc7442000}, {0xc7444000}, {0xc7446000},
- {0xc7448000}, {0xc744a000}, {0xc744c000}, {0xc744e000},
- {0xc7450000}, {0xc7452000}, {0xc7454000}, {0xc7456000},
- {0xc7458000}, {0xc745a000}, {0xc745c000}, {0xc745e000},
- {0xc7460000}, {0xc7462000}, {0xc7464000}, {0xc7466000},
- {0xc7468000}, {0xc746a000}, {0xc746c000}, {0xc746e000},
- {0xc7470000}, {0xc7472000}, {0xc7474000}, {0xc7476000},
- {0xc7478000}, {0xc747a000}, {0xc747c000}, {0xc747e000},
- {0xc7480000}, {0xc7482000}, {0xc7484000}, {0xc7486000},
- {0xc7488000}, {0xc748a000}, {0xc748c000}, {0xc748e000},
- {0xc7490000}, {0xc7492000}, {0xc7494000}, {0xc7496000},
- {0xc7498000}, {0xc749a000}, {0xc749c000}, {0xc749e000},
- {0xc74a0000}, {0xc74a2000}, {0xc74a4000}, {0xc74a6000},
- {0xc74a8000}, {0xc74aa000}, {0xc74ac000}, {0xc74ae000},
- {0xc74b0000}, {0xc74b2000}, {0xc74b4000}, {0xc74b6000},
- {0xc74b8000}, {0xc74ba000}, {0xc74bc000}, {0xc74be000},
- {0xc74c0000}, {0xc74c2000}, {0xc74c4000}, {0xc74c6000},
- {0xc74c8000}, {0xc74ca000}, {0xc74cc000}, {0xc74ce000},
- {0xc74d0000}, {0xc74d2000}, {0xc74d4000}, {0xc74d6000},
- {0xc74d8000}, {0xc74da000}, {0xc74dc000}, {0xc74de000},
- {0xc74e0000}, {0xc74e2000}, {0xc74e4000}, {0xc74e6000},
- {0xc74e8000}, {0xc74ea000}, {0xc74ec000}, {0xc74ee000},
- {0xc74f0000}, {0xc74f2000}, {0xc74f4000}, {0xc74f6000},
- {0xc74f8000}, {0xc74fa000}, {0xc74fc000}, {0xc74fe000},
- {0xc7500000}, {0xc7502000}, {0xc7504000}, {0xc7506000},
- {0xc7508000}, {0xc750a000}, {0xc750c000}, {0xc750e000},
- {0xc7510000}, {0xc7512000}, {0xc7514000}, {0xc7516000},
- {0xc7518000}, {0xc751a000}, {0xc751c000}, {0xc751e000},
- {0xc7520000}, {0xc7522000}, {0xc7524000}, {0xc7526000},
- {0xc7528000}, {0xc752a000}, {0xc752c000}, {0xc752e000},
- {0xc7530000}, {0xc7532000}, {0xc7534000}, {0xc7536000},
- {0xc7538000}, {0xc753a000}, {0xc753c000}, {0xc753e000},
- {0xc7540000}, {0xc7542000}, {0xc7544000}, {0xc7546000},
- {0xc7548000}, {0xc754a000}, {0xc754c000}, {0xc754e000},
- {0xc7550000}, {0xc7552000}, {0xc7554000}, {0xc7556000},
- {0xc7558000}, {0xc755a000}, {0xc755c000}, {0xc755e000},
- {0xc7560000}, {0xc7562000}, {0xc7564000}, {0xc7566000},
- {0xc7568000}, {0xc756a000}, {0xc756c000}, {0xc756e000},
- {0xc7570000}, {0xc7572000}, {0xc7574000}, {0xc7576000},
- {0xc7578000}, {0xc757a000}, {0xc757c000}, {0xc757e000},
- {0xc7580000}, {0xc7582000}, {0xc7584000}, {0xc7586000},
- {0xc7588000}, {0xc758a000}, {0xc758c000}, {0xc758e000},
- {0xc7590000}, {0xc7592000}, {0xc7594000}, {0xc7596000},
- {0xc7598000}, {0xc759a000}, {0xc759c000}, {0xc759e000},
- {0xc75a0000}, {0xc75a2000}, {0xc75a4000}, {0xc75a6000},
- {0xc75a8000}, {0xc75aa000}, {0xc75ac000}, {0xc75ae000},
- {0xc75b0000}, {0xc75b2000}, {0xc75b4000}, {0xc75b6000},
- {0xc75b8000}, {0xc75ba000}, {0xc75bc000}, {0xc75be000},
- {0xc75c0000}, {0xc75c2000}, {0xc75c4000}, {0xc75c6000},
- {0xc75c8000}, {0xc75ca000}, {0xc75cc000}, {0xc75ce000},
- {0xc75d0000}, {0xc75d2000}, {0xc75d4000}, {0xc75d6000},
- {0xc75d8000}, {0xc75da000}, {0xc75dc000}, {0xc75de000},
- {0xc75e0000}, {0xc75e2000}, {0xc75e4000}, {0xc75e6000},
- {0xc75e8000}, {0xc75ea000}, {0xc75ec000}, {0xc75ee000},
- {0xc75f0000}, {0xc75f2000}, {0xc75f4000}, {0xc75f6000},
- {0xc75f8000}, {0xc75fa000}, {0xc75fc000}, {0xc75fe000},
- {0xc7600000}, {0xc7602000}, {0xc7604000}, {0xc7606000},
- {0xc7608000}, {0xc760a000}, {0xc760c000}, {0xc760e000},
- {0xc7610000}, {0xc7612000}, {0xc7614000}, {0xc7616000},
- {0xc7618000}, {0xc761a000}, {0xc761c000}, {0xc761e000},
- {0xc7620000}, {0xc7622000}, {0xc7624000}, {0xc7626000},
- {0xc7628000}, {0xc762a000}, {0xc762c000}, {0xc762e000},
- {0xc7630000}, {0xc7632000}, {0xc7634000}, {0xc7636000},
- {0xc7638000}, {0xc763a000}, {0xc763c000}, {0xc763e000},
- {0xc7640000}, {0xc7642000}, {0xc7644000}, {0xc7646000},
- {0xc7648000}, {0xc764a000}, {0xc764c000}, {0xc764e000},
- {0xc7650000}, {0xc7652000}, {0xc7654000}, {0xc7656000},
- {0xc7658000}, {0xc765a000}, {0xc765c000}, {0xc765e000},
- {0xc7660000}, {0xc7662000}, {0xc7664000}, {0xc7666000},
- {0xc7668000}, {0xc766a000}, {0xc766c000}, {0xc766e000},
- {0xc7670000}, {0xc7672000}, {0xc7674000}, {0xc7676000},
- {0xc7678000}, {0xc767a000}, {0xc767c000}, {0xc767e000},
- {0xc7680000}, {0xc7682000}, {0xc7684000}, {0xc7686000},
- {0xc7688000}, {0xc768a000}, {0xc768c000}, {0xc768e000},
- {0xc7690000}, {0xc7692000}, {0xc7694000}, {0xc7696000},
- {0xc7698000}, {0xc769a000}, {0xc769c000}, {0xc769e000},
- {0xc76a0000}, {0xc76a2000}, {0xc76a4000}, {0xc76a6000},
- {0xc76a8000}, {0xc76aa000}, {0xc76ac000}, {0xc76ae000},
- {0xc76b0000}, {0xc76b2000}, {0xc76b4000}, {0xc76b6000},
- {0xc76b8000}, {0xc76ba000}, {0xc76bc000}, {0xc76be000},
- {0xc76c0000}, {0xc76c2000}, {0xc76c4000}, {0xc76c6000},
- {0xc76c8000}, {0xc76ca000}, {0xc76cc000}, {0xc76ce000},
- {0xc76d0000}, {0xc76d2000}, {0xc76d4000}, {0xc76d6000},
- {0xc76d8000}, {0xc76da000}, {0xc76dc000}, {0xc76de000},
- {0xc76e0000}, {0xc76e2000}, {0xc76e4000}, {0xc76e6000},
- {0xc76e8000}, {0xc76ea000}, {0xc76ec000}, {0xc76ee000},
- {0xc76f0000}, {0xc76f2000}, {0xc76f4000}, {0xc76f6000},
- {0xc76f8000}, {0xc76fa000}, {0xc76fc000}, {0xc76fe000},
- {0xc7700000}, {0xc7702000}, {0xc7704000}, {0xc7706000},
- {0xc7708000}, {0xc770a000}, {0xc770c000}, {0xc770e000},
- {0xc7710000}, {0xc7712000}, {0xc7714000}, {0xc7716000},
- {0xc7718000}, {0xc771a000}, {0xc771c000}, {0xc771e000},
- {0xc7720000}, {0xc7722000}, {0xc7724000}, {0xc7726000},
- {0xc7728000}, {0xc772a000}, {0xc772c000}, {0xc772e000},
- {0xc7730000}, {0xc7732000}, {0xc7734000}, {0xc7736000},
- {0xc7738000}, {0xc773a000}, {0xc773c000}, {0xc773e000},
- {0xc7740000}, {0xc7742000}, {0xc7744000}, {0xc7746000},
- {0xc7748000}, {0xc774a000}, {0xc774c000}, {0xc774e000},
- {0xc7750000}, {0xc7752000}, {0xc7754000}, {0xc7756000},
- {0xc7758000}, {0xc775a000}, {0xc775c000}, {0xc775e000},
- {0xc7760000}, {0xc7762000}, {0xc7764000}, {0xc7766000},
- {0xc7768000}, {0xc776a000}, {0xc776c000}, {0xc776e000},
- {0xc7770000}, {0xc7772000}, {0xc7774000}, {0xc7776000},
- {0xc7778000}, {0xc777a000}, {0xc777c000}, {0xc777e000},
- {0xc7780000}, {0xc7782000}, {0xc7784000}, {0xc7786000},
- {0xc7788000}, {0xc778a000}, {0xc778c000}, {0xc778e000},
- {0xc7790000}, {0xc7792000}, {0xc7794000}, {0xc7796000},
- {0xc7798000}, {0xc779a000}, {0xc779c000}, {0xc779e000},
- {0xc77a0000}, {0xc77a2000}, {0xc77a4000}, {0xc77a6000},
- {0xc77a8000}, {0xc77aa000}, {0xc77ac000}, {0xc77ae000},
- {0xc77b0000}, {0xc77b2000}, {0xc77b4000}, {0xc77b6000},
- {0xc77b8000}, {0xc77ba000}, {0xc77bc000}, {0xc77be000},
- {0xc77c0000}, {0xc77c2000}, {0xc77c4000}, {0xc77c6000},
- {0xc77c8000}, {0xc77ca000}, {0xc77cc000}, {0xc77ce000},
- {0xc77d0000}, {0xc77d2000}, {0xc77d4000}, {0xc77d6000},
- {0xc77d8000}, {0xc77da000}, {0xc77dc000}, {0xc77de000},
- {0xc77e0000}, {0xc77e2000}, {0xc77e4000}, {0xc77e6000},
- {0xc77e8000}, {0xc77ea000}, {0xc77ec000}, {0xc77ee000},
- {0xc77f0000}, {0xc77f2000}, {0xc77f4000}, {0xc77f6000},
- {0xc77f8000}, {0xc77fa000}, {0xc77fc000}, {0xc77fe000},
- {0xff800000}, {0xff802000}, {0xff804000}, {0xff806000},
- {0xff808000}, {0xff80a000}, {0xff80c000}, {0xff80e000},
- {0xff810000}, {0xff812000}, {0xff814000}, {0xff816000},
- {0xff818000}, {0xff81a000}, {0xff81c000}, {0xff81e000},
- {0xff820000}, {0xff822000}, {0xff824000}, {0xff826000},
- {0xff828000}, {0xff82a000}, {0xff82c000}, {0xff82e000},
- {0xff830000}, {0xff832000}, {0xff834000}, {0xff836000},
- {0xff838000}, {0xff83a000}, {0xff83c000}, {0xff83e000},
- {0xff840000}, {0xff842000}, {0xff844000}, {0xff846000},
- {0xff848000}, {0xff84a000}, {0xff84c000}, {0xff84e000},
- {0xff850000}, {0xff852000}, {0xff854000}, {0xff856000},
- {0xff858000}, {0xff85a000}, {0xff85c000}, {0xff85e000},
- {0xff860000}, {0xff862000}, {0xff864000}, {0xff866000},
- {0xff868000}, {0xff86a000}, {0xff86c000}, {0xff86e000},
- {0xff870000}, {0xff872000}, {0xff874000}, {0xff876000},
- {0xff878000}, {0xff87a000}, {0xff87c000}, {0xff87e000},
- {0xff880000}, {0xff882000}, {0xff884000}, {0xff886000},
- {0xff888000}, {0xff88a000}, {0xff88c000}, {0xff88e000},
- {0xff890000}, {0xff892000}, {0xff894000}, {0xff896000},
- {0xff898000}, {0xff89a000}, {0xff89c000}, {0xff89e000},
- {0xff8a0000}, {0xff8a2000}, {0xff8a4000}, {0xff8a6000},
- {0xff8a8000}, {0xff8aa000}, {0xff8ac000}, {0xff8ae000},
- {0xff8b0000}, {0xff8b2000}, {0xff8b4000}, {0xff8b6000},
- {0xff8b8000}, {0xff8ba000}, {0xff8bc000}, {0xff8be000},
- {0xff8c0000}, {0xff8c2000}, {0xff8c4000}, {0xff8c6000},
- {0xff8c8000}, {0xff8ca000}, {0xff8cc000}, {0xff8ce000},
- {0xff8d0000}, {0xff8d2000}, {0xff8d4000}, {0xff8d6000},
- {0xff8d8000}, {0xff8da000}, {0xff8dc000}, {0xff8de000},
- {0xff8e0000}, {0xff8e2000}, {0xff8e4000}, {0xff8e6000},
- {0xff8e8000}, {0xff8ea000}, {0xff8ec000}, {0xff8ee000},
- {0xff8f0000}, {0xff8f2000}, {0xff8f4000}, {0xff8f6000},
- {0xff8f8000}, {0xff8fa000}, {0xff8fc000}, {0xff8fe000},
- {0xff900000}, {0xff902000}, {0xff904000}, {0xff906000},
- {0xff908000}, {0xff90a000}, {0xff90c000}, {0xff90e000},
- {0xff910000}, {0xff912000}, {0xff914000}, {0xff916000},
- {0xff918000}, {0xff91a000}, {0xff91c000}, {0xff91e000},
- {0xff920000}, {0xff922000}, {0xff924000}, {0xff926000},
- {0xff928000}, {0xff92a000}, {0xff92c000}, {0xff92e000},
- {0xff930000}, {0xff932000}, {0xff934000}, {0xff936000},
- {0xff938000}, {0xff93a000}, {0xff93c000}, {0xff93e000},
- {0xff940000}, {0xff942000}, {0xff944000}, {0xff946000},
- {0xff948000}, {0xff94a000}, {0xff94c000}, {0xff94e000},
- {0xff950000}, {0xff952000}, {0xff954000}, {0xff956000},
- {0xff958000}, {0xff95a000}, {0xff95c000}, {0xff95e000},
- {0xff960000}, {0xff962000}, {0xff964000}, {0xff966000},
- {0xff968000}, {0xff96a000}, {0xff96c000}, {0xff96e000},
- {0xff970000}, {0xff972000}, {0xff974000}, {0xff976000},
- {0xff978000}, {0xff97a000}, {0xff97c000}, {0xff97e000},
- {0xff980000}, {0xff982000}, {0xff984000}, {0xff986000},
- {0xff988000}, {0xff98a000}, {0xff98c000}, {0xff98e000},
- {0xff990000}, {0xff992000}, {0xff994000}, {0xff996000},
- {0xff998000}, {0xff99a000}, {0xff99c000}, {0xff99e000},
- {0xff9a0000}, {0xff9a2000}, {0xff9a4000}, {0xff9a6000},
- {0xff9a8000}, {0xff9aa000}, {0xff9ac000}, {0xff9ae000},
- {0xff9b0000}, {0xff9b2000}, {0xff9b4000}, {0xff9b6000},
- {0xff9b8000}, {0xff9ba000}, {0xff9bc000}, {0xff9be000},
- {0xff9c0000}, {0xff9c2000}, {0xff9c4000}, {0xff9c6000},
- {0xff9c8000}, {0xff9ca000}, {0xff9cc000}, {0xff9ce000},
- {0xff9d0000}, {0xff9d2000}, {0xff9d4000}, {0xff9d6000},
- {0xff9d8000}, {0xff9da000}, {0xff9dc000}, {0xff9de000},
- {0xff9e0000}, {0xff9e2000}, {0xff9e4000}, {0xff9e6000},
- {0xff9e8000}, {0xff9ea000}, {0xff9ec000}, {0xff9ee000},
- {0xff9f0000}, {0xff9f2000}, {0xff9f4000}, {0xff9f6000},
- {0xff9f8000}, {0xff9fa000}, {0xff9fc000}, {0xff9fe000},
- {0xffa00000}, {0xffa02000}, {0xffa04000}, {0xffa06000},
- {0xffa08000}, {0xffa0a000}, {0xffa0c000}, {0xffa0e000},
- {0xffa10000}, {0xffa12000}, {0xffa14000}, {0xffa16000},
- {0xffa18000}, {0xffa1a000}, {0xffa1c000}, {0xffa1e000},
- {0xffa20000}, {0xffa22000}, {0xffa24000}, {0xffa26000},
- {0xffa28000}, {0xffa2a000}, {0xffa2c000}, {0xffa2e000},
- {0xffa30000}, {0xffa32000}, {0xffa34000}, {0xffa36000},
- {0xffa38000}, {0xffa3a000}, {0xffa3c000}, {0xffa3e000},
- {0xffa40000}, {0xffa42000}, {0xffa44000}, {0xffa46000},
- {0xffa48000}, {0xffa4a000}, {0xffa4c000}, {0xffa4e000},
- {0xffa50000}, {0xffa52000}, {0xffa54000}, {0xffa56000},
- {0xffa58000}, {0xffa5a000}, {0xffa5c000}, {0xffa5e000},
- {0xffa60000}, {0xffa62000}, {0xffa64000}, {0xffa66000},
- {0xffa68000}, {0xffa6a000}, {0xffa6c000}, {0xffa6e000},
- {0xffa70000}, {0xffa72000}, {0xffa74000}, {0xffa76000},
- {0xffa78000}, {0xffa7a000}, {0xffa7c000}, {0xffa7e000},
- {0xffa80000}, {0xffa82000}, {0xffa84000}, {0xffa86000},
- {0xffa88000}, {0xffa8a000}, {0xffa8c000}, {0xffa8e000},
- {0xffa90000}, {0xffa92000}, {0xffa94000}, {0xffa96000},
- {0xffa98000}, {0xffa9a000}, {0xffa9c000}, {0xffa9e000},
- {0xffaa0000}, {0xffaa2000}, {0xffaa4000}, {0xffaa6000},
- {0xffaa8000}, {0xffaaa000}, {0xffaac000}, {0xffaae000},
- {0xffab0000}, {0xffab2000}, {0xffab4000}, {0xffab6000},
- {0xffab8000}, {0xffaba000}, {0xffabc000}, {0xffabe000},
- {0xffac0000}, {0xffac2000}, {0xffac4000}, {0xffac6000},
- {0xffac8000}, {0xffaca000}, {0xffacc000}, {0xfface000},
- {0xffad0000}, {0xffad2000}, {0xffad4000}, {0xffad6000},
- {0xffad8000}, {0xffada000}, {0xffadc000}, {0xffade000},
- {0xffae0000}, {0xffae2000}, {0xffae4000}, {0xffae6000},
- {0xffae8000}, {0xffaea000}, {0xffaec000}, {0xffaee000},
- {0xffaf0000}, {0xffaf2000}, {0xffaf4000}, {0xffaf6000},
- {0xffaf8000}, {0xffafa000}, {0xffafc000}, {0xffafe000},
- {0xffb00000}, {0xffb02000}, {0xffb04000}, {0xffb06000},
- {0xffb08000}, {0xffb0a000}, {0xffb0c000}, {0xffb0e000},
- {0xffb10000}, {0xffb12000}, {0xffb14000}, {0xffb16000},
- {0xffb18000}, {0xffb1a000}, {0xffb1c000}, {0xffb1e000},
- {0xffb20000}, {0xffb22000}, {0xffb24000}, {0xffb26000},
- {0xffb28000}, {0xffb2a000}, {0xffb2c000}, {0xffb2e000},
- {0xffb30000}, {0xffb32000}, {0xffb34000}, {0xffb36000},
- {0xffb38000}, {0xffb3a000}, {0xffb3c000}, {0xffb3e000},
- {0xffb40000}, {0xffb42000}, {0xffb44000}, {0xffb46000},
- {0xffb48000}, {0xffb4a000}, {0xffb4c000}, {0xffb4e000},
- {0xffb50000}, {0xffb52000}, {0xffb54000}, {0xffb56000},
- {0xffb58000}, {0xffb5a000}, {0xffb5c000}, {0xffb5e000},
- {0xffb60000}, {0xffb62000}, {0xffb64000}, {0xffb66000},
- {0xffb68000}, {0xffb6a000}, {0xffb6c000}, {0xffb6e000},
- {0xffb70000}, {0xffb72000}, {0xffb74000}, {0xffb76000},
- {0xffb78000}, {0xffb7a000}, {0xffb7c000}, {0xffb7e000},
- {0xffb80000}, {0xffb82000}, {0xffb84000}, {0xffb86000},
- {0xffb88000}, {0xffb8a000}, {0xffb8c000}, {0xffb8e000},
- {0xffb90000}, {0xffb92000}, {0xffb94000}, {0xffb96000},
- {0xffb98000}, {0xffb9a000}, {0xffb9c000}, {0xffb9e000},
- {0xffba0000}, {0xffba2000}, {0xffba4000}, {0xffba6000},
- {0xffba8000}, {0xffbaa000}, {0xffbac000}, {0xffbae000},
- {0xffbb0000}, {0xffbb2000}, {0xffbb4000}, {0xffbb6000},
- {0xffbb8000}, {0xffbba000}, {0xffbbc000}, {0xffbbe000},
- {0xffbc0000}, {0xffbc2000}, {0xffbc4000}, {0xffbc6000},
- {0xffbc8000}, {0xffbca000}, {0xffbcc000}, {0xffbce000},
- {0xffbd0000}, {0xffbd2000}, {0xffbd4000}, {0xffbd6000},
- {0xffbd8000}, {0xffbda000}, {0xffbdc000}, {0xffbde000},
- {0xffbe0000}, {0xffbe2000}, {0xffbe4000}, {0xffbe6000},
- {0xffbe8000}, {0xffbea000}, {0xffbec000}, {0xffbee000},
- {0xffbf0000}, {0xffbf2000}, {0xffbf4000}, {0xffbf6000},
- {0xffbf8000}, {0xffbfa000}, {0xffbfc000}, {0xffbfe000},
- {0xffc00000}, {0xffc02000}, {0xffc04000}, {0xffc06000},
- {0xffc08000}, {0xffc0a000}, {0xffc0c000}, {0xffc0e000},
- {0xffc10000}, {0xffc12000}, {0xffc14000}, {0xffc16000},
- {0xffc18000}, {0xffc1a000}, {0xffc1c000}, {0xffc1e000},
- {0xffc20000}, {0xffc22000}, {0xffc24000}, {0xffc26000},
- {0xffc28000}, {0xffc2a000}, {0xffc2c000}, {0xffc2e000},
- {0xffc30000}, {0xffc32000}, {0xffc34000}, {0xffc36000},
- {0xffc38000}, {0xffc3a000}, {0xffc3c000}, {0xffc3e000},
- {0xffc40000}, {0xffc42000}, {0xffc44000}, {0xffc46000},
- {0xffc48000}, {0xffc4a000}, {0xffc4c000}, {0xffc4e000},
- {0xffc50000}, {0xffc52000}, {0xffc54000}, {0xffc56000},
- {0xffc58000}, {0xffc5a000}, {0xffc5c000}, {0xffc5e000},
- {0xffc60000}, {0xffc62000}, {0xffc64000}, {0xffc66000},
- {0xffc68000}, {0xffc6a000}, {0xffc6c000}, {0xffc6e000},
- {0xffc70000}, {0xffc72000}, {0xffc74000}, {0xffc76000},
- {0xffc78000}, {0xffc7a000}, {0xffc7c000}, {0xffc7e000},
- {0xffc80000}, {0xffc82000}, {0xffc84000}, {0xffc86000},
- {0xffc88000}, {0xffc8a000}, {0xffc8c000}, {0xffc8e000},
- {0xffc90000}, {0xffc92000}, {0xffc94000}, {0xffc96000},
- {0xffc98000}, {0xffc9a000}, {0xffc9c000}, {0xffc9e000},
- {0xffca0000}, {0xffca2000}, {0xffca4000}, {0xffca6000},
- {0xffca8000}, {0xffcaa000}, {0xffcac000}, {0xffcae000},
- {0xffcb0000}, {0xffcb2000}, {0xffcb4000}, {0xffcb6000},
- {0xffcb8000}, {0xffcba000}, {0xffcbc000}, {0xffcbe000},
- {0xffcc0000}, {0xffcc2000}, {0xffcc4000}, {0xffcc6000},
- {0xffcc8000}, {0xffcca000}, {0xffccc000}, {0xffcce000},
- {0xffcd0000}, {0xffcd2000}, {0xffcd4000}, {0xffcd6000},
- {0xffcd8000}, {0xffcda000}, {0xffcdc000}, {0xffcde000},
- {0xffce0000}, {0xffce2000}, {0xffce4000}, {0xffce6000},
- {0xffce8000}, {0xffcea000}, {0xffcec000}, {0xffcee000},
- {0xffcf0000}, {0xffcf2000}, {0xffcf4000}, {0xffcf6000},
- {0xffcf8000}, {0xffcfa000}, {0xffcfc000}, {0xffcfe000},
- {0xffd00000}, {0xffd02000}, {0xffd04000}, {0xffd06000},
- {0xffd08000}, {0xffd0a000}, {0xffd0c000}, {0xffd0e000},
- {0xffd10000}, {0xffd12000}, {0xffd14000}, {0xffd16000},
- {0xffd18000}, {0xffd1a000}, {0xffd1c000}, {0xffd1e000},
- {0xffd20000}, {0xffd22000}, {0xffd24000}, {0xffd26000},
- {0xffd28000}, {0xffd2a000}, {0xffd2c000}, {0xffd2e000},
- {0xffd30000}, {0xffd32000}, {0xffd34000}, {0xffd36000},
- {0xffd38000}, {0xffd3a000}, {0xffd3c000}, {0xffd3e000},
- {0xffd40000}, {0xffd42000}, {0xffd44000}, {0xffd46000},
- {0xffd48000}, {0xffd4a000}, {0xffd4c000}, {0xffd4e000},
- {0xffd50000}, {0xffd52000}, {0xffd54000}, {0xffd56000},
- {0xffd58000}, {0xffd5a000}, {0xffd5c000}, {0xffd5e000},
- {0xffd60000}, {0xffd62000}, {0xffd64000}, {0xffd66000},
- {0xffd68000}, {0xffd6a000}, {0xffd6c000}, {0xffd6e000},
- {0xffd70000}, {0xffd72000}, {0xffd74000}, {0xffd76000},
- {0xffd78000}, {0xffd7a000}, {0xffd7c000}, {0xffd7e000},
- {0xffd80000}, {0xffd82000}, {0xffd84000}, {0xffd86000},
- {0xffd88000}, {0xffd8a000}, {0xffd8c000}, {0xffd8e000},
- {0xffd90000}, {0xffd92000}, {0xffd94000}, {0xffd96000},
- {0xffd98000}, {0xffd9a000}, {0xffd9c000}, {0xffd9e000},
- {0xffda0000}, {0xffda2000}, {0xffda4000}, {0xffda6000},
- {0xffda8000}, {0xffdaa000}, {0xffdac000}, {0xffdae000},
- {0xffdb0000}, {0xffdb2000}, {0xffdb4000}, {0xffdb6000},
- {0xffdb8000}, {0xffdba000}, {0xffdbc000}, {0xffdbe000},
- {0xffdc0000}, {0xffdc2000}, {0xffdc4000}, {0xffdc6000},
- {0xffdc8000}, {0xffdca000}, {0xffdcc000}, {0xffdce000},
- {0xffdd0000}, {0xffdd2000}, {0xffdd4000}, {0xffdd6000},
- {0xffdd8000}, {0xffdda000}, {0xffddc000}, {0xffdde000},
- {0xffde0000}, {0xffde2000}, {0xffde4000}, {0xffde6000},
- {0xffde8000}, {0xffdea000}, {0xffdec000}, {0xffdee000},
- {0xffdf0000}, {0xffdf2000}, {0xffdf4000}, {0xffdf6000},
- {0xffdf8000}, {0xffdfa000}, {0xffdfc000}, {0xffdfe000},
- {0xffe00000}, {0xffe02000}, {0xffe04000}, {0xffe06000},
- {0xffe08000}, {0xffe0a000}, {0xffe0c000}, {0xffe0e000},
- {0xffe10000}, {0xffe12000}, {0xffe14000}, {0xffe16000},
- {0xffe18000}, {0xffe1a000}, {0xffe1c000}, {0xffe1e000},
- {0xffe20000}, {0xffe22000}, {0xffe24000}, {0xffe26000},
- {0xffe28000}, {0xffe2a000}, {0xffe2c000}, {0xffe2e000},
- {0xffe30000}, {0xffe32000}, {0xffe34000}, {0xffe36000},
- {0xffe38000}, {0xffe3a000}, {0xffe3c000}, {0xffe3e000},
- {0xffe40000}, {0xffe42000}, {0xffe44000}, {0xffe46000},
- {0xffe48000}, {0xffe4a000}, {0xffe4c000}, {0xffe4e000},
- {0xffe50000}, {0xffe52000}, {0xffe54000}, {0xffe56000},
- {0xffe58000}, {0xffe5a000}, {0xffe5c000}, {0xffe5e000},
- {0xffe60000}, {0xffe62000}, {0xffe64000}, {0xffe66000},
- {0xffe68000}, {0xffe6a000}, {0xffe6c000}, {0xffe6e000},
- {0xffe70000}, {0xffe72000}, {0xffe74000}, {0xffe76000},
- {0xffe78000}, {0xffe7a000}, {0xffe7c000}, {0xffe7e000},
- {0xffe80000}, {0xffe82000}, {0xffe84000}, {0xffe86000},
- {0xffe88000}, {0xffe8a000}, {0xffe8c000}, {0xffe8e000},
- {0xffe90000}, {0xffe92000}, {0xffe94000}, {0xffe96000},
- {0xffe98000}, {0xffe9a000}, {0xffe9c000}, {0xffe9e000},
- {0xffea0000}, {0xffea2000}, {0xffea4000}, {0xffea6000},
- {0xffea8000}, {0xffeaa000}, {0xffeac000}, {0xffeae000},
- {0xffeb0000}, {0xffeb2000}, {0xffeb4000}, {0xffeb6000},
- {0xffeb8000}, {0xffeba000}, {0xffebc000}, {0xffebe000},
- {0xffec0000}, {0xffec2000}, {0xffec4000}, {0xffec6000},
- {0xffec8000}, {0xffeca000}, {0xffecc000}, {0xffece000},
- {0xffed0000}, {0xffed2000}, {0xffed4000}, {0xffed6000},
- {0xffed8000}, {0xffeda000}, {0xffedc000}, {0xffede000},
- {0xffee0000}, {0xffee2000}, {0xffee4000}, {0xffee6000},
- {0xffee8000}, {0xffeea000}, {0xffeec000}, {0xffeee000},
- {0xffef0000}, {0xffef2000}, {0xffef4000}, {0xffef6000},
- {0xffef8000}, {0xffefa000}, {0xffefc000}, {0xffefe000},
- {0xfff00000}, {0xfff02000}, {0xfff04000}, {0xfff06000},
- {0xfff08000}, {0xfff0a000}, {0xfff0c000}, {0xfff0e000},
- {0xfff10000}, {0xfff12000}, {0xfff14000}, {0xfff16000},
- {0xfff18000}, {0xfff1a000}, {0xfff1c000}, {0xfff1e000},
- {0xfff20000}, {0xfff22000}, {0xfff24000}, {0xfff26000},
- {0xfff28000}, {0xfff2a000}, {0xfff2c000}, {0xfff2e000},
- {0xfff30000}, {0xfff32000}, {0xfff34000}, {0xfff36000},
- {0xfff38000}, {0xfff3a000}, {0xfff3c000}, {0xfff3e000},
- {0xfff40000}, {0xfff42000}, {0xfff44000}, {0xfff46000},
- {0xfff48000}, {0xfff4a000}, {0xfff4c000}, {0xfff4e000},
- {0xfff50000}, {0xfff52000}, {0xfff54000}, {0xfff56000},
- {0xfff58000}, {0xfff5a000}, {0xfff5c000}, {0xfff5e000},
- {0xfff60000}, {0xfff62000}, {0xfff64000}, {0xfff66000},
- {0xfff68000}, {0xfff6a000}, {0xfff6c000}, {0xfff6e000},
- {0xfff70000}, {0xfff72000}, {0xfff74000}, {0xfff76000},
- {0xfff78000}, {0xfff7a000}, {0xfff7c000}, {0xfff7e000},
- {0xfff80000}, {0xfff82000}, {0xfff84000}, {0xfff86000},
- {0xfff88000}, {0xfff8a000}, {0xfff8c000}, {0xfff8e000},
- {0xfff90000}, {0xfff92000}, {0xfff94000}, {0xfff96000},
- {0xfff98000}, {0xfff9a000}, {0xfff9c000}, {0xfff9e000},
- {0xfffa0000}, {0xfffa2000}, {0xfffa4000}, {0xfffa6000},
- {0xfffa8000}, {0xfffaa000}, {0xfffac000}, {0xfffae000},
- {0xfffb0000}, {0xfffb2000}, {0xfffb4000}, {0xfffb6000},
- {0xfffb8000}, {0xfffba000}, {0xfffbc000}, {0xfffbe000},
- {0xfffc0000}, {0xfffc2000}, {0xfffc4000}, {0xfffc6000},
- {0xfffc8000}, {0xfffca000}, {0xfffcc000}, {0xfffce000},
- {0xfffd0000}, {0xfffd2000}, {0xfffd4000}, {0xfffd6000},
- {0xfffd8000}, {0xfffda000}, {0xfffdc000}, {0xfffde000},
- {0xfffe0000}, {0xfffe2000}, {0xfffe4000}, {0xfffe6000},
- {0xfffe8000}, {0xfffea000}, {0xfffec000}, {0xfffee000},
- {0xffff0000}, {0xffff2000}, {0xffff4000}, {0xffff6000},
- {0xffff8000}, {0xffffa000}, {0xffffc000}, {0xffffe000},
-};
diff --git a/jellyfish/yaggo.cpp b/jellyfish/yaggo.cpp
deleted file mode 100644
index 660a12f..0000000
--- a/jellyfish/yaggo.cpp
+++ /dev/null
@@ -1,184 +0,0 @@
-/* Copyright (c) 2011 Guillaume Marcais
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <jellyfish/yaggo.hpp>
-
-namespace yaggo {
- uint32_t string::as_uint32(bool si_suffix) const {
- std::string err;
- uint32_t res = yaggo::conv_uint<uint32_t>((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to uint32_t: ";
- msg += err;
- throw std::runtime_error(msg);
- }
- return res;
- }
-
- uint64_t string::as_uint64(bool si_suffix) const {
- std::string err;
- uint64_t res = yaggo::conv_uint<uint64_t>((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to uint64_t: ";
- msg += err;
- throw std::runtime_error(msg);
- }
- return res;
- }
-
- int32_t string::as_int32(bool si_suffix) const {
- std::string err;
- int32_t res = yaggo::conv_int<int32_t>((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to int32_t: ";
- msg += err;
- throw std::runtime_error(msg);
- }
- return res;
- }
-
- int64_t string::as_int64(bool si_suffix) const {
- std::string err;
- int64_t res = yaggo::conv_int<int64_t>((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to int64_t: ";
- msg += err;
- throw std::runtime_error(msg);
- }
- return res;
- }
-
- int string::as_int(bool si_suffix) const {
- std::string err;
- int res = yaggo::conv_int<int>((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to int_t: ";
- msg += err;
- throw std::runtime_error(msg);
- }
- return res;
- }
-
- long string::as_long(bool si_suffix) const {
- std::string err;
- long res = yaggo::conv_int<long>((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to long_t: ";
- msg += err;
- throw std::runtime_error(msg);
- }
- return res;
- }
-
- double string::as_double(bool si_suffix) const {
- std::string err;
- double res = yaggo::conv_double((const char*)this->c_str(), err, si_suffix);
- if(!err.empty()) {
- std::string msg("Invalid conversion of '");
- msg += *this;
- msg += "' to double_t: ";
- msg += err;
- throw std::runtime_error(msg);
- }
- return res;
- }
-
- int string::as_enum(const char* const strs[]) {
- std::string err;
- int res = yaggo::conv_enum((const char*)this->c_str(), err, strs);
- if(!err.empty())
- throw std::runtime_error(err);
- return res;
- }
-
- bool adjust_double_si_suffix(double &res, const char *suffix) {
- if(*suffix == '\0')
- return true;
- if(*(suffix + 1) != '\0')
- return false;
-
- switch(*suffix) {
- case 'a': res *= 1e-18; break;
- case 'f': res *= 1e-15; break;
- case 'p': res *= 1e-12; break;
- case 'n': res *= 1e-9; break;
- case 'u': res *= 1e-6; break;
- case 'm': res *= 1e-3; break;
- case 'k': res *= 1e3; break;
- case 'M': res *= 1e6; break;
- case 'G': res *= 1e9; break;
- case 'T': res *= 1e12; break;
- case 'P': res *= 1e15; break;
- case 'E': res *= 1e18; break;
- default: return false;
- }
- return true;
- }
-
- double conv_double(const char *str, std::string &err, bool si_suffix) {
- char *endptr = 0;
- errno = 0;
- double res = strtod(str, &endptr);
- if(errno) {
- err.assign(strerror(errno));
- return (double)0.0;
- }
- bool invalid =
- si_suffix ? !adjust_double_si_suffix(res, endptr) : *endptr != '\0';
- if(invalid) {
- err.assign("Invalid character");
- return (double)0.0;
- }
- return res;
- }
-
- int conv_enum(const char* str, std::string& err, const char* const strs[]) {
- int res = 0;
- for(const char* const* cstr = strs; *cstr; ++cstr, ++res)
- if(!strcmp(*cstr, str))
- return res;
- err += "Invalid constant '";
- err += str;
- err += "'. Expected one of { ";
- for(const char* const* cstr = strs; *cstr; ++cstr) {
- if(cstr != strs)
- err += ", ";
- err += *cstr;
- }
- err += " }";
- return -1;
- }
-}
diff --git a/jellyfish/yaggo.hpp b/jellyfish/yaggo.hpp
deleted file mode 100644
index 9cff366..0000000
--- a/jellyfish/yaggo.hpp
+++ /dev/null
@@ -1,152 +0,0 @@
-/* Copyright (c) 2011 Guillaume Marcais
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use,
- * copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following
- * conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef __YAGGO_HPP__
-#define __YAGGO_HPP__
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <getopt.h>
-#include <errno.h>
-#include <string.h>
-#include <stdexcept>
-#include <string>
-#include <limits>
-#include <vector>
-#include <iostream>
-#include <sstream>
-
-namespace yaggo {
- class string : public std::string {
- public:
- string() : std::string() {}
- explicit string(const std::string &s) : std::string(s) {}
- explicit string(const char *s) : std::string(s) {}
- int as_enum(const char* const strs[]);
-
- uint32_t as_uint32_suffix() const { return as_uint32(true); }
- uint32_t as_uint32(bool si_suffix = false) const;
- uint64_t as_uint64_suffix() const { return as_uint64(true); }
- uint64_t as_uint64(bool si_suffix = false) const;
- int32_t as_int32_suffix() const { return as_int32(true); }
- int32_t as_int32(bool si_suffix = false) const;
- int64_t as_int64_suffix() const { return as_int64(true); }
- int64_t as_int64(bool si_suffix = false) const;
- int as_int_suffix() const { return as_int(true); }
- int as_int(bool si_suffix = false) const;
- long as_long_suffix() const { return as_long(true); }
- long as_long(bool si_suffix = false) const;
- double as_double_suffix() const { return as_double(true); }
- double as_double(bool si_suffix = false) const;
- };
-
- bool adjust_double_si_suffix(double &res, const char *unit);
- double conv_double(const char *str, std::string &err, bool si_suffix);
- int conv_enum(const char* str, std::string& err, const char* const strs[]);
-
- template<typename T>
- static bool adjust_int_si_suffix(T &res, const char *suffix) {
- if(*suffix == '\0')
- return true;
- if(*(suffix + 1) != '\0')
- return false;
-
- switch(*suffix) {
- case 'k': res *= (T)1000; break;
- case 'M': res *= (T)1000000; break;
- case 'G': res *= (T)1000000000; break;
- case 'T': res *= (T)1000000000000; break;
- case 'P': res *= (T)1000000000000000; break;
- case 'E': res *= (T)1000000000000000000; break;
- default: return false;
- }
- return true;
- }
-
- template<typename T>
- static T conv_int(const char *str, std::string &err, bool si_suffix) {
- char *endptr = 0;
- errno = 0;
- long long int res = strtoll(str, &endptr, 0);
- if(errno) {
- err.assign(strerror(errno));
- return (T)0;
- }
- bool invalid =
- si_suffix ? !adjust_int_si_suffix(res, endptr) : *endptr != '\0';
- if(invalid) {
- err.assign("Invalid character");
- return (T)0;
- }
- if(res > std::numeric_limits<T>::max() ||
- res < std::numeric_limits<T>::min()) {
- err.assign("Value out of range");
- return (T)0;
- }
- return (T)res;
- }
-
- template<typename T>
- static T conv_uint(const char *str, std::string &err, bool si_suffix) {
- char *endptr = 0;
- errno = 0;
- while(isspace(*str)) { ++str; }
- if(*str == '-') {
- err.assign("Negative value");
- return (T)0;
- }
- unsigned long long int res = strtoull(str, &endptr, 0);
- if(errno) {
- err.assign(strerror(errno));
- return (T)0;
- }
- bool invalid =
- si_suffix ? !adjust_int_si_suffix(res, endptr) : *endptr != '\0';
- if(invalid) {
- err.assign("Invalid character");
- return (T)0;
- }
- if(res > std::numeric_limits<T>::max() ||
- res < std::numeric_limits<T>::min()) {
- err.assign("Value out of range");
- return (T)0;
- }
- return (T)res;
- }
-
- template<typename T>
- static std::string vec_str(const std::vector<T> &vec) {
- std::ostringstream os;
- for(typename std::vector<T>::const_iterator it = vec.begin();
- it != vec.end(); ++it) {
- if(it != vec.begin())
- os << ",";
- os << *it;
- }
- return os.str();
- }
-
-}
-
-#endif
diff --git a/jellyfish/allocators_mmap.cc b/lib/allocators_mmap.cc
similarity index 51%
rename from jellyfish/allocators_mmap.cc
rename to lib/allocators_mmap.cc
index e4a24d7..f39853a 100644
--- a/jellyfish/allocators_mmap.cc
+++ b/lib/allocators_mmap.cc
@@ -15,30 +15,56 @@
*/
#include <config.h>
+#include <assert.h>
#include <jellyfish/allocators_mmap.hpp>
#ifndef MAP_ANONYMOUS
#define MAP_ANONYMOUS MAP_ANON
#endif
+#ifdef HAVE_VALGRIND
+#include <valgrind.h>
+// TODO: this should really come from the valgrind switch
+// --redzone-size. Don't know how to get access to that yet!
+static size_t redzone_size = 128;
+#endif
+
void *allocators::mmap::realloc(size_t new_size) {
void *new_ptr = MAP_FAILED;
- if(ptr == MAP_FAILED) {
- new_ptr = ::mmap(NULL, new_size, PROT_WRITE|PROT_READ,
+ const size_t asize = new_size
+#ifdef HAVE_VALGRIND
+ + 2 * redzone_size
+#endif
+ ;
+
+ if(ptr_ == MAP_FAILED) {
+ new_ptr = ::mmap(NULL, asize, PROT_WRITE|PROT_READ,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
- }
+ }
// mremap is Linux specific
// TODO: We must do something if it is not supported
#ifdef MREMAP_MAYMOVE
else {
- new_ptr = ::mremap(ptr, size, new_size, MREMAP_MAYMOVE);
+ new_ptr = ::mremap(ptr_, size_, new_size, MREMAP_MAYMOVE);
}
#endif
if(new_ptr == MAP_FAILED)
return NULL;
- size = new_size;
- ptr = new_ptr;
- return ptr;
+
+#ifdef HAVE_VALGRIND
+ new_ptr = (char*)new_ptr + redzone_size;
+ if(ptr_ == MAP_FAILED)
+ VALGRIND_MALLOCLIKE_BLOCK(new_ptr, new_size, redzone_size, 1);
+ // TODO: resize not yet supported
+#endif
+
+
+ size_ = new_size;
+ ptr_ = new_ptr;
+
+ fast_zero();
+
+ return ptr_;
}
size_t allocators::mmap::round_to_page(size_t _size) {
@@ -48,25 +74,41 @@ size_t allocators::mmap::round_to_page(size_t _size) {
void allocators::mmap::fast_zero() {
tinfo info[nb_threads];
- size_t pgsize = round_to_page(1);
- size_t nb_pages = size / pgsize + (size % pgsize != 0);
+ size_t pgsize = round_to_page(1);
+ size_t nb_pages = size_ / pgsize + (size_ % pgsize != 0);
+ int total_threads = 0;
- for(int i = 0; i < nb_threads; i++) {
- info[i].start = (char *)ptr + pgsize * ((i * nb_pages) / nb_threads);
- info[i].end = (char *)ptr + pgsize * (((i + 1) * nb_pages) / nb_threads);
-
+ for(size_t i = 0; i < (size_t)nb_threads; ++i, ++total_threads) {
+ info[i].start = (char *)ptr_ + pgsize * ((i * nb_pages) / nb_threads);
+ info[i].end = (char *)ptr_ + std::min(pgsize * (((i + 1) * nb_pages) / nb_threads), size_);
info[i].pgsize = pgsize;
- pthread_create(&info[i].thid, NULL, _fast_zero, &info[i]);
+ if(pthread_create(&info[i].thid, NULL, _fast_zero, &info[i]))
+ break;
}
- for(int i = 0; i < nb_threads; i++)
+
+ for(int i = 0; i < total_threads; i++)
pthread_join(info[i].thid, NULL);
}
void * allocators::mmap::_fast_zero(void *_info) {
tinfo *info = (tinfo *)_info;
-
- for(char *cptr = info->start; cptr < info->end; cptr += info->pgsize)
+
+ for(char *cptr = info->start; cptr < info->end; cptr += info->pgsize) {
*cptr = 0;
+ }
return NULL;
}
+
+void allocators::mmap::free() {
+ if(ptr_ == MAP_FAILED)
+ return;
+#ifdef HAVE_VALGRIND
+ VALGRIND_FREELIKE_BLOCK(ptr_, redzone_size);
+ ptr_ = (char*)ptr_ - redzone_size;
+ size_ += 2 * redzone_size;
+#endif
+ assert(::munmap(ptr_, size_) == 0);
+ ptr_ = MAP_FAILED;
+ size_ = 0;
+}
diff --git a/jellyfish/err.cc b/lib/err.cc
similarity index 84%
rename from jellyfish/err.cc
rename to lib/err.cc
index 933d488..481a33e 100644
--- a/jellyfish/err.cc
+++ b/lib/err.cc
@@ -16,14 +16,16 @@
#include <jellyfish/err.hpp>
+namespace jellyfish {
namespace err {
- std::ostream &operator<<(std::ostream &os, const err::substr &ss) {
+ std::ostream &operator<<(std::ostream &os, const substr &ss) {
os.write(ss._s, ss._l);
return os;
}
- std::ostream &operator<<(std::ostream &os, const err::no_t &x) {
+ std::ostream &operator<<(std::ostream &os, const no_t &x) {
x.write(os, errno);
return os;
}
}
+}
diff --git a/lib/generator_manager.cc b/lib/generator_manager.cc
new file mode 100644
index 0000000..b9d801b
--- /dev/null
+++ b/lib/generator_manager.cc
@@ -0,0 +1,281 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <assert.h>
+
+#include <cstdlib>
+#include <vector>
+#include <string>
+#include <map>
+#include <memory>
+#include <sstream>
+
+#include <jellyfish/generator_manager.hpp>
+#include <jellyfish/err.hpp>
+
+namespace jellyfish {
+int open_cloexec(const char* path, int flags) {
+#ifdef O_CLOEXEC
+ int fd = open(path, flags|O_CLOEXEC);
+#else
+ int fd = open(path, flags);
+ if(fd != -1)
+ fcntl(fd, F_SETFD, FD_CLOEXEC);
+#endif
+ return fd;
+}
+
+std::string tmp_pipes::create_tmp_dir() {
+ std::vector<const char*> prefixes;
+ const char* tmpdir = getenv("TMPDIR");
+ if(tmpdir)
+ prefixes.push_back(tmpdir);
+#ifdef P_tmpdir
+ prefixes.push_back(P_tmpdir);
+#endif
+ prefixes.push_back(".");
+
+ for(auto it = prefixes.begin(); it != prefixes.end(); ++it) {
+ size_t len = strlen(*it) + 6 + 1;
+ std::unique_ptr<char[]> tmppath(new char[len]);
+ sprintf(tmppath.get(), "%sXXXXXX", *it);
+ const char* res = mkdtemp(tmppath.get());
+ if(res)
+ return std::string(res);
+ }
+ throw std::runtime_error(err::msg() << "Failed to create a temporary directory for the pipes. Set the variable TMPDIR properly: " << err::no);
+ return "";
+}
+
+std::vector<std::string> tmp_pipes::create_pipes(const std::string& tmpdir, int nb_pipes)
+{
+ std::vector<std::string> pipes;
+ for(int i = 0; i < nb_pipes; ++i) {
+ std::ostringstream path;
+ path << tmpdir << "/fifo" << i;
+ if(mkfifo(path.str().c_str(), S_IRUSR|S_IWUSR) == -1)
+ throw std::runtime_error(err::msg() << "Failed to create named fifos: " << err::no);
+ pipes.push_back(path.str());
+ }
+ return pipes;
+}
+
+void tmp_pipes::discard(int i) {
+ if(pipes_[i].empty())
+ return;
+ // First rename the fifo so no new reader will open it, then open
+ // the fifo (with its new name for writing, in non-blocking mode. If
+ // we get a valid file descriptor, some readers are blocked reading
+ // on the fifo: we close the fifo and free the readers. Otherwise,
+ // no readers is blocked and no action is required. Finally we
+ // unlink the fifo for good.
+ std::string discarded_name(pipes_[i]);
+ discarded_name += "_discarded";
+ if(rename(pipes_[i].c_str(), discarded_name.c_str()) == -1)
+ return;
+ pipes_[i].clear();
+ pipes_paths_[i] = 0;
+ int fd = open(discarded_name.c_str(), O_WRONLY|O_NONBLOCK);
+ if(fd != -1)
+ close(fd);
+ unlink(discarded_name.c_str());
+}
+
+void tmp_pipes::cleanup() {
+ for(size_t i = 0; i < pipes_.size(); ++i) {
+ discard(i);
+ }
+ rmdir(tmpdir_.c_str());
+}
+
+void generator_manager::start() {
+ if(manager_pid_ != -1)
+ return;
+ manager_pid_ = fork();
+ switch(manager_pid_) {
+ case -1:
+ throw std::runtime_error(err::msg() << "Failed to start manager process: " << err::no);
+ break;
+ case 0:
+ manager_pid_ = -1;
+ break;
+ default:
+ cmds_.close();
+ return;
+ }
+
+
+ // In child
+ setup_signal_handlers();
+ start_commands(); // child start commands
+ int signal = kill_signal_;
+ if(signal == 0)
+ exit(EXIT_SUCCESS);
+
+ // Got killed. Kill all children, cleanup and kill myself with the
+ // same signal (and die from it this time :). We do not wait on the
+ // dead children as we are going to die soon as well, and we don't
+ // care about the return value at that point. Let init take care of
+ // that for us...
+ cleanup();
+ unset_signal_handlers();
+ kill(getpid(), signal); // kill myself
+ exit(EXIT_FAILURE); // Should not be reached
+}
+
+static generator_manager* manager = 0;
+void generator_manager::signal_handler(int signal) {
+ manager->kill_signal_ = signal;
+}
+void generator_manager::setup_signal_handlers() {
+ int res;
+ struct sigaction act;
+ memset(&act, '\0', sizeof(act));
+ act.sa_handler = signal_handler;
+ res = sigaction(SIGTERM, &act, 0);
+ assert(res == 0);
+ // Should we redefine other signals as well? Like SIGINT, SIGQUIT?
+}
+
+void generator_manager::unset_signal_handlers() {
+ struct sigaction act;
+ memset(&act, '\0', sizeof(act));
+ act.sa_handler = SIG_DFL;
+ assert(sigaction(SIGTERM, &act, 0) == 0);
+}
+
+bool generator_manager::wait() {
+ if(manager_pid_ == -1) return false;
+ pid_t pid = manager_pid_;
+ manager_pid_ = -1;
+ int status;
+ if(pid != waitpid(pid, &status, 0))
+ return false;
+ return WIFEXITED(status) && (WEXITSTATUS(status) == 0);
+}
+
+void generator_manager::cleanup() {
+ for(auto it = pid2pipe_.begin(); it != pid2pipe_.end(); ++it) {
+ kill(it->first, SIGTERM);
+ pipes_.discard(it->second.pipe);
+ }
+ pipes_.cleanup();
+}
+
+void generator_manager::start_one_command(const std::string& command, int pipe)
+{
+ cmd_info_type info = { command, pipe };
+ pid_t child = fork();
+ switch(child) {
+ case -1:
+ std::cerr << "Failed to fork. Command '" << command << "' not run" << std::endl;
+ return;
+ case 0:
+ break;
+ default:
+ pid2pipe_[child] = info;
+ return;
+ }
+
+ // In child
+ int dev_null = open_cloexec("/dev/null", O_RDONLY);
+ if(dev_null != -1)
+ dup2(dev_null, 0);
+
+ int pipe_fd = open_cloexec(pipes_[pipe], O_WRONLY);
+ if(pipe_fd == -1) {
+ std::cerr << "Failed to open output pipe. Command '" << command << "' not run" << std::endl;
+ exit(EXIT_FAILURE);
+ }
+ if(dup2(pipe_fd, 1) == -1) {
+ std::cerr << "Failed to dup pipe to stdout. Command '" << command << "' not run" << std::endl;
+ exit(EXIT_FAILURE);
+ }
+ execl(shell_, shell_, "-c", command.c_str(), (char*)0);
+ std::cerr << "Failed to exec. Command '" << command << "' not run" << std::endl;
+ exit(EXIT_FAILURE);
+}
+
+std::string generator_manager::get_cmd() {
+ std::string command;
+
+ while(std::getline(cmds_, command)) {
+ size_t pos = command.find_first_not_of(" \t\n\v\f\r");
+ if(pos != std::string::npos && command[pos] != '#')
+ break;
+ command.clear();
+ }
+ return command;
+}
+
+void generator_manager::start_commands()
+{
+ std::string command;
+ size_t i;
+ for(i = 0; i < pipes_.size(); ++i) {
+ command = get_cmd();
+ if(command.empty())
+ break;
+ start_one_command(command, i);
+ }
+ for( ; i < pipes_.size(); ++i)
+ pipes_.discard(i);
+
+ while(!pid2pipe_.empty()) {
+ int status;
+ int res = ::wait(&status);
+ if(res == -1) {
+ if(errno == EINTR) continue;
+ break;
+ }
+ cmd_info_type info = pid2pipe_[res];
+ pid2pipe_.erase(info.pipe);
+ command = get_cmd();
+ if(!command.empty()) {
+ start_one_command(command, info.pipe);
+ } else {
+ pipes_.discard(info.pipe);
+ }
+ if(!display_status(status, info.command)) {
+ cleanup();
+ exit(EXIT_FAILURE);
+ }
+ }
+}
+
+bool generator_manager::display_status(int status, const std::string& command)
+{
+ if(WIFEXITED(status) && WEXITSTATUS(status) != 0) {
+ std::cerr << "Command '" << command
+ << "' exited with error status " << WEXITSTATUS(status) << std::endl;
+ return false;
+ } else if(WIFSIGNALED(status)) {
+ std::cerr << "Command '" << command
+ << "' killed by signal " << WTERMSIG(status) << std::endl;
+ return false;
+ }
+ return true;
+}
+
+} // namespace jellyfish
diff --git a/lib/int128.cc b/lib/int128.cc
new file mode 100644
index 0000000..6f2d1f4
--- /dev/null
+++ b/lib/int128.cc
@@ -0,0 +1,94 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_INT128
+#include <jellyfish/int128.hpp>
+
+void __int128_ns::__print_bases(std::ostream& prefix, std::ostream& os,
+ unsigned __int128 x,
+ const std::ios::fmtflags& ff) {
+ if(x == 0) {
+ os << "0";
+ return;
+ }
+ if(ff & std::ios::showbase) {
+ if(ff & std::ios::hex) {
+ if(ff & std::ios::uppercase)
+ prefix << "0X";
+ else
+ prefix << "0x";
+ } else if(ff & std::ios::oct) {
+ prefix << "0";
+ }
+ }
+ if(ff & std::ios::hex) {
+ __print_digits<16>(os, (unsigned __int128)x,
+ !(ff & std::ios::uppercase));
+ } else if(ff & std::ios::oct) {
+ __print_digits<8>(os, (unsigned __int128)x);
+ }
+}
+
+#ifndef HAVE_NUMERIC_LIMITS128
+const int std::numeric_limits<__int128>::digits;
+const int std::numeric_limits<__int128>::digits10;
+const bool std::numeric_limits<__int128>::is_signed;
+const bool std::numeric_limits<__int128>::is_integer;
+const bool std::numeric_limits<__int128>::is_exact;
+const int std::numeric_limits<__int128>::radix;
+const int std::numeric_limits<__int128>::min_exponent;
+const int std::numeric_limits<__int128>::min_exponent10;
+const int std::numeric_limits<__int128>::max_exponent;
+const int std::numeric_limits<__int128>::max_exponent10;
+const bool std::numeric_limits<__int128>::has_infinity;
+const bool std::numeric_limits<__int128>::has_quiet_NaN;
+const bool std::numeric_limits<__int128>::has_signaling_NaN;
+const std::float_denorm_style std::numeric_limits<__int128>::has_denorm;
+const bool std::numeric_limits<__int128>::has_denorm_loss;
+const bool std::numeric_limits<__int128>::is_iec559;
+const bool std::numeric_limits<__int128>::is_bounded;
+const bool std::numeric_limits<__int128>::is_modulo;
+const bool std::numeric_limits<__int128>::traps;
+const bool std::numeric_limits<__int128>::tinyness_before;
+const std::float_round_style std::numeric_limits<__int128>::round_style;
+
+const int std::numeric_limits<unsigned __int128>::digits;
+const int std::numeric_limits<unsigned __int128>::digits10;
+const bool std::numeric_limits<unsigned __int128>::is_signed;
+const bool std::numeric_limits<unsigned __int128>::is_integer;
+const bool std::numeric_limits<unsigned __int128>::is_exact;
+const int std::numeric_limits<unsigned __int128>::radix;
+const int std::numeric_limits<unsigned __int128>::min_exponent;
+const int std::numeric_limits<unsigned __int128>::min_exponent10;
+const int std::numeric_limits<unsigned __int128>::max_exponent;
+const int std::numeric_limits<unsigned __int128>::max_exponent10;
+const bool std::numeric_limits<unsigned __int128>::has_infinity;
+const bool std::numeric_limits<unsigned __int128>::has_quiet_NaN;
+const bool std::numeric_limits<unsigned __int128>::has_signaling_NaN;
+const std::float_denorm_style std::numeric_limits<unsigned __int128>::has_denorm;
+const bool std::numeric_limits<unsigned __int128>::has_denorm_loss;
+const bool std::numeric_limits<unsigned __int128>::is_iec559;
+const bool std::numeric_limits<unsigned __int128>::is_bounded;
+const bool std::numeric_limits<unsigned __int128>::is_modulo;
+const bool std::numeric_limits<unsigned __int128>::traps;
+const bool std::numeric_limits<unsigned __int128>::tinyness_before;
+const std::float_round_style std::numeric_limits<unsigned __int128>::round_style;
+#endif
+#endif
diff --git a/lib/jsoncpp.cpp b/lib/jsoncpp.cpp
new file mode 100644
index 0000000..6665010
--- /dev/null
+++ b/lib/jsoncpp.cpp
@@ -0,0 +1,4230 @@
+/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/).
+/// It is intented to be used with #include <jellyfish/json.h>
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: LICENSE
+// //////////////////////////////////////////////////////////////////////
+
+/*
+The JsonCpp library's source code, including accompanying documentation,
+tests and demonstration applications, are licensed under the following
+conditions...
+
+The author (Baptiste Lepilleur) explicitly disclaims copyright in all
+jurisdictions which recognize such a disclaimer. In such jurisdictions,
+this software is released into the Public Domain.
+
+In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
+2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
+released under the terms of the MIT License (see below).
+
+In jurisdictions which recognize Public Domain property, the user of this
+software may choose to accept it either as 1) Public Domain, 2) under the
+conditions of the MIT License (see below), or 3) under the terms of dual
+Public Domain/MIT License conditions described here, as they choose.
+
+The MIT License is about as close to Public Domain as a license can get, and is
+described in clear, concise terms at:
+
+ http://en.wikipedia.org/wiki/MIT_License
+
+The full text of the MIT License follows:
+
+========================================================================
+Copyright (c) 2007-2010 Baptiste Lepilleur
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+========================================================================
+(END LICENSE TEXT)
+
+The MIT license is compatible with both the GPL and commercial
+software, affording one all of the rights of Public Domain with the
+minor nuisance of being required to keep the above copyright notice
+and license text in the source code. Note also that by accepting the
+Public Domain "license" you can re-license your copy using whatever
+license you like.
+
+*/
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: LICENSE
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+#include <jellyfish/json.h>
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: src/lib_json/json_tool.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED
+# define LIB_JSONCPP_JSON_TOOL_H_INCLUDED
+
+/* This header provides common string manipulation support, such as UTF-8,
+ * portable conversion from/to string...
+ *
+ * It is an internal header that must not be exposed.
+ */
+
+namespace Json {
+
+/// Converts a unicode code-point to UTF-8.
+static inline std::string
+codePointToUTF8(unsigned int cp)
+{
+ std::string result;
+
+ // based on description from http://en.wikipedia.org/wiki/UTF-8
+
+ if (cp <= 0x7f)
+ {
+ result.resize(1);
+ result[0] = static_cast<char>(cp);
+ }
+ else if (cp <= 0x7FF)
+ {
+ result.resize(2);
+ result[1] = static_cast<char>(0x80 | (0x3f & cp));
+ result[0] = static_cast<char>(0xC0 | (0x1f & (cp >> 6)));
+ }
+ else if (cp <= 0xFFFF)
+ {
+ result.resize(3);
+ result[2] = static_cast<char>(0x80 | (0x3f & cp));
+ result[1] = 0x80 | static_cast<char>((0x3f & (cp >> 6)));
+ result[0] = 0xE0 | static_cast<char>((0xf & (cp >> 12)));
+ }
+ else if (cp <= 0x10FFFF)
+ {
+ result.resize(4);
+ result[3] = static_cast<char>(0x80 | (0x3f & cp));
+ result[2] = static_cast<char>(0x80 | (0x3f & (cp >> 6)));
+ result[1] = static_cast<char>(0x80 | (0x3f & (cp >> 12)));
+ result[0] = static_cast<char>(0xF0 | (0x7 & (cp >> 18)));
+ }
+
+ return result;
+}
+
+
+/// Returns true if ch is a control character (in range [0,32[).
+static inline bool
+isControlCharacter(char ch)
+{
+ return ch > 0 && ch <= 0x1F;
+}
+
+
+enum {
+ /// Constant that specify the size of the buffer that must be passed to uintToString.
+ uintToStringBufferSize = 3*sizeof(LargestUInt)+1
+};
+
+// Defines a char buffer for use with uintToString().
+typedef char UIntToStringBuffer[uintToStringBufferSize];
+
+
+/** Converts an unsigned integer to string.
+ * @param value Unsigned interger to convert to string
+ * @param current Input/Output string buffer.
+ * Must have at least uintToStringBufferSize chars free.
+ */
+static inline void
+uintToString( LargestUInt value,
+ char *¤t )
+{
+ *--current = 0;
+ do
+ {
+ *--current = char(value % 10) + '0';
+ value /= 10;
+ }
+ while ( value != 0 );
+}
+
+} // namespace Json {
+
+#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: src/lib_json/json_tool.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: src/lib_json/json_reader.cpp
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include <json/reader.h>
+# include <json/value.h>
+# include "json_tool.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+#include <utility>
+#include <cstdio>
+#include <cassert>
+#include <cstring>
+#include <iostream>
+#include <stdexcept>
+
+#if _MSC_VER >= 1400 // VC++ 8.0
+#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated.
+#endif
+
+namespace Json {
+
+// Implementation of class Features
+// ////////////////////////////////
+
+Features::Features()
+ : allowComments_( true )
+ , strictRoot_( false )
+{
+}
+
+
+Features
+Features::all()
+{
+ return Features();
+}
+
+
+Features
+Features::strictMode()
+{
+ Features features;
+ features.allowComments_ = false;
+ features.strictRoot_ = true;
+ return features;
+}
+
+// Implementation of class Reader
+// ////////////////////////////////
+
+
+static inline bool
+in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4 )
+{
+ return c == c1 || c == c2 || c == c3 || c == c4;
+}
+
+static inline bool
+in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4, Reader::Char c5 )
+{
+ return c == c1 || c == c2 || c == c3 || c == c4 || c == c5;
+}
+
+
+static bool
+containsNewLine( Reader::Location begin,
+ Reader::Location end )
+{
+ for ( ;begin < end; ++begin )
+ if ( *begin == '\n' || *begin == '\r' )
+ return true;
+ return false;
+}
+
+
+// Class Reader
+// //////////////////////////////////////////////////////////////////
+
+Reader::Reader()
+ : features_( Features::all() )
+{
+}
+
+
+Reader::Reader( const Features &features )
+ : features_( features )
+{
+}
+
+
+bool
+Reader::parse( const std::string &document,
+ Value &root,
+ bool collectComments )
+{
+ document_ = document;
+ const char *begin = document_.c_str();
+ const char *end = begin + document_.length();
+ return parse( begin, end, root, collectComments );
+}
+
+
+bool
+Reader::parse( std::istream& sin,
+ Value &root,
+ bool collectComments )
+{
+ //std::istream_iterator<char> begin(sin);
+ //std::istream_iterator<char> end;
+ // Those would allow streamed input from a file, if parse() were a
+ // template function.
+
+ // Since std::string is reference-counted, this at least does not
+ // create an extra copy.
+ std::string doc;
+ std::getline(sin, doc, (char)EOF);
+ return parse( doc, root, collectComments );
+}
+
+bool
+Reader::parse( const char *beginDoc, const char *endDoc,
+ Value &root,
+ bool collectComments )
+{
+ if ( !features_.allowComments_ )
+ {
+ collectComments = false;
+ }
+
+ begin_ = beginDoc;
+ end_ = endDoc;
+ collectComments_ = collectComments;
+ current_ = begin_;
+ lastValueEnd_ = 0;
+ lastValue_ = 0;
+ commentsBefore_ = "";
+ errors_.clear();
+ while ( !nodes_.empty() )
+ nodes_.pop();
+ nodes_.push( &root );
+
+ bool successful = readValue();
+ Token token;
+ skipCommentTokens( token );
+ if ( collectComments_ && !commentsBefore_.empty() )
+ root.setComment( commentsBefore_, commentAfter );
+ if ( features_.strictRoot_ )
+ {
+ if ( !root.isArray() && !root.isObject() )
+ {
+ // Set error location to start of doc, ideally should be first token found in doc
+ token.type_ = tokenError;
+ token.start_ = beginDoc;
+ token.end_ = endDoc;
+ addError( "A valid JSON document must be either an array or an object value.",
+ token );
+ return false;
+ }
+ }
+ return successful;
+}
+
+
+bool
+Reader::readValue()
+{
+ Token token;
+ skipCommentTokens( token );
+ bool successful = true;
+
+ if ( collectComments_ && !commentsBefore_.empty() )
+ {
+ currentValue().setComment( commentsBefore_, commentBefore );
+ commentsBefore_ = "";
+ }
+
+
+ switch ( token.type_ )
+ {
+ case tokenObjectBegin:
+ successful = readObject( token );
+ break;
+ case tokenArrayBegin:
+ successful = readArray( token );
+ break;
+ case tokenNumber:
+ successful = decodeNumber( token );
+ break;
+ case tokenString:
+ successful = decodeString( token );
+ break;
+ case tokenTrue:
+ currentValue() = true;
+ break;
+ case tokenFalse:
+ currentValue() = false;
+ break;
+ case tokenNull:
+ currentValue() = Value();
+ break;
+ default:
+ return addError( "Syntax error: value, object or array expected.", token );
+ }
+
+ if ( collectComments_ )
+ {
+ lastValueEnd_ = current_;
+ lastValue_ = ¤tValue();
+ }
+
+ return successful;
+}
+
+
+void
+Reader::skipCommentTokens( Token &token )
+{
+ if ( features_.allowComments_ )
+ {
+ do
+ {
+ readToken( token );
+ }
+ while ( token.type_ == tokenComment );
+ }
+ else
+ {
+ readToken( token );
+ }
+}
+
+
+bool
+Reader::expectToken( TokenType type, Token &token, const char *message )
+{
+ readToken( token );
+ if ( token.type_ != type )
+ return addError( message, token );
+ return true;
+}
+
+
+bool
+Reader::readToken( Token &token )
+{
+ skipSpaces();
+ token.start_ = current_;
+ Char c = getNextChar();
+ bool ok = true;
+ switch ( c )
+ {
+ case '{':
+ token.type_ = tokenObjectBegin;
+ break;
+ case '}':
+ token.type_ = tokenObjectEnd;
+ break;
+ case '[':
+ token.type_ = tokenArrayBegin;
+ break;
+ case ']':
+ token.type_ = tokenArrayEnd;
+ break;
+ case '"':
+ token.type_ = tokenString;
+ ok = readString();
+ break;
+ case '/':
+ token.type_ = tokenComment;
+ ok = readComment();
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ case '-':
+ token.type_ = tokenNumber;
+ readNumber();
+ break;
+ case 't':
+ token.type_ = tokenTrue;
+ ok = match( "rue", 3 );
+ break;
+ case 'f':
+ token.type_ = tokenFalse;
+ ok = match( "alse", 4 );
+ break;
+ case 'n':
+ token.type_ = tokenNull;
+ ok = match( "ull", 3 );
+ break;
+ case ',':
+ token.type_ = tokenArraySeparator;
+ break;
+ case ':':
+ token.type_ = tokenMemberSeparator;
+ break;
+ case 0:
+ token.type_ = tokenEndOfStream;
+ break;
+ default:
+ ok = false;
+ break;
+ }
+ if ( !ok )
+ token.type_ = tokenError;
+ token.end_ = current_;
+ return true;
+}
+
+
+void
+Reader::skipSpaces()
+{
+ while ( current_ != end_ )
+ {
+ Char c = *current_;
+ if ( c == ' ' || c == '\t' || c == '\r' || c == '\n' )
+ ++current_;
+ else
+ break;
+ }
+}
+
+
+bool
+Reader::match( Location pattern,
+ int patternLength )
+{
+ if ( end_ - current_ < patternLength )
+ return false;
+ int index = patternLength;
+ while ( index-- )
+ if ( current_[index] != pattern[index] )
+ return false;
+ current_ += patternLength;
+ return true;
+}
+
+
+bool
+Reader::readComment()
+{
+ Location commentBegin = current_ - 1;
+ Char c = getNextChar();
+ bool successful = false;
+ if ( c == '*' )
+ successful = readCStyleComment();
+ else if ( c == '/' )
+ successful = readCppStyleComment();
+ if ( !successful )
+ return false;
+
+ if ( collectComments_ )
+ {
+ CommentPlacement placement = commentBefore;
+ if ( lastValueEnd_ && !containsNewLine( lastValueEnd_, commentBegin ) )
+ {
+ if ( c != '*' || !containsNewLine( commentBegin, current_ ) )
+ placement = commentAfterOnSameLine;
+ }
+
+ addComment( commentBegin, current_, placement );
+ }
+ return true;
+}
+
+
+void
+Reader::addComment( Location begin,
+ Location end,
+ CommentPlacement placement )
+{
+ assert( collectComments_ );
+ if ( placement == commentAfterOnSameLine )
+ {
+ assert( lastValue_ != 0 );
+ lastValue_->setComment( std::string( begin, end ), placement );
+ }
+ else
+ {
+ if ( !commentsBefore_.empty() )
+ commentsBefore_ += "\n";
+ commentsBefore_ += std::string( begin, end );
+ }
+}
+
+
+bool
+Reader::readCStyleComment()
+{
+ while ( current_ != end_ )
+ {
+ Char c = getNextChar();
+ if ( c == '*' && *current_ == '/' )
+ break;
+ }
+ return getNextChar() == '/';
+}
+
+
+bool
+Reader::readCppStyleComment()
+{
+ while ( current_ != end_ )
+ {
+ Char c = getNextChar();
+ if ( c == '\r' || c == '\n' )
+ break;
+ }
+ return true;
+}
+
+
+void
+Reader::readNumber()
+{
+ while ( current_ != end_ )
+ {
+ if ( !(*current_ >= '0' && *current_ <= '9') &&
+ !in( *current_, '.', 'e', 'E', '+', '-' ) )
+ break;
+ ++current_;
+ }
+}
+
+bool
+Reader::readString()
+{
+ Char c = 0;
+ while ( current_ != end_ )
+ {
+ c = getNextChar();
+ if ( c == '\\' )
+ getNextChar();
+ else if ( c == '"' )
+ break;
+ }
+ return c == '"';
+}
+
+
+bool
+Reader::readObject( Token &/*tokenStart*/ )
+{
+ Token tokenName;
+ std::string name;
+ currentValue() = Value( objectValue );
+ while ( readToken( tokenName ) )
+ {
+ bool initialTokenOk = true;
+ while ( tokenName.type_ == tokenComment && initialTokenOk )
+ initialTokenOk = readToken( tokenName );
+ if ( !initialTokenOk )
+ break;
+ if ( tokenName.type_ == tokenObjectEnd && name.empty() ) // empty object
+ return true;
+ if ( tokenName.type_ != tokenString )
+ break;
+
+ name = "";
+ if ( !decodeString( tokenName, name ) )
+ return recoverFromError( tokenObjectEnd );
+
+ Token colon;
+ if ( !readToken( colon ) || colon.type_ != tokenMemberSeparator )
+ {
+ return addErrorAndRecover( "Missing ':' after object member name",
+ colon,
+ tokenObjectEnd );
+ }
+ Value &value = currentValue()[ name ];
+ nodes_.push( &value );
+ bool ok = readValue();
+ nodes_.pop();
+ if ( !ok ) // error already set
+ return recoverFromError( tokenObjectEnd );
+
+ Token comma;
+ if ( !readToken( comma )
+ || ( comma.type_ != tokenObjectEnd &&
+ comma.type_ != tokenArraySeparator &&
+ comma.type_ != tokenComment ) )
+ {
+ return addErrorAndRecover( "Missing ',' or '}' in object declaration",
+ comma,
+ tokenObjectEnd );
+ }
+ bool finalizeTokenOk = true;
+ while ( comma.type_ == tokenComment &&
+ finalizeTokenOk )
+ finalizeTokenOk = readToken( comma );
+ if ( comma.type_ == tokenObjectEnd )
+ return true;
+ }
+ return addErrorAndRecover( "Missing '}' or object member name",
+ tokenName,
+ tokenObjectEnd );
+}
+
+
+bool
+Reader::readArray( Token &/*tokenStart*/ )
+{
+ currentValue() = Value( arrayValue );
+ skipSpaces();
+ if ( *current_ == ']' ) // empty array
+ {
+ Token endArray;
+ readToken( endArray );
+ return true;
+ }
+ int index = 0;
+ for (;;)
+ {
+ Value &value = currentValue()[ index++ ];
+ nodes_.push( &value );
+ bool ok = readValue();
+ nodes_.pop();
+ if ( !ok ) // error already set
+ return recoverFromError( tokenArrayEnd );
+
+ Token token;
+ // Accept Comment after last item in the array.
+ ok = readToken( token );
+ while ( token.type_ == tokenComment && ok )
+ {
+ ok = readToken( token );
+ }
+ bool badTokenType = ( token.type_ != tokenArraySeparator &&
+ token.type_ != tokenArrayEnd );
+ if ( !ok || badTokenType )
+ {
+ return addErrorAndRecover( "Missing ',' or ']' in array declaration",
+ token,
+ tokenArrayEnd );
+ }
+ if ( token.type_ == tokenArrayEnd )
+ break;
+ }
+ return true;
+}
+
+
+bool
+Reader::decodeNumber( Token &token )
+{
+ bool isDouble = false;
+ for ( Location inspect = token.start_; inspect != token.end_; ++inspect )
+ {
+ isDouble = isDouble
+ || in( *inspect, '.', 'e', 'E', '+' )
+ || ( *inspect == '-' && inspect != token.start_ );
+ }
+ if ( isDouble )
+ return decodeDouble( token );
+ // Attempts to parse the number as an integer. If the number is
+ // larger than the maximum supported value of an integer then
+ // we decode the number as a double.
+ Location current = token.start_;
+ bool isNegative = *current == '-';
+ if ( isNegative )
+ ++current;
+ Value::LargestUInt maxIntegerValue = isNegative ? Value::LargestUInt(-Value::minLargestInt)
+ : Value::maxLargestUInt;
+ Value::LargestUInt threshold = maxIntegerValue / 10;
+ Value::UInt lastDigitThreshold = Value::UInt( maxIntegerValue % 10 );
+ assert( lastDigitThreshold <= 9 );
+ Value::LargestUInt value = 0;
+ while ( current < token.end_ )
+ {
+ Char c = *current++;
+ if ( c < '0' || c > '9' )
+ return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token );
+ Value::UInt digit(c - '0');
+ if ( value >= threshold )
+ {
+ // If the current digit is not the last one, or if it is
+ // greater than the last digit of the maximum integer value,
+ // the parse the number as a double.
+ if ( current != token.end_ || digit > lastDigitThreshold )
+ {
+ return decodeDouble( token );
+ }
+ }
+ value = value * 10 + digit;
+ }
+ if ( isNegative )
+ currentValue() = -Value::LargestInt( value );
+ else if ( value <= Value::LargestUInt(Value::maxInt) )
+ currentValue() = Value::LargestInt( value );
+ else
+ currentValue() = value;
+ return true;
+}
+
+
+bool
+Reader::decodeDouble( Token &token )
+{
+ double value = 0;
+ const int bufferSize = 32;
+ int count;
+ int length = int(token.end_ - token.start_);
+ if ( length <= bufferSize )
+ {
+ Char buffer[bufferSize+1];
+ memcpy( buffer, token.start_, length );
+ buffer[length] = 0;
+ count = sscanf( buffer, "%lf", &value );
+ }
+ else
+ {
+ std::string buffer( token.start_, token.end_ );
+ count = sscanf( buffer.c_str(), "%lf", &value );
+ }
+
+ if ( count != 1 )
+ return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token );
+ currentValue() = value;
+ return true;
+}
+
+
+bool
+Reader::decodeString( Token &token )
+{
+ std::string decoded;
+ if ( !decodeString( token, decoded ) )
+ return false;
+ currentValue() = decoded;
+ return true;
+}
+
+
+bool
+Reader::decodeString( Token &token, std::string &decoded )
+{
+ decoded.reserve( token.end_ - token.start_ - 2 );
+ Location current = token.start_ + 1; // skip '"'
+ Location end = token.end_ - 1; // do not include '"'
+ while ( current != end )
+ {
+ Char c = *current++;
+ if ( c == '"' )
+ break;
+ else if ( c == '\\' )
+ {
+ if ( current == end )
+ return addError( "Empty escape sequence in string", token, current );
+ Char escape = *current++;
+ switch ( escape )
+ {
+ case '"': decoded += '"'; break;
+ case '/': decoded += '/'; break;
+ case '\\': decoded += '\\'; break;
+ case 'b': decoded += '\b'; break;
+ case 'f': decoded += '\f'; break;
+ case 'n': decoded += '\n'; break;
+ case 'r': decoded += '\r'; break;
+ case 't': decoded += '\t'; break;
+ case 'u':
+ {
+ unsigned int unicode;
+ if ( !decodeUnicodeCodePoint( token, current, end, unicode ) )
+ return false;
+ decoded += codePointToUTF8(unicode);
+ }
+ break;
+ default:
+ return addError( "Bad escape sequence in string", token, current );
+ }
+ }
+ else
+ {
+ decoded += c;
+ }
+ }
+ return true;
+}
+
+bool
+Reader::decodeUnicodeCodePoint( Token &token,
+ Location ¤t,
+ Location end,
+ unsigned int &unicode )
+{
+
+ if ( !decodeUnicodeEscapeSequence( token, current, end, unicode ) )
+ return false;
+ if (unicode >= 0xD800 && unicode <= 0xDBFF)
+ {
+ // surrogate pairs
+ if (end - current < 6)
+ return addError( "additional six characters expected to parse unicode surrogate pair.", token, current );
+ unsigned int surrogatePair;
+ if (*(current++) == '\\' && *(current++)== 'u')
+ {
+ if (decodeUnicodeEscapeSequence( token, current, end, surrogatePair ))
+ {
+ unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF);
+ }
+ else
+ return false;
+ }
+ else
+ return addError( "expecting another \\u token to begin the second half of a unicode surrogate pair", token, current );
+ }
+ return true;
+}
+
+bool
+Reader::decodeUnicodeEscapeSequence( Token &token,
+ Location ¤t,
+ Location end,
+ unsigned int &unicode )
+{
+ if ( end - current < 4 )
+ return addError( "Bad unicode escape sequence in string: four digits expected.", token, current );
+ unicode = 0;
+ for ( int index =0; index < 4; ++index )
+ {
+ Char c = *current++;
+ unicode *= 16;
+ if ( c >= '0' && c <= '9' )
+ unicode += c - '0';
+ else if ( c >= 'a' && c <= 'f' )
+ unicode += c - 'a' + 10;
+ else if ( c >= 'A' && c <= 'F' )
+ unicode += c - 'A' + 10;
+ else
+ return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", token, current );
+ }
+ return true;
+}
+
+
+bool
+Reader::addError( const std::string &message,
+ Token &token,
+ Location extra )
+{
+ ErrorInfo info;
+ info.token_ = token;
+ info.message_ = message;
+ info.extra_ = extra;
+ errors_.push_back( info );
+ return false;
+}
+
+
+bool
+Reader::recoverFromError( TokenType skipUntilToken )
+{
+ int errorCount = int(errors_.size());
+ Token skip;
+ for (;;)
+ {
+ if ( !readToken(skip) )
+ errors_.resize( errorCount ); // discard errors caused by recovery
+ if ( skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream )
+ break;
+ }
+ errors_.resize( errorCount );
+ return false;
+}
+
+
+bool
+Reader::addErrorAndRecover( const std::string &message,
+ Token &token,
+ TokenType skipUntilToken )
+{
+ addError( message, token );
+ return recoverFromError( skipUntilToken );
+}
+
+
+Value &
+Reader::currentValue()
+{
+ return *(nodes_.top());
+}
+
+
+Reader::Char
+Reader::getNextChar()
+{
+ if ( current_ == end_ )
+ return 0;
+ return *current_++;
+}
+
+
+void
+Reader::getLocationLineAndColumn( Location location,
+ int &line,
+ int &column ) const
+{
+ Location current = begin_;
+ Location lastLineStart = current;
+ line = 0;
+ while ( current < location && current != end_ )
+ {
+ Char c = *current++;
+ if ( c == '\r' )
+ {
+ if ( *current == '\n' )
+ ++current;
+ lastLineStart = current;
+ ++line;
+ }
+ else if ( c == '\n' )
+ {
+ lastLineStart = current;
+ ++line;
+ }
+ }
+ // column & line start at 1
+ column = int(location - lastLineStart) + 1;
+ ++line;
+}
+
+
+std::string
+Reader::getLocationLineAndColumn( Location location ) const
+{
+ int line, column;
+ getLocationLineAndColumn( location, line, column );
+ char buffer[18+16+16+1];
+ sprintf( buffer, "Line %d, Column %d", line, column );
+ return buffer;
+}
+
+
+// Deprecated. Preserved for backward compatibility
+std::string
+Reader::getFormatedErrorMessages() const
+{
+ return getFormattedErrorMessages();
+}
+
+
+std::string
+Reader::getFormattedErrorMessages() const
+{
+ std::string formattedMessage;
+ for ( Errors::const_iterator itError = errors_.begin();
+ itError != errors_.end();
+ ++itError )
+ {
+ const ErrorInfo &error = *itError;
+ formattedMessage += "* " + getLocationLineAndColumn( error.token_.start_ ) + "\n";
+ formattedMessage += " " + error.message_ + "\n";
+ if ( error.extra_ )
+ formattedMessage += "See " + getLocationLineAndColumn( error.extra_ ) + " for detail.\n";
+ }
+ return formattedMessage;
+}
+
+
+std::istream& operator>>( std::istream &sin, Value &root )
+{
+ Json::Reader reader;
+ bool ok = reader.parse(sin, root, true);
+ //JSON_ASSERT( ok );
+ if (!ok) throw std::runtime_error(reader.getFormattedErrorMessages());
+ return sin;
+}
+
+
+} // namespace Json
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: src/lib_json/json_reader.cpp
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: src/lib_json/json_batchallocator.h
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#ifndef JSONCPP_BATCHALLOCATOR_H_INCLUDED
+# define JSONCPP_BATCHALLOCATOR_H_INCLUDED
+
+# include <stdlib.h>
+# include <assert.h>
+
+# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
+
+namespace Json {
+
+/* Fast memory allocator.
+ *
+ * This memory allocator allocates memory for a batch of object (specified by
+ * the page size, the number of object in each page).
+ *
+ * It does not allow the destruction of a single object. All the allocated objects
+ * can be destroyed at once. The memory can be either released or reused for future
+ * allocation.
+ *
+ * The in-place new operator must be used to construct the object using the pointer
+ * returned by allocate.
+ */
+template<typename AllocatedType
+ ,const unsigned int objectPerAllocation>
+class BatchAllocator
+{
+public:
+ typedef AllocatedType Type;
+
+ BatchAllocator( unsigned int objectsPerPage = 255 )
+ : freeHead_( 0 )
+ , objectsPerPage_( objectsPerPage )
+ {
+// printf( "Size: %d => %s\n", sizeof(AllocatedType), typeid(AllocatedType).name() );
+ assert( sizeof(AllocatedType) * objectPerAllocation >= sizeof(AllocatedType *) ); // We must be able to store a slist in the object free space.
+ assert( objectsPerPage >= 16 );
+ batches_ = allocateBatch( 0 ); // allocated a dummy page
+ currentBatch_ = batches_;
+ }
+
+ ~BatchAllocator()
+ {
+ for ( BatchInfo *batch = batches_; batch; )
+ {
+ BatchInfo *nextBatch = batch->next_;
+ free( batch );
+ batch = nextBatch;
+ }
+ }
+
+ /// allocate space for an array of objectPerAllocation object.
+ /// @warning it is the responsability of the caller to call objects constructors.
+ AllocatedType *allocate()
+ {
+ if ( freeHead_ ) // returns node from free list.
+ {
+ AllocatedType *object = freeHead_;
+ freeHead_ = *(AllocatedType **)object;
+ return object;
+ }
+ if ( currentBatch_->used_ == currentBatch_->end_ )
+ {
+ currentBatch_ = currentBatch_->next_;
+ while ( currentBatch_ && currentBatch_->used_ == currentBatch_->end_ )
+ currentBatch_ = currentBatch_->next_;
+
+ if ( !currentBatch_ ) // no free batch found, allocate a new one
+ {
+ currentBatch_ = allocateBatch( objectsPerPage_ );
+ currentBatch_->next_ = batches_; // insert at the head of the list
+ batches_ = currentBatch_;
+ }
+ }
+ AllocatedType *allocated = currentBatch_->used_;
+ currentBatch_->used_ += objectPerAllocation;
+ return allocated;
+ }
+
+ /// Release the object.
+ /// @warning it is the responsability of the caller to actually destruct the object.
+ void release( AllocatedType *object )
+ {
+ assert( object != 0 );
+ *(AllocatedType **)object = freeHead_;
+ freeHead_ = object;
+ }
+
+private:
+ struct BatchInfo
+ {
+ BatchInfo *next_;
+ AllocatedType *used_;
+ AllocatedType *end_;
+ AllocatedType buffer_[objectPerAllocation];
+ };
+
+ // disabled copy constructor and assignement operator.
+ BatchAllocator( const BatchAllocator & );
+ void operator =( const BatchAllocator &);
+
+ static BatchInfo *allocateBatch( unsigned int objectsPerPage )
+ {
+ const unsigned int mallocSize = sizeof(BatchInfo) - sizeof(AllocatedType)* objectPerAllocation
+ + sizeof(AllocatedType) * objectPerAllocation * objectsPerPage;
+ BatchInfo *batch = static_cast<BatchInfo*>( malloc( mallocSize ) );
+ batch->next_ = 0;
+ batch->used_ = batch->buffer_;
+ batch->end_ = batch->buffer_ + objectsPerPage;
+ return batch;
+ }
+
+ BatchInfo *batches_;
+ BatchInfo *currentBatch_;
+ /// Head of a single linked list within the allocated space of freeed object
+ AllocatedType *freeHead_;
+ unsigned int objectsPerPage_;
+};
+
+
+} // namespace Json
+
+# endif // ifndef JSONCPP_DOC_INCLUDE_IMPLEMENTATION
+
+#endif // JSONCPP_BATCHALLOCATOR_H_INCLUDED
+
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: src/lib_json/json_batchallocator.h
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: src/lib_json/json_valueiterator.inl
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+// included by json_value.cpp
+
+namespace Json {
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// class ValueIteratorBase
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+
+ValueIteratorBase::ValueIteratorBase()
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ : current_()
+ , isNull_( true )
+{
+}
+#else
+ : isArray_( true )
+ , isNull_( true )
+{
+ iterator_.array_ = ValueInternalArray::IteratorState();
+}
+#endif
+
+
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator ¤t )
+ : current_( current )
+ , isNull_( false )
+{
+}
+#else
+ValueIteratorBase::ValueIteratorBase( const ValueInternalArray::IteratorState &state )
+ : isArray_( true )
+{
+ iterator_.array_ = state;
+}
+
+
+ValueIteratorBase::ValueIteratorBase( const ValueInternalMap::IteratorState &state )
+ : isArray_( false )
+{
+ iterator_.map_ = state;
+}
+#endif
+
+Value &
+ValueIteratorBase::deref() const
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ return current_->second;
+#else
+ if ( isArray_ )
+ return ValueInternalArray::dereference( iterator_.array_ );
+ return ValueInternalMap::value( iterator_.map_ );
+#endif
+}
+
+
+void
+ValueIteratorBase::increment()
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ ++current_;
+#else
+ if ( isArray_ )
+ ValueInternalArray::increment( iterator_.array_ );
+ ValueInternalMap::increment( iterator_.map_ );
+#endif
+}
+
+
+void
+ValueIteratorBase::decrement()
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ --current_;
+#else
+ if ( isArray_ )
+ ValueInternalArray::decrement( iterator_.array_ );
+ ValueInternalMap::decrement( iterator_.map_ );
+#endif
+}
+
+
+ValueIteratorBase::difference_type
+ValueIteratorBase::computeDistance( const SelfType &other ) const
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+# ifdef JSON_USE_CPPTL_SMALLMAP
+ return current_ - other.current_;
+# else
+ // Iterator for null value are initialized using the default
+ // constructor, which initialize current_ to the default
+ // std::map::iterator. As begin() and end() are two instance
+ // of the default std::map::iterator, they can not be compared.
+ // To allow this, we handle this comparison specifically.
+ if ( isNull_ && other.isNull_ )
+ {
+ return 0;
+ }
+
+
+ // Usage of std::distance is not portable (does not compile with Sun Studio 12 RogueWave STL,
+ // which is the one used by default).
+ // Using a portable hand-made version for non random iterator instead:
+ // return difference_type( std::distance( current_, other.current_ ) );
+ difference_type myDistance = 0;
+ for ( Value::ObjectValues::iterator it = current_; it != other.current_; ++it )
+ {
+ ++myDistance;
+ }
+ return myDistance;
+# endif
+#else
+ if ( isArray_ )
+ return ValueInternalArray::distance( iterator_.array_, other.iterator_.array_ );
+ return ValueInternalMap::distance( iterator_.map_, other.iterator_.map_ );
+#endif
+}
+
+
+bool
+ValueIteratorBase::isEqual( const SelfType &other ) const
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ if ( isNull_ )
+ {
+ return other.isNull_;
+ }
+ return current_ == other.current_;
+#else
+ if ( isArray_ )
+ return ValueInternalArray::equals( iterator_.array_, other.iterator_.array_ );
+ return ValueInternalMap::equals( iterator_.map_, other.iterator_.map_ );
+#endif
+}
+
+
+void
+ValueIteratorBase::copy( const SelfType &other )
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ current_ = other.current_;
+#else
+ if ( isArray_ )
+ iterator_.array_ = other.iterator_.array_;
+ iterator_.map_ = other.iterator_.map_;
+#endif
+}
+
+
+Value
+ValueIteratorBase::key() const
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ const Value::CZString czstring = (*current_).first;
+ if ( czstring.c_str() )
+ {
+ if ( czstring.isStaticString() )
+ return Value( StaticString( czstring.c_str() ) );
+ return Value( czstring.c_str() );
+ }
+ return Value( czstring.index() );
+#else
+ if ( isArray_ )
+ return Value( ValueInternalArray::indexOf( iterator_.array_ ) );
+ bool isStatic;
+ const char *memberName = ValueInternalMap::key( iterator_.map_, isStatic );
+ if ( isStatic )
+ return Value( StaticString( memberName ) );
+ return Value( memberName );
+#endif
+}
+
+
+UInt
+ValueIteratorBase::index() const
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ const Value::CZString czstring = (*current_).first;
+ if ( !czstring.c_str() )
+ return czstring.index();
+ return Value::UInt( -1 );
+#else
+ if ( isArray_ )
+ return Value::UInt( ValueInternalArray::indexOf( iterator_.array_ ) );
+ return Value::UInt( -1 );
+#endif
+}
+
+
+const char *
+ValueIteratorBase::memberName() const
+{
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ const char *name = (*current_).first.c_str();
+ return name ? name : "";
+#else
+ if ( !isArray_ )
+ return ValueInternalMap::key( iterator_.map_ );
+ return "";
+#endif
+}
+
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// class ValueConstIterator
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+
+ValueConstIterator::ValueConstIterator()
+{
+}
+
+
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator ¤t )
+ : ValueIteratorBase( current )
+{
+}
+#else
+ValueConstIterator::ValueConstIterator( const ValueInternalArray::IteratorState &state )
+ : ValueIteratorBase( state )
+{
+}
+
+ValueConstIterator::ValueConstIterator( const ValueInternalMap::IteratorState &state )
+ : ValueIteratorBase( state )
+{
+}
+#endif
+
+ValueConstIterator &
+ValueConstIterator::operator =( const ValueIteratorBase &other )
+{
+ copy( other );
+ return *this;
+}
+
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// class ValueIterator
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+
+ValueIterator::ValueIterator()
+{
+}
+
+
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ValueIterator::ValueIterator( const Value::ObjectValues::iterator ¤t )
+ : ValueIteratorBase( current )
+{
+}
+#else
+ValueIterator::ValueIterator( const ValueInternalArray::IteratorState &state )
+ : ValueIteratorBase( state )
+{
+}
+
+ValueIterator::ValueIterator( const ValueInternalMap::IteratorState &state )
+ : ValueIteratorBase( state )
+{
+}
+#endif
+
+ValueIterator::ValueIterator( const ValueConstIterator &other )
+ : ValueIteratorBase( other )
+{
+}
+
+ValueIterator::ValueIterator( const ValueIterator &other )
+ : ValueIteratorBase( other )
+{
+}
+
+ValueIterator &
+ValueIterator::operator =( const SelfType &other )
+{
+ copy( other );
+ return *this;
+}
+
+} // namespace Json
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: src/lib_json/json_valueiterator.inl
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: src/lib_json/json_value.cpp
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include <json/value.h>
+# include <json/writer.h>
+# ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
+# include "json_batchallocator.h"
+# endif // #ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
+#endif // if !defined(JSON_IS_AMALGAMATION)
+#include <iostream>
+#include <utility>
+#include <stdexcept>
+#include <cstring>
+#include <cassert>
+#ifdef JSON_USE_CPPTL
+# include <cpptl/conststring.h>
+#endif
+#include <cstddef> // size_t
+
+#define JSON_ASSERT_UNREACHABLE assert( false )
+#define JSON_ASSERT( condition ) assert( condition ); // @todo <= change this into an exception throw
+#define JSON_FAIL_MESSAGE( message ) throw std::runtime_error( message );
+#define JSON_ASSERT_MESSAGE( condition, message ) if (!( condition )) JSON_FAIL_MESSAGE( message )
+
+namespace Json {
+
+const Value Value::null;
+const Int Value::minInt = Int( ~(UInt(-1)/2) );
+const Int Value::maxInt = Int( UInt(-1)/2 );
+const UInt Value::maxUInt = UInt(-1);
+const Int64 Value::minInt64 = Int64( ~(UInt64(-1)/2) );
+const Int64 Value::maxInt64 = Int64( UInt64(-1)/2 );
+const UInt64 Value::maxUInt64 = UInt64(-1);
+const LargestInt Value::minLargestInt = LargestInt( ~(LargestUInt(-1)/2) );
+const LargestInt Value::maxLargestInt = LargestInt( LargestUInt(-1)/2 );
+const LargestUInt Value::maxLargestUInt = LargestUInt(-1);
+
+
+/// Unknown size marker
+static const unsigned int unknown = (unsigned)-1;
+
+
+/** Duplicates the specified string value.
+ * @param value Pointer to the string to duplicate. Must be zero-terminated if
+ * length is "unknown".
+ * @param length Length of the value. if equals to unknown, then it will be
+ * computed using strlen(value).
+ * @return Pointer on the duplicate instance of string.
+ */
+static inline char *
+duplicateStringValue( const char *value,
+ unsigned int length = unknown )
+{
+ if ( length == unknown )
+ length = (unsigned int)strlen(value);
+ char *newString = static_cast<char *>( malloc( length + 1 ) );
+ JSON_ASSERT_MESSAGE( newString != 0, "Failed to allocate string value buffer" );
+ memcpy( newString, value, length );
+ newString[length] = 0;
+ return newString;
+}
+
+
+/** Free the string duplicated by duplicateStringValue().
+ */
+static inline void
+releaseStringValue( char *value )
+{
+ if ( value )
+ free( value );
+}
+
+} // namespace Json
+
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// ValueInternals...
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+#if !defined(JSON_IS_AMALGAMATION)
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+# include "json_internalarray.inl"
+# include "json_internalmap.inl"
+# endif // JSON_VALUE_USE_INTERNAL_MAP
+
+# include "json_valueiterator.inl"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+
+namespace Json {
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// class Value::CommentInfo
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+
+
+Value::CommentInfo::CommentInfo()
+ : comment_( 0 )
+{
+}
+
+Value::CommentInfo::~CommentInfo()
+{
+ if ( comment_ )
+ releaseStringValue( comment_ );
+}
+
+
+void
+Value::CommentInfo::setComment( const char *text )
+{
+ if ( comment_ )
+ releaseStringValue( comment_ );
+ JSON_ASSERT( text != 0 );
+ JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /");
+ // It seems that /**/ style comments are acceptable as well.
+ comment_ = duplicateStringValue( text );
+}
+
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// class Value::CZString
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+# ifndef JSON_VALUE_USE_INTERNAL_MAP
+
+// Notes: index_ indicates if the string was allocated when
+// a string is stored.
+
+Value::CZString::CZString( ArrayIndex index )
+ : cstr_( 0 )
+ , index_( index )
+{
+}
+
+Value::CZString::CZString( const char *cstr, DuplicationPolicy allocate )
+ : cstr_( allocate == duplicate ? duplicateStringValue(cstr)
+ : cstr )
+ , index_( allocate )
+{
+}
+
+Value::CZString::CZString( const CZString &other )
+: cstr_( other.index_ != noDuplication && other.cstr_ != 0
+ ? duplicateStringValue( other.cstr_ )
+ : other.cstr_ )
+ , index_( other.cstr_ ? (other.index_ == noDuplication ? noDuplication : duplicate)
+ : other.index_ )
+{
+}
+
+Value::CZString::~CZString()
+{
+ if ( cstr_ && index_ == duplicate )
+ releaseStringValue( const_cast<char *>( cstr_ ) );
+}
+
+void
+Value::CZString::swap( CZString &other )
+{
+ std::swap( cstr_, other.cstr_ );
+ std::swap( index_, other.index_ );
+}
+
+Value::CZString &
+Value::CZString::operator =( const CZString &other )
+{
+ CZString temp( other );
+ swap( temp );
+ return *this;
+}
+
+bool
+Value::CZString::operator<( const CZString &other ) const
+{
+ if ( cstr_ )
+ return strcmp( cstr_, other.cstr_ ) < 0;
+ return index_ < other.index_;
+}
+
+bool
+Value::CZString::operator==( const CZString &other ) const
+{
+ if ( cstr_ )
+ return strcmp( cstr_, other.cstr_ ) == 0;
+ return index_ == other.index_;
+}
+
+
+ArrayIndex
+Value::CZString::index() const
+{
+ return index_;
+}
+
+
+const char *
+Value::CZString::c_str() const
+{
+ return cstr_;
+}
+
+bool
+Value::CZString::isStaticString() const
+{
+ return index_ == noDuplication;
+}
+
+#endif // ifndef JSON_VALUE_USE_INTERNAL_MAP
+
+
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// class Value::Value
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+// //////////////////////////////////////////////////////////////////
+
+/*! \internal Default constructor initialization must be equivalent to:
+ * memset( this, 0, sizeof(Value) )
+ * This optimization is used in ValueInternalMap fast allocator.
+ */
+Value::Value( ValueType type )
+ : type_( type )
+ , allocated_( 0 )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ switch ( type )
+ {
+ case nullValue:
+ break;
+ case intValue:
+ case uintValue:
+ value_.int_ = 0;
+ break;
+ case realValue:
+ value_.real_ = 0.0;
+ break;
+ case stringValue:
+ value_.string_ = 0;
+ break;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ case arrayValue:
+ case objectValue:
+ value_.map_ = new ObjectValues();
+ break;
+#else
+ case arrayValue:
+ value_.array_ = arrayAllocator()->newArray();
+ break;
+ case objectValue:
+ value_.map_ = mapAllocator()->newMap();
+ break;
+#endif
+ case booleanValue:
+ value_.bool_ = false;
+ break;
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+}
+
+
+#if defined(JSON_HAS_INT64)
+Value::Value( UInt value )
+ : type_( uintValue )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ value_.uint_ = value;
+}
+
+Value::Value( Int value )
+ : type_( intValue )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ value_.int_ = value;
+}
+
+#endif // if defined(JSON_HAS_INT64)
+
+
+Value::Value( Int64 value )
+ : type_( intValue )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ value_.int_ = value;
+}
+
+
+Value::Value( UInt64 value )
+ : type_( uintValue )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ value_.uint_ = value;
+}
+
+Value::Value( double value )
+ : type_( realValue )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ value_.real_ = value;
+}
+
+Value::Value( const char *value )
+ : type_( stringValue )
+ , allocated_( true )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ value_.string_ = duplicateStringValue( value );
+}
+
+
+Value::Value( const char *beginValue,
+ const char *endValue )
+ : type_( stringValue )
+ , allocated_( true )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ value_.string_ = duplicateStringValue( beginValue,
+ (unsigned int)(endValue - beginValue) );
+}
+
+
+Value::Value( const std::string &value )
+ : type_( stringValue )
+ , allocated_( true )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ value_.string_ = duplicateStringValue( value.c_str(),
+ (unsigned int)value.length() );
+
+}
+
+Value::Value( const StaticString &value )
+ : type_( stringValue )
+ , allocated_( false )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ value_.string_ = const_cast<char *>( value.c_str() );
+}
+
+
+# ifdef JSON_USE_CPPTL
+Value::Value( const CppTL::ConstString &value )
+ : type_( stringValue )
+ , allocated_( true )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ value_.string_ = duplicateStringValue( value, value.length() );
+}
+# endif
+
+Value::Value( bool value )
+ : type_( booleanValue )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ value_.bool_ = value;
+}
+
+
+Value::Value( const Value &other )
+ : type_( other.type_ )
+ , comments_( 0 )
+# ifdef JSON_VALUE_USE_INTERNAL_MAP
+ , itemIsUsed_( 0 )
+#endif
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ case intValue:
+ case uintValue:
+ case realValue:
+ case booleanValue:
+ value_ = other.value_;
+ break;
+ case stringValue:
+ if ( other.value_.string_ )
+ {
+ value_.string_ = duplicateStringValue( other.value_.string_ );
+ allocated_ = true;
+ }
+ else
+ value_.string_ = 0;
+ break;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ case arrayValue:
+ case objectValue:
+ value_.map_ = new ObjectValues( *other.value_.map_ );
+ break;
+#else
+ case arrayValue:
+ value_.array_ = arrayAllocator()->newArrayCopy( *other.value_.array_ );
+ break;
+ case objectValue:
+ value_.map_ = mapAllocator()->newMapCopy( *other.value_.map_ );
+ break;
+#endif
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ if ( other.comments_ )
+ {
+ comments_ = new CommentInfo[numberOfCommentPlacement];
+ for ( int comment =0; comment < numberOfCommentPlacement; ++comment )
+ {
+ const CommentInfo &otherComment = other.comments_[comment];
+ if ( otherComment.comment_ )
+ comments_[comment].setComment( otherComment.comment_ );
+ }
+ }
+}
+
+
+Value::~Value()
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ case intValue:
+ case uintValue:
+ case realValue:
+ case booleanValue:
+ break;
+ case stringValue:
+ if ( allocated_ )
+ releaseStringValue( value_.string_ );
+ break;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ case arrayValue:
+ case objectValue:
+ delete value_.map_;
+ break;
+#else
+ case arrayValue:
+ arrayAllocator()->destructArray( value_.array_ );
+ break;
+ case objectValue:
+ mapAllocator()->destructMap( value_.map_ );
+ break;
+#endif
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+
+ if ( comments_ )
+ delete[] comments_;
+}
+
+Value &
+Value::operator=( const Value &other )
+{
+ Value temp( other );
+ swap( temp );
+ return *this;
+}
+
+void
+Value::swap( Value &other )
+{
+ ValueType temp = type_;
+ type_ = other.type_;
+ other.type_ = temp;
+ std::swap( value_, other.value_ );
+ int temp2 = allocated_;
+ allocated_ = other.allocated_;
+ other.allocated_ = temp2;
+}
+
+ValueType
+Value::type() const
+{
+ return type_;
+}
+
+
+int
+Value::compare( const Value &other ) const
+{
+ if ( *this < other )
+ return -1;
+ if ( *this > other )
+ return 1;
+ return 0;
+}
+
+
+bool
+Value::operator <( const Value &other ) const
+{
+ int typeDelta = type_ - other.type_;
+ if ( typeDelta )
+ return typeDelta < 0 ? true : false;
+ switch ( type_ )
+ {
+ case nullValue:
+ return false;
+ case intValue:
+ return value_.int_ < other.value_.int_;
+ case uintValue:
+ return value_.uint_ < other.value_.uint_;
+ case realValue:
+ return value_.real_ < other.value_.real_;
+ case booleanValue:
+ return value_.bool_ < other.value_.bool_;
+ case stringValue:
+ return ( value_.string_ == 0 && other.value_.string_ )
+ || ( other.value_.string_
+ && value_.string_
+ && strcmp( value_.string_, other.value_.string_ ) < 0 );
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ case arrayValue:
+ case objectValue:
+ {
+ int delta = int( value_.map_->size() - other.value_.map_->size() );
+ if ( delta )
+ return delta < 0;
+ return (*value_.map_) < (*other.value_.map_);
+ }
+#else
+ case arrayValue:
+ return value_.array_->compare( *(other.value_.array_) ) < 0;
+ case objectValue:
+ return value_.map_->compare( *(other.value_.map_) ) < 0;
+#endif
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return false; // unreachable
+}
+
+bool
+Value::operator <=( const Value &other ) const
+{
+ return !(other < *this);
+}
+
+bool
+Value::operator >=( const Value &other ) const
+{
+ return !(*this < other);
+}
+
+bool
+Value::operator >( const Value &other ) const
+{
+ return other < *this;
+}
+
+bool
+Value::operator ==( const Value &other ) const
+{
+ //if ( type_ != other.type_ )
+ // GCC 2.95.3 says:
+ // attempt to take address of bit-field structure member `Json::Value::type_'
+ // Beats me, but a temp solves the problem.
+ int temp = other.type_;
+ if ( type_ != temp )
+ return false;
+ switch ( type_ )
+ {
+ case nullValue:
+ return true;
+ case intValue:
+ return value_.int_ == other.value_.int_;
+ case uintValue:
+ return value_.uint_ == other.value_.uint_;
+ case realValue:
+ return value_.real_ == other.value_.real_;
+ case booleanValue:
+ return value_.bool_ == other.value_.bool_;
+ case stringValue:
+ return ( value_.string_ == other.value_.string_ )
+ || ( other.value_.string_
+ && value_.string_
+ && strcmp( value_.string_, other.value_.string_ ) == 0 );
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ case arrayValue:
+ case objectValue:
+ return value_.map_->size() == other.value_.map_->size()
+ && (*value_.map_) == (*other.value_.map_);
+#else
+ case arrayValue:
+ return value_.array_->compare( *(other.value_.array_) ) == 0;
+ case objectValue:
+ return value_.map_->compare( *(other.value_.map_) ) == 0;
+#endif
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return false; // unreachable
+}
+
+bool
+Value::operator !=( const Value &other ) const
+{
+ return !( *this == other );
+}
+
+const char *
+Value::asCString() const
+{
+ JSON_ASSERT( type_ == stringValue );
+ return value_.string_;
+}
+
+
+std::string
+Value::asString() const
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ return "";
+ case stringValue:
+ return value_.string_ ? value_.string_ : "";
+ case booleanValue:
+ return value_.bool_ ? "true" : "false";
+ case intValue:
+ case uintValue:
+ case realValue:
+ case arrayValue:
+ case objectValue:
+ JSON_FAIL_MESSAGE( "Type is not convertible to string" );
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return ""; // unreachable
+}
+
+# ifdef JSON_USE_CPPTL
+CppTL::ConstString
+Value::asConstString() const
+{
+ return CppTL::ConstString( asString().c_str() );
+}
+# endif
+
+
+Value::Int
+Value::asInt() const
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ return 0;
+ case intValue:
+ JSON_ASSERT_MESSAGE( value_.int_ >= minInt && value_.int_ <= maxInt, "unsigned integer out of signed int range" );
+ return Int(value_.int_);
+ case uintValue:
+ JSON_ASSERT_MESSAGE( value_.uint_ <= UInt(maxInt), "unsigned integer out of signed int range" );
+ return Int(value_.uint_);
+ case realValue:
+ JSON_ASSERT_MESSAGE( value_.real_ >= minInt && value_.real_ <= maxInt, "Real out of signed integer range" );
+ return Int( value_.real_ );
+ case booleanValue:
+ return value_.bool_ ? 1 : 0;
+ case stringValue:
+ case arrayValue:
+ case objectValue:
+ JSON_FAIL_MESSAGE( "Type is not convertible to int" );
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return 0; // unreachable;
+}
+
+
+Value::UInt
+Value::asUInt() const
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ return 0;
+ case intValue:
+ JSON_ASSERT_MESSAGE( value_.int_ >= 0, "Negative integer can not be converted to unsigned integer" );
+ JSON_ASSERT_MESSAGE( value_.int_ <= maxUInt, "signed integer out of UInt range" );
+ return UInt(value_.int_);
+ case uintValue:
+ JSON_ASSERT_MESSAGE( value_.uint_ <= maxUInt, "unsigned integer out of UInt range" );
+ return UInt(value_.uint_);
+ case realValue:
+ JSON_ASSERT_MESSAGE( value_.real_ >= 0 && value_.real_ <= maxUInt, "Real out of unsigned integer range" );
+ return UInt( value_.real_ );
+ case booleanValue:
+ return value_.bool_ ? 1 : 0;
+ case stringValue:
+ case arrayValue:
+ case objectValue:
+ JSON_FAIL_MESSAGE( "Type is not convertible to uint" );
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return 0; // unreachable;
+}
+
+
+# if defined(JSON_HAS_INT64)
+
+Value::Int64
+Value::asInt64() const
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ return 0;
+ case intValue:
+ return value_.int_;
+ case uintValue:
+ JSON_ASSERT_MESSAGE( value_.uint_ <= UInt64(maxInt64), "unsigned integer out of Int64 range" );
+ return value_.uint_;
+ case realValue:
+ JSON_ASSERT_MESSAGE( value_.real_ >= minInt64 && value_.real_ <= maxInt64, "Real out of Int64 range" );
+ return Int( value_.real_ );
+ case booleanValue:
+ return value_.bool_ ? 1 : 0;
+ case stringValue:
+ case arrayValue:
+ case objectValue:
+ JSON_FAIL_MESSAGE( "Type is not convertible to Int64" );
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return 0; // unreachable;
+}
+
+
+Value::UInt64
+Value::asUInt64() const
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ return 0;
+ case intValue:
+ JSON_ASSERT_MESSAGE( value_.int_ >= 0, "Negative integer can not be converted to UInt64" );
+ return value_.int_;
+ case uintValue:
+ return value_.uint_;
+ case realValue:
+ JSON_ASSERT_MESSAGE( value_.real_ >= 0 && value_.real_ <= maxUInt64, "Real out of UInt64 range" );
+ return UInt( value_.real_ );
+ case booleanValue:
+ return value_.bool_ ? 1 : 0;
+ case stringValue:
+ case arrayValue:
+ case objectValue:
+ JSON_FAIL_MESSAGE( "Type is not convertible to UInt64" );
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return 0; // unreachable;
+}
+# endif // if defined(JSON_HAS_INT64)
+
+
+LargestInt
+Value::asLargestInt() const
+{
+#if defined(JSON_NO_INT64)
+ return asInt();
+#else
+ return asInt64();
+#endif
+}
+
+
+LargestUInt
+Value::asLargestUInt() const
+{
+#if defined(JSON_NO_INT64)
+ return asUInt();
+#else
+ return asUInt64();
+#endif
+}
+
+
+double
+Value::asDouble() const
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ return 0.0;
+ case intValue:
+ return static_cast<double>( value_.int_ );
+ case uintValue:
+#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+ return static_cast<double>( value_.uint_ );
+#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+ return static_cast<double>( Int(value_.uint_/2) ) * 2 + Int(value_.uint_ & 1);
+#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+ case realValue:
+ return value_.real_;
+ case booleanValue:
+ return value_.bool_ ? 1.0 : 0.0;
+ case stringValue:
+ case arrayValue:
+ case objectValue:
+ JSON_FAIL_MESSAGE( "Type is not convertible to double" );
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return 0; // unreachable;
+}
+
+float
+Value::asFloat() const
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ return 0.0f;
+ case intValue:
+ return static_cast<float>( value_.int_ );
+ case uintValue:
+#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+ return static_cast<float>( value_.uint_ );
+#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+ return static_cast<float>( Int(value_.uint_/2) ) * 2 + Int(value_.uint_ & 1);
+#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
+ case realValue:
+ return static_cast<float>( value_.real_ );
+ case booleanValue:
+ return value_.bool_ ? 1.0f : 0.0f;
+ case stringValue:
+ case arrayValue:
+ case objectValue:
+ JSON_FAIL_MESSAGE( "Type is not convertible to float" );
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return 0.0f; // unreachable;
+}
+
+bool
+Value::asBool() const
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ return false;
+ case intValue:
+ case uintValue:
+ return value_.int_ != 0;
+ case realValue:
+ return value_.real_ != 0.0;
+ case booleanValue:
+ return value_.bool_;
+ case stringValue:
+ return value_.string_ && value_.string_[0] != 0;
+ case arrayValue:
+ case objectValue:
+ return value_.map_->size() != 0;
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return false; // unreachable;
+}
+
+
+bool
+Value::isConvertibleTo( ValueType other ) const
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ return true;
+ case intValue:
+ return ( other == nullValue && value_.int_ == 0 )
+ || other == intValue
+ || ( other == uintValue && value_.int_ >= 0 )
+ || other == realValue
+ || other == stringValue
+ || other == booleanValue;
+ case uintValue:
+ return ( other == nullValue && value_.uint_ == 0 )
+ || ( other == intValue && value_.uint_ <= (unsigned)maxInt )
+ || other == uintValue
+ || other == realValue
+ || other == stringValue
+ || other == booleanValue;
+ case realValue:
+ return ( other == nullValue && value_.real_ == 0.0 )
+ || ( other == intValue && value_.real_ >= minInt && value_.real_ <= maxInt )
+ || ( other == uintValue && value_.real_ >= 0 && value_.real_ <= maxUInt )
+ || other == realValue
+ || other == stringValue
+ || other == booleanValue;
+ case booleanValue:
+ return ( other == nullValue && value_.bool_ == false )
+ || other == intValue
+ || other == uintValue
+ || other == realValue
+ || other == stringValue
+ || other == booleanValue;
+ case stringValue:
+ return other == stringValue
+ || ( other == nullValue && (!value_.string_ || value_.string_[0] == 0) );
+ case arrayValue:
+ return other == arrayValue
+ || ( other == nullValue && value_.map_->size() == 0 );
+ case objectValue:
+ return other == objectValue
+ || ( other == nullValue && value_.map_->size() == 0 );
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return false; // unreachable;
+}
+
+
+/// Number of values in array or object
+ArrayIndex
+Value::size() const
+{
+ switch ( type_ )
+ {
+ case nullValue:
+ case intValue:
+ case uintValue:
+ case realValue:
+ case booleanValue:
+ case stringValue:
+ return 0;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ case arrayValue: // size of the array is highest index + 1
+ if ( !value_.map_->empty() )
+ {
+ ObjectValues::const_iterator itLast = value_.map_->end();
+ --itLast;
+ return (*itLast).first.index()+1;
+ }
+ return 0;
+ case objectValue:
+ return ArrayIndex( value_.map_->size() );
+#else
+ case arrayValue:
+ return Int( value_.array_->size() );
+ case objectValue:
+ return Int( value_.map_->size() );
+#endif
+ default:
+ JSON_ASSERT_UNREACHABLE;
+ }
+ return 0; // unreachable;
+}
+
+
+bool
+Value::empty() const
+{
+ if ( isNull() || isArray() || isObject() )
+ return size() == 0u;
+ else
+ return false;
+}
+
+
+bool
+Value::operator!() const
+{
+ return isNull();
+}
+
+
+void
+Value::clear()
+{
+ JSON_ASSERT( type_ == nullValue || type_ == arrayValue || type_ == objectValue );
+
+ switch ( type_ )
+ {
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ case arrayValue:
+ case objectValue:
+ value_.map_->clear();
+ break;
+#else
+ case arrayValue:
+ value_.array_->clear();
+ break;
+ case objectValue:
+ value_.map_->clear();
+ break;
+#endif
+ default:
+ break;
+ }
+}
+
+void
+Value::resize( ArrayIndex newSize )
+{
+ JSON_ASSERT( type_ == nullValue || type_ == arrayValue );
+ if ( type_ == nullValue )
+ *this = Value( arrayValue );
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ ArrayIndex oldSize = size();
+ if ( newSize == 0 )
+ clear();
+ else if ( newSize > oldSize )
+ (*this)[ newSize - 1 ];
+ else
+ {
+ for ( ArrayIndex index = newSize; index < oldSize; ++index )
+ {
+ value_.map_->erase( index );
+ }
+ assert( size() == newSize );
+ }
+#else
+ value_.array_->resize( newSize );
+#endif
+}
+
+
+Value &
+Value::operator[]( ArrayIndex index )
+{
+ JSON_ASSERT( type_ == nullValue || type_ == arrayValue );
+ if ( type_ == nullValue )
+ *this = Value( arrayValue );
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ CZString key( index );
+ ObjectValues::iterator it = value_.map_->lower_bound( key );
+ if ( it != value_.map_->end() && (*it).first == key )
+ return (*it).second;
+
+ ObjectValues::value_type defaultValue( key, null );
+ it = value_.map_->insert( it, defaultValue );
+ return (*it).second;
+#else
+ return value_.array_->resolveReference( index );
+#endif
+}
+
+
+Value &
+Value::operator[]( int index )
+{
+ JSON_ASSERT( index >= 0 );
+ return (*this)[ ArrayIndex(index) ];
+}
+
+
+const Value &
+Value::operator[]( ArrayIndex index ) const
+{
+ JSON_ASSERT( type_ == nullValue || type_ == arrayValue );
+ if ( type_ == nullValue )
+ return null;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ CZString key( index );
+ ObjectValues::const_iterator it = value_.map_->find( key );
+ if ( it == value_.map_->end() )
+ return null;
+ return (*it).second;
+#else
+ Value *value = value_.array_->find( index );
+ return value ? *value : null;
+#endif
+}
+
+
+const Value &
+Value::operator[]( int index ) const
+{
+ JSON_ASSERT( index >= 0 );
+ return (*this)[ ArrayIndex(index) ];
+}
+
+
+Value &
+Value::operator[]( const char *key )
+{
+ return resolveReference( key, false );
+}
+
+
+Value &
+Value::resolveReference( const char *key,
+ bool isStatic )
+{
+ JSON_ASSERT( type_ == nullValue || type_ == objectValue );
+ if ( type_ == nullValue )
+ *this = Value( objectValue );
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ CZString actualKey( key, isStatic ? CZString::noDuplication
+ : CZString::duplicateOnCopy );
+ ObjectValues::iterator it = value_.map_->lower_bound( actualKey );
+ if ( it != value_.map_->end() && (*it).first == actualKey )
+ return (*it).second;
+
+ ObjectValues::value_type defaultValue( actualKey, null );
+ it = value_.map_->insert( it, defaultValue );
+ Value &value = (*it).second;
+ return value;
+#else
+ return value_.map_->resolveReference( key, isStatic );
+#endif
+}
+
+
+Value
+Value::get( ArrayIndex index,
+ const Value &defaultValue ) const
+{
+ const Value *value = &((*this)[index]);
+ return value == &null ? defaultValue : *value;
+}
+
+
+bool
+Value::isValidIndex( ArrayIndex index ) const
+{
+ return index < size();
+}
+
+
+
+const Value &
+Value::operator[]( const char *key ) const
+{
+ JSON_ASSERT( type_ == nullValue || type_ == objectValue );
+ if ( type_ == nullValue )
+ return null;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ CZString actualKey( key, CZString::noDuplication );
+ ObjectValues::const_iterator it = value_.map_->find( actualKey );
+ if ( it == value_.map_->end() )
+ return null;
+ return (*it).second;
+#else
+ const Value *value = value_.map_->find( key );
+ return value ? *value : null;
+#endif
+}
+
+
+Value &
+Value::operator[]( const std::string &key )
+{
+ return (*this)[ key.c_str() ];
+}
+
+
+const Value &
+Value::operator[]( const std::string &key ) const
+{
+ return (*this)[ key.c_str() ];
+}
+
+Value &
+Value::operator[]( const StaticString &key )
+{
+ return resolveReference( key, true );
+}
+
+
+# ifdef JSON_USE_CPPTL
+Value &
+Value::operator[]( const CppTL::ConstString &key )
+{
+ return (*this)[ key.c_str() ];
+}
+
+
+const Value &
+Value::operator[]( const CppTL::ConstString &key ) const
+{
+ return (*this)[ key.c_str() ];
+}
+# endif
+
+
+Value &
+Value::append( const Value &value )
+{
+ return (*this)[size()] = value;
+}
+
+
+Value
+Value::get( const char *key,
+ const Value &defaultValue ) const
+{
+ const Value *value = &((*this)[key]);
+ return value == &null ? defaultValue : *value;
+}
+
+
+Value
+Value::get( const std::string &key,
+ const Value &defaultValue ) const
+{
+ return get( key.c_str(), defaultValue );
+}
+
+Value
+Value::removeMember( const char* key )
+{
+ JSON_ASSERT( type_ == nullValue || type_ == objectValue );
+ if ( type_ == nullValue )
+ return null;
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ CZString actualKey( key, CZString::noDuplication );
+ ObjectValues::iterator it = value_.map_->find( actualKey );
+ if ( it == value_.map_->end() )
+ return null;
+ Value old(it->second);
+ value_.map_->erase(it);
+ return old;
+#else
+ Value *value = value_.map_->find( key );
+ if (value){
+ Value old(*value);
+ value_.map_.remove( key );
+ return old;
+ } else {
+ return null;
+ }
+#endif
+}
+
+Value
+Value::removeMember( const std::string &key )
+{
+ return removeMember( key.c_str() );
+}
+
+# ifdef JSON_USE_CPPTL
+Value
+Value::get( const CppTL::ConstString &key,
+ const Value &defaultValue ) const
+{
+ return get( key.c_str(), defaultValue );
+}
+# endif
+
+bool
+Value::isMember( const char *key ) const
+{
+ const Value *value = &((*this)[key]);
+ return value != &null;
+}
+
+
+bool
+Value::isMember( const std::string &key ) const
+{
+ return isMember( key.c_str() );
+}
+
+
+# ifdef JSON_USE_CPPTL
+bool
+Value::isMember( const CppTL::ConstString &key ) const
+{
+ return isMember( key.c_str() );
+}
+#endif
+
+Value::Members
+Value::getMemberNames() const
+{
+ JSON_ASSERT( type_ == nullValue || type_ == objectValue );
+ if ( type_ == nullValue )
+ return Value::Members();
+ Members members;
+ members.reserve( value_.map_->size() );
+#ifndef JSON_VALUE_USE_INTERNAL_MAP
+ ObjectValues::const_iterator it = value_.map_->begin();
+ ObjectValues::const_iterator itEnd = value_.map_->end();
+ for ( ; it != itEnd; ++it )
+ members.push_back( std::string( (*it).first.c_str() ) );
+#else
+ ValueInternalMap::IteratorState it;
+ ValueInternalMap::IteratorState itEnd;
+ value_.map_->makeBeginIterator( it );
+ value_.map_->makeEndIterator( itEnd );
+ for ( ; !ValueInternalMap::equals( it, itEnd ); ValueInternalMap::increment(it) )
+ members.push_back( std::string( ValueInternalMap::key( it ) ) );
+#endif
+ return members;
+}
+//
+//# ifdef JSON_USE_CPPTL
+//EnumMemberNames
+//Value::enumMemberNames() const
+//{
+// if ( type_ == objectValue )
+// {
+// return CppTL::Enum::any( CppTL::Enum::transform(
+// CppTL::Enum::keys( *(value_.map_), CppTL::Type<const CZString &>() ),
+// MemberNamesTransform() ) );
+// }
+// return EnumMemberNames();
+//}
+//
+//
+//EnumValues
+//Value::enumValues() const
+//{
+// if ( type_ == objectValue || type_ == arrayValue )
+// return CppTL::Enum::anyValues( *(value_.map_),
+// CppTL::Type<const Value &>() );
+// return EnumValues();
+//}
+//
+//# endif
+
+
+bool
+Value::isNull() const
+{
+ return type_ == nullValue;
+}
+
+
+bool
+Value::isBool() const
+{
+ return type_ == booleanValue;
+}
+
+
+bool
+Value::isInt() const
+{
+ return type_ == intValue;
+}
+
+
+bool
+Value::isUInt() const
+{
+ return type_ == uintValue;
+}
+
+
+bool
+Value::isIntegral() const
+{
+ return type_ == intValue
+ || type_ == uintValue
+ || type_ == booleanValue;
+}
+
+
+bool
+Value::isDouble() const
+{
+ return type_ == realValue;
+}
+
+
+bool
+Value::isNumeric() const
+{
+ return isIntegral() || isDouble();
+}
+
+
+bool
+Value::isString() const
+{
+ return type_ == stringValue;
+}
+
+
+bool
+Value::isArray() const
+{
+ return type_ == nullValue || type_ == arrayValue;
+}
+
+
+bool
+Value::isObject() const
+{
+ return type_ == nullValue || type_ == objectValue;
+}
+
+
+void
+Value::setComment( const char *comment,
+ CommentPlacement placement )
+{
+ if ( !comments_ )
+ comments_ = new CommentInfo[numberOfCommentPlacement];
+ comments_[placement].setComment( comment );
+}
+
+
+void
+Value::setComment( const std::string &comment,
+ CommentPlacement placement )
+{
+ setComment( comment.c_str(), placement );
+}
+
+
+bool
+Value::hasComment( CommentPlacement placement ) const
+{
+ return comments_ != 0 && comments_[placement].comment_ != 0;
+}
+
+std::string
+Value::getComment( CommentPlacement placement ) const
+{
+ if ( hasComment(placement) )
+ return comments_[placement].comment_;
+ return "";
+}
+
+
+std::string
+Value::toStyledString() const
+{
+ StyledWriter writer;
+ return writer.write( *this );
+}
+
+
+Value::const_iterator
+Value::begin() const
+{
+ switch ( type_ )
+ {
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+ case arrayValue:
+ if ( value_.array_ )
+ {
+ ValueInternalArray::IteratorState it;
+ value_.array_->makeBeginIterator( it );
+ return const_iterator( it );
+ }
+ break;
+ case objectValue:
+ if ( value_.map_ )
+ {
+ ValueInternalMap::IteratorState it;
+ value_.map_->makeBeginIterator( it );
+ return const_iterator( it );
+ }
+ break;
+#else
+ case arrayValue:
+ case objectValue:
+ if ( value_.map_ )
+ return const_iterator( value_.map_->begin() );
+ break;
+#endif
+ default:
+ break;
+ }
+ return const_iterator();
+}
+
+Value::const_iterator
+Value::end() const
+{
+ switch ( type_ )
+ {
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+ case arrayValue:
+ if ( value_.array_ )
+ {
+ ValueInternalArray::IteratorState it;
+ value_.array_->makeEndIterator( it );
+ return const_iterator( it );
+ }
+ break;
+ case objectValue:
+ if ( value_.map_ )
+ {
+ ValueInternalMap::IteratorState it;
+ value_.map_->makeEndIterator( it );
+ return const_iterator( it );
+ }
+ break;
+#else
+ case arrayValue:
+ case objectValue:
+ if ( value_.map_ )
+ return const_iterator( value_.map_->end() );
+ break;
+#endif
+ default:
+ break;
+ }
+ return const_iterator();
+}
+
+
+Value::iterator
+Value::begin()
+{
+ switch ( type_ )
+ {
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+ case arrayValue:
+ if ( value_.array_ )
+ {
+ ValueInternalArray::IteratorState it;
+ value_.array_->makeBeginIterator( it );
+ return iterator( it );
+ }
+ break;
+ case objectValue:
+ if ( value_.map_ )
+ {
+ ValueInternalMap::IteratorState it;
+ value_.map_->makeBeginIterator( it );
+ return iterator( it );
+ }
+ break;
+#else
+ case arrayValue:
+ case objectValue:
+ if ( value_.map_ )
+ return iterator( value_.map_->begin() );
+ break;
+#endif
+ default:
+ break;
+ }
+ return iterator();
+}
+
+Value::iterator
+Value::end()
+{
+ switch ( type_ )
+ {
+#ifdef JSON_VALUE_USE_INTERNAL_MAP
+ case arrayValue:
+ if ( value_.array_ )
+ {
+ ValueInternalArray::IteratorState it;
+ value_.array_->makeEndIterator( it );
+ return iterator( it );
+ }
+ break;
+ case objectValue:
+ if ( value_.map_ )
+ {
+ ValueInternalMap::IteratorState it;
+ value_.map_->makeEndIterator( it );
+ return iterator( it );
+ }
+ break;
+#else
+ case arrayValue:
+ case objectValue:
+ if ( value_.map_ )
+ return iterator( value_.map_->end() );
+ break;
+#endif
+ default:
+ break;
+ }
+ return iterator();
+}
+
+
+// class PathArgument
+// //////////////////////////////////////////////////////////////////
+
+PathArgument::PathArgument()
+ : kind_( kindNone )
+{
+}
+
+
+PathArgument::PathArgument( ArrayIndex index )
+ : index_( index )
+ , kind_( kindIndex )
+{
+}
+
+
+PathArgument::PathArgument( const char *key )
+ : key_( key )
+ , kind_( kindKey )
+{
+}
+
+
+PathArgument::PathArgument( const std::string &key )
+ : key_( key.c_str() )
+ , kind_( kindKey )
+{
+}
+
+// class Path
+// //////////////////////////////////////////////////////////////////
+
+Path::Path( const std::string &path,
+ const PathArgument &a1,
+ const PathArgument &a2,
+ const PathArgument &a3,
+ const PathArgument &a4,
+ const PathArgument &a5 )
+{
+ InArgs in;
+ in.push_back( &a1 );
+ in.push_back( &a2 );
+ in.push_back( &a3 );
+ in.push_back( &a4 );
+ in.push_back( &a5 );
+ makePath( path, in );
+}
+
+
+void
+Path::makePath( const std::string &path,
+ const InArgs &in )
+{
+ const char *current = path.c_str();
+ const char *end = current + path.length();
+ InArgs::const_iterator itInArg = in.begin();
+ while ( current != end )
+ {
+ if ( *current == '[' )
+ {
+ ++current;
+ if ( *current == '%' )
+ addPathInArg( path, in, itInArg, PathArgument::kindIndex );
+ else
+ {
+ ArrayIndex index = 0;
+ for ( ; current != end && *current >= '0' && *current <= '9'; ++current )
+ index = index * 10 + ArrayIndex(*current - '0');
+ args_.push_back( index );
+ }
+ if ( current == end || *current++ != ']' )
+ invalidPath( path, int(current - path.c_str()) );
+ }
+ else if ( *current == '%' )
+ {
+ addPathInArg( path, in, itInArg, PathArgument::kindKey );
+ ++current;
+ }
+ else if ( *current == '.' )
+ {
+ ++current;
+ }
+ else
+ {
+ const char *beginName = current;
+ while ( current != end && !strchr( "[.", *current ) )
+ ++current;
+ args_.push_back( std::string( beginName, current ) );
+ }
+ }
+}
+
+
+void
+Path::addPathInArg( const std::string &path,
+ const InArgs &in,
+ InArgs::const_iterator &itInArg,
+ PathArgument::Kind kind )
+{
+ if ( itInArg == in.end() )
+ {
+ // Error: missing argument %d
+ }
+ else if ( (*itInArg)->kind_ != kind )
+ {
+ // Error: bad argument type
+ }
+ else
+ {
+ args_.push_back( **itInArg );
+ }
+}
+
+
+void
+Path::invalidPath( const std::string &path,
+ int location )
+{
+ // Error: invalid path.
+}
+
+
+const Value &
+Path::resolve( const Value &root ) const
+{
+ const Value *node = &root;
+ for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
+ {
+ const PathArgument &arg = *it;
+ if ( arg.kind_ == PathArgument::kindIndex )
+ {
+ if ( !node->isArray() || node->isValidIndex( arg.index_ ) )
+ {
+ // Error: unable to resolve path (array value expected at position...
+ }
+ node = &((*node)[arg.index_]);
+ }
+ else if ( arg.kind_ == PathArgument::kindKey )
+ {
+ if ( !node->isObject() )
+ {
+ // Error: unable to resolve path (object value expected at position...)
+ }
+ node = &((*node)[arg.key_]);
+ if ( node == &Value::null )
+ {
+ // Error: unable to resolve path (object has no member named '' at position...)
+ }
+ }
+ }
+ return *node;
+}
+
+
+Value
+Path::resolve( const Value &root,
+ const Value &defaultValue ) const
+{
+ const Value *node = &root;
+ for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
+ {
+ const PathArgument &arg = *it;
+ if ( arg.kind_ == PathArgument::kindIndex )
+ {
+ if ( !node->isArray() || node->isValidIndex( arg.index_ ) )
+ return defaultValue;
+ node = &((*node)[arg.index_]);
+ }
+ else if ( arg.kind_ == PathArgument::kindKey )
+ {
+ if ( !node->isObject() )
+ return defaultValue;
+ node = &((*node)[arg.key_]);
+ if ( node == &Value::null )
+ return defaultValue;
+ }
+ }
+ return *node;
+}
+
+
+Value &
+Path::make( Value &root ) const
+{
+ Value *node = &root;
+ for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
+ {
+ const PathArgument &arg = *it;
+ if ( arg.kind_ == PathArgument::kindIndex )
+ {
+ if ( !node->isArray() )
+ {
+ // Error: node is not an array at position ...
+ }
+ node = &((*node)[arg.index_]);
+ }
+ else if ( arg.kind_ == PathArgument::kindKey )
+ {
+ if ( !node->isObject() )
+ {
+ // Error: node is not an object at position...
+ }
+ node = &((*node)[arg.key_]);
+ }
+ }
+ return *node;
+}
+
+
+} // namespace Json
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: src/lib_json/json_value.cpp
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
+
+// //////////////////////////////////////////////////////////////////////
+// Beginning of content of file: src/lib_json/json_writer.cpp
+// //////////////////////////////////////////////////////////////////////
+
+// Copyright 2007-2010 Baptiste Lepilleur
+// Distributed under MIT license, or public domain if desired and
+// recognized in your jurisdiction.
+// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
+
+#if !defined(JSON_IS_AMALGAMATION)
+# include <json/writer.h>
+# include "json_tool.h"
+#endif // if !defined(JSON_IS_AMALGAMATION)
+#include <utility>
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <iostream>
+#include <sstream>
+#include <iomanip>
+
+#if _MSC_VER >= 1400 // VC++ 8.0
+#pragma warning( disable : 4996 ) // disable warning about strdup being deprecated.
+#endif
+
+namespace Json {
+
+static bool containsControlCharacter( const char* str )
+{
+ while ( *str )
+ {
+ if ( isControlCharacter( *(str++) ) )
+ return true;
+ }
+ return false;
+}
+
+
+std::string valueToString( LargestInt value )
+{
+ UIntToStringBuffer buffer;
+ char *current = buffer + sizeof(buffer);
+ bool isNegative = value < 0;
+ if ( isNegative )
+ value = -value;
+ uintToString( LargestUInt(value), current );
+ if ( isNegative )
+ *--current = '-';
+ assert( current >= buffer );
+ return current;
+}
+
+
+std::string valueToString( LargestUInt value )
+{
+ UIntToStringBuffer buffer;
+ char *current = buffer + sizeof(buffer);
+ uintToString( value, current );
+ assert( current >= buffer );
+ return current;
+}
+
+#if defined(JSON_HAS_INT64)
+
+std::string valueToString( Int value )
+{
+ return valueToString( LargestInt(value) );
+}
+
+
+std::string valueToString( UInt value )
+{
+ return valueToString( LargestUInt(value) );
+}
+
+#endif // # if defined(JSON_HAS_INT64)
+
+
+std::string valueToString( double value )
+{
+ char buffer[32];
+#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with visual studio 2005 to avoid warning.
+ sprintf_s(buffer, sizeof(buffer), "%#.16g", value);
+#else
+ sprintf(buffer, "%#.16g", value);
+#endif
+ char* ch = buffer + strlen(buffer) - 1;
+ if (*ch != '0') return buffer; // nothing to truncate, so save time
+ while(ch > buffer && *ch == '0'){
+ --ch;
+ }
+ char* last_nonzero = ch;
+ while(ch >= buffer){
+ switch(*ch){
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ --ch;
+ continue;
+ case '.':
+ // Truncate zeroes to save bytes in output, but keep one.
+ *(last_nonzero+2) = '\0';
+ return buffer;
+ default:
+ return buffer;
+ }
+ }
+ return buffer;
+}
+
+
+std::string valueToString( bool value )
+{
+ return value ? "true" : "false";
+}
+
+std::string valueToQuotedString( const char *value )
+{
+ // Not sure how to handle unicode...
+ if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && !containsControlCharacter( value ))
+ return std::string("\"") + value + "\"";
+ // We have to walk value and escape any special characters.
+ // Appending to std::string is not efficient, but this should be rare.
+ // (Note: forward slashes are *not* rare, but I am not escaping them.)
+ std::string::size_type maxsize = strlen(value)*2 + 3; // allescaped+quotes+NULL
+ std::string result;
+ result.reserve(maxsize); // to avoid lots of mallocs
+ result += "\"";
+ for (const char* c=value; *c != 0; ++c)
+ {
+ switch(*c)
+ {
+ case '\"':
+ result += "\\\"";
+ break;
+ case '\\':
+ result += "\\\\";
+ break;
+ case '\b':
+ result += "\\b";
+ break;
+ case '\f':
+ result += "\\f";
+ break;
+ case '\n':
+ result += "\\n";
+ break;
+ case '\r':
+ result += "\\r";
+ break;
+ case '\t':
+ result += "\\t";
+ break;
+ //case '/':
+ // Even though \/ is considered a legal escape in JSON, a bare
+ // slash is also legal, so I see no reason to escape it.
+ // (I hope I am not misunderstanding something.
+ // blep notes: actually escaping \/ may be useful in javascript to avoid </
+ // sequence.
+ // Should add a flag to allow this compatibility mode and prevent this
+ // sequence from occurring.
+ default:
+ if ( isControlCharacter( *c ) )
+ {
+ std::ostringstream oss;
+ oss << "\\u" << std::hex << std::uppercase << std::setfill('0') << std::setw(4) << static_cast<int>(*c);
+ result += oss.str();
+ }
+ else
+ {
+ result += *c;
+ }
+ break;
+ }
+ }
+ result += "\"";
+ return result;
+}
+
+// Class Writer
+// //////////////////////////////////////////////////////////////////
+Writer::~Writer()
+{
+}
+
+
+// Class FastWriter
+// //////////////////////////////////////////////////////////////////
+
+FastWriter::FastWriter()
+ : yamlCompatiblityEnabled_( false )
+{
+}
+
+
+void
+FastWriter::enableYAMLCompatibility()
+{
+ yamlCompatiblityEnabled_ = true;
+}
+
+
+std::string
+FastWriter::write( const Value &root )
+{
+ document_ = "";
+ writeValue( root );
+ document_ += "\n";
+ return document_;
+}
+
+
+void
+FastWriter::writeValue( const Value &value )
+{
+ switch ( value.type() )
+ {
+ case nullValue:
+ document_ += "null";
+ break;
+ case intValue:
+ document_ += valueToString( value.asLargestInt() );
+ break;
+ case uintValue:
+ document_ += valueToString( value.asLargestUInt() );
+ break;
+ case realValue:
+ document_ += valueToString( value.asDouble() );
+ break;
+ case stringValue:
+ document_ += valueToQuotedString( value.asCString() );
+ break;
+ case booleanValue:
+ document_ += valueToString( value.asBool() );
+ break;
+ case arrayValue:
+ {
+ document_ += "[";
+ int size = value.size();
+ for ( int index =0; index < size; ++index )
+ {
+ if ( index > 0 )
+ document_ += ",";
+ writeValue( value[index] );
+ }
+ document_ += "]";
+ }
+ break;
+ case objectValue:
+ {
+ Value::Members members( value.getMemberNames() );
+ document_ += "{";
+ for ( Value::Members::iterator it = members.begin();
+ it != members.end();
+ ++it )
+ {
+ const std::string &name = *it;
+ if ( it != members.begin() )
+ document_ += ",";
+ document_ += valueToQuotedString( name.c_str() );
+ document_ += yamlCompatiblityEnabled_ ? ": "
+ : ":";
+ writeValue( value[name] );
+ }
+ document_ += "}";
+ }
+ break;
+ }
+}
+
+
+// Class StyledWriter
+// //////////////////////////////////////////////////////////////////
+
+StyledWriter::StyledWriter()
+ : rightMargin_( 74 )
+ , indentSize_( 3 )
+{
+}
+
+
+std::string
+StyledWriter::write( const Value &root )
+{
+ document_ = "";
+ addChildValues_ = false;
+ indentString_ = "";
+ writeCommentBeforeValue( root );
+ writeValue( root );
+ writeCommentAfterValueOnSameLine( root );
+ document_ += "\n";
+ return document_;
+}
+
+
+void
+StyledWriter::writeValue( const Value &value )
+{
+ switch ( value.type() )
+ {
+ case nullValue:
+ pushValue( "null" );
+ break;
+ case intValue:
+ pushValue( valueToString( value.asLargestInt() ) );
+ break;
+ case uintValue:
+ pushValue( valueToString( value.asLargestUInt() ) );
+ break;
+ case realValue:
+ pushValue( valueToString( value.asDouble() ) );
+ break;
+ case stringValue:
+ pushValue( valueToQuotedString( value.asCString() ) );
+ break;
+ case booleanValue:
+ pushValue( valueToString( value.asBool() ) );
+ break;
+ case arrayValue:
+ writeArrayValue( value);
+ break;
+ case objectValue:
+ {
+ Value::Members members( value.getMemberNames() );
+ if ( members.empty() )
+ pushValue( "{}" );
+ else
+ {
+ writeWithIndent( "{" );
+ indent();
+ Value::Members::iterator it = members.begin();
+ for (;;)
+ {
+ const std::string &name = *it;
+ const Value &childValue = value[name];
+ writeCommentBeforeValue( childValue );
+ writeWithIndent( valueToQuotedString( name.c_str() ) );
+ document_ += " : ";
+ writeValue( childValue );
+ if ( ++it == members.end() )
+ {
+ writeCommentAfterValueOnSameLine( childValue );
+ break;
+ }
+ document_ += ",";
+ writeCommentAfterValueOnSameLine( childValue );
+ }
+ unindent();
+ writeWithIndent( "}" );
+ }
+ }
+ break;
+ }
+}
+
+
+void
+StyledWriter::writeArrayValue( const Value &value )
+{
+ unsigned size = value.size();
+ if ( size == 0 )
+ pushValue( "[]" );
+ else
+ {
+ bool isArrayMultiLine = isMultineArray( value );
+ if ( isArrayMultiLine )
+ {
+ writeWithIndent( "[" );
+ indent();
+ bool hasChildValue = !childValues_.empty();
+ unsigned index =0;
+ for (;;)
+ {
+ const Value &childValue = value[index];
+ writeCommentBeforeValue( childValue );
+ if ( hasChildValue )
+ writeWithIndent( childValues_[index] );
+ else
+ {
+ writeIndent();
+ writeValue( childValue );
+ }
+ if ( ++index == size )
+ {
+ writeCommentAfterValueOnSameLine( childValue );
+ break;
+ }
+ document_ += ",";
+ writeCommentAfterValueOnSameLine( childValue );
+ }
+ unindent();
+ writeWithIndent( "]" );
+ }
+ else // output on a single line
+ {
+ assert( childValues_.size() == size );
+ document_ += "[ ";
+ for ( unsigned index =0; index < size; ++index )
+ {
+ if ( index > 0 )
+ document_ += ", ";
+ document_ += childValues_[index];
+ }
+ document_ += " ]";
+ }
+ }
+}
+
+
+bool
+StyledWriter::isMultineArray( const Value &value )
+{
+ int size = value.size();
+ bool isMultiLine = size*3 >= rightMargin_ ;
+ childValues_.clear();
+ for ( int index =0; index < size && !isMultiLine; ++index )
+ {
+ const Value &childValue = value[index];
+ isMultiLine = isMultiLine ||
+ ( (childValue.isArray() || childValue.isObject()) &&
+ childValue.size() > 0 );
+ }
+ if ( !isMultiLine ) // check if line length > max line length
+ {
+ childValues_.reserve( size );
+ addChildValues_ = true;
+ int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'
+ for ( int index =0; index < size && !isMultiLine; ++index )
+ {
+ writeValue( value[index] );
+ lineLength += int( childValues_[index].length() );
+ isMultiLine = isMultiLine && hasCommentForValue( value[index] );
+ }
+ addChildValues_ = false;
+ isMultiLine = isMultiLine || lineLength >= rightMargin_;
+ }
+ return isMultiLine;
+}
+
+
+void
+StyledWriter::pushValue( const std::string &value )
+{
+ if ( addChildValues_ )
+ childValues_.push_back( value );
+ else
+ document_ += value;
+}
+
+
+void
+StyledWriter::writeIndent()
+{
+ if ( !document_.empty() )
+ {
+ char last = document_[document_.length()-1];
+ if ( last == ' ' ) // already indented
+ return;
+ if ( last != '\n' ) // Comments may add new-line
+ document_ += '\n';
+ }
+ document_ += indentString_;
+}
+
+
+void
+StyledWriter::writeWithIndent( const std::string &value )
+{
+ writeIndent();
+ document_ += value;
+}
+
+
+void
+StyledWriter::indent()
+{
+ indentString_ += std::string( indentSize_, ' ' );
+}
+
+
+void
+StyledWriter::unindent()
+{
+ assert( int(indentString_.size()) >= indentSize_ );
+ indentString_.resize( indentString_.size() - indentSize_ );
+}
+
+
+void
+StyledWriter::writeCommentBeforeValue( const Value &root )
+{
+ if ( !root.hasComment( commentBefore ) )
+ return;
+ document_ += normalizeEOL( root.getComment( commentBefore ) );
+ document_ += "\n";
+}
+
+
+void
+StyledWriter::writeCommentAfterValueOnSameLine( const Value &root )
+{
+ if ( root.hasComment( commentAfterOnSameLine ) )
+ document_ += " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) );
+
+ if ( root.hasComment( commentAfter ) )
+ {
+ document_ += "\n";
+ document_ += normalizeEOL( root.getComment( commentAfter ) );
+ document_ += "\n";
+ }
+}
+
+
+bool
+StyledWriter::hasCommentForValue( const Value &value )
+{
+ return value.hasComment( commentBefore )
+ || value.hasComment( commentAfterOnSameLine )
+ || value.hasComment( commentAfter );
+}
+
+
+std::string
+StyledWriter::normalizeEOL( const std::string &text )
+{
+ std::string normalized;
+ normalized.reserve( text.length() );
+ const char *begin = text.c_str();
+ const char *end = begin + text.length();
+ const char *current = begin;
+ while ( current != end )
+ {
+ char c = *current++;
+ if ( c == '\r' ) // mac or dos EOL
+ {
+ if ( *current == '\n' ) // convert dos EOL
+ ++current;
+ normalized += '\n';
+ }
+ else // handle unix EOL & other char
+ normalized += c;
+ }
+ return normalized;
+}
+
+
+// Class StyledStreamWriter
+// //////////////////////////////////////////////////////////////////
+
+StyledStreamWriter::StyledStreamWriter( std::string indentation )
+ : document_(NULL)
+ , rightMargin_( 74 )
+ , indentation_( indentation )
+{
+}
+
+
+void
+StyledStreamWriter::write( std::ostream &out, const Value &root )
+{
+ document_ = &out;
+ addChildValues_ = false;
+ indentString_ = "";
+ writeCommentBeforeValue( root );
+ writeValue( root );
+ writeCommentAfterValueOnSameLine( root );
+ *document_ << "\n";
+ document_ = NULL; // Forget the stream, for safety.
+}
+
+
+void
+StyledStreamWriter::writeValue( const Value &value )
+{
+ switch ( value.type() )
+ {
+ case nullValue:
+ pushValue( "null" );
+ break;
+ case intValue:
+ pushValue( valueToString( value.asLargestInt() ) );
+ break;
+ case uintValue:
+ pushValue( valueToString( value.asLargestUInt() ) );
+ break;
+ case realValue:
+ pushValue( valueToString( value.asDouble() ) );
+ break;
+ case stringValue:
+ pushValue( valueToQuotedString( value.asCString() ) );
+ break;
+ case booleanValue:
+ pushValue( valueToString( value.asBool() ) );
+ break;
+ case arrayValue:
+ writeArrayValue( value);
+ break;
+ case objectValue:
+ {
+ Value::Members members( value.getMemberNames() );
+ if ( members.empty() )
+ pushValue( "{}" );
+ else
+ {
+ writeWithIndent( "{" );
+ indent();
+ Value::Members::iterator it = members.begin();
+ for (;;)
+ {
+ const std::string &name = *it;
+ const Value &childValue = value[name];
+ writeCommentBeforeValue( childValue );
+ writeWithIndent( valueToQuotedString( name.c_str() ) );
+ *document_ << " : ";
+ writeValue( childValue );
+ if ( ++it == members.end() )
+ {
+ writeCommentAfterValueOnSameLine( childValue );
+ break;
+ }
+ *document_ << ",";
+ writeCommentAfterValueOnSameLine( childValue );
+ }
+ unindent();
+ writeWithIndent( "}" );
+ }
+ }
+ break;
+ }
+}
+
+
+void
+StyledStreamWriter::writeArrayValue( const Value &value )
+{
+ unsigned size = value.size();
+ if ( size == 0 )
+ pushValue( "[]" );
+ else
+ {
+ bool isArrayMultiLine = isMultineArray( value );
+ if ( isArrayMultiLine )
+ {
+ writeWithIndent( "[" );
+ indent();
+ bool hasChildValue = !childValues_.empty();
+ unsigned index =0;
+ for (;;)
+ {
+ const Value &childValue = value[index];
+ writeCommentBeforeValue( childValue );
+ if ( hasChildValue )
+ writeWithIndent( childValues_[index] );
+ else
+ {
+ writeIndent();
+ writeValue( childValue );
+ }
+ if ( ++index == size )
+ {
+ writeCommentAfterValueOnSameLine( childValue );
+ break;
+ }
+ *document_ << ",";
+ writeCommentAfterValueOnSameLine( childValue );
+ }
+ unindent();
+ writeWithIndent( "]" );
+ }
+ else // output on a single line
+ {
+ assert( childValues_.size() == size );
+ *document_ << "[ ";
+ for ( unsigned index =0; index < size; ++index )
+ {
+ if ( index > 0 )
+ *document_ << ", ";
+ *document_ << childValues_[index];
+ }
+ *document_ << " ]";
+ }
+ }
+}
+
+
+bool
+StyledStreamWriter::isMultineArray( const Value &value )
+{
+ int size = value.size();
+ bool isMultiLine = size*3 >= rightMargin_ ;
+ childValues_.clear();
+ for ( int index =0; index < size && !isMultiLine; ++index )
+ {
+ const Value &childValue = value[index];
+ isMultiLine = isMultiLine ||
+ ( (childValue.isArray() || childValue.isObject()) &&
+ childValue.size() > 0 );
+ }
+ if ( !isMultiLine ) // check if line length > max line length
+ {
+ childValues_.reserve( size );
+ addChildValues_ = true;
+ int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'
+ for ( int index =0; index < size && !isMultiLine; ++index )
+ {
+ writeValue( value[index] );
+ lineLength += int( childValues_[index].length() );
+ isMultiLine = isMultiLine && hasCommentForValue( value[index] );
+ }
+ addChildValues_ = false;
+ isMultiLine = isMultiLine || lineLength >= rightMargin_;
+ }
+ return isMultiLine;
+}
+
+
+void
+StyledStreamWriter::pushValue( const std::string &value )
+{
+ if ( addChildValues_ )
+ childValues_.push_back( value );
+ else
+ *document_ << value;
+}
+
+
+void
+StyledStreamWriter::writeIndent()
+{
+ /*
+ Some comments in this method would have been nice. ;-)
+
+ if ( !document_.empty() )
+ {
+ char last = document_[document_.length()-1];
+ if ( last == ' ' ) // already indented
+ return;
+ if ( last != '\n' ) // Comments may add new-line
+ *document_ << '\n';
+ }
+ */
+ *document_ << '\n' << indentString_;
+}
+
+
+void
+StyledStreamWriter::writeWithIndent( const std::string &value )
+{
+ writeIndent();
+ *document_ << value;
+}
+
+
+void
+StyledStreamWriter::indent()
+{
+ indentString_ += indentation_;
+}
+
+
+void
+StyledStreamWriter::unindent()
+{
+ assert( indentString_.size() >= indentation_.size() );
+ indentString_.resize( indentString_.size() - indentation_.size() );
+}
+
+
+void
+StyledStreamWriter::writeCommentBeforeValue( const Value &root )
+{
+ if ( !root.hasComment( commentBefore ) )
+ return;
+ *document_ << normalizeEOL( root.getComment( commentBefore ) );
+ *document_ << "\n";
+}
+
+
+void
+StyledStreamWriter::writeCommentAfterValueOnSameLine( const Value &root )
+{
+ if ( root.hasComment( commentAfterOnSameLine ) )
+ *document_ << " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) );
+
+ if ( root.hasComment( commentAfter ) )
+ {
+ *document_ << "\n";
+ *document_ << normalizeEOL( root.getComment( commentAfter ) );
+ *document_ << "\n";
+ }
+}
+
+
+bool
+StyledStreamWriter::hasCommentForValue( const Value &value )
+{
+ return value.hasComment( commentBefore )
+ || value.hasComment( commentAfterOnSameLine )
+ || value.hasComment( commentAfter );
+}
+
+
+std::string
+StyledStreamWriter::normalizeEOL( const std::string &text )
+{
+ std::string normalized;
+ normalized.reserve( text.length() );
+ const char *begin = text.c_str();
+ const char *end = begin + text.length();
+ const char *current = begin;
+ while ( current != end )
+ {
+ char c = *current++;
+ if ( c == '\r' ) // mac or dos EOL
+ {
+ if ( *current == '\n' ) // convert dos EOL
+ ++current;
+ normalized += '\n';
+ }
+ else // handle unix EOL & other char
+ normalized += c;
+ }
+ return normalized;
+}
+
+
+std::ostream& operator<<( std::ostream &sout, const Value &root )
+{
+ Json::StyledStreamWriter writer;
+ writer.write(sout, root);
+ return sout;
+}
+
+
+} // namespace Json
+
+// //////////////////////////////////////////////////////////////////////
+// End of content of file: src/lib_json/json_writer.cpp
+// //////////////////////////////////////////////////////////////////////
+
+
+
+
+
diff --git a/jellyfish/hash_function.hpp b/lib/mer_dna.cc
similarity index 71%
rename from jellyfish/hash_function.hpp
rename to lib/mer_dna.cc
index 408628c..c8751dd 100644
--- a/jellyfish/hash_function.hpp
+++ b/lib/mer_dna.cc
@@ -14,10 +14,10 @@
along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef __JELLYFISH_HASH_FUNCTION_HPP__
-#define __JELLYFISH_HASH_FUNCTION_HPP__
+#include <jellyfish/mer_dna.hpp>
-uint64_t MurmurHash64A(const void *key, int len, uint64_t seed);
-
-#endif
+namespace jellyfish { namespace mer_dna_ns {
+const char* const error_different_k = "Length of k-mers are different";
+const char* const error_short_string = "Input string is to short";
+} } // namespace jellyfish { namespace mer_dna_ns
diff --git a/jellyfish/misc.cc b/lib/misc.cc
similarity index 65%
rename from jellyfish/misc.cc
rename to lib/misc.cc
index 4f6b0c9..31e7c8f 100644
--- a/jellyfish/misc.cc
+++ b/lib/misc.cc
@@ -20,6 +20,7 @@ n the Free Software Foundation, either version 3 of the License, or
#include <jellyfish/err.hpp>
#include <jellyfish/backtrace.hpp>
+namespace jellyfish {
uint64_t bogus_sum(void *data, size_t len) {
uint64_t res = 0, tmp = 0;
uint64_t *ptr = (uint64_t *)data;
@@ -60,3 +61,42 @@ std::streamoff get_file_size(std::istream& is) {
is.seekg(cpos);
return res;
}
+
+template<long int n>
+struct ConstFloorLog2 {
+ static const int val = ConstFloorLog2<n / 2>::val + 1;
+};
+template<>
+struct ConstFloorLog2<1> {
+ static const int val = 0;
+};
+// Return length random bits
+uint64_t random_bits(int length) {
+ uint64_t res = 0;
+ for(int i = 0; i < length; i += ConstFloorLog2<RAND_MAX>::val) {
+ res ^= (uint64_t)random() << i;
+ }
+ return res & ((uint64_t)-1 >> (bsizeof(uint64_t) - length));
+}
+
+bool isblunt(char c) {
+ return isalnum(c) || c == '_' || c == '-' || c == '/' || c == '.';
+}
+std::string quote_arg(const std::string& arg) {
+ if(std::all_of(arg.begin(), arg.end(), isblunt))
+ return arg;
+
+ std::string res("'");
+ size_t pos = 0;
+ while(true) {
+ size_t qpos = arg.find_first_of("'", pos);
+ res += arg.substr(pos, qpos - pos);
+ if(qpos == std::string::npos) break;
+ res += "'\\''";
+ pos = qpos + 1;
+ }
+ res += "'";
+ return res;
+}
+
+} // namespace jellyfish
diff --git a/lib/rectangular_binary_matrix.cc b/lib/rectangular_binary_matrix.cc
new file mode 100644
index 0000000..4eedb93
--- /dev/null
+++ b/lib/rectangular_binary_matrix.cc
@@ -0,0 +1,216 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <new>
+#include <stdexcept>
+#include <vector>
+#include <sstream>
+#include <assert.h>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+
+uint64_t *jellyfish::RectangularBinaryMatrix::alloc(unsigned int r, unsigned int c) {
+ if(r > (sizeof(uint64_t) * 8) || r == 0 || c == 0) {
+ std::ostringstream err;
+ err << "Invalid matrix size " << r << "x" << c;
+ throw std::out_of_range(err.str());
+ }
+ void *mem;
+ // Make sure the number of words allocated is a multiple of
+ // 8. Necessary for loop unrolling of vector multiplication
+ size_t alloc_columns = (c / 8 + (c % 8 != 0)) * 8;
+ if(posix_memalign(&mem, sizeof(uint64_t) * 2, alloc_columns * sizeof(uint64_t)))
+ throw std::bad_alloc();
+ memset(mem, '\0', sizeof(uint64_t) * alloc_columns);
+ return (uint64_t *)mem;
+}
+
+void jellyfish::RectangularBinaryMatrix::init_low_identity() {
+ memset(_columns, '\0', sizeof(uint64_t) * _c);
+ unsigned int row = std::min(_c, _r);
+ unsigned int col = _c - row;
+ _columns[col] = (uint64_t)1 << (row - 1);
+ for(unsigned int i = col + 1; i < _c; ++i)
+ _columns[i] = _columns[i - 1] >> 1;
+}
+
+bool jellyfish::RectangularBinaryMatrix::is_low_identity() {
+ unsigned int row = std::min(_c, _r);
+ unsigned int col = _c - row;
+
+ for(unsigned int i = 0; i < col; ++i)
+ if(_columns[i])
+ return false;
+ if(_columns[col] != (uint64_t)1 << (row - 1))
+ return false;
+ for(unsigned int i = col + 1; i < _c; ++i)
+ if(_columns[i] != _columns[i - 1] >> 1)
+ return false;
+ return true;
+}
+
+jellyfish::RectangularBinaryMatrix jellyfish::RectangularBinaryMatrix::pseudo_multiplication(const jellyfish::RectangularBinaryMatrix &rhs) const {
+ if(_r != rhs._r || _c != rhs._c)
+ throw std::domain_error("Matrices of different size");
+ RectangularBinaryMatrix res(_r, _c);
+
+ // v is a vector. The lower part is equal to the given column of rhs
+ // and the high part is the identity matrix.
+ // uint64_t v[nb_words()];
+ uint64_t *v = new uint64_t[nb_words()];
+ memset(v, '\0', sizeof(uint64_t) * nb_words());
+ unsigned int j = nb_words() - 1;
+ v[j] = msb();
+ const unsigned int row = std::min(_c, _r);
+ const unsigned int col = _c - row;
+
+ unsigned int i;
+ for(i = 0; i < col; ++i) {
+ // Set the lower part to rhs and do vector multiplication
+ v[0] ^= rhs[i];
+ res.get(i) = this->times(&v[0]);
+ //res.get(i) = this->times_loop(v);
+
+ // Zero the lower part and shift the one down the diagonal.
+ v[0] ^= rhs[i];
+ v[j] >>= 1;
+ if(!v[j])
+ v[--j] = (uint64_t)1 << (sizeof(uint64_t) * 8 - 1);
+ }
+ // No more identity part to deal with
+ memset(v, '\0', sizeof(uint64_t) * nb_words());
+ for( ; i < _c; ++i) {
+ v[0] = rhs[i];
+ res.get(i) = this->times(v);
+ //res.get(i) = this->times_loop(v);
+ }
+
+ delete[] v;
+ return res;
+}
+
+unsigned int jellyfish::RectangularBinaryMatrix::pseudo_rank() const {
+ unsigned int rank = _c;
+ RectangularBinaryMatrix pivot(*this);
+
+ // Make the matrix lower triangular.
+ unsigned int srow = std::min(_r, _c);
+ unsigned int scol = _c - srow;
+ uint64_t mask = (uint64_t)1 << (srow - 1);
+ for(unsigned int i = scol; i < _c; ++i, mask >>= 1) {
+ if(!(pivot.get(i) & mask)) {
+ // current column has a 0 in the diagonal. XOR it with another
+ // column to get a 1.
+ unsigned int j;
+ for(j = i + 1; j < _c; ++j)
+ if(pivot.get(j) & mask)
+ break;
+ if(j == _c) {
+ // Did not find one, the matrix is not full rank.
+ rank = i;
+ break;
+ }
+ pivot.get(i) ^= pivot.get(j);
+ }
+
+ // Zero out every ones on the ith row in the upper part of the
+ // matrix.
+ for(unsigned int j = i + 1; j < _c; ++j)
+ if(pivot.get(j) & mask)
+ pivot.get(j) ^= pivot.get(i);
+ }
+
+ return rank;
+}
+
+jellyfish::RectangularBinaryMatrix jellyfish::RectangularBinaryMatrix::pseudo_inverse() const {
+ RectangularBinaryMatrix pivot(*this);
+ RectangularBinaryMatrix res(_r, _c); res.init_low_identity();
+ unsigned int i, j;
+ uint64_t mask;
+
+ // Do gaussian elimination on the columns and apply the same
+ // operation to res.
+
+ // Make pivot lower triangular.
+ unsigned int srow = std::min(_r, _c);
+ unsigned int scol = _c - srow;
+ mask = (uint64_t)1 << (srow - 1);
+ for(i = scol; i < _c; ++i, mask >>= 1) {
+ if(!(pivot.get(i) & mask)) {
+ // current column has a 0 in the diagonal. XOR it with another
+ // column to get a 1.
+ unsigned int j;
+ for(j = i + 1; j < _c; ++j)
+ if(pivot.get(j) & mask)
+ break;
+ if(j == _c)
+ throw std::domain_error("Matrix is singular");
+ pivot.get(i) ^= pivot.get(j);
+ res.get(i) ^= res.get(j);
+ }
+ // Zero out every ones on the ith row in the upper part of the
+ // matrix.
+ for(j = i + 1; j < _c; ++j) {
+ if(pivot.get(j) & mask) {
+ pivot.get(j) ^= pivot.get(i);
+ res.get(j) ^= res.get(i);
+ }
+ }
+ }
+
+ // Make pivot the lower identity
+ mask = (uint64_t)1 << (srow - 1);
+ for(i = scol; i < _c; ++i, mask >>= 1) {
+ for(j = 0; j < i; ++j) {
+ if(pivot.get(j) & mask) {
+ pivot.get(j) ^= pivot.get(i);
+ res.get(j) ^= res.get(i);
+ }
+ }
+ }
+
+ return res;
+}
+
+void jellyfish::RectangularBinaryMatrix::print(std::ostream &os) const {
+ uint64_t mask = (uint64_t)1 << (_r - 1);
+ for( ; mask; mask >>= 1) {
+ for(unsigned int j = 0; j < _c; ++j) {
+ os << (mask & _columns[j] ? "1" : "0");
+ }
+ os << "\n";
+ }
+}
+
+template<typename T>
+void jellyfish::RectangularBinaryMatrix::print_vector(std::ostream &os, const T &v) const {
+ uint64_t mask = msb();
+ for(int i = nb_words() - 1; i >= 0; --i) {
+ for( ; mask; mask >>= 1)
+ os << (v[i] & mask ? "1" : "0");
+ mask = (uint64_t)1 << (sizeof(uint64_t) * 8 - 1);
+ }
+ os << "\n";
+}
+
+jellyfish::RectangularBinaryMatrix jellyfish::RectangularBinaryMatrix::randomize_pseudo_inverse(uint64_t (*rng)()) {
+ while(true) {
+ randomize(rng);
+ try {
+ return pseudo_inverse();
+ } catch(std::domain_error &e) { }
+ }
+}
diff --git a/lib/storage.cc b/lib/storage.cc
new file mode 100644
index 0000000..6c33f77
--- /dev/null
+++ b/lib/storage.cc
@@ -0,0 +1,51 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "config.h"
+#include <jellyfish/storage.hpp>
+
+namespace jellyfish {
+const size_t _quadratic_reprobes[257] = {
+ 1,
+ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55,
+ 66, 78, 91, 105, 120, 136, 153, 171, 190, 210,
+ 231, 253, 276, 300, 325, 351, 378, 406, 435, 465,
+ 496, 528, 561, 595, 630, 666, 703, 741, 780, 820,
+ 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275,
+ 1326, 1378, 1431, 1485, 1540, 1596, 1653, 1711, 1770, 1830,
+ 1891, 1953, 2016, 2080, 2145, 2211, 2278, 2346, 2415, 2485,
+ 2556, 2628, 2701, 2775, 2850, 2926, 3003, 3081, 3160, 3240,
+ 3321, 3403, 3486, 3570, 3655, 3741, 3828, 3916, 4005, 4095,
+ 4186, 4278, 4371, 4465, 4560, 4656, 4753, 4851, 4950, 5050,
+ 5151, 5253, 5356, 5460, 5565, 5671, 5778, 5886, 5995, 6105,
+ 6216, 6328, 6441, 6555, 6670, 6786, 6903, 7021, 7140, 7260,
+ 7381, 7503, 7626, 7750, 7875, 8001, 8128, 8256, 8385, 8515,
+ 8646, 8778, 8911, 9045, 9180, 9316, 9453, 9591, 9730, 9870,
+ 10011, 10153, 10296, 10440, 10585, 10731, 10878, 11026, 11175, 11325,
+ 11476, 11628, 11781, 11935, 12090, 12246, 12403, 12561, 12720, 12880,
+ 13041, 13203, 13366, 13530, 13695, 13861, 14028, 14196, 14365, 14535,
+ 14706, 14878, 15051, 15225, 15400, 15576, 15753, 15931, 16110, 16290,
+ 16471, 16653, 16836, 17020, 17205, 17391, 17578, 17766, 17955, 18145,
+ 18336, 18528, 18721, 18915, 19110, 19306, 19503, 19701, 19900, 20100,
+ 20301, 20503, 20706, 20910, 21115, 21321, 21528, 21736, 21945, 22155,
+ 22366, 22578, 22791, 23005, 23220, 23436, 23653, 23871, 24090, 24310,
+ 24531, 24753, 24976, 25200, 25425, 25651, 25878, 26106, 26335, 26565,
+ 26796, 27028, 27261, 27495, 27730, 27966, 28203, 28441, 28680, 28920,
+ 29161, 29403, 29646, 29890, 30135, 30381, 30628, 30876, 31125, 31375,
+ 31626, 31878, 32131, 32385, 32640, 32896
+};
+const size_t *quadratic_reprobes = _quadratic_reprobes;
+}
diff --git a/jellyfish/thread_exec.cc b/lib/thread_exec.cc
similarity index 77%
rename from jellyfish/thread_exec.cc
rename to lib/thread_exec.cc
index 265dc57..8c6e4de 100644
--- a/jellyfish/thread_exec.cc
+++ b/lib/thread_exec.cc
@@ -14,9 +14,9 @@
along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "thread_exec.hpp"
+#include <jellyfish/thread_exec.hpp>
-void thread_exec::exec(int nb_threads) {
+void jellyfish::thread_exec::exec(int nb_threads) {
struct thread_info empty = {0, 0, 0};
infos.resize(nb_threads, empty);
@@ -25,19 +25,19 @@ void thread_exec::exec(int nb_threads) {
infos[i].self = this;
int err = pthread_create(&infos[i].thid, NULL, start_routine, &infos[i]);
if(err)
- eraise(Error) << "Can't create thread" << err::no;
+ throw Error(err::msg() << "Can't create thread: " << err::no);
}
}
-void thread_exec::join() {
+void jellyfish::thread_exec::join() {
for(unsigned int i = 0; i < infos.size(); i++) {
int err = pthread_join(infos[i].thid, NULL);
if(err)
- eraise(Error) << "Can't join thread '" << infos[i].thid << "'" << err::no;
+ throw Error(err::msg() << "Can't join thread '" << infos[i].thid << "': " << err::no);
}
}
-void *thread_exec::start_routine(void *_info) {
+void *jellyfish::thread_exec::start_routine(void *_info) {
struct thread_info *info = (struct thread_info *)_info;
info->self->start(info->id);
return 0;
diff --git a/jellyfish/time.cc b/lib/time.cc
similarity index 100%
rename from jellyfish/time.cc
rename to lib/time.cc
diff --git a/local.mk b/local.mk
new file mode 100644
index 0000000..7002a50
--- /dev/null
+++ b/local.mk
@@ -0,0 +1,3 @@
+mer_counter: square_binary_matrix.o
+dump_stats: square_binary_matrix.o
+hash_merge: square_binary_matrix.o
diff --git a/ltmain.sh b/ltmain.sh
deleted file mode 100644
index 63ae69d..0000000
--- a/ltmain.sh
+++ /dev/null
@@ -1,9655 +0,0 @@
-
-# libtool (GNU libtool) 2.4.2
-# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
-# This is free software; see the source for copying conditions. There is NO
-# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-# GNU Libtool is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING. If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-# --config show all configuration variables
-# --debug enable verbose shell tracing
-# -n, --dry-run display commands without modifying any files
-# --features display basic configuration information and exit
-# --mode=MODE use operation mode MODE
-# --preserve-dup-deps don't remove duplicate dependency libraries
-# --quiet, --silent don't print informational messages
-# --no-quiet, --no-silent
-# print informational messages (default)
-# --no-warn don't display warning messages
-# --tag=TAG use configuration variables from tag TAG
-# -v, --verbose print more informational messages than default
-# --no-verbose don't print the extra informational messages
-# --version print version information
-# -h, --help, --help-all print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-# clean remove files from the build directory
-# compile compile a source file into a libtool object
-# execute automatically set library path, then run a program
-# finish complete the installation of libtool libraries
-# install install libraries or executables
-# link create a library or an executable
-# uninstall remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE. When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-# host-triplet: $host
-# shell: $SHELL
-# compiler: $LTCC
-# compiler flags: $LTCFLAGS
-# linker: $LD (gnu? $with_gnu_ld)
-# $progname: (GNU libtool) 2.4.2
-# automake: $automake_version
-# autoconf: $autoconf_version
-#
-# Report bugs to <bug-libtool at gnu.org>.
-# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-# General help using GNU software: <http://www.gnu.org/gethelp/>.
-
-PROGRAM=libtool
-PACKAGE=libtool
-VERSION=2.4.2
-TIMESTAMP=""
-package_revision=1.3337
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
- emulate sh
- NULLCMD=:
- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
- setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
- eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
-
-# NLS nuisances: We save the old values to restore during execute mode.
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-do
- eval "if test \"\${$lt_var+set}\" = set; then
- save_$lt_var=\$$lt_var
- $lt_var=C
- export $lt_var
- lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
- lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
- fi"
-done
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
-
-$lt_unset CDPATH
-
-
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
-
-
-
-: ${CP="cp -f"}
-test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
-: ${MAKE="make"}
-: ${MKDIR="mkdir"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" $lt_nl"
-
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE. If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
- func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
- if test "X$func_dirname_result" = "X${1}"; then
- func_dirname_result="${3}"
- else
- func_dirname_result="$func_dirname_result${2}"
- fi
-} # func_dirname may be replaced by extended shell implementation
-
-
-# func_basename file
-func_basename ()
-{
- func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-} # func_basename may be replaced by extended shell implementation
-
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-# dirname: Compute the dirname of FILE. If nonempty,
-# add APPEND to the result, otherwise set result
-# to NONDIR_REPLACEMENT.
-# value returned in "$func_dirname_result"
-# basename: Compute filename of FILE.
-# value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
- # Extract subdirectory from the argument.
- func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
- if test "X$func_dirname_result" = "X${1}"; then
- func_dirname_result="${3}"
- else
- func_dirname_result="$func_dirname_result${2}"
- fi
- func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-} # func_dirname_and_basename may be replaced by extended shell implementation
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
- case ${2} in
- .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
- *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
- esac
-} # func_stripname may be replaced by extended shell implementation
-
-
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
- s@/\./@/@g
- t dotsl
- s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
-
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-# value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
- # Start from root dir and reassemble the path.
- func_normal_abspath_result=
- func_normal_abspath_tpath=$1
- func_normal_abspath_altnamespace=
- case $func_normal_abspath_tpath in
- "")
- # Empty path, that just means $cwd.
- func_stripname '' '/' "`pwd`"
- func_normal_abspath_result=$func_stripname_result
- return
- ;;
- # The next three entries are used to spot a run of precisely
- # two leading slashes without using negated character classes;
- # we take advantage of case's first-match behaviour.
- ///*)
- # Unusual form of absolute path, do nothing.
- ;;
- //*)
- # Not necessarily an ordinary path; POSIX reserves leading '//'
- # and for example Cygwin uses it to access remote file shares
- # over CIFS/SMB, so we conserve a leading double slash if found.
- func_normal_abspath_altnamespace=/
- ;;
- /*)
- # Absolute path, do nothing.
- ;;
- *)
- # Relative path, prepend $cwd.
- func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
- ;;
- esac
- # Cancel out all the simple stuff to save iterations. We also want
- # the path to end with a slash for ease of parsing, so make sure
- # there is one (and only one) here.
- func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
- -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
- while :; do
- # Processed it all yet?
- if test "$func_normal_abspath_tpath" = / ; then
- # If we ascended to the root using ".." the result may be empty now.
- if test -z "$func_normal_abspath_result" ; then
- func_normal_abspath_result=/
- fi
- break
- fi
- func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
- -e "$pathcar"`
- func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
- -e "$pathcdr"`
- # Figure out what to do with it
- case $func_normal_abspath_tcomponent in
- "")
- # Trailing empty path component, ignore it.
- ;;
- ..)
- # Parent dir; strip last assembled component from result.
- func_dirname "$func_normal_abspath_result"
- func_normal_abspath_result=$func_dirname_result
- ;;
- *)
- # Actual path component, append it.
- func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
- ;;
- esac
- done
- # Restore leading double-slash if one was found on entry.
- func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
-
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-# value returned in "$func_relative_path_result"
-func_relative_path ()
-{
- func_relative_path_result=
- func_normal_abspath "$1"
- func_relative_path_tlibdir=$func_normal_abspath_result
- func_normal_abspath "$2"
- func_relative_path_tbindir=$func_normal_abspath_result
-
- # Ascend the tree starting from libdir
- while :; do
- # check if we have found a prefix of bindir
- case $func_relative_path_tbindir in
- $func_relative_path_tlibdir)
- # found an exact match
- func_relative_path_tcancelled=
- break
- ;;
- $func_relative_path_tlibdir*)
- # found a matching prefix
- func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
- func_relative_path_tcancelled=$func_stripname_result
- if test -z "$func_relative_path_result"; then
- func_relative_path_result=.
- fi
- break
- ;;
- *)
- func_dirname $func_relative_path_tlibdir
- func_relative_path_tlibdir=${func_dirname_result}
- if test "x$func_relative_path_tlibdir" = x ; then
- # Have to descend all the way to the root!
- func_relative_path_result=../$func_relative_path_result
- func_relative_path_tcancelled=$func_relative_path_tbindir
- break
- fi
- func_relative_path_result=../$func_relative_path_result
- ;;
- esac
- done
-
- # Now calculate path; take care to avoid doubling-up slashes.
- func_stripname '' '/' "$func_relative_path_result"
- func_relative_path_result=$func_stripname_result
- func_stripname '/' '/' "$func_relative_path_tcancelled"
- if test "x$func_stripname_result" != x ; then
- func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
- fi
-
- # Normalisation. If bindir is libdir, return empty string,
- # else relative path ending with a slash; either way, target
- # file name can be directly appended.
- if test ! -z "$func_relative_path_result"; then
- func_stripname './' '' "$func_relative_path_result/"
- func_relative_path_result=$func_stripname_result
- fi
-}
-
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
-
-# Make sure we have an absolute path for reexecution:
-case $progpath in
- [\\/]*|[A-Za-z]:\\*) ;;
- *[\\/]*)
- progdir=$func_dirname_result
- progdir=`cd "$progdir" && pwd`
- progpath="$progdir/$progname"
- ;;
- *)
- save_IFS="$IFS"
- IFS=${PATH_SEPARATOR-:}
- for progdir in $PATH; do
- IFS="$save_IFS"
- test -x "$progdir/$progname" && break
- done
- IFS="$save_IFS"
- test -n "$progdir" || progdir=`pwd`
- progpath="$progdir/$progname"
- ;;
-esac
-
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution that turns a string into a regex matching for the
-# string literally.
-sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
-
-# Sed substitution that converts a w32 file name or path
-# which contains forward slashes, into one that contains
-# (escaped) backslashes. A very naive implementation.
-lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same. If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'. `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
- s/$bs4/&\\
-/g
- s/^$bs2$dollar/$bs&/
- s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
- s/\n//g"
-
-# Standard options:
-opt_dry_run=false
-opt_help=false
-opt_quiet=false
-opt_verbose=false
-opt_warning=:
-
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
- $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
-}
-
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
- $opt_verbose && func_echo ${1+"$@"}
-
- # A bug in bash halts the script if the last line of a function
- # fails when set -e is in force, so we need another command to
- # work around that:
- :
-}
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
- $ECHO "$*"
-}
-
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
- $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
-}
-
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
- $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
-
- # bash bug again:
- :
-}
-
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
-{
- func_error ${1+"$@"}
- exit $EXIT_FAILURE
-}
-
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
- func_error ${1+"$@"}
- func_fatal_error "$help"
-}
-help="Try \`$progname --help' for more information." ## default
-
-
-# func_grep expression filename
-# Check whether EXPRESSION matches any line of FILENAME, without output.
-func_grep ()
-{
- $GREP "$1" "$2" >/dev/null 2>&1
-}
-
-
-# func_mkdir_p directory-path
-# Make sure the entire path to DIRECTORY-PATH is available.
-func_mkdir_p ()
-{
- my_directory_path="$1"
- my_dir_list=
-
- if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
-
- # Protect directory names starting with `-'
- case $my_directory_path in
- -*) my_directory_path="./$my_directory_path" ;;
- esac
-
- # While some portion of DIR does not yet exist...
- while test ! -d "$my_directory_path"; do
- # ...make a list in topmost first order. Use a colon delimited
- # list incase some portion of path contains whitespace.
- my_dir_list="$my_directory_path:$my_dir_list"
-
- # If the last portion added has no slash in it, the list is done
- case $my_directory_path in */*) ;; *) break ;; esac
-
- # ...otherwise throw away the child directory and loop
- my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
- done
- my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
-
- save_mkdir_p_IFS="$IFS"; IFS=':'
- for my_dir in $my_dir_list; do
- IFS="$save_mkdir_p_IFS"
- # mkdir can fail with a `File exist' error if two processes
- # try to create one of the directories concurrently. Don't
- # stop in that case!
- $MKDIR "$my_dir" 2>/dev/null || :
- done
- IFS="$save_mkdir_p_IFS"
-
- # Bail out if we (or some other process) failed to create a directory.
- test -d "$my_directory_path" || \
- func_fatal_error "Failed to create \`$1'"
- fi
-}
-
-
-# func_mktempdir [string]
-# Make a temporary directory that won't clash with other running
-# libtool processes, and avoids race conditions if possible. If
-# given, STRING is the basename for that directory.
-func_mktempdir ()
-{
- my_template="${TMPDIR-/tmp}/${1-$progname}"
-
- if test "$opt_dry_run" = ":"; then
- # Return a directory name, but don't create it in dry-run mode
- my_tmpdir="${my_template}-$$"
- else
-
- # If mktemp works, use that first and foremost
- my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
-
- if test ! -d "$my_tmpdir"; then
- # Failing that, at least try and use $RANDOM to avoid a race
- my_tmpdir="${my_template}-${RANDOM-0}$$"
-
- save_mktempdir_umask=`umask`
- umask 0077
- $MKDIR "$my_tmpdir"
- umask $save_mktempdir_umask
- fi
-
- # If we're not in dry-run mode, bomb out on failure
- test -d "$my_tmpdir" || \
- func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
- fi
-
- $ECHO "$my_tmpdir"
-}
-
-
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
-{
- case $1 in
- *[\\\`\"\$]*)
- func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
- *)
- func_quote_for_eval_unquoted_result="$1" ;;
- esac
-
- case $func_quote_for_eval_unquoted_result in
- # Double-quote args containing shell metacharacters to delay
- # word splitting, command substitution and and variable
- # expansion for a subsequent eval.
- # Many Bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
- ;;
- *)
- func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
- esac
-}
-
-
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
- case $1 in
- *[\\\`\"]*)
- my_arg=`$ECHO "$1" | $SED \
- -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
- *)
- my_arg="$1" ;;
- esac
-
- case $my_arg in
- # Double-quote args containing shell metacharacters to delay
- # word splitting and command substitution for a subsequent eval.
- # Many Bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- my_arg="\"$my_arg\""
- ;;
- esac
-
- func_quote_for_expand_result="$my_arg"
-}
-
-
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is
-# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
- my_cmd="$1"
- my_fail_exp="${2-:}"
-
- ${opt_silent-false} || {
- func_quote_for_expand "$my_cmd"
- eval "func_echo $func_quote_for_expand_result"
- }
-
- if ${opt_dry_run-false}; then :; else
- eval "$my_cmd"
- my_status=$?
- if test "$my_status" -eq 0; then :; else
- eval "(exit $my_status); $my_fail_exp"
- fi
- fi
-}
-
-
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is
-# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it. Use the saved locale for evaluation.
-func_show_eval_locale ()
-{
- my_cmd="$1"
- my_fail_exp="${2-:}"
-
- ${opt_silent-false} || {
- func_quote_for_expand "$my_cmd"
- eval "func_echo $func_quote_for_expand_result"
- }
-
- if ${opt_dry_run-false}; then :; else
- eval "$lt_user_locale
- $my_cmd"
- my_status=$?
- eval "$lt_safe_locale"
- if test "$my_status" -eq 0; then :; else
- eval "(exit $my_status); $my_fail_exp"
- fi
- fi
-}
-
-# func_tr_sh
-# Turn $1 into a string suitable for a shell variable name.
-# Result is stored in $func_tr_sh_result. All characters
-# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
-# if $1 begins with a digit, a '_' is prepended as well.
-func_tr_sh ()
-{
- case $1 in
- [0-9]* | *[!a-zA-Z0-9_]*)
- func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
- ;;
- * )
- func_tr_sh_result=$1
- ;;
- esac
-}
-
-
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
- $opt_debug
-
- $SED -n '/(C)/!b go
- :more
- /\./!{
- N
- s/\n# / /
- b more
- }
- :go
- /^# '$PROGRAM' (GNU /,/# warranty; / {
- s/^# //
- s/^# *$//
- s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
- p
- }' < "$progpath"
- exit $?
-}
-
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
-{
- $opt_debug
-
- $SED -n '/^# Usage:/,/^# *.*--help/ {
- s/^# //
- s/^# *$//
- s/\$progname/'$progname'/
- p
- }' < "$progpath"
- echo
- $ECHO "run \`$progname --help | more' for full usage"
- exit $?
-}
-
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
-func_help ()
-{
- $opt_debug
-
- $SED -n '/^# Usage:/,/# Report bugs to/ {
- :print
- s/^# //
- s/^# *$//
- s*\$progname*'$progname'*
- s*\$host*'"$host"'*
- s*\$SHELL*'"$SHELL"'*
- s*\$LTCC*'"$LTCC"'*
- s*\$LTCFLAGS*'"$LTCFLAGS"'*
- s*\$LD*'"$LD"'*
- s/\$with_gnu_ld/'"$with_gnu_ld"'/
- s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
- s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
- p
- d
- }
- /^# .* home page:/b print
- /^# General help using/b print
- ' < "$progpath"
- ret=$?
- if test -z "$1"; then
- exit $ret
- fi
-}
-
-# func_missing_arg argname
-# Echo program name prefixed message to standard error and set global
-# exit_cmd.
-func_missing_arg ()
-{
- $opt_debug
-
- func_error "missing argument for $1."
- exit_cmd=exit
-}
-
-
-# func_split_short_opt shortopt
-# Set func_split_short_opt_name and func_split_short_opt_arg shell
-# variables after splitting SHORTOPT after the 2nd character.
-func_split_short_opt ()
-{
- my_sed_short_opt='1s/^\(..\).*$/\1/;q'
- my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
-
- func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
- func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
-} # func_split_short_opt may be replaced by extended shell implementation
-
-
-# func_split_long_opt longopt
-# Set func_split_long_opt_name and func_split_long_opt_arg shell
-# variables after splitting LONGOPT at the `=' sign.
-func_split_long_opt ()
-{
- my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
- my_sed_long_arg='1s/^--[^=]*=//'
-
- func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
- func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
-} # func_split_long_opt may be replaced by extended shell implementation
-
-exit_cmd=:
-
-
-
-
-
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
-
-# Global variables.
-nonopt=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end. This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
- eval "${1}=\$${1}\${2}"
-} # func_append may be replaced by extended shell implementation
-
-# func_append_quoted var value
-# Quote VALUE and append to the end of shell variable VAR, separated
-# by a space.
-func_append_quoted ()
-{
- func_quote_for_eval "${2}"
- eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
-} # func_append_quoted may be replaced by extended shell implementation
-
-
-# func_arith arithmetic-term...
-func_arith ()
-{
- func_arith_result=`expr "${@}"`
-} # func_arith may be replaced by extended shell implementation
-
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
- func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
-} # func_len may be replaced by extended shell implementation
-
-
-# func_lo2o object
-func_lo2o ()
-{
- func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-} # func_lo2o may be replaced by extended shell implementation
-
-
-# func_xform libobj-or-source
-func_xform ()
-{
- func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-} # func_xform may be replaced by extended shell implementation
-
-
-# func_fatal_configuration arg...
-# Echo program name prefixed message to standard error, followed by
-# a configuration failure hint, and exit.
-func_fatal_configuration ()
-{
- func_error ${1+"$@"}
- func_error "See the $PACKAGE documentation for more information."
- func_fatal_error "Fatal configuration error."
-}
-
-
-# func_config
-# Display the configuration for all the tags in this script.
-func_config ()
-{
- re_begincf='^# ### BEGIN LIBTOOL'
- re_endcf='^# ### END LIBTOOL'
-
- # Default configuration.
- $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
-
- # Now print the configurations for the tags.
- for tagname in $taglist; do
- $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
- done
-
- exit $?
-}
-
-# func_features
-# Display the features supported by this script.
-func_features ()
-{
- echo "host: $host"
- if test "$build_libtool_libs" = yes; then
- echo "enable shared libraries"
- else
- echo "disable shared libraries"
- fi
- if test "$build_old_libs" = yes; then
- echo "enable static libraries"
- else
- echo "disable static libraries"
- fi
-
- exit $?
-}
-
-# func_enable_tag tagname
-# Verify that TAGNAME is valid, and either flag an error and exit, or
-# enable the TAGNAME tag. We also add TAGNAME to the global $taglist
-# variable here.
-func_enable_tag ()
-{
- # Global variable:
- tagname="$1"
-
- re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
- re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
- sed_extractcf="/$re_begincf/,/$re_endcf/p"
-
- # Validate tagname.
- case $tagname in
- *[!-_A-Za-z0-9,/]*)
- func_fatal_error "invalid tag name: $tagname"
- ;;
- esac
-
- # Don't test for the "default" C tag, as we know it's
- # there but not specially marked.
- case $tagname in
- CC) ;;
- *)
- if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
- taglist="$taglist $tagname"
-
- # Evaluate the configuration. Be careful to quote the path
- # and the sed script, to avoid splitting on whitespace, but
- # also don't use non-portable quotes within backquotes within
- # quotes we have to do it in 2 steps:
- extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
- eval "$extractedcf"
- else
- func_error "ignoring unknown tag $tagname"
- fi
- ;;
- esac
-}
-
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
- if test "$package_revision" != "$macro_revision"; then
- if test "$VERSION" != "$macro_version"; then
- if test -z "$macro_version"; then
- cat >&2 <<_LT_EOF
-$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
- else
- cat >&2 <<_LT_EOF
-$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
- fi
- else
- cat >&2 <<_LT_EOF
-$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
- fi
-
- exit $EXIT_MISMATCH
- fi
-}
-
-
-# Shorthand for --mode=foo, only valid as the first argument
-case $1 in
-clean|clea|cle|cl)
- shift; set dummy --mode clean ${1+"$@"}; shift
- ;;
-compile|compil|compi|comp|com|co|c)
- shift; set dummy --mode compile ${1+"$@"}; shift
- ;;
-execute|execut|execu|exec|exe|ex|e)
- shift; set dummy --mode execute ${1+"$@"}; shift
- ;;
-finish|finis|fini|fin|fi|f)
- shift; set dummy --mode finish ${1+"$@"}; shift
- ;;
-install|instal|insta|inst|ins|in|i)
- shift; set dummy --mode install ${1+"$@"}; shift
- ;;
-link|lin|li|l)
- shift; set dummy --mode link ${1+"$@"}; shift
- ;;
-uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
- shift; set dummy --mode uninstall ${1+"$@"}; shift
- ;;
-esac
-
-
-
-# Option defaults:
-opt_debug=:
-opt_dry_run=false
-opt_config=false
-opt_preserve_dup_deps=false
-opt_features=false
-opt_finish=false
-opt_help=false
-opt_help_all=false
-opt_silent=:
-opt_warning=:
-opt_verbose=:
-opt_silent=false
-opt_verbose=false
-
-
-# Parse options once, thoroughly. This comes as soon as possible in the
-# script to make things like `--version' happen as quickly as we can.
-{
- # this just eases exit handling
- while test $# -gt 0; do
- opt="$1"
- shift
- case $opt in
- --debug|-x) opt_debug='set -x'
- func_echo "enabling shell trace mode"
- $opt_debug
- ;;
- --dry-run|--dryrun|-n)
- opt_dry_run=:
- ;;
- --config)
- opt_config=:
-func_config
- ;;
- --dlopen|-dlopen)
- optarg="$1"
- opt_dlopen="${opt_dlopen+$opt_dlopen
-}$optarg"
- shift
- ;;
- --preserve-dup-deps)
- opt_preserve_dup_deps=:
- ;;
- --features)
- opt_features=:
-func_features
- ;;
- --finish)
- opt_finish=:
-set dummy --mode finish ${1+"$@"}; shift
- ;;
- --help)
- opt_help=:
- ;;
- --help-all)
- opt_help_all=:
-opt_help=': help-all'
- ;;
- --mode)
- test $# = 0 && func_missing_arg $opt && break
- optarg="$1"
- opt_mode="$optarg"
-case $optarg in
- # Valid mode arguments:
- clean|compile|execute|finish|install|link|relink|uninstall) ;;
-
- # Catch anything else as an error
- *) func_error "invalid argument for $opt"
- exit_cmd=exit
- break
- ;;
-esac
- shift
- ;;
- --no-silent|--no-quiet)
- opt_silent=false
-func_append preserve_args " $opt"
- ;;
- --no-warning|--no-warn)
- opt_warning=false
-func_append preserve_args " $opt"
- ;;
- --no-verbose)
- opt_verbose=false
-func_append preserve_args " $opt"
- ;;
- --silent|--quiet)
- opt_silent=:
-func_append preserve_args " $opt"
- opt_verbose=false
- ;;
- --verbose|-v)
- opt_verbose=:
-func_append preserve_args " $opt"
-opt_silent=false
- ;;
- --tag)
- test $# = 0 && func_missing_arg $opt && break
- optarg="$1"
- opt_tag="$optarg"
-func_append preserve_args " $opt $optarg"
-func_enable_tag "$optarg"
- shift
- ;;
-
- -\?|-h) func_usage ;;
- --help) func_help ;;
- --version) func_version ;;
-
- # Separate optargs to long options:
- --*=*)
- func_split_long_opt "$opt"
- set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
- shift
- ;;
-
- # Separate non-argument short options:
- -\?*|-h*|-n*|-v*)
- func_split_short_opt "$opt"
- set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
- shift
- ;;
-
- --) break ;;
- -*) func_fatal_help "unrecognized option \`$opt'" ;;
- *) set dummy "$opt" ${1+"$@"}; shift; break ;;
- esac
- done
-
- # Validate options:
-
- # save first non-option argument
- if test "$#" -gt 0; then
- nonopt="$opt"
- shift
- fi
-
- # preserve --debug
- test "$opt_debug" = : || func_append preserve_args " --debug"
-
- case $host in
- *cygwin* | *mingw* | *pw32* | *cegcc*)
- # don't eliminate duplications in $postdeps and $predeps
- opt_duplicate_compiler_generated_deps=:
- ;;
- *)
- opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
- ;;
- esac
-
- $opt_help || {
- # Sanity checks first:
- func_check_version_match
-
- if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
- func_fatal_configuration "not configured to build any kind of library"
- fi
-
- # Darwin sucks
- eval std_shrext=\"$shrext_cmds\"
-
- # Only execute mode is allowed to have -dlopen flags.
- if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
- func_error "unrecognized option \`-dlopen'"
- $ECHO "$help" 1>&2
- exit $EXIT_FAILURE
- fi
-
- # Change the help message to a mode-specific one.
- generic_help="$help"
- help="Try \`$progname --help --mode=$opt_mode' for more information."
- }
-
-
- # Bail if the options were screwed
- $exit_cmd $EXIT_FAILURE
-}
-
-
-
-
-## ----------- ##
-## Main. ##
-## ----------- ##
-
-# func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_lalib_p ()
-{
- test -f "$1" &&
- $SED -e 4q "$1" 2>/dev/null \
- | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
-}
-
-# func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function implements the same check as func_lalib_p without
-# resorting to external programs. To this end, it redirects stdin and
-# closes it afterwards, without saving the original file descriptor.
-# As a safety measure, use it only where a negative result would be
-# fatal anyway. Works if `file' does not exist.
-func_lalib_unsafe_p ()
-{
- lalib_p=no
- if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
- for lalib_p_l in 1 2 3 4
- do
- read lalib_p_line
- case "$lalib_p_line" in
- \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
- esac
- done
- exec 0<&5 5<&-
- fi
- test "$lalib_p" = yes
-}
-
-# func_ltwrapper_script_p file
-# True iff FILE is a libtool wrapper script
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_script_p ()
-{
- func_lalib_p "$1"
-}
-
-# func_ltwrapper_executable_p file
-# True iff FILE is a libtool wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_executable_p ()
-{
- func_ltwrapper_exec_suffix=
- case $1 in
- *.exe) ;;
- *) func_ltwrapper_exec_suffix=.exe ;;
- esac
- $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
-}
-
-# func_ltwrapper_scriptname file
-# Assumes file is an ltwrapper_executable
-# uses $file to determine the appropriate filename for a
-# temporary ltwrapper_script.
-func_ltwrapper_scriptname ()
-{
- func_dirname_and_basename "$1" "" "."
- func_stripname '' '.exe' "$func_basename_result"
- func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
-}
-
-# func_ltwrapper_p file
-# True iff FILE is a libtool wrapper script or wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_p ()
-{
- func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
-}
-
-
-# func_execute_cmds commands fail_cmd
-# Execute tilde-delimited COMMANDS.
-# If FAIL_CMD is given, eval that upon failure.
-# FAIL_CMD may read-access the current command in variable CMD!
-func_execute_cmds ()
-{
- $opt_debug
- save_ifs=$IFS; IFS='~'
- for cmd in $1; do
- IFS=$save_ifs
- eval cmd=\"$cmd\"
- func_show_eval "$cmd" "${2-:}"
- done
- IFS=$save_ifs
-}
-
-
-# func_source file
-# Source FILE, adding directory component if necessary.
-# Note that it is not necessary on cygwin/mingw to append a dot to
-# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
-# behavior happens only for exec(3), not for open(2)! Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
-func_source ()
-{
- $opt_debug
- case $1 in
- */* | *\\*) . "$1" ;;
- *) . "./$1" ;;
- esac
-}
-
-
-# func_resolve_sysroot PATH
-# Replace a leading = in PATH with a sysroot. Store the result into
-# func_resolve_sysroot_result
-func_resolve_sysroot ()
-{
- func_resolve_sysroot_result=$1
- case $func_resolve_sysroot_result in
- =*)
- func_stripname '=' '' "$func_resolve_sysroot_result"
- func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
- ;;
- esac
-}
-
-# func_replace_sysroot PATH
-# If PATH begins with the sysroot, replace it with = and
-# store the result into func_replace_sysroot_result.
-func_replace_sysroot ()
-{
- case "$lt_sysroot:$1" in
- ?*:"$lt_sysroot"*)
- func_stripname "$lt_sysroot" '' "$1"
- func_replace_sysroot_result="=$func_stripname_result"
- ;;
- *)
- # Including no sysroot.
- func_replace_sysroot_result=$1
- ;;
- esac
-}
-
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
-{
- $opt_debug
- if test -n "$available_tags" && test -z "$tagname"; then
- CC_quoted=
- for arg in $CC; do
- func_append_quoted CC_quoted "$arg"
- done
- CC_expanded=`func_echo_all $CC`
- CC_quoted_expanded=`func_echo_all $CC_quoted`
- case $@ in
- # Blanks in the command may have been stripped by the calling shell,
- # but not from the CC environment variable when configure was run.
- " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
- " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
- # Blanks at the start of $base_compile will cause this to fail
- # if we don't check for them as well.
- *)
- for z in $available_tags; do
- if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
- # Evaluate the configuration.
- eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
- CC_quoted=
- for arg in $CC; do
- # Double-quote args containing other shell metacharacters.
- func_append_quoted CC_quoted "$arg"
- done
- CC_expanded=`func_echo_all $CC`
- CC_quoted_expanded=`func_echo_all $CC_quoted`
- case "$@ " in
- " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
- " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
- # The compiler in the base compile command matches
- # the one in the tagged configuration.
- # Assume this is the tagged configuration we want.
- tagname=$z
- break
- ;;
- esac
- fi
- done
- # If $tagname still isn't set, then no tagged configuration
- # was found and let the user know that the "--tag" command
- # line option must be used.
- if test -z "$tagname"; then
- func_echo "unable to infer tagged configuration"
- func_fatal_error "specify a tag with \`--tag'"
-# else
-# func_verbose "using $tagname tagged configuration"
- fi
- ;;
- esac
- fi
-}
-
-
-
-# func_write_libtool_object output_name pic_name nonpic_name
-# Create a libtool object file (analogous to a ".la" file),
-# but don't create it if we're doing a dry run.
-func_write_libtool_object ()
-{
- write_libobj=${1}
- if test "$build_libtool_libs" = yes; then
- write_lobj=\'${2}\'
- else
- write_lobj=none
- fi
-
- if test "$build_old_libs" = yes; then
- write_oldobj=\'${3}\'
- else
- write_oldobj=none
- fi
-
- $opt_dry_run || {
- cat >${write_libobj}T <<EOF
-# $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-pic_object=$write_lobj
-
-# Name of the non-PIC object
-non_pic_object=$write_oldobj
-
-EOF
- $MV "${write_libobj}T" "${write_libobj}"
- }
-}
-
-
-##################################################
-# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
-##################################################
-
-# func_convert_core_file_wine_to_w32 ARG
-# Helper function used by file name conversion functions when $build is *nix,
-# and $host is mingw, cygwin, or some other w32 environment. Relies on a
-# correctly configured wine environment available, with the winepath program
-# in $build's $PATH.
-#
-# ARG is the $build file name to be converted to w32 format.
-# Result is available in $func_convert_core_file_wine_to_w32_result, and will
-# be empty on error (or when ARG is empty)
-func_convert_core_file_wine_to_w32 ()
-{
- $opt_debug
- func_convert_core_file_wine_to_w32_result="$1"
- if test -n "$1"; then
- # Unfortunately, winepath does not exit with a non-zero error code, so we
- # are forced to check the contents of stdout. On the other hand, if the
- # command is not found, the shell will set an exit code of 127 and print
- # *an error message* to stdout. So we must check for both error code of
- # zero AND non-empty stdout, which explains the odd construction:
- func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
- if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
- func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
- $SED -e "$lt_sed_naive_backslashify"`
- else
- func_convert_core_file_wine_to_w32_result=
- fi
- fi
-}
-# end: func_convert_core_file_wine_to_w32
-
-
-# func_convert_core_path_wine_to_w32 ARG
-# Helper function used by path conversion functions when $build is *nix, and
-# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
-# configured wine environment available, with the winepath program in $build's
-# $PATH. Assumes ARG has no leading or trailing path separator characters.
-#
-# ARG is path to be converted from $build format to win32.
-# Result is available in $func_convert_core_path_wine_to_w32_result.
-# Unconvertible file (directory) names in ARG are skipped; if no directory names
-# are convertible, then the result may be empty.
-func_convert_core_path_wine_to_w32 ()
-{
- $opt_debug
- # unfortunately, winepath doesn't convert paths, only file names
- func_convert_core_path_wine_to_w32_result=""
- if test -n "$1"; then
- oldIFS=$IFS
- IFS=:
- for func_convert_core_path_wine_to_w32_f in $1; do
- IFS=$oldIFS
- func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
- if test -n "$func_convert_core_file_wine_to_w32_result" ; then
- if test -z "$func_convert_core_path_wine_to_w32_result"; then
- func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
- else
- func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
- fi
- fi
- done
- IFS=$oldIFS
- fi
-}
-# end: func_convert_core_path_wine_to_w32
-
-
-# func_cygpath ARGS...
-# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
-# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
-# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
-# (2), returns the Cygwin file name or path in func_cygpath_result (input
-# file name or path is assumed to be in w32 format, as previously converted
-# from $build's *nix or MSYS format). In case (3), returns the w32 file name
-# or path in func_cygpath_result (input file name or path is assumed to be in
-# Cygwin format). Returns an empty string on error.
-#
-# ARGS are passed to cygpath, with the last one being the file name or path to
-# be converted.
-#
-# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
-# environment variable; do not put it in $PATH.
-func_cygpath ()
-{
- $opt_debug
- if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
- func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
- if test "$?" -ne 0; then
- # on failure, ensure result is empty
- func_cygpath_result=
- fi
- else
- func_cygpath_result=
- func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
- fi
-}
-#end: func_cygpath
-
-
-# func_convert_core_msys_to_w32 ARG
-# Convert file name or path ARG from MSYS format to w32 format. Return
-# result in func_convert_core_msys_to_w32_result.
-func_convert_core_msys_to_w32 ()
-{
- $opt_debug
- # awkward: cmd appends spaces to result
- func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
- $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
-}
-#end: func_convert_core_msys_to_w32
-
-
-# func_convert_file_check ARG1 ARG2
-# Verify that ARG1 (a file name in $build format) was converted to $host
-# format in ARG2. Otherwise, emit an error message, but continue (resetting
-# func_to_host_file_result to ARG1).
-func_convert_file_check ()
-{
- $opt_debug
- if test -z "$2" && test -n "$1" ; then
- func_error "Could not determine host file name corresponding to"
- func_error " \`$1'"
- func_error "Continuing, but uninstalled executables may not work."
- # Fallback:
- func_to_host_file_result="$1"
- fi
-}
-# end func_convert_file_check
-
-
-# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
-# Verify that FROM_PATH (a path in $build format) was converted to $host
-# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
-# func_to_host_file_result to a simplistic fallback value (see below).
-func_convert_path_check ()
-{
- $opt_debug
- if test -z "$4" && test -n "$3"; then
- func_error "Could not determine the host path corresponding to"
- func_error " \`$3'"
- func_error "Continuing, but uninstalled executables may not work."
- # Fallback. This is a deliberately simplistic "conversion" and
- # should not be "improved". See libtool.info.
- if test "x$1" != "x$2"; then
- lt_replace_pathsep_chars="s|$1|$2|g"
- func_to_host_path_result=`echo "$3" |
- $SED -e "$lt_replace_pathsep_chars"`
- else
- func_to_host_path_result="$3"
- fi
- fi
-}
-# end func_convert_path_check
-
-
-# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
-# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
-# and appending REPL if ORIG matches BACKPAT.
-func_convert_path_front_back_pathsep ()
-{
- $opt_debug
- case $4 in
- $1 ) func_to_host_path_result="$3$func_to_host_path_result"
- ;;
- esac
- case $4 in
- $2 ) func_append func_to_host_path_result "$3"
- ;;
- esac
-}
-# end func_convert_path_front_back_pathsep
-
-
-##################################################
-# $build to $host FILE NAME CONVERSION FUNCTIONS #
-##################################################
-# invoked via `$to_host_file_cmd ARG'
-#
-# In each case, ARG is the path to be converted from $build to $host format.
-# Result will be available in $func_to_host_file_result.
-
-
-# func_to_host_file ARG
-# Converts the file name ARG from $build format to $host format. Return result
-# in func_to_host_file_result.
-func_to_host_file ()
-{
- $opt_debug
- $to_host_file_cmd "$1"
-}
-# end func_to_host_file
-
-
-# func_to_tool_file ARG LAZY
-# converts the file name ARG from $build format to toolchain format. Return
-# result in func_to_tool_file_result. If the conversion in use is listed
-# in (the comma separated) LAZY, no conversion takes place.
-func_to_tool_file ()
-{
- $opt_debug
- case ,$2, in
- *,"$to_tool_file_cmd",*)
- func_to_tool_file_result=$1
- ;;
- *)
- $to_tool_file_cmd "$1"
- func_to_tool_file_result=$func_to_host_file_result
- ;;
- esac
-}
-# end func_to_tool_file
-
-
-# func_convert_file_noop ARG
-# Copy ARG to func_to_host_file_result.
-func_convert_file_noop ()
-{
- func_to_host_file_result="$1"
-}
-# end func_convert_file_noop
-
-
-# func_convert_file_msys_to_w32 ARG
-# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
-# conversion to w32 is not available inside the cwrapper. Returns result in
-# func_to_host_file_result.
-func_convert_file_msys_to_w32 ()
-{
- $opt_debug
- func_to_host_file_result="$1"
- if test -n "$1"; then
- func_convert_core_msys_to_w32 "$1"
- func_to_host_file_result="$func_convert_core_msys_to_w32_result"
- fi
- func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_msys_to_w32
-
-
-# func_convert_file_cygwin_to_w32 ARG
-# Convert file name ARG from Cygwin to w32 format. Returns result in
-# func_to_host_file_result.
-func_convert_file_cygwin_to_w32 ()
-{
- $opt_debug
- func_to_host_file_result="$1"
- if test -n "$1"; then
- # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
- # LT_CYGPATH in this case.
- func_to_host_file_result=`cygpath -m "$1"`
- fi
- func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_cygwin_to_w32
-
-
-# func_convert_file_nix_to_w32 ARG
-# Convert file name ARG from *nix to w32 format. Requires a wine environment
-# and a working winepath. Returns result in func_to_host_file_result.
-func_convert_file_nix_to_w32 ()
-{
- $opt_debug
- func_to_host_file_result="$1"
- if test -n "$1"; then
- func_convert_core_file_wine_to_w32 "$1"
- func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
- fi
- func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_nix_to_w32
-
-
-# func_convert_file_msys_to_cygwin ARG
-# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set.
-# Returns result in func_to_host_file_result.
-func_convert_file_msys_to_cygwin ()
-{
- $opt_debug
- func_to_host_file_result="$1"
- if test -n "$1"; then
- func_convert_core_msys_to_w32 "$1"
- func_cygpath -u "$func_convert_core_msys_to_w32_result"
- func_to_host_file_result="$func_cygpath_result"
- fi
- func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_msys_to_cygwin
-
-
-# func_convert_file_nix_to_cygwin ARG
-# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed
-# in a wine environment, working winepath, and LT_CYGPATH set. Returns result
-# in func_to_host_file_result.
-func_convert_file_nix_to_cygwin ()
-{
- $opt_debug
- func_to_host_file_result="$1"
- if test -n "$1"; then
- # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
- func_convert_core_file_wine_to_w32 "$1"
- func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
- func_to_host_file_result="$func_cygpath_result"
- fi
- func_convert_file_check "$1" "$func_to_host_file_result"
-}
-# end func_convert_file_nix_to_cygwin
-
-
-#############################################
-# $build to $host PATH CONVERSION FUNCTIONS #
-#############################################
-# invoked via `$to_host_path_cmd ARG'
-#
-# In each case, ARG is the path to be converted from $build to $host format.
-# The result will be available in $func_to_host_path_result.
-#
-# Path separators are also converted from $build format to $host format. If
-# ARG begins or ends with a path separator character, it is preserved (but
-# converted to $host format) on output.
-#
-# All path conversion functions are named using the following convention:
-# file name conversion function : func_convert_file_X_to_Y ()
-# path conversion function : func_convert_path_X_to_Y ()
-# where, for any given $build/$host combination the 'X_to_Y' value is the
-# same. If conversion functions are added for new $build/$host combinations,
-# the two new functions must follow this pattern, or func_init_to_host_path_cmd
-# will break.
-
-
-# func_init_to_host_path_cmd
-# Ensures that function "pointer" variable $to_host_path_cmd is set to the
-# appropriate value, based on the value of $to_host_file_cmd.
-to_host_path_cmd=
-func_init_to_host_path_cmd ()
-{
- $opt_debug
- if test -z "$to_host_path_cmd"; then
- func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
- to_host_path_cmd="func_convert_path_${func_stripname_result}"
- fi
-}
-
-
-# func_to_host_path ARG
-# Converts the path ARG from $build format to $host format. Return result
-# in func_to_host_path_result.
-func_to_host_path ()
-{
- $opt_debug
- func_init_to_host_path_cmd
- $to_host_path_cmd "$1"
-}
-# end func_to_host_path
-
-
-# func_convert_path_noop ARG
-# Copy ARG to func_to_host_path_result.
-func_convert_path_noop ()
-{
- func_to_host_path_result="$1"
-}
-# end func_convert_path_noop
-
-
-# func_convert_path_msys_to_w32 ARG
-# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
-# conversion to w32 is not available inside the cwrapper. Returns result in
-# func_to_host_path_result.
-func_convert_path_msys_to_w32 ()
-{
- $opt_debug
- func_to_host_path_result="$1"
- if test -n "$1"; then
- # Remove leading and trailing path separator characters from ARG. MSYS
- # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
- # and winepath ignores them completely.
- func_stripname : : "$1"
- func_to_host_path_tmp1=$func_stripname_result
- func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
- func_to_host_path_result="$func_convert_core_msys_to_w32_result"
- func_convert_path_check : ";" \
- "$func_to_host_path_tmp1" "$func_to_host_path_result"
- func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
- fi
-}
-# end func_convert_path_msys_to_w32
-
-
-# func_convert_path_cygwin_to_w32 ARG
-# Convert path ARG from Cygwin to w32 format. Returns result in
-# func_to_host_file_result.
-func_convert_path_cygwin_to_w32 ()
-{
- $opt_debug
- func_to_host_path_result="$1"
- if test -n "$1"; then
- # See func_convert_path_msys_to_w32:
- func_stripname : : "$1"
- func_to_host_path_tmp1=$func_stripname_result
- func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
- func_convert_path_check : ";" \
- "$func_to_host_path_tmp1" "$func_to_host_path_result"
- func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
- fi
-}
-# end func_convert_path_cygwin_to_w32
-
-
-# func_convert_path_nix_to_w32 ARG
-# Convert path ARG from *nix to w32 format. Requires a wine environment and
-# a working winepath. Returns result in func_to_host_file_result.
-func_convert_path_nix_to_w32 ()
-{
- $opt_debug
- func_to_host_path_result="$1"
- if test -n "$1"; then
- # See func_convert_path_msys_to_w32:
- func_stripname : : "$1"
- func_to_host_path_tmp1=$func_stripname_result
- func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
- func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
- func_convert_path_check : ";" \
- "$func_to_host_path_tmp1" "$func_to_host_path_result"
- func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
- fi
-}
-# end func_convert_path_nix_to_w32
-
-
-# func_convert_path_msys_to_cygwin ARG
-# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set.
-# Returns result in func_to_host_file_result.
-func_convert_path_msys_to_cygwin ()
-{
- $opt_debug
- func_to_host_path_result="$1"
- if test -n "$1"; then
- # See func_convert_path_msys_to_w32:
- func_stripname : : "$1"
- func_to_host_path_tmp1=$func_stripname_result
- func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
- func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
- func_to_host_path_result="$func_cygpath_result"
- func_convert_path_check : : \
- "$func_to_host_path_tmp1" "$func_to_host_path_result"
- func_convert_path_front_back_pathsep ":*" "*:" : "$1"
- fi
-}
-# end func_convert_path_msys_to_cygwin
-
-
-# func_convert_path_nix_to_cygwin ARG
-# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a
-# a wine environment, working winepath, and LT_CYGPATH set. Returns result in
-# func_to_host_file_result.
-func_convert_path_nix_to_cygwin ()
-{
- $opt_debug
- func_to_host_path_result="$1"
- if test -n "$1"; then
- # Remove leading and trailing path separator characters from
- # ARG. msys behavior is inconsistent here, cygpath turns them
- # into '.;' and ';.', and winepath ignores them completely.
- func_stripname : : "$1"
- func_to_host_path_tmp1=$func_stripname_result
- func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
- func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
- func_to_host_path_result="$func_cygpath_result"
- func_convert_path_check : : \
- "$func_to_host_path_tmp1" "$func_to_host_path_result"
- func_convert_path_front_back_pathsep ":*" "*:" : "$1"
- fi
-}
-# end func_convert_path_nix_to_cygwin
-
-
-# func_mode_compile arg...
-func_mode_compile ()
-{
- $opt_debug
- # Get the compilation command and the source file.
- base_compile=
- srcfile="$nonopt" # always keep a non-empty value in "srcfile"
- suppress_opt=yes
- suppress_output=
- arg_mode=normal
- libobj=
- later=
- pie_flag=
-
- for arg
- do
- case $arg_mode in
- arg )
- # do not "continue". Instead, add this to base_compile
- lastarg="$arg"
- arg_mode=normal
- ;;
-
- target )
- libobj="$arg"
- arg_mode=normal
- continue
- ;;
-
- normal )
- # Accept any command-line options.
- case $arg in
- -o)
- test -n "$libobj" && \
- func_fatal_error "you cannot specify \`-o' more than once"
- arg_mode=target
- continue
- ;;
-
- -pie | -fpie | -fPIE)
- func_append pie_flag " $arg"
- continue
- ;;
-
- -shared | -static | -prefer-pic | -prefer-non-pic)
- func_append later " $arg"
- continue
- ;;
-
- -no-suppress)
- suppress_opt=no
- continue
- ;;
-
- -Xcompiler)
- arg_mode=arg # the next one goes into the "base_compile" arg list
- continue # The current "srcfile" will either be retained or
- ;; # replaced later. I would guess that would be a bug.
-
- -Wc,*)
- func_stripname '-Wc,' '' "$arg"
- args=$func_stripname_result
- lastarg=
- save_ifs="$IFS"; IFS=','
- for arg in $args; do
- IFS="$save_ifs"
- func_append_quoted lastarg "$arg"
- done
- IFS="$save_ifs"
- func_stripname ' ' '' "$lastarg"
- lastarg=$func_stripname_result
-
- # Add the arguments to base_compile.
- func_append base_compile " $lastarg"
- continue
- ;;
-
- *)
- # Accept the current argument as the source file.
- # The previous "srcfile" becomes the current argument.
- #
- lastarg="$srcfile"
- srcfile="$arg"
- ;;
- esac # case $arg
- ;;
- esac # case $arg_mode
-
- # Aesthetically quote the previous argument.
- func_append_quoted base_compile "$lastarg"
- done # for arg
-
- case $arg_mode in
- arg)
- func_fatal_error "you must specify an argument for -Xcompile"
- ;;
- target)
- func_fatal_error "you must specify a target with \`-o'"
- ;;
- *)
- # Get the name of the library object.
- test -z "$libobj" && {
- func_basename "$srcfile"
- libobj="$func_basename_result"
- }
- ;;
- esac
-
- # Recognize several different file suffixes.
- # If the user specifies -o file.o, it is replaced with file.lo
- case $libobj in
- *.[cCFSifmso] | \
- *.ada | *.adb | *.ads | *.asm | \
- *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
- *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
- func_xform "$libobj"
- libobj=$func_xform_result
- ;;
- esac
-
- case $libobj in
- *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
- *)
- func_fatal_error "cannot determine name of library object from \`$libobj'"
- ;;
- esac
-
- func_infer_tag $base_compile
-
- for arg in $later; do
- case $arg in
- -shared)
- test "$build_libtool_libs" != yes && \
- func_fatal_configuration "can not build a shared library"
- build_old_libs=no
- continue
- ;;
-
- -static)
- build_libtool_libs=no
- build_old_libs=yes
- continue
- ;;
-
- -prefer-pic)
- pic_mode=yes
- continue
- ;;
-
- -prefer-non-pic)
- pic_mode=no
- continue
- ;;
- esac
- done
-
- func_quote_for_eval "$libobj"
- test "X$libobj" != "X$func_quote_for_eval_result" \
- && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \
- && func_warning "libobj name \`$libobj' may not contain shell special characters."
- func_dirname_and_basename "$obj" "/" ""
- objname="$func_basename_result"
- xdir="$func_dirname_result"
- lobj=${xdir}$objdir/$objname
-
- test -z "$base_compile" && \
- func_fatal_help "you must specify a compilation command"
-
- # Delete any leftover library objects.
- if test "$build_old_libs" = yes; then
- removelist="$obj $lobj $libobj ${libobj}T"
- else
- removelist="$lobj $libobj ${libobj}T"
- fi
-
- # On Cygwin there's no "real" PIC flag so we must build both object types
- case $host_os in
- cygwin* | mingw* | pw32* | os2* | cegcc*)
- pic_mode=default
- ;;
- esac
- if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
- # non-PIC code in shared libraries is not supported
- pic_mode=default
- fi
-
- # Calculate the filename of the output object if compiler does
- # not support -o with -c
- if test "$compiler_c_o" = no; then
- output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
- lockfile="$output_obj.lock"
- else
- output_obj=
- need_locks=no
- lockfile=
- fi
-
- # Lock this critical section if it is needed
- # We use this script file to make the link, it avoids creating a new file
- if test "$need_locks" = yes; then
- until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
- func_echo "Waiting for $lockfile to be removed"
- sleep 2
- done
- elif test "$need_locks" = warn; then
- if test -f "$lockfile"; then
- $ECHO "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
- $opt_dry_run || $RM $removelist
- exit $EXIT_FAILURE
- fi
- func_append removelist " $output_obj"
- $ECHO "$srcfile" > "$lockfile"
- fi
-
- $opt_dry_run || $RM $removelist
- func_append removelist " $lockfile"
- trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
-
- func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
- srcfile=$func_to_tool_file_result
- func_quote_for_eval "$srcfile"
- qsrcfile=$func_quote_for_eval_result
-
- # Only build a PIC object if we are building libtool libraries.
- if test "$build_libtool_libs" = yes; then
- # Without this assignment, base_compile gets emptied.
- fbsd_hideous_sh_bug=$base_compile
-
- if test "$pic_mode" != no; then
- command="$base_compile $qsrcfile $pic_flag"
- else
- # Don't build PIC code
- command="$base_compile $qsrcfile"
- fi
-
- func_mkdir_p "$xdir$objdir"
-
- if test -z "$output_obj"; then
- # Place PIC objects in $objdir
- func_append command " -o $lobj"
- fi
-
- func_show_eval_locale "$command" \
- 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
-
- if test "$need_locks" = warn &&
- test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
- $ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
- $opt_dry_run || $RM $removelist
- exit $EXIT_FAILURE
- fi
-
- # Just move the object if needed, then go on to compile the next one
- if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
- func_show_eval '$MV "$output_obj" "$lobj"' \
- 'error=$?; $opt_dry_run || $RM $removelist; exit $error'
- fi
-
- # Allow error messages only from the first compilation.
- if test "$suppress_opt" = yes; then
- suppress_output=' >/dev/null 2>&1'
- fi
- fi
-
- # Only build a position-dependent object if we build old libraries.
- if test "$build_old_libs" = yes; then
- if test "$pic_mode" != yes; then
- # Don't build PIC code
- command="$base_compile $qsrcfile$pie_flag"
- else
- command="$base_compile $qsrcfile $pic_flag"
- fi
- if test "$compiler_c_o" = yes; then
- func_append command " -o $obj"
- fi
-
- # Suppress compiler output if we already did a PIC compilation.
- func_append command "$suppress_output"
- func_show_eval_locale "$command" \
- '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
-
- if test "$need_locks" = warn &&
- test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
- $ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
- $opt_dry_run || $RM $removelist
- exit $EXIT_FAILURE
- fi
-
- # Just move the object if needed
- if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
- func_show_eval '$MV "$output_obj" "$obj"' \
- 'error=$?; $opt_dry_run || $RM $removelist; exit $error'
- fi
- fi
-
- $opt_dry_run || {
- func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
-
- # Unlock the critical section if it was locked
- if test "$need_locks" != no; then
- removelist=$lockfile
- $RM "$lockfile"
- fi
- }
-
- exit $EXIT_SUCCESS
-}
-
-$opt_help || {
- test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
-}
-
-func_mode_help ()
-{
- # We need to display help for each of the modes.
- case $opt_mode in
- "")
- # Generic help is extracted from the usage comments
- # at the start of this file.
- func_help
- ;;
-
- clean)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
- ;;
-
- compile)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
- -o OUTPUT-FILE set the output file name to OUTPUT-FILE
- -no-suppress do not suppress compiler output for multiple passes
- -prefer-pic try to build PIC objects only
- -prefer-non-pic try to build non-PIC objects only
- -shared do not build a \`.o' file suitable for static linking
- -static only build a \`.o' file suitable for static linking
- -Wc,FLAG pass FLAG directly to the compiler
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
- ;;
-
- execute)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
- -dlopen FILE add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
- ;;
-
- finish)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges. Use
-the \`--dry-run' option if you just want to see what would be executed."
- ;;
-
- install)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command. The first component should be
-either the \`install' or \`cp' program.
-
-The following components of INSTALL-COMMAND are treated specially:
-
- -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
- ;;
-
- link)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
- -all-static do not do any dynamic linking at all
- -avoid-version do not add a version suffix if possible
- -bindir BINDIR specify path to binaries directory (for systems where
- libraries must be found in the PATH setting at runtime)
- -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
- -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
- -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
- -export-symbols SYMFILE
- try to export only the symbols listed in SYMFILE
- -export-symbols-regex REGEX
- try to export only the symbols matching REGEX
- -LLIBDIR search LIBDIR for required installed libraries
- -lNAME OUTPUT-FILE requires the installed library libNAME
- -module build a library that can dlopened
- -no-fast-install disable the fast-install mode
- -no-install link a not-installable executable
- -no-undefined declare that a library does not refer to external symbols
- -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
- -objectlist FILE Use a list of object files found in FILE to specify objects
- -precious-files-regex REGEX
- don't remove output files matching REGEX
- -release RELEASE specify package release information
- -rpath LIBDIR the created library will eventually be installed in LIBDIR
- -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
- -shared only do dynamic linking of libtool libraries
- -shrext SUFFIX override the standard shared library file extension
- -static do not do any dynamic linking of uninstalled libtool libraries
- -static-libtool-libs
- do not do any dynamic linking of libtool libraries
- -version-info CURRENT[:REVISION[:AGE]]
- specify library version info [each variable defaults to 0]
- -weak LIBNAME declare that the target provides the LIBNAME interface
- -Wc,FLAG
- -Xcompiler FLAG pass linker-specific FLAG directly to the compiler
- -Wl,FLAG
- -Xlinker FLAG pass linker-specific FLAG directly to the linker
- -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC)
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename. Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
- ;;
-
- uninstall)
- $ECHO \
-"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
- ;;
-
- *)
- func_fatal_help "invalid operation mode \`$opt_mode'"
- ;;
- esac
-
- echo
- $ECHO "Try \`$progname --help' for more information about other modes."
-}
-
-# Now that we've collected a possible --mode arg, show help if necessary
-if $opt_help; then
- if test "$opt_help" = :; then
- func_mode_help
- else
- {
- func_help noexit
- for opt_mode in compile link execute install finish uninstall clean; do
- func_mode_help
- done
- } | sed -n '1p; 2,$s/^Usage:/ or: /p'
- {
- func_help noexit
- for opt_mode in compile link execute install finish uninstall clean; do
- echo
- func_mode_help
- done
- } |
- sed '1d
- /^When reporting/,/^Report/{
- H
- d
- }
- $x
- /information about other modes/d
- /more detailed .*MODE/d
- s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
- fi
- exit $?
-fi
-
-
-# func_mode_execute arg...
-func_mode_execute ()
-{
- $opt_debug
- # The first argument is the command name.
- cmd="$nonopt"
- test -z "$cmd" && \
- func_fatal_help "you must specify a COMMAND"
-
- # Handle -dlopen flags immediately.
- for file in $opt_dlopen; do
- test -f "$file" \
- || func_fatal_help "\`$file' is not a file"
-
- dir=
- case $file in
- *.la)
- func_resolve_sysroot "$file"
- file=$func_resolve_sysroot_result
-
- # Check to see that this really is a libtool archive.
- func_lalib_unsafe_p "$file" \
- || func_fatal_help "\`$lib' is not a valid libtool archive"
-
- # Read the libtool library.
- dlname=
- library_names=
- func_source "$file"
-
- # Skip this library if it cannot be dlopened.
- if test -z "$dlname"; then
- # Warn if it was a shared library.
- test -n "$library_names" && \
- func_warning "\`$file' was not linked with \`-export-dynamic'"
- continue
- fi
-
- func_dirname "$file" "" "."
- dir="$func_dirname_result"
-
- if test -f "$dir/$objdir/$dlname"; then
- func_append dir "/$objdir"
- else
- if test ! -f "$dir/$dlname"; then
- func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
- fi
- fi
- ;;
-
- *.lo)
- # Just add the directory containing the .lo file.
- func_dirname "$file" "" "."
- dir="$func_dirname_result"
- ;;
-
- *)
- func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
- continue
- ;;
- esac
-
- # Get the absolute pathname.
- absdir=`cd "$dir" && pwd`
- test -n "$absdir" && dir="$absdir"
-
- # Now add the directory to shlibpath_var.
- if eval "test -z \"\$$shlibpath_var\""; then
- eval "$shlibpath_var=\"\$dir\""
- else
- eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
- fi
- done
-
- # This variable tells wrapper scripts just to set shlibpath_var
- # rather than running their programs.
- libtool_execute_magic="$magic"
-
- # Check if any of the arguments is a wrapper script.
- args=
- for file
- do
- case $file in
- -* | *.la | *.lo ) ;;
- *)
- # Do a test to see if this is really a libtool program.
- if func_ltwrapper_script_p "$file"; then
- func_source "$file"
- # Transform arg to wrapped name.
- file="$progdir/$program"
- elif func_ltwrapper_executable_p "$file"; then
- func_ltwrapper_scriptname "$file"
- func_source "$func_ltwrapper_scriptname_result"
- # Transform arg to wrapped name.
- file="$progdir/$program"
- fi
- ;;
- esac
- # Quote arguments (to preserve shell metacharacters).
- func_append_quoted args "$file"
- done
-
- if test "X$opt_dry_run" = Xfalse; then
- if test -n "$shlibpath_var"; then
- # Export the shlibpath_var.
- eval "export $shlibpath_var"
- fi
-
- # Restore saved environment variables
- for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
- do
- eval "if test \"\${save_$lt_var+set}\" = set; then
- $lt_var=\$save_$lt_var; export $lt_var
- else
- $lt_unset $lt_var
- fi"
- done
-
- # Now prepare to actually exec the command.
- exec_cmd="\$cmd$args"
- else
- # Display what would be done.
- if test -n "$shlibpath_var"; then
- eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
- echo "export $shlibpath_var"
- fi
- $ECHO "$cmd$args"
- exit $EXIT_SUCCESS
- fi
-}
-
-test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
-
-
-# func_mode_finish arg...
-func_mode_finish ()
-{
- $opt_debug
- libs=
- libdirs=
- admincmds=
-
- for opt in "$nonopt" ${1+"$@"}
- do
- if test -d "$opt"; then
- func_append libdirs " $opt"
-
- elif test -f "$opt"; then
- if func_lalib_unsafe_p "$opt"; then
- func_append libs " $opt"
- else
- func_warning "\`$opt' is not a valid libtool archive"
- fi
-
- else
- func_fatal_error "invalid argument \`$opt'"
- fi
- done
-
- if test -n "$libs"; then
- if test -n "$lt_sysroot"; then
- sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
- sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
- else
- sysroot_cmd=
- fi
-
- # Remove sysroot references
- if $opt_dry_run; then
- for lib in $libs; do
- echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
- done
- else
- tmpdir=`func_mktempdir`
- for lib in $libs; do
- sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
- > $tmpdir/tmp-la
- mv -f $tmpdir/tmp-la $lib
- done
- ${RM}r "$tmpdir"
- fi
- fi
-
- if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
- for libdir in $libdirs; do
- if test -n "$finish_cmds"; then
- # Do each command in the finish commands.
- func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
-'"$cmd"'"'
- fi
- if test -n "$finish_eval"; then
- # Do the single finish_eval.
- eval cmds=\"$finish_eval\"
- $opt_dry_run || eval "$cmds" || func_append admincmds "
- $cmds"
- fi
- done
- fi
-
- # Exit here if they wanted silent mode.
- $opt_silent && exit $EXIT_SUCCESS
-
- if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
- echo "----------------------------------------------------------------------"
- echo "Libraries have been installed in:"
- for libdir in $libdirs; do
- $ECHO " $libdir"
- done
- echo
- echo "If you ever happen to want to link against installed libraries"
- echo "in a given directory, LIBDIR, you must either use libtool, and"
- echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
- echo "flag during linking and do at least one of the following:"
- if test -n "$shlibpath_var"; then
- echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
- echo " during execution"
- fi
- if test -n "$runpath_var"; then
- echo " - add LIBDIR to the \`$runpath_var' environment variable"
- echo " during linking"
- fi
- if test -n "$hardcode_libdir_flag_spec"; then
- libdir=LIBDIR
- eval flag=\"$hardcode_libdir_flag_spec\"
-
- $ECHO " - use the \`$flag' linker flag"
- fi
- if test -n "$admincmds"; then
- $ECHO " - have your system administrator run these commands:$admincmds"
- fi
- if test -f /etc/ld.so.conf; then
- echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
- fi
- echo
-
- echo "See any operating system documentation about shared libraries for"
- case $host in
- solaris2.[6789]|solaris2.1[0-9])
- echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
- echo "pages."
- ;;
- *)
- echo "more information, such as the ld(1) and ld.so(8) manual pages."
- ;;
- esac
- echo "----------------------------------------------------------------------"
- fi
- exit $EXIT_SUCCESS
-}
-
-test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
-
-
-# func_mode_install arg...
-func_mode_install ()
-{
- $opt_debug
- # There may be an optional sh(1) argument at the beginning of
- # install_prog (especially on Windows NT).
- if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
- # Allow the use of GNU shtool's install command.
- case $nonopt in *shtool*) :;; *) false;; esac; then
- # Aesthetically quote it.
- func_quote_for_eval "$nonopt"
- install_prog="$func_quote_for_eval_result "
- arg=$1
- shift
- else
- install_prog=
- arg=$nonopt
- fi
-
- # The real first argument should be the name of the installation program.
- # Aesthetically quote it.
- func_quote_for_eval "$arg"
- func_append install_prog "$func_quote_for_eval_result"
- install_shared_prog=$install_prog
- case " $install_prog " in
- *[\\\ /]cp\ *) install_cp=: ;;
- *) install_cp=false ;;
- esac
-
- # We need to accept at least all the BSD install flags.
- dest=
- files=
- opts=
- prev=
- install_type=
- isdir=no
- stripme=
- no_mode=:
- for arg
- do
- arg2=
- if test -n "$dest"; then
- func_append files " $dest"
- dest=$arg
- continue
- fi
-
- case $arg in
- -d) isdir=yes ;;
- -f)
- if $install_cp; then :; else
- prev=$arg
- fi
- ;;
- -g | -m | -o)
- prev=$arg
- ;;
- -s)
- stripme=" -s"
- continue
- ;;
- -*)
- ;;
- *)
- # If the previous option needed an argument, then skip it.
- if test -n "$prev"; then
- if test "x$prev" = x-m && test -n "$install_override_mode"; then
- arg2=$install_override_mode
- no_mode=false
- fi
- prev=
- else
- dest=$arg
- continue
- fi
- ;;
- esac
-
- # Aesthetically quote the argument.
- func_quote_for_eval "$arg"
- func_append install_prog " $func_quote_for_eval_result"
- if test -n "$arg2"; then
- func_quote_for_eval "$arg2"
- fi
- func_append install_shared_prog " $func_quote_for_eval_result"
- done
-
- test -z "$install_prog" && \
- func_fatal_help "you must specify an install program"
-
- test -n "$prev" && \
- func_fatal_help "the \`$prev' option requires an argument"
-
- if test -n "$install_override_mode" && $no_mode; then
- if $install_cp; then :; else
- func_quote_for_eval "$install_override_mode"
- func_append install_shared_prog " -m $func_quote_for_eval_result"
- fi
- fi
-
- if test -z "$files"; then
- if test -z "$dest"; then
- func_fatal_help "no file or destination specified"
- else
- func_fatal_help "you must specify a destination"
- fi
- fi
-
- # Strip any trailing slash from the destination.
- func_stripname '' '/' "$dest"
- dest=$func_stripname_result
-
- # Check to see that the destination is a directory.
- test -d "$dest" && isdir=yes
- if test "$isdir" = yes; then
- destdir="$dest"
- destname=
- else
- func_dirname_and_basename "$dest" "" "."
- destdir="$func_dirname_result"
- destname="$func_basename_result"
-
- # Not a directory, so check to see that there is only one file specified.
- set dummy $files; shift
- test "$#" -gt 1 && \
- func_fatal_help "\`$dest' is not a directory"
- fi
- case $destdir in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- for file in $files; do
- case $file in
- *.lo) ;;
- *)
- func_fatal_help "\`$destdir' must be an absolute directory name"
- ;;
- esac
- done
- ;;
- esac
-
- # This variable tells wrapper scripts just to set variables rather
- # than running their programs.
- libtool_install_magic="$magic"
-
- staticlibs=
- future_libdirs=
- current_libdirs=
- for file in $files; do
-
- # Do each installation.
- case $file in
- *.$libext)
- # Do the static libraries later.
- func_append staticlibs " $file"
- ;;
-
- *.la)
- func_resolve_sysroot "$file"
- file=$func_resolve_sysroot_result
-
- # Check to see that this really is a libtool archive.
- func_lalib_unsafe_p "$file" \
- || func_fatal_help "\`$file' is not a valid libtool archive"
-
- library_names=
- old_library=
- relink_command=
- func_source "$file"
-
- # Add the libdir to current_libdirs if it is the destination.
- if test "X$destdir" = "X$libdir"; then
- case "$current_libdirs " in
- *" $libdir "*) ;;
- *) func_append current_libdirs " $libdir" ;;
- esac
- else
- # Note the libdir as a future libdir.
- case "$future_libdirs " in
- *" $libdir "*) ;;
- *) func_append future_libdirs " $libdir" ;;
- esac
- fi
-
- func_dirname "$file" "/" ""
- dir="$func_dirname_result"
- func_append dir "$objdir"
-
- if test -n "$relink_command"; then
- # Determine the prefix the user has applied to our future dir.
- inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
-
- # Don't allow the user to place us outside of our expected
- # location b/c this prevents finding dependent libraries that
- # are installed to the same prefix.
- # At present, this check doesn't affect windows .dll's that
- # are installed into $libdir/../bin (currently, that works fine)
- # but it's something to keep an eye on.
- test "$inst_prefix_dir" = "$destdir" && \
- func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
-
- if test -n "$inst_prefix_dir"; then
- # Stick the inst_prefix_dir data into the link command.
- relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
- else
- relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
- fi
-
- func_warning "relinking \`$file'"
- func_show_eval "$relink_command" \
- 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
- fi
-
- # See the names of the shared library.
- set dummy $library_names; shift
- if test -n "$1"; then
- realname="$1"
- shift
-
- srcname="$realname"
- test -n "$relink_command" && srcname="$realname"T
-
- # Install the shared library and build the symlinks.
- func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
- 'exit $?'
- tstripme="$stripme"
- case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
- case $realname in
- *.dll.a)
- tstripme=""
- ;;
- esac
- ;;
- esac
- if test -n "$tstripme" && test -n "$striplib"; then
- func_show_eval "$striplib $destdir/$realname" 'exit $?'
- fi
-
- if test "$#" -gt 0; then
- # Delete the old symlinks, and create new ones.
- # Try `ln -sf' first, because the `ln' binary might depend on
- # the symlink we replace! Solaris /bin/ln does not understand -f,
- # so we also need to try rm && ln -s.
- for linkname
- do
- test "$linkname" != "$realname" \
- && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
- done
- fi
-
- # Do each command in the postinstall commands.
- lib="$destdir/$realname"
- func_execute_cmds "$postinstall_cmds" 'exit $?'
- fi
-
- # Install the pseudo-library for information purposes.
- func_basename "$file"
- name="$func_basename_result"
- instname="$dir/$name"i
- func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
-
- # Maybe install the static library, too.
- test -n "$old_library" && func_append staticlibs " $dir/$old_library"
- ;;
-
- *.lo)
- # Install (i.e. copy) a libtool object.
-
- # Figure out destination file name, if it wasn't already specified.
- if test -n "$destname"; then
- destfile="$destdir/$destname"
- else
- func_basename "$file"
- destfile="$func_basename_result"
- destfile="$destdir/$destfile"
- fi
-
- # Deduce the name of the destination old-style object file.
- case $destfile in
- *.lo)
- func_lo2o "$destfile"
- staticdest=$func_lo2o_result
- ;;
- *.$objext)
- staticdest="$destfile"
- destfile=
- ;;
- *)
- func_fatal_help "cannot copy a libtool object to \`$destfile'"
- ;;
- esac
-
- # Install the libtool object if requested.
- test -n "$destfile" && \
- func_show_eval "$install_prog $file $destfile" 'exit $?'
-
- # Install the old object if enabled.
- if test "$build_old_libs" = yes; then
- # Deduce the name of the old-style object file.
- func_lo2o "$file"
- staticobj=$func_lo2o_result
- func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
- fi
- exit $EXIT_SUCCESS
- ;;
-
- *)
- # Figure out destination file name, if it wasn't already specified.
- if test -n "$destname"; then
- destfile="$destdir/$destname"
- else
- func_basename "$file"
- destfile="$func_basename_result"
- destfile="$destdir/$destfile"
- fi
-
- # If the file is missing, and there is a .exe on the end, strip it
- # because it is most likely a libtool script we actually want to
- # install
- stripped_ext=""
- case $file in
- *.exe)
- if test ! -f "$file"; then
- func_stripname '' '.exe' "$file"
- file=$func_stripname_result
- stripped_ext=".exe"
- fi
- ;;
- esac
-
- # Do a test to see if this is really a libtool program.
- case $host in
- *cygwin* | *mingw*)
- if func_ltwrapper_executable_p "$file"; then
- func_ltwrapper_scriptname "$file"
- wrapper=$func_ltwrapper_scriptname_result
- else
- func_stripname '' '.exe' "$file"
- wrapper=$func_stripname_result
- fi
- ;;
- *)
- wrapper=$file
- ;;
- esac
- if func_ltwrapper_script_p "$wrapper"; then
- notinst_deplibs=
- relink_command=
-
- func_source "$wrapper"
-
- # Check the variables that should have been set.
- test -z "$generated_by_libtool_version" && \
- func_fatal_error "invalid libtool wrapper script \`$wrapper'"
-
- finalize=yes
- for lib in $notinst_deplibs; do
- # Check to see that each library is installed.
- libdir=
- if test -f "$lib"; then
- func_source "$lib"
- fi
- libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
- if test -n "$libdir" && test ! -f "$libfile"; then
- func_warning "\`$lib' has not been installed in \`$libdir'"
- finalize=no
- fi
- done
-
- relink_command=
- func_source "$wrapper"
-
- outputname=
- if test "$fast_install" = no && test -n "$relink_command"; then
- $opt_dry_run || {
- if test "$finalize" = yes; then
- tmpdir=`func_mktempdir`
- func_basename "$file$stripped_ext"
- file="$func_basename_result"
- outputname="$tmpdir/$file"
- # Replace the output file specification.
- relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
-
- $opt_silent || {
- func_quote_for_expand "$relink_command"
- eval "func_echo $func_quote_for_expand_result"
- }
- if eval "$relink_command"; then :
- else
- func_error "error: relink \`$file' with the above command before installing it"
- $opt_dry_run || ${RM}r "$tmpdir"
- continue
- fi
- file="$outputname"
- else
- func_warning "cannot relink \`$file'"
- fi
- }
- else
- # Install the binary that we compiled earlier.
- file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
- fi
- fi
-
- # remove .exe since cygwin /usr/bin/install will append another
- # one anyway
- case $install_prog,$host in
- */usr/bin/install*,*cygwin*)
- case $file:$destfile in
- *.exe:*.exe)
- # this is ok
- ;;
- *.exe:*)
- destfile=$destfile.exe
- ;;
- *:*.exe)
- func_stripname '' '.exe' "$destfile"
- destfile=$func_stripname_result
- ;;
- esac
- ;;
- esac
- func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
- $opt_dry_run || if test -n "$outputname"; then
- ${RM}r "$tmpdir"
- fi
- ;;
- esac
- done
-
- for file in $staticlibs; do
- func_basename "$file"
- name="$func_basename_result"
-
- # Set up the ranlib parameters.
- oldlib="$destdir/$name"
- func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
- tool_oldlib=$func_to_tool_file_result
-
- func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
-
- if test -n "$stripme" && test -n "$old_striplib"; then
- func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
- fi
-
- # Do each command in the postinstall commands.
- func_execute_cmds "$old_postinstall_cmds" 'exit $?'
- done
-
- test -n "$future_libdirs" && \
- func_warning "remember to run \`$progname --finish$future_libdirs'"
-
- if test -n "$current_libdirs"; then
- # Maybe just do a dry run.
- $opt_dry_run && current_libdirs=" -n$current_libdirs"
- exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
- else
- exit $EXIT_SUCCESS
- fi
-}
-
-test "$opt_mode" = install && func_mode_install ${1+"$@"}
-
-
-# func_generate_dlsyms outputname originator pic_p
-# Extract symbols from dlprefiles and create ${outputname}S.o with
-# a dlpreopen symbol table.
-func_generate_dlsyms ()
-{
- $opt_debug
- my_outputname="$1"
- my_originator="$2"
- my_pic_p="${3-no}"
- my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
- my_dlsyms=
-
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- if test -n "$NM" && test -n "$global_symbol_pipe"; then
- my_dlsyms="${my_outputname}S.c"
- else
- func_error "not configured to extract global symbols from dlpreopened files"
- fi
- fi
-
- if test -n "$my_dlsyms"; then
- case $my_dlsyms in
- "") ;;
- *.c)
- # Discover the nlist of each of the dlfiles.
- nlist="$output_objdir/${my_outputname}.nm"
-
- func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
-
- # Parse the name list into a source file.
- func_verbose "creating $output_objdir/$my_dlsyms"
-
- $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
-#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
-#endif
-
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
- relocations are performed -- see ld's documentation on pseudo-relocs. */
-# define LT_DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data. */
-# define LT_DLSYM_CONST
-#else
-# define LT_DLSYM_CONST const
-#endif
-
-/* External symbol declarations for the compiler. */\
-"
-
- if test "$dlself" = yes; then
- func_verbose "generating symbol list for \`$output'"
-
- $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
-
- # Add our own program objects to the symbol list.
- progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
- for progfile in $progfiles; do
- func_to_tool_file "$progfile" func_convert_file_msys_to_w32
- func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
- $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
- done
-
- if test -n "$exclude_expsyms"; then
- $opt_dry_run || {
- eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
- eval '$MV "$nlist"T "$nlist"'
- }
- fi
-
- if test -n "$export_symbols_regex"; then
- $opt_dry_run || {
- eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
- eval '$MV "$nlist"T "$nlist"'
- }
- fi
-
- # Prepare the list of exported symbols
- if test -z "$export_symbols"; then
- export_symbols="$output_objdir/$outputname.exp"
- $opt_dry_run || {
- $RM $export_symbols
- eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
- case $host in
- *cygwin* | *mingw* | *cegcc* )
- eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
- eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
- ;;
- esac
- }
- else
- $opt_dry_run || {
- eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
- eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
- eval '$MV "$nlist"T "$nlist"'
- case $host in
- *cygwin* | *mingw* | *cegcc* )
- eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
- eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
- ;;
- esac
- }
- fi
- fi
-
- for dlprefile in $dlprefiles; do
- func_verbose "extracting global C symbols from \`$dlprefile'"
- func_basename "$dlprefile"
- name="$func_basename_result"
- case $host in
- *cygwin* | *mingw* | *cegcc* )
- # if an import library, we need to obtain dlname
- if func_win32_import_lib_p "$dlprefile"; then
- func_tr_sh "$dlprefile"
- eval "curr_lafile=\$libfile_$func_tr_sh_result"
- dlprefile_dlbasename=""
- if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
- # Use subshell, to avoid clobbering current variable values
- dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
- if test -n "$dlprefile_dlname" ; then
- func_basename "$dlprefile_dlname"
- dlprefile_dlbasename="$func_basename_result"
- else
- # no lafile. user explicitly requested -dlpreopen <import library>.
- $sharedlib_from_linklib_cmd "$dlprefile"
- dlprefile_dlbasename=$sharedlib_from_linklib_result
- fi
- fi
- $opt_dry_run || {
- if test -n "$dlprefile_dlbasename" ; then
- eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
- else
- func_warning "Could not compute DLL name from $name"
- eval '$ECHO ": $name " >> "$nlist"'
- fi
- func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
- eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
- $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
- }
- else # not an import lib
- $opt_dry_run || {
- eval '$ECHO ": $name " >> "$nlist"'
- func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
- eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
- }
- fi
- ;;
- *)
- $opt_dry_run || {
- eval '$ECHO ": $name " >> "$nlist"'
- func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
- eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
- }
- ;;
- esac
- done
-
- $opt_dry_run || {
- # Make sure we have at least an empty file.
- test -f "$nlist" || : > "$nlist"
-
- if test -n "$exclude_expsyms"; then
- $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
- $MV "$nlist"T "$nlist"
- fi
-
- # Try sorting and uniquifying the output.
- if $GREP -v "^: " < "$nlist" |
- if sort -k 3 </dev/null >/dev/null 2>&1; then
- sort -k 3
- else
- sort +2
- fi |
- uniq > "$nlist"S; then
- :
- else
- $GREP -v "^: " < "$nlist" > "$nlist"S
- fi
-
- if test -f "$nlist"S; then
- eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
- else
- echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
- fi
-
- echo >> "$output_objdir/$my_dlsyms" "\
-
-/* The mapping between symbol names and symbols. */
-typedef struct {
- const char *name;
- void *address;
-} lt_dlsymlist;
-extern LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
-LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
- { \"$my_originator\", (void *) 0 },"
-
- case $need_lib_prefix in
- no)
- eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
- ;;
- *)
- eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
- ;;
- esac
- echo >> "$output_objdir/$my_dlsyms" "\
- {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
- return lt_${my_prefix}_LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
- } # !$opt_dry_run
-
- pic_flag_for_symtable=
- case "$compile_command " in
- *" -static "*) ;;
- *)
- case $host in
- # compiling the symbol table file with pic_flag works around
- # a FreeBSD bug that causes programs to crash when -lm is
- # linked before any other PIC object. But we must not use
- # pic_flag when linking with -static. The problem exists in
- # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
- *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
- pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
- *-*-hpux*)
- pic_flag_for_symtable=" $pic_flag" ;;
- *)
- if test "X$my_pic_p" != Xno; then
- pic_flag_for_symtable=" $pic_flag"
- fi
- ;;
- esac
- ;;
- esac
- symtab_cflags=
- for arg in $LTCFLAGS; do
- case $arg in
- -pie | -fpie | -fPIE) ;;
- *) func_append symtab_cflags " $arg" ;;
- esac
- done
-
- # Now compile the dynamic symbol file.
- func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
-
- # Clean up the generated files.
- func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
-
- # Transform the symbol file into the correct name.
- symfileobj="$output_objdir/${my_outputname}S.$objext"
- case $host in
- *cygwin* | *mingw* | *cegcc* )
- if test -f "$output_objdir/$my_outputname.def"; then
- compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
- finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
- else
- compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
- finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
- fi
- ;;
- *)
- compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
- finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
- ;;
- esac
- ;;
- *)
- func_fatal_error "unknown suffix for \`$my_dlsyms'"
- ;;
- esac
- else
- # We keep going just in case the user didn't refer to
- # lt_preloaded_symbols. The linker will fail if global_symbol_pipe
- # really was required.
-
- # Nullify the symbol file.
- compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
- finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
- fi
-}
-
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-# Despite the name, also deal with 64 bit binaries.
-func_win32_libid ()
-{
- $opt_debug
- win32_libid_type="unknown"
- win32_fileres=`file -L $1 2>/dev/null`
- case $win32_fileres in
- *ar\ archive\ import\ library*) # definitely import
- win32_libid_type="x86 archive import"
- ;;
- *ar\ archive*) # could be an import, or static
- # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
- if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
- $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
- func_to_tool_file "$1" func_convert_file_msys_to_w32
- win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
- $SED -n -e '
- 1,100{
- / I /{
- s,.*,import,
- p
- q
- }
- }'`
- case $win32_nmres in
- import*) win32_libid_type="x86 archive import";;
- *) win32_libid_type="x86 archive static";;
- esac
- fi
- ;;
- *DLL*)
- win32_libid_type="x86 DLL"
- ;;
- *executable*) # but shell scripts are "executable" too...
- case $win32_fileres in
- *MS\ Windows\ PE\ Intel*)
- win32_libid_type="x86 DLL"
- ;;
- esac
- ;;
- esac
- $ECHO "$win32_libid_type"
-}
-
-# func_cygming_dll_for_implib ARG
-#
-# Platform-specific function to extract the
-# name of the DLL associated with the specified
-# import library ARG.
-# Invoked by eval'ing the libtool variable
-# $sharedlib_from_linklib_cmd
-# Result is available in the variable
-# $sharedlib_from_linklib_result
-func_cygming_dll_for_implib ()
-{
- $opt_debug
- sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
-}
-
-# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
-#
-# The is the core of a fallback implementation of a
-# platform-specific function to extract the name of the
-# DLL associated with the specified import library LIBNAME.
-#
-# SECTION_NAME is either .idata$6 or .idata$7, depending
-# on the platform and compiler that created the implib.
-#
-# Echos the name of the DLL associated with the
-# specified import library.
-func_cygming_dll_for_implib_fallback_core ()
-{
- $opt_debug
- match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
- $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
- $SED '/^Contents of section '"$match_literal"':/{
- # Place marker at beginning of archive member dllname section
- s/.*/====MARK====/
- p
- d
- }
- # These lines can sometimes be longer than 43 characters, but
- # are always uninteresting
- /:[ ]*file format pe[i]\{,1\}-/d
- /^In archive [^:]*:/d
- # Ensure marker is printed
- /^====MARK====/p
- # Remove all lines with less than 43 characters
- /^.\{43\}/!d
- # From remaining lines, remove first 43 characters
- s/^.\{43\}//' |
- $SED -n '
- # Join marker and all lines until next marker into a single line
- /^====MARK====/ b para
- H
- $ b para
- b
- :para
- x
- s/\n//g
- # Remove the marker
- s/^====MARK====//
- # Remove trailing dots and whitespace
- s/[\. \t]*$//
- # Print
- /./p' |
- # we now have a list, one entry per line, of the stringified
- # contents of the appropriate section of all members of the
- # archive which possess that section. Heuristic: eliminate
- # all those which have a first or second character that is
- # a '.' (that is, objdump's representation of an unprintable
- # character.) This should work for all archives with less than
- # 0x302f exports -- but will fail for DLLs whose name actually
- # begins with a literal '.' or a single character followed by
- # a '.'.
- #
- # Of those that remain, print the first one.
- $SED -e '/^\./d;/^.\./d;q'
-}
-
-# func_cygming_gnu_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is a GNU/binutils-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_gnu_implib_p ()
-{
- $opt_debug
- func_to_tool_file "$1" func_convert_file_msys_to_w32
- func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
- test -n "$func_cygming_gnu_implib_tmp"
-}
-
-# func_cygming_ms_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is an MS-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_ms_implib_p ()
-{
- $opt_debug
- func_to_tool_file "$1" func_convert_file_msys_to_w32
- func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
- test -n "$func_cygming_ms_implib_tmp"
-}
-
-# func_cygming_dll_for_implib_fallback ARG
-# Platform-specific function to extract the
-# name of the DLL associated with the specified
-# import library ARG.
-#
-# This fallback implementation is for use when $DLLTOOL
-# does not support the --identify-strict option.
-# Invoked by eval'ing the libtool variable
-# $sharedlib_from_linklib_cmd
-# Result is available in the variable
-# $sharedlib_from_linklib_result
-func_cygming_dll_for_implib_fallback ()
-{
- $opt_debug
- if func_cygming_gnu_implib_p "$1" ; then
- # binutils import library
- sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
- elif func_cygming_ms_implib_p "$1" ; then
- # ms-generated import library
- sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
- else
- # unknown
- sharedlib_from_linklib_result=""
- fi
-}
-
-
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
-{
- $opt_debug
- f_ex_an_ar_dir="$1"; shift
- f_ex_an_ar_oldlib="$1"
- if test "$lock_old_archive_extraction" = yes; then
- lockfile=$f_ex_an_ar_oldlib.lock
- until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
- func_echo "Waiting for $lockfile to be removed"
- sleep 2
- done
- fi
- func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
- 'stat=$?; rm -f "$lockfile"; exit $stat'
- if test "$lock_old_archive_extraction" = yes; then
- $opt_dry_run || rm -f "$lockfile"
- fi
- if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
- :
- else
- func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
- fi
-}
-
-
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
-{
- $opt_debug
- my_gentop="$1"; shift
- my_oldlibs=${1+"$@"}
- my_oldobjs=""
- my_xlib=""
- my_xabs=""
- my_xdir=""
-
- for my_xlib in $my_oldlibs; do
- # Extract the objects.
- case $my_xlib in
- [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
- *) my_xabs=`pwd`"/$my_xlib" ;;
- esac
- func_basename "$my_xlib"
- my_xlib="$func_basename_result"
- my_xlib_u=$my_xlib
- while :; do
- case " $extracted_archives " in
- *" $my_xlib_u "*)
- func_arith $extracted_serial + 1
- extracted_serial=$func_arith_result
- my_xlib_u=lt$extracted_serial-$my_xlib ;;
- *) break ;;
- esac
- done
- extracted_archives="$extracted_archives $my_xlib_u"
- my_xdir="$my_gentop/$my_xlib_u"
-
- func_mkdir_p "$my_xdir"
-
- case $host in
- *-darwin*)
- func_verbose "Extracting $my_xabs"
- # Do not bother doing anything if just a dry run
- $opt_dry_run || {
- darwin_orig_dir=`pwd`
- cd $my_xdir || exit $?
- darwin_archive=$my_xabs
- darwin_curdir=`pwd`
- darwin_base_archive=`basename "$darwin_archive"`
- darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
- if test -n "$darwin_arches"; then
- darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
- darwin_arch=
- func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
- for darwin_arch in $darwin_arches ; do
- func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
- $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
- cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
- func_extract_an_archive "`pwd`" "${darwin_base_archive}"
- cd "$darwin_curdir"
- $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
- done # $darwin_arches
- ## Okay now we've a bunch of thin objects, gotta fatten them up :)
- darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
- darwin_file=
- darwin_files=
- for darwin_file in $darwin_filelist; do
- darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
- $LIPO -create -output "$darwin_file" $darwin_files
- done # $darwin_filelist
- $RM -rf unfat-$$
- cd "$darwin_orig_dir"
- else
- cd $darwin_orig_dir
- func_extract_an_archive "$my_xdir" "$my_xabs"
- fi # $darwin_arches
- } # !$opt_dry_run
- ;;
- *)
- func_extract_an_archive "$my_xdir" "$my_xabs"
- ;;
- esac
- my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
- done
-
- func_extract_archives_result="$my_oldobjs"
-}
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable. Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take. If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory. This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
- func_emit_wrapper_arg1=${1-no}
-
- $ECHO "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='$sed_quote_subst'
-
-# Be Bourne compatible
-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
- emulate sh
- NULLCMD=:
- # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '\${1+\"\$@\"}'='\"\$@\"'
- setopt NO_GLOB_SUBST
-else
- case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
- # install mode needs the following variables:
- generated_by_libtool_version='$macro_version'
- notinst_deplibs='$notinst_deplibs'
-else
- # When we are sourced in execute mode, \$file and \$ECHO are already set.
- if test \"\$libtool_execute_magic\" != \"$magic\"; then
- file=\"\$0\""
-
- qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
- $ECHO "\
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
- eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
- ECHO=\"$qECHO\"
- fi
-
-# Very basic option parsing. These options are (a) specific to
-# the libtool wrapper, (b) are identical between the wrapper
-# /script/ and the wrapper /executable/ which is used only on
-# windows platforms, and (c) all begin with the string "--lt-"
-# (application programs are unlikely to have options which match
-# this pattern).
-#
-# There are only two supported options: --lt-debug and
-# --lt-dump-script. There is, deliberately, no --lt-help.
-#
-# The first argument to this parsing function should be the
-# script's $0 value, followed by "$@".
-lt_option_debug=
-func_parse_lt_options ()
-{
- lt_script_arg0=\$0
- shift
- for lt_opt
- do
- case \"\$lt_opt\" in
- --lt-debug) lt_option_debug=1 ;;
- --lt-dump-script)
- lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
- test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
- lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
- cat \"\$lt_dump_D/\$lt_dump_F\"
- exit 0
- ;;
- --lt-*)
- \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
- exit 1
- ;;
- esac
- done
-
- # Print the debug banner immediately:
- if test -n \"\$lt_option_debug\"; then
- echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
- fi
-}
-
-# Used when --lt-debug. Prints its arguments to stdout
-# (redirection is the responsibility of the caller)
-func_lt_dump_args ()
-{
- lt_dump_args_N=1;
- for lt_arg
- do
- \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
- lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
- done
-}
-
-# Core function for launching the target application
-func_exec_program_core ()
-{
-"
- case $host in
- # Backslashes separate directories on plain windows
- *-*-mingw | *-*-os2* | *-cegcc*)
- $ECHO "\
- if test -n \"\$lt_option_debug\"; then
- \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
- func_lt_dump_args \${1+\"\$@\"} 1>&2
- fi
- exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
- ;;
-
- *)
- $ECHO "\
- if test -n \"\$lt_option_debug\"; then
- \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
- func_lt_dump_args \${1+\"\$@\"} 1>&2
- fi
- exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
- ;;
- esac
- $ECHO "\
- \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
- exit 1
-}
-
-# A function to encapsulate launching the target application
-# Strips options in the --lt-* namespace from \$@ and
-# launches target application with the remaining arguments.
-func_exec_program ()
-{
- case \" \$* \" in
- *\\ --lt-*)
- for lt_wr_arg
- do
- case \$lt_wr_arg in
- --lt-*) ;;
- *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
- esac
- shift
- done ;;
- esac
- func_exec_program_core \${1+\"\$@\"}
-}
-
- # Parse options
- func_parse_lt_options \"\$0\" \${1+\"\$@\"}
-
- # Find the directory that this script lives in.
- thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
- test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
- # Follow symbolic links until we get to the real thisdir.
- file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
- while test -n \"\$file\"; do
- destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
-
- # If there was a directory component, then change thisdir.
- if test \"x\$destdir\" != \"x\$file\"; then
- case \"\$destdir\" in
- [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
- *) thisdir=\"\$thisdir/\$destdir\" ;;
- esac
- fi
-
- file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
- file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
- done
-
- # Usually 'no', except on cygwin/mingw when embedded into
- # the cwrapper.
- WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
- if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
- # special case for '.'
- if test \"\$thisdir\" = \".\"; then
- thisdir=\`pwd\`
- fi
- # remove .libs from thisdir
- case \"\$thisdir\" in
- *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
- $objdir ) thisdir=. ;;
- esac
- fi
-
- # Try to get the absolute directory name.
- absdir=\`cd \"\$thisdir\" && pwd\`
- test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
- if test "$fast_install" = yes; then
- $ECHO "\
- program=lt-'$outputname'$exeext
- progdir=\"\$thisdir/$objdir\"
-
- if test ! -f \"\$progdir/\$program\" ||
- { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
- test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
- file=\"\$\$-\$program\"
-
- if test ! -d \"\$progdir\"; then
- $MKDIR \"\$progdir\"
- else
- $RM \"\$progdir/\$file\"
- fi"
-
- $ECHO "\
-
- # relink executable if necessary
- if test -n \"\$relink_command\"; then
- if relink_command_output=\`eval \$relink_command 2>&1\`; then :
- else
- $ECHO \"\$relink_command_output\" >&2
- $RM \"\$progdir/\$file\"
- exit 1
- fi
- fi
-
- $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
- { $RM \"\$progdir/\$program\";
- $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
- $RM \"\$progdir/\$file\"
- fi"
- else
- $ECHO "\
- program='$outputname'
- progdir=\"\$thisdir/$objdir\"
-"
- fi
-
- $ECHO "\
-
- if test -f \"\$progdir/\$program\"; then"
-
- # fixup the dll searchpath if we need to.
- #
- # Fix the DLL searchpath if we need to. Do this before prepending
- # to shlibpath, because on Windows, both are PATH and uninstalled
- # libraries must come first.
- if test -n "$dllsearchpath"; then
- $ECHO "\
- # Add the dll search path components to the executable PATH
- PATH=$dllsearchpath:\$PATH
-"
- fi
-
- # Export our shlibpath_var if we have one.
- if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
- $ECHO "\
- # Add our own library path to $shlibpath_var
- $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
- # Some systems cannot cope with colon-terminated $shlibpath_var
- # The second colon is a workaround for a bug in BeOS R4 sed
- $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
-
- export $shlibpath_var
-"
- fi
-
- $ECHO "\
- if test \"\$libtool_execute_magic\" != \"$magic\"; then
- # Run the actual program with our arguments.
- func_exec_program \${1+\"\$@\"}
- fi
- else
- # The program doesn't exist.
- \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
- \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
- \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
- exit 1
- fi
-fi\
-"
-}
-
-
-# func_emit_cwrapperexe_src
-# emit the source code for a wrapper executable on stdout
-# Must ONLY be called from within func_mode_link because
-# it depends on a number of variable set therein.
-func_emit_cwrapperexe_src ()
-{
- cat <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
- Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-
- The $output program cannot be directly executed until all the libtool
- libraries that it depends on are installed.
-
- This wrapper executable should never be moved out of the build directory.
- If it is, it will not operate correctly.
-*/
-EOF
- cat <<"EOF"
-#ifdef _MSC_VER
-# define _CRT_SECURE_NO_DEPRECATE 1
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef _MSC_VER
-# include <direct.h>
-# include <process.h>
-# include <io.h>
-#else
-# include <unistd.h>
-# include <stdint.h>
-# ifdef __CYGWIN__
-# include <io.h>
-# endif
-#endif
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-/* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
-# ifdef __STRICT_ANSI__
-int _putenv (const char *);
-# endif
-#elif defined(__CYGWIN__)
-# ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-# endif
-/* #elif defined (other platforms) ... */
-#endif
-
-/* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
-# define setmode _setmode
-# define stat _stat
-# define chmod _chmod
-# define getcwd _getcwd
-# define putenv _putenv
-# define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-# define _INTPTR_T_DEFINED
-# define intptr_t int
-# endif
-#elif defined(__MINGW32__)
-# define setmode _setmode
-# define stat _stat
-# define chmod _chmod
-# define getcwd _getcwd
-# define putenv _putenv
-#elif defined(__CYGWIN__)
-# define HAVE_SETENV
-# define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
-#endif
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
-
-#ifndef S_IXOTH
-# define S_IXOTH 0
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 0
-#endif
-
-/* path handling portability macros */
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
-
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
- defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# define FOPEN_WB "wb"
-# ifndef DIR_SEPARATOR_2
-# define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-# define PATH_SEPARATOR_2 ';'
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
- (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
-
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
-
-#ifndef FOPEN_WB
-# define FOPEN_WB "w"
-#endif
-#ifndef _O_BINARY
-# define _O_BINARY 0
-#endif
-
-#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
- if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
-
-#if defined(LT_DEBUGWRAPPER)
-static int lt_debug = 1;
-#else
-static int lt_debug = 0;
-#endif
-
-const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
-
-void *xmalloc (size_t num);
-char *xstrdup (const char *string);
-const char *base_name (const char *name);
-char *find_executable (const char *wrapper);
-char *chase_symlinks (const char *pathspec);
-int make_executable (const char *path);
-int check_executable (const char *path);
-char *strendzap (char *str, const char *pat);
-void lt_debugprintf (const char *file, int line, const char *fmt, ...);
-void lt_fatal (const char *file, int line, const char *message, ...);
-static const char *nonnull (const char *s);
-static const char *nonempty (const char *s);
-void lt_setenv (const char *name, const char *value);
-char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_update_exe_path (const char *name, const char *value);
-void lt_update_lib_path (const char *name, const char *value);
-char **prepare_spawn (char **argv);
-void lt_dump_script (FILE *f);
-EOF
-
- cat <<EOF
-volatile const char * MAGIC_EXE = "$magic_exe";
-const char * LIB_PATH_VARNAME = "$shlibpath_var";
-EOF
-
- if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
- func_to_host_path "$temp_rpath"
- cat <<EOF
-const char * LIB_PATH_VALUE = "$func_to_host_path_result";
-EOF
- else
- cat <<"EOF"
-const char * LIB_PATH_VALUE = "";
-EOF
- fi
-
- if test -n "$dllsearchpath"; then
- func_to_host_path "$dllsearchpath:"
- cat <<EOF
-const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE = "$func_to_host_path_result";
-EOF
- else
- cat <<"EOF"
-const char * EXE_PATH_VARNAME = "";
-const char * EXE_PATH_VALUE = "";
-EOF
- fi
-
- if test "$fast_install" = yes; then
- cat <<EOF
-const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
-EOF
- else
- cat <<EOF
-const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
-EOF
- fi
-
-
- cat <<"EOF"
-
-#define LTWRAPPER_OPTION_PREFIX "--lt-"
-
-static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script";
-static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug";
-
-int
-main (int argc, char *argv[])
-{
- char **newargz;
- int newargc;
- char *tmp_pathspec;
- char *actual_cwrapper_path;
- char *actual_cwrapper_name;
- char *target_name;
- char *lt_argv_zero;
- intptr_t rval = 127;
-
- int i;
-
- program_name = (char *) xstrdup (base_name (argv[0]));
- newargz = XMALLOC (char *, argc + 1);
-
- /* very simple arg parsing; don't want to rely on getopt
- * also, copy all non cwrapper options to newargz, except
- * argz[0], which is handled differently
- */
- newargc=0;
- for (i = 1; i < argc; i++)
- {
- if (strcmp (argv[i], dumpscript_opt) == 0)
- {
-EOF
- case "$host" in
- *mingw* | *cygwin* )
- # make stdout use "unix" line endings
- echo " setmode(1,_O_BINARY);"
- ;;
- esac
-
- cat <<"EOF"
- lt_dump_script (stdout);
- return 0;
- }
- if (strcmp (argv[i], debug_opt) == 0)
- {
- lt_debug = 1;
- continue;
- }
- if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
- {
- /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
- namespace, but it is not one of the ones we know about and
- have already dealt with, above (inluding dump-script), then
- report an error. Otherwise, targets might begin to believe
- they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
- namespace. The first time any user complains about this, we'll
- need to make LTWRAPPER_OPTION_PREFIX a configure-time option
- or a configure.ac-settable value.
- */
- lt_fatal (__FILE__, __LINE__,
- "unrecognized %s option: '%s'",
- ltwrapper_option_prefix, argv[i]);
- }
- /* otherwise ... */
- newargz[++newargc] = xstrdup (argv[i]);
- }
- newargz[++newargc] = NULL;
-
-EOF
- cat <<EOF
- /* The GNU banner must be the first non-error debug message */
- lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
-EOF
- cat <<"EOF"
- lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
- lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
-
- tmp_pathspec = find_executable (argv[0]);
- if (tmp_pathspec == NULL)
- lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
- lt_debugprintf (__FILE__, __LINE__,
- "(main) found exe (before symlink chase) at: %s\n",
- tmp_pathspec);
-
- actual_cwrapper_path = chase_symlinks (tmp_pathspec);
- lt_debugprintf (__FILE__, __LINE__,
- "(main) found exe (after symlink chase) at: %s\n",
- actual_cwrapper_path);
- XFREE (tmp_pathspec);
-
- actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
- strendzap (actual_cwrapper_path, actual_cwrapper_name);
-
- /* wrapper name transforms */
- strendzap (actual_cwrapper_name, ".exe");
- tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
- XFREE (actual_cwrapper_name);
- actual_cwrapper_name = tmp_pathspec;
- tmp_pathspec = 0;
-
- /* target_name transforms -- use actual target program name; might have lt- prefix */
- target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
- strendzap (target_name, ".exe");
- tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
- XFREE (target_name);
- target_name = tmp_pathspec;
- tmp_pathspec = 0;
-
- lt_debugprintf (__FILE__, __LINE__,
- "(main) libtool target name: %s\n",
- target_name);
-EOF
-
- cat <<EOF
- newargz[0] =
- XMALLOC (char, (strlen (actual_cwrapper_path) +
- strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
- strcpy (newargz[0], actual_cwrapper_path);
- strcat (newargz[0], "$objdir");
- strcat (newargz[0], "/");
-EOF
-
- cat <<"EOF"
- /* stop here, and copy so we don't have to do this twice */
- tmp_pathspec = xstrdup (newargz[0]);
-
- /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
- strcat (newargz[0], actual_cwrapper_name);
-
- /* DO want the lt- prefix here if it exists, so use target_name */
- lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
- XFREE (tmp_pathspec);
- tmp_pathspec = NULL;
-EOF
-
- case $host_os in
- mingw*)
- cat <<"EOF"
- {
- char* p;
- while ((p = strchr (newargz[0], '\\')) != NULL)
- {
- *p = '/';
- }
- while ((p = strchr (lt_argv_zero, '\\')) != NULL)
- {
- *p = '/';
- }
- }
-EOF
- ;;
- esac
-
- cat <<"EOF"
- XFREE (target_name);
- XFREE (actual_cwrapper_path);
- XFREE (actual_cwrapper_name);
-
- lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
- lt_setenv ("DUALCASE", "1"); /* for MSK sh */
- /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must
- be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
- because on Windows, both *_VARNAMEs are PATH but uninstalled
- libraries must come first. */
- lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
- lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
-
- lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
- nonnull (lt_argv_zero));
- for (i = 0; i < newargc; i++)
- {
- lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
- i, nonnull (newargz[i]));
- }
-
-EOF
-
- case $host_os in
- mingw*)
- cat <<"EOF"
- /* execv doesn't actually work on mingw as expected on unix */
- newargz = prepare_spawn (newargz);
- rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
- if (rval == -1)
- {
- /* failed to start process */
- lt_debugprintf (__FILE__, __LINE__,
- "(main) failed to launch target \"%s\": %s\n",
- lt_argv_zero, nonnull (strerror (errno)));
- return 127;
- }
- return rval;
-EOF
- ;;
- *)
- cat <<"EOF"
- execv (lt_argv_zero, newargz);
- return rval; /* =127, but avoids unused variable warning */
-EOF
- ;;
- esac
-
- cat <<"EOF"
-}
-
-void *
-xmalloc (size_t num)
-{
- void *p = (void *) malloc (num);
- if (!p)
- lt_fatal (__FILE__, __LINE__, "memory exhausted");
-
- return p;
-}
-
-char *
-xstrdup (const char *string)
-{
- return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
- string) : NULL;
-}
-
-const char *
-base_name (const char *name)
-{
- const char *base;
-
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
- /* Skip over the disk name in MSDOS pathnames. */
- if (isalpha ((unsigned char) name[0]) && name[1] == ':')
- name += 2;
-#endif
-
- for (base = name; *name; name++)
- if (IS_DIR_SEPARATOR (*name))
- base = name + 1;
- return base;
-}
-
-int
-check_executable (const char *path)
-{
- struct stat st;
-
- lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
- nonempty (path));
- if ((!path) || (!*path))
- return 0;
-
- if ((stat (path, &st) >= 0)
- && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
- return 1;
- else
- return 0;
-}
-
-int
-make_executable (const char *path)
-{
- int rval = 0;
- struct stat st;
-
- lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
- nonempty (path));
- if ((!path) || (!*path))
- return 0;
-
- if (stat (path, &st) >= 0)
- {
- rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
- }
- return rval;
-}
-
-/* Searches for the full path of the wrapper. Returns
- newly allocated full path name if found, NULL otherwise
- Does not chase symlinks, even on platforms that support them.
-*/
-char *
-find_executable (const char *wrapper)
-{
- int has_slash = 0;
- const char *p;
- const char *p_next;
- /* static buffer for getcwd */
- char tmp[LT_PATHMAX + 1];
- int tmp_len;
- char *concat_name;
-
- lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
- nonempty (wrapper));
-
- if ((wrapper == NULL) || (*wrapper == '\0'))
- return NULL;
-
- /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
- if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
- {
- concat_name = xstrdup (wrapper);
- if (check_executable (concat_name))
- return concat_name;
- XFREE (concat_name);
- }
- else
- {
-#endif
- if (IS_DIR_SEPARATOR (wrapper[0]))
- {
- concat_name = xstrdup (wrapper);
- if (check_executable (concat_name))
- return concat_name;
- XFREE (concat_name);
- }
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
- }
-#endif
-
- for (p = wrapper; *p; p++)
- if (*p == '/')
- {
- has_slash = 1;
- break;
- }
- if (!has_slash)
- {
- /* no slashes; search PATH */
- const char *path = getenv ("PATH");
- if (path != NULL)
- {
- for (p = path; *p; p = p_next)
- {
- const char *q;
- size_t p_len;
- for (q = p; *q; q++)
- if (IS_PATH_SEPARATOR (*q))
- break;
- p_len = q - p;
- p_next = (*q == '\0' ? q : q + 1);
- if (p_len == 0)
- {
- /* empty path: current directory */
- if (getcwd (tmp, LT_PATHMAX) == NULL)
- lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
- nonnull (strerror (errno)));
- tmp_len = strlen (tmp);
- concat_name =
- XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
- memcpy (concat_name, tmp, tmp_len);
- concat_name[tmp_len] = '/';
- strcpy (concat_name + tmp_len + 1, wrapper);
- }
- else
- {
- concat_name =
- XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
- memcpy (concat_name, p, p_len);
- concat_name[p_len] = '/';
- strcpy (concat_name + p_len + 1, wrapper);
- }
- if (check_executable (concat_name))
- return concat_name;
- XFREE (concat_name);
- }
- }
- /* not found in PATH; assume curdir */
- }
- /* Relative path | not found in path: prepend cwd */
- if (getcwd (tmp, LT_PATHMAX) == NULL)
- lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
- nonnull (strerror (errno)));
- tmp_len = strlen (tmp);
- concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
- memcpy (concat_name, tmp, tmp_len);
- concat_name[tmp_len] = '/';
- strcpy (concat_name + tmp_len + 1, wrapper);
-
- if (check_executable (concat_name))
- return concat_name;
- XFREE (concat_name);
- return NULL;
-}
-
-char *
-chase_symlinks (const char *pathspec)
-{
-#ifndef S_ISLNK
- return xstrdup (pathspec);
-#else
- char buf[LT_PATHMAX];
- struct stat s;
- char *tmp_pathspec = xstrdup (pathspec);
- char *p;
- int has_symlinks = 0;
- while (strlen (tmp_pathspec) && !has_symlinks)
- {
- lt_debugprintf (__FILE__, __LINE__,
- "checking path component for symlinks: %s\n",
- tmp_pathspec);
- if (lstat (tmp_pathspec, &s) == 0)
- {
- if (S_ISLNK (s.st_mode) != 0)
- {
- has_symlinks = 1;
- break;
- }
-
- /* search backwards for last DIR_SEPARATOR */
- p = tmp_pathspec + strlen (tmp_pathspec) - 1;
- while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
- p--;
- if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
- {
- /* no more DIR_SEPARATORS left */
- break;
- }
- *p = '\0';
- }
- else
- {
- lt_fatal (__FILE__, __LINE__,
- "error accessing file \"%s\": %s",
- tmp_pathspec, nonnull (strerror (errno)));
- }
- }
- XFREE (tmp_pathspec);
-
- if (!has_symlinks)
- {
- return xstrdup (pathspec);
- }
-
- tmp_pathspec = realpath (pathspec, buf);
- if (tmp_pathspec == 0)
- {
- lt_fatal (__FILE__, __LINE__,
- "could not follow symlinks for %s", pathspec);
- }
- return xstrdup (tmp_pathspec);
-#endif
-}
-
-char *
-strendzap (char *str, const char *pat)
-{
- size_t len, patlen;
-
- assert (str != NULL);
- assert (pat != NULL);
-
- len = strlen (str);
- patlen = strlen (pat);
-
- if (patlen <= len)
- {
- str += len - patlen;
- if (strcmp (str, pat) == 0)
- *str = '\0';
- }
- return str;
-}
-
-void
-lt_debugprintf (const char *file, int line, const char *fmt, ...)
-{
- va_list args;
- if (lt_debug)
- {
- (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
- va_start (args, fmt);
- (void) vfprintf (stderr, fmt, args);
- va_end (args);
- }
-}
-
-static void
-lt_error_core (int exit_status, const char *file,
- int line, const char *mode,
- const char *message, va_list ap)
-{
- fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
- vfprintf (stderr, message, ap);
- fprintf (stderr, ".\n");
-
- if (exit_status >= 0)
- exit (exit_status);
-}
-
-void
-lt_fatal (const char *file, int line, const char *message, ...)
-{
- va_list ap;
- va_start (ap, message);
- lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
- va_end (ap);
-}
-
-static const char *
-nonnull (const char *s)
-{
- return s ? s : "(null)";
-}
-
-static const char *
-nonempty (const char *s)
-{
- return (s && !*s) ? "(empty)" : nonnull (s);
-}
-
-void
-lt_setenv (const char *name, const char *value)
-{
- lt_debugprintf (__FILE__, __LINE__,
- "(lt_setenv) setting '%s' to '%s'\n",
- nonnull (name), nonnull (value));
- {
-#ifdef HAVE_SETENV
- /* always make a copy, for consistency with !HAVE_SETENV */
- char *str = xstrdup (value);
- setenv (name, str, 1);
-#else
- int len = strlen (name) + 1 + strlen (value) + 1;
- char *str = XMALLOC (char, len);
- sprintf (str, "%s=%s", name, value);
- if (putenv (str) != EXIT_SUCCESS)
- {
- XFREE (str);
- }
-#endif
- }
-}
-
-char *
-lt_extend_str (const char *orig_value, const char *add, int to_end)
-{
- char *new_value;
- if (orig_value && *orig_value)
- {
- int orig_value_len = strlen (orig_value);
- int add_len = strlen (add);
- new_value = XMALLOC (char, add_len + orig_value_len + 1);
- if (to_end)
- {
- strcpy (new_value, orig_value);
- strcpy (new_value + orig_value_len, add);
- }
- else
- {
- strcpy (new_value, add);
- strcpy (new_value + add_len, orig_value);
- }
- }
- else
- {
- new_value = xstrdup (add);
- }
- return new_value;
-}
-
-void
-lt_update_exe_path (const char *name, const char *value)
-{
- lt_debugprintf (__FILE__, __LINE__,
- "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
- nonnull (name), nonnull (value));
-
- if (name && *name && value && *value)
- {
- char *new_value = lt_extend_str (getenv (name), value, 0);
- /* some systems can't cope with a ':'-terminated path #' */
- int len = strlen (new_value);
- while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
- {
- new_value[len-1] = '\0';
- }
- lt_setenv (name, new_value);
- XFREE (new_value);
- }
-}
-
-void
-lt_update_lib_path (const char *name, const char *value)
-{
- lt_debugprintf (__FILE__, __LINE__,
- "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
- nonnull (name), nonnull (value));
-
- if (name && *name && value && *value)
- {
- char *new_value = lt_extend_str (getenv (name), value, 0);
- lt_setenv (name, new_value);
- XFREE (new_value);
- }
-}
-
-EOF
- case $host_os in
- mingw*)
- cat <<"EOF"
-
-/* Prepares an argument vector before calling spawn().
- Note that spawn() does not by itself call the command interpreter
- (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
- ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- GetVersionEx(&v);
- v.dwPlatformId == VER_PLATFORM_WIN32_NT;
- }) ? "cmd.exe" : "command.com").
- Instead it simply concatenates the arguments, separated by ' ', and calls
- CreateProcess(). We must quote the arguments since Win32 CreateProcess()
- interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
- special way:
- - Space and tab are interpreted as delimiters. They are not treated as
- delimiters if they are surrounded by double quotes: "...".
- - Unescaped double quotes are removed from the input. Their only effect is
- that within double quotes, space and tab are treated like normal
- characters.
- - Backslashes not followed by double quotes are not special.
- - But 2*n+1 backslashes followed by a double quote become
- n backslashes followed by a double quote (n >= 0):
- \" -> "
- \\\" -> \"
- \\\\\" -> \\"
- */
-#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-char **
-prepare_spawn (char **argv)
-{
- size_t argc;
- char **new_argv;
- size_t i;
-
- /* Count number of arguments. */
- for (argc = 0; argv[argc] != NULL; argc++)
- ;
-
- /* Allocate new argument vector. */
- new_argv = XMALLOC (char *, argc + 1);
-
- /* Put quoted arguments into the new argument vector. */
- for (i = 0; i < argc; i++)
- {
- const char *string = argv[i];
-
- if (string[0] == '\0')
- new_argv[i] = xstrdup ("\"\"");
- else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
- {
- int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
- size_t length;
- unsigned int backslashes;
- const char *s;
- char *quoted_string;
- char *p;
-
- length = 0;
- backslashes = 0;
- if (quote_around)
- length++;
- for (s = string; *s != '\0'; s++)
- {
- char c = *s;
- if (c == '"')
- length += backslashes + 1;
- length++;
- if (c == '\\')
- backslashes++;
- else
- backslashes = 0;
- }
- if (quote_around)
- length += backslashes + 1;
-
- quoted_string = XMALLOC (char, length + 1);
-
- p = quoted_string;
- backslashes = 0;
- if (quote_around)
- *p++ = '"';
- for (s = string; *s != '\0'; s++)
- {
- char c = *s;
- if (c == '"')
- {
- unsigned int j;
- for (j = backslashes + 1; j > 0; j--)
- *p++ = '\\';
- }
- *p++ = c;
- if (c == '\\')
- backslashes++;
- else
- backslashes = 0;
- }
- if (quote_around)
- {
- unsigned int j;
- for (j = backslashes; j > 0; j--)
- *p++ = '\\';
- *p++ = '"';
- }
- *p = '\0';
-
- new_argv[i] = quoted_string;
- }
- else
- new_argv[i] = (char *) string;
- }
- new_argv[argc] = NULL;
-
- return new_argv;
-}
-EOF
- ;;
- esac
-
- cat <<"EOF"
-void lt_dump_script (FILE* f)
-{
-EOF
- func_emit_wrapper yes |
- $SED -n -e '
-s/^\(.\{79\}\)\(..*\)/\1\
-\2/
-h
-s/\([\\"]\)/\\\1/g
-s/$/\\n/
-s/\([^\n]*\).*/ fputs ("\1", f);/p
-g
-D'
- cat <<"EOF"
-}
-EOF
-}
-# end: func_emit_cwrapperexe_src
-
-# func_win32_import_lib_p ARG
-# True if ARG is an import lib, as indicated by $file_magic_cmd
-func_win32_import_lib_p ()
-{
- $opt_debug
- case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
- *import*) : ;;
- *) false ;;
- esac
-}
-
-# func_mode_link arg...
-func_mode_link ()
-{
- $opt_debug
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
- # It is impossible to link a dll without this setting, and
- # we shouldn't force the makefile maintainer to figure out
- # which system we are compiling for in order to pass an extra
- # flag for every libtool invocation.
- # allow_undefined=no
-
- # FIXME: Unfortunately, there are problems with the above when trying
- # to make a dll which has undefined symbols, in which case not
- # even a static library is built. For now, we need to specify
- # -no-undefined on the libtool link line when we can be certain
- # that all symbols are satisfied, otherwise we get a static library.
- allow_undefined=yes
- ;;
- *)
- allow_undefined=yes
- ;;
- esac
- libtool_args=$nonopt
- base_compile="$nonopt $@"
- compile_command=$nonopt
- finalize_command=$nonopt
-
- compile_rpath=
- finalize_rpath=
- compile_shlibpath=
- finalize_shlibpath=
- convenience=
- old_convenience=
- deplibs=
- old_deplibs=
- compiler_flags=
- linker_flags=
- dllsearchpath=
- lib_search_path=`pwd`
- inst_prefix_dir=
- new_inherited_linker_flags=
-
- avoid_version=no
- bindir=
- dlfiles=
- dlprefiles=
- dlself=no
- export_dynamic=no
- export_symbols=
- export_symbols_regex=
- generated=
- libobjs=
- ltlibs=
- module=no
- no_install=no
- objs=
- non_pic_objects=
- precious_files_regex=
- prefer_static_libs=no
- preload=no
- prev=
- prevarg=
- release=
- rpath=
- xrpath=
- perm_rpath=
- temp_rpath=
- thread_safe=no
- vinfo=
- vinfo_number=no
- weak_libs=
- single_module="${wl}-single_module"
- func_infer_tag $base_compile
-
- # We need to know -static, to get the right output filenames.
- for arg
- do
- case $arg in
- -shared)
- test "$build_libtool_libs" != yes && \
- func_fatal_configuration "can not build a shared library"
- build_old_libs=no
- break
- ;;
- -all-static | -static | -static-libtool-libs)
- case $arg in
- -all-static)
- if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
- func_warning "complete static linking is impossible in this configuration"
- fi
- if test -n "$link_static_flag"; then
- dlopen_self=$dlopen_self_static
- fi
- prefer_static_libs=yes
- ;;
- -static)
- if test -z "$pic_flag" && test -n "$link_static_flag"; then
- dlopen_self=$dlopen_self_static
- fi
- prefer_static_libs=built
- ;;
- -static-libtool-libs)
- if test -z "$pic_flag" && test -n "$link_static_flag"; then
- dlopen_self=$dlopen_self_static
- fi
- prefer_static_libs=yes
- ;;
- esac
- build_libtool_libs=no
- build_old_libs=yes
- break
- ;;
- esac
- done
-
- # See if our shared archives depend on static archives.
- test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
- # Go through the arguments, transforming them on the way.
- while test "$#" -gt 0; do
- arg="$1"
- shift
- func_quote_for_eval "$arg"
- qarg=$func_quote_for_eval_unquoted_result
- func_append libtool_args " $func_quote_for_eval_result"
-
- # If the previous option needs an argument, assign it.
- if test -n "$prev"; then
- case $prev in
- output)
- func_append compile_command " @OUTPUT@"
- func_append finalize_command " @OUTPUT@"
- ;;
- esac
-
- case $prev in
- bindir)
- bindir="$arg"
- prev=
- continue
- ;;
- dlfiles|dlprefiles)
- if test "$preload" = no; then
- # Add the symbol object into the linking commands.
- func_append compile_command " @SYMFILE@"
- func_append finalize_command " @SYMFILE@"
- preload=yes
- fi
- case $arg in
- *.la | *.lo) ;; # We handle these cases below.
- force)
- if test "$dlself" = no; then
- dlself=needless
- export_dynamic=yes
- fi
- prev=
- continue
- ;;
- self)
- if test "$prev" = dlprefiles; then
- dlself=yes
- elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
- dlself=yes
- else
- dlself=needless
- export_dynamic=yes
- fi
- prev=
- continue
- ;;
- *)
- if test "$prev" = dlfiles; then
- func_append dlfiles " $arg"
- else
- func_append dlprefiles " $arg"
- fi
- prev=
- continue
- ;;
- esac
- ;;
- expsyms)
- export_symbols="$arg"
- test -f "$arg" \
- || func_fatal_error "symbol file \`$arg' does not exist"
- prev=
- continue
- ;;
- expsyms_regex)
- export_symbols_regex="$arg"
- prev=
- continue
- ;;
- framework)
- case $host in
- *-*-darwin*)
- case "$deplibs " in
- *" $qarg.ltframework "*) ;;
- *) func_append deplibs " $qarg.ltframework" # this is fixed later
- ;;
- esac
- ;;
- esac
- prev=
- continue
- ;;
- inst_prefix)
- inst_prefix_dir="$arg"
- prev=
- continue
- ;;
- objectlist)
- if test -f "$arg"; then
- save_arg=$arg
- moreargs=
- for fil in `cat "$save_arg"`
- do
-# func_append moreargs " $fil"
- arg=$fil
- # A libtool-controlled object.
-
- # Check to see that this really is a libtool object.
- if func_lalib_unsafe_p "$arg"; then
- pic_object=
- non_pic_object=
-
- # Read the .lo file
- func_source "$arg"
-
- if test -z "$pic_object" ||
- test -z "$non_pic_object" ||
- test "$pic_object" = none &&
- test "$non_pic_object" = none; then
- func_fatal_error "cannot find name of object for \`$arg'"
- fi
-
- # Extract subdirectory from the argument.
- func_dirname "$arg" "/" ""
- xdir="$func_dirname_result"
-
- if test "$pic_object" != none; then
- # Prepend the subdirectory the object is found in.
- pic_object="$xdir$pic_object"
-
- if test "$prev" = dlfiles; then
- if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
- func_append dlfiles " $pic_object"
- prev=
- continue
- else
- # If libtool objects are unsupported, then we need to preload.
- prev=dlprefiles
- fi
- fi
-
- # CHECK ME: I think I busted this. -Ossama
- if test "$prev" = dlprefiles; then
- # Preload the old-style object.
- func_append dlprefiles " $pic_object"
- prev=
- fi
-
- # A PIC object.
- func_append libobjs " $pic_object"
- arg="$pic_object"
- fi
-
- # Non-PIC object.
- if test "$non_pic_object" != none; then
- # Prepend the subdirectory the object is found in.
- non_pic_object="$xdir$non_pic_object"
-
- # A standard non-PIC object
- func_append non_pic_objects " $non_pic_object"
- if test -z "$pic_object" || test "$pic_object" = none ; then
- arg="$non_pic_object"
- fi
- else
- # If the PIC object exists, use it instead.
- # $xdir was prepended to $pic_object above.
- non_pic_object="$pic_object"
- func_append non_pic_objects " $non_pic_object"
- fi
- else
- # Only an error if not doing a dry-run.
- if $opt_dry_run; then
- # Extract subdirectory from the argument.
- func_dirname "$arg" "/" ""
- xdir="$func_dirname_result"
-
- func_lo2o "$arg"
- pic_object=$xdir$objdir/$func_lo2o_result
- non_pic_object=$xdir$func_lo2o_result
- func_append libobjs " $pic_object"
- func_append non_pic_objects " $non_pic_object"
- else
- func_fatal_error "\`$arg' is not a valid libtool object"
- fi
- fi
- done
- else
- func_fatal_error "link input file \`$arg' does not exist"
- fi
- arg=$save_arg
- prev=
- continue
- ;;
- precious_regex)
- precious_files_regex="$arg"
- prev=
- continue
- ;;
- release)
- release="-$arg"
- prev=
- continue
- ;;
- rpath | xrpath)
- # We need an absolute path.
- case $arg in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- func_fatal_error "only absolute run-paths are allowed"
- ;;
- esac
- if test "$prev" = rpath; then
- case "$rpath " in
- *" $arg "*) ;;
- *) func_append rpath " $arg" ;;
- esac
- else
- case "$xrpath " in
- *" $arg "*) ;;
- *) func_append xrpath " $arg" ;;
- esac
- fi
- prev=
- continue
- ;;
- shrext)
- shrext_cmds="$arg"
- prev=
- continue
- ;;
- weak)
- func_append weak_libs " $arg"
- prev=
- continue
- ;;
- xcclinker)
- func_append linker_flags " $qarg"
- func_append compiler_flags " $qarg"
- prev=
- func_append compile_command " $qarg"
- func_append finalize_command " $qarg"
- continue
- ;;
- xcompiler)
- func_append compiler_flags " $qarg"
- prev=
- func_append compile_command " $qarg"
- func_append finalize_command " $qarg"
- continue
- ;;
- xlinker)
- func_append linker_flags " $qarg"
- func_append compiler_flags " $wl$qarg"
- prev=
- func_append compile_command " $wl$qarg"
- func_append finalize_command " $wl$qarg"
- continue
- ;;
- *)
- eval "$prev=\"\$arg\""
- prev=
- continue
- ;;
- esac
- fi # test -n "$prev"
-
- prevarg="$arg"
-
- case $arg in
- -all-static)
- if test -n "$link_static_flag"; then
- # See comment for -static flag below, for more details.
- func_append compile_command " $link_static_flag"
- func_append finalize_command " $link_static_flag"
- fi
- continue
- ;;
-
- -allow-undefined)
- # FIXME: remove this flag sometime in the future.
- func_fatal_error "\`-allow-undefined' must not be used because it is the default"
- ;;
-
- -avoid-version)
- avoid_version=yes
- continue
- ;;
-
- -bindir)
- prev=bindir
- continue
- ;;
-
- -dlopen)
- prev=dlfiles
- continue
- ;;
-
- -dlpreopen)
- prev=dlprefiles
- continue
- ;;
-
- -export-dynamic)
- export_dynamic=yes
- continue
- ;;
-
- -export-symbols | -export-symbols-regex)
- if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
- func_fatal_error "more than one -exported-symbols argument is not allowed"
- fi
- if test "X$arg" = "X-export-symbols"; then
- prev=expsyms
- else
- prev=expsyms_regex
- fi
- continue
- ;;
-
- -framework)
- prev=framework
- continue
- ;;
-
- -inst-prefix-dir)
- prev=inst_prefix
- continue
- ;;
-
- # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
- # so, if we see these flags be careful not to treat them like -L
- -L[A-Z][A-Z]*:*)
- case $with_gcc/$host in
- no/*-*-irix* | /*-*-irix*)
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
- ;;
- esac
- continue
- ;;
-
- -L*)
- func_stripname "-L" '' "$arg"
- if test -z "$func_stripname_result"; then
- if test "$#" -gt 0; then
- func_fatal_error "require no space between \`-L' and \`$1'"
- else
- func_fatal_error "need path for \`-L' option"
- fi
- fi
- func_resolve_sysroot "$func_stripname_result"
- dir=$func_resolve_sysroot_result
- # We need an absolute path.
- case $dir in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- absdir=`cd "$dir" && pwd`
- test -z "$absdir" && \
- func_fatal_error "cannot determine absolute directory name of \`$dir'"
- dir="$absdir"
- ;;
- esac
- case "$deplibs " in
- *" -L$dir "* | *" $arg "*)
- # Will only happen for absolute or sysroot arguments
- ;;
- *)
- # Preserve sysroot, but never include relative directories
- case $dir in
- [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
- *) func_append deplibs " -L$dir" ;;
- esac
- func_append lib_search_path " $dir"
- ;;
- esac
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
- testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
- case :$dllsearchpath: in
- *":$dir:"*) ;;
- ::) dllsearchpath=$dir;;
- *) func_append dllsearchpath ":$dir";;
- esac
- case :$dllsearchpath: in
- *":$testbindir:"*) ;;
- ::) dllsearchpath=$testbindir;;
- *) func_append dllsearchpath ":$testbindir";;
- esac
- ;;
- esac
- continue
- ;;
-
- -l*)
- if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
- # These systems don't actually have a C or math library (as such)
- continue
- ;;
- *-*-os2*)
- # These systems don't actually have a C library (as such)
- test "X$arg" = "X-lc" && continue
- ;;
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
- # Do not include libc due to us having libc/libc_r.
- test "X$arg" = "X-lc" && continue
- ;;
- *-*-rhapsody* | *-*-darwin1.[012])
- # Rhapsody C and math libraries are in the System framework
- func_append deplibs " System.ltframework"
- continue
- ;;
- *-*-sco3.2v5* | *-*-sco5v6*)
- # Causes problems with __ctype
- test "X$arg" = "X-lc" && continue
- ;;
- *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
- # Compiler inserts libc in the correct place for threads to work
- test "X$arg" = "X-lc" && continue
- ;;
- esac
- elif test "X$arg" = "X-lc_r"; then
- case $host in
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
- # Do not include libc_r directly, use -pthread flag.
- continue
- ;;
- esac
- fi
- func_append deplibs " $arg"
- continue
- ;;
-
- -module)
- module=yes
- continue
- ;;
-
- # Tru64 UNIX uses -model [arg] to determine the layout of C++
- # classes, name mangling, and exception handling.
- # Darwin uses the -arch flag to determine output architecture.
- -model|-arch|-isysroot|--sysroot)
- func_append compiler_flags " $arg"
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
- prev=xcompiler
- continue
- ;;
-
- -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
- |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
- func_append compiler_flags " $arg"
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
- case "$new_inherited_linker_flags " in
- *" $arg "*) ;;
- * ) func_append new_inherited_linker_flags " $arg" ;;
- esac
- continue
- ;;
-
- -multi_module)
- single_module="${wl}-multi_module"
- continue
- ;;
-
- -no-fast-install)
- fast_install=no
- continue
- ;;
-
- -no-install)
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
- # The PATH hackery in wrapper scripts is required on Windows
- # and Darwin in order for the loader to find any dlls it needs.
- func_warning "\`-no-install' is ignored for $host"
- func_warning "assuming \`-no-fast-install' instead"
- fast_install=no
- ;;
- *) no_install=yes ;;
- esac
- continue
- ;;
-
- -no-undefined)
- allow_undefined=no
- continue
- ;;
-
- -objectlist)
- prev=objectlist
- continue
- ;;
-
- -o) prev=output ;;
-
- -precious-files-regex)
- prev=precious_regex
- continue
- ;;
-
- -release)
- prev=release
- continue
- ;;
-
- -rpath)
- prev=rpath
- continue
- ;;
-
- -R)
- prev=xrpath
- continue
- ;;
-
- -R*)
- func_stripname '-R' '' "$arg"
- dir=$func_stripname_result
- # We need an absolute path.
- case $dir in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- =*)
- func_stripname '=' '' "$dir"
- dir=$lt_sysroot$func_stripname_result
- ;;
- *)
- func_fatal_error "only absolute run-paths are allowed"
- ;;
- esac
- case "$xrpath " in
- *" $dir "*) ;;
- *) func_append xrpath " $dir" ;;
- esac
- continue
- ;;
-
- -shared)
- # The effects of -shared are defined in a previous loop.
- continue
- ;;
-
- -shrext)
- prev=shrext
- continue
- ;;
-
- -static | -static-libtool-libs)
- # The effects of -static are defined in a previous loop.
- # We used to do the same as -all-static on platforms that
- # didn't have a PIC flag, but the assumption that the effects
- # would be equivalent was wrong. It would break on at least
- # Digital Unix and AIX.
- continue
- ;;
-
- -thread-safe)
- thread_safe=yes
- continue
- ;;
-
- -version-info)
- prev=vinfo
- continue
- ;;
-
- -version-number)
- prev=vinfo
- vinfo_number=yes
- continue
- ;;
-
- -weak)
- prev=weak
- continue
- ;;
-
- -Wc,*)
- func_stripname '-Wc,' '' "$arg"
- args=$func_stripname_result
- arg=
- save_ifs="$IFS"; IFS=','
- for flag in $args; do
- IFS="$save_ifs"
- func_quote_for_eval "$flag"
- func_append arg " $func_quote_for_eval_result"
- func_append compiler_flags " $func_quote_for_eval_result"
- done
- IFS="$save_ifs"
- func_stripname ' ' '' "$arg"
- arg=$func_stripname_result
- ;;
-
- -Wl,*)
- func_stripname '-Wl,' '' "$arg"
- args=$func_stripname_result
- arg=
- save_ifs="$IFS"; IFS=','
- for flag in $args; do
- IFS="$save_ifs"
- func_quote_for_eval "$flag"
- func_append arg " $wl$func_quote_for_eval_result"
- func_append compiler_flags " $wl$func_quote_for_eval_result"
- func_append linker_flags " $func_quote_for_eval_result"
- done
- IFS="$save_ifs"
- func_stripname ' ' '' "$arg"
- arg=$func_stripname_result
- ;;
-
- -Xcompiler)
- prev=xcompiler
- continue
- ;;
-
- -Xlinker)
- prev=xlinker
- continue
- ;;
-
- -XCClinker)
- prev=xcclinker
- continue
- ;;
-
- # -msg_* for osf cc
- -msg_*)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- ;;
-
- # Flags to be passed through unchanged, with rationale:
- # -64, -mips[0-9] enable 64-bit mode for the SGI compiler
- # -r[0-9][0-9]* specify processor for the SGI compiler
- # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
- # +DA*, +DD* enable 64-bit mode for the HP compiler
- # -q* compiler args for the IBM compiler
- # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
- # -F/path path to uninstalled frameworks, gcc on darwin
- # -p, -pg, --coverage, -fprofile-* profiling flags for GCC
- # @file GCC response files
- # -tp=* Portland pgcc target processor selection
- # --sysroot=* for sysroot support
- # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
- -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
- -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
- -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
- func_append compiler_flags " $arg"
- continue
- ;;
-
- # Some other compiler flag.
- -* | +*)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- ;;
-
- *.$objext)
- # A standard object.
- func_append objs " $arg"
- ;;
-
- *.lo)
- # A libtool-controlled object.
-
- # Check to see that this really is a libtool object.
- if func_lalib_unsafe_p "$arg"; then
- pic_object=
- non_pic_object=
-
- # Read the .lo file
- func_source "$arg"
-
- if test -z "$pic_object" ||
- test -z "$non_pic_object" ||
- test "$pic_object" = none &&
- test "$non_pic_object" = none; then
- func_fatal_error "cannot find name of object for \`$arg'"
- fi
-
- # Extract subdirectory from the argument.
- func_dirname "$arg" "/" ""
- xdir="$func_dirname_result"
-
- if test "$pic_object" != none; then
- # Prepend the subdirectory the object is found in.
- pic_object="$xdir$pic_object"
-
- if test "$prev" = dlfiles; then
- if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
- func_append dlfiles " $pic_object"
- prev=
- continue
- else
- # If libtool objects are unsupported, then we need to preload.
- prev=dlprefiles
- fi
- fi
-
- # CHECK ME: I think I busted this. -Ossama
- if test "$prev" = dlprefiles; then
- # Preload the old-style object.
- func_append dlprefiles " $pic_object"
- prev=
- fi
-
- # A PIC object.
- func_append libobjs " $pic_object"
- arg="$pic_object"
- fi
-
- # Non-PIC object.
- if test "$non_pic_object" != none; then
- # Prepend the subdirectory the object is found in.
- non_pic_object="$xdir$non_pic_object"
-
- # A standard non-PIC object
- func_append non_pic_objects " $non_pic_object"
- if test -z "$pic_object" || test "$pic_object" = none ; then
- arg="$non_pic_object"
- fi
- else
- # If the PIC object exists, use it instead.
- # $xdir was prepended to $pic_object above.
- non_pic_object="$pic_object"
- func_append non_pic_objects " $non_pic_object"
- fi
- else
- # Only an error if not doing a dry-run.
- if $opt_dry_run; then
- # Extract subdirectory from the argument.
- func_dirname "$arg" "/" ""
- xdir="$func_dirname_result"
-
- func_lo2o "$arg"
- pic_object=$xdir$objdir/$func_lo2o_result
- non_pic_object=$xdir$func_lo2o_result
- func_append libobjs " $pic_object"
- func_append non_pic_objects " $non_pic_object"
- else
- func_fatal_error "\`$arg' is not a valid libtool object"
- fi
- fi
- ;;
-
- *.$libext)
- # An archive.
- func_append deplibs " $arg"
- func_append old_deplibs " $arg"
- continue
- ;;
-
- *.la)
- # A libtool-controlled library.
-
- func_resolve_sysroot "$arg"
- if test "$prev" = dlfiles; then
- # This library was specified with -dlopen.
- func_append dlfiles " $func_resolve_sysroot_result"
- prev=
- elif test "$prev" = dlprefiles; then
- # The library was specified with -dlpreopen.
- func_append dlprefiles " $func_resolve_sysroot_result"
- prev=
- else
- func_append deplibs " $func_resolve_sysroot_result"
- fi
- continue
- ;;
-
- # Some other compiler argument.
- *)
- # Unknown arguments in both finalize_command and compile_command need
- # to be aesthetically quoted because they are evaled later.
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- ;;
- esac # arg
-
- # Now actually substitute the argument into the commands.
- if test -n "$arg"; then
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
- fi
- done # argument parsing loop
-
- test -n "$prev" && \
- func_fatal_help "the \`$prevarg' option requires an argument"
-
- if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
- eval arg=\"$export_dynamic_flag_spec\"
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
- fi
-
- oldlibs=
- # calculate the name of the file, without its directory
- func_basename "$output"
- outputname="$func_basename_result"
- libobjs_save="$libobjs"
-
- if test -n "$shlibpath_var"; then
- # get the directories listed in $shlibpath_var
- eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
- else
- shlib_search_path=
- fi
- eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
- eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-
- func_dirname "$output" "/" ""
- output_objdir="$func_dirname_result$objdir"
- func_to_tool_file "$output_objdir/"
- tool_output_objdir=$func_to_tool_file_result
- # Create the object directory.
- func_mkdir_p "$output_objdir"
-
- # Determine the type of output
- case $output in
- "")
- func_fatal_help "you must specify an output file"
- ;;
- *.$libext) linkmode=oldlib ;;
- *.lo | *.$objext) linkmode=obj ;;
- *.la) linkmode=lib ;;
- *) linkmode=prog ;; # Anything else should be a program.
- esac
-
- specialdeplibs=
-
- libs=
- # Find all interdependent deplibs by searching for libraries
- # that are linked more than once (e.g. -la -lb -la)
- for deplib in $deplibs; do
- if $opt_preserve_dup_deps ; then
- case "$libs " in
- *" $deplib "*) func_append specialdeplibs " $deplib" ;;
- esac
- fi
- func_append libs " $deplib"
- done
-
- if test "$linkmode" = lib; then
- libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
- # Compute libraries that are listed more than once in $predeps
- # $postdeps and mark them as special (i.e., whose duplicates are
- # not to be eliminated).
- pre_post_deps=
- if $opt_duplicate_compiler_generated_deps; then
- for pre_post_dep in $predeps $postdeps; do
- case "$pre_post_deps " in
- *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
- esac
- func_append pre_post_deps " $pre_post_dep"
- done
- fi
- pre_post_deps=
- fi
-
- deplibs=
- newdependency_libs=
- newlib_search_path=
- need_relink=no # whether we're linking any uninstalled libtool libraries
- notinst_deplibs= # not-installed libtool libraries
- notinst_path= # paths that contain not-installed libtool libraries
-
- case $linkmode in
- lib)
- passes="conv dlpreopen link"
- for file in $dlfiles $dlprefiles; do
- case $file in
- *.la) ;;
- *)
- func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
- ;;
- esac
- done
- ;;
- prog)
- compile_deplibs=
- finalize_deplibs=
- alldeplibs=no
- newdlfiles=
- newdlprefiles=
- passes="conv scan dlopen dlpreopen link"
- ;;
- *) passes="conv"
- ;;
- esac
-
- for pass in $passes; do
- # The preopen pass in lib mode reverses $deplibs; put it back here
- # so that -L comes before libs that need it for instance...
- if test "$linkmode,$pass" = "lib,link"; then
- ## FIXME: Find the place where the list is rebuilt in the wrong
- ## order, and fix it there properly
- tmp_deplibs=
- for deplib in $deplibs; do
- tmp_deplibs="$deplib $tmp_deplibs"
- done
- deplibs="$tmp_deplibs"
- fi
-
- if test "$linkmode,$pass" = "lib,link" ||
- test "$linkmode,$pass" = "prog,scan"; then
- libs="$deplibs"
- deplibs=
- fi
- if test "$linkmode" = prog; then
- case $pass in
- dlopen) libs="$dlfiles" ;;
- dlpreopen) libs="$dlprefiles" ;;
- link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
- esac
- fi
- if test "$linkmode,$pass" = "lib,dlpreopen"; then
- # Collect and forward deplibs of preopened libtool libs
- for lib in $dlprefiles; do
- # Ignore non-libtool-libs
- dependency_libs=
- func_resolve_sysroot "$lib"
- case $lib in
- *.la) func_source "$func_resolve_sysroot_result" ;;
- esac
-
- # Collect preopened libtool deplibs, except any this library
- # has declared as weak libs
- for deplib in $dependency_libs; do
- func_basename "$deplib"
- deplib_base=$func_basename_result
- case " $weak_libs " in
- *" $deplib_base "*) ;;
- *) func_append deplibs " $deplib" ;;
- esac
- done
- done
- libs="$dlprefiles"
- fi
- if test "$pass" = dlopen; then
- # Collect dlpreopened libraries
- save_deplibs="$deplibs"
- deplibs=
- fi
-
- for deplib in $libs; do
- lib=
- found=no
- case $deplib in
- -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
- |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
- if test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- func_append compiler_flags " $deplib"
- if test "$linkmode" = lib ; then
- case "$new_inherited_linker_flags " in
- *" $deplib "*) ;;
- * ) func_append new_inherited_linker_flags " $deplib" ;;
- esac
- fi
- fi
- continue
- ;;
- -l*)
- if test "$linkmode" != lib && test "$linkmode" != prog; then
- func_warning "\`-l' is ignored for archives/objects"
- continue
- fi
- func_stripname '-l' '' "$deplib"
- name=$func_stripname_result
- if test "$linkmode" = lib; then
- searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
- else
- searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
- fi
- for searchdir in $searchdirs; do
- for search_ext in .la $std_shrext .so .a; do
- # Search the libtool library
- lib="$searchdir/lib${name}${search_ext}"
- if test -f "$lib"; then
- if test "$search_ext" = ".la"; then
- found=yes
- else
- found=no
- fi
- break 2
- fi
- done
- done
- if test "$found" != yes; then
- # deplib doesn't seem to be a libtool library
- if test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- deplibs="$deplib $deplibs"
- test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
- fi
- continue
- else # deplib is a libtool library
- # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
- # We need to do some special things here, and not later.
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- case " $predeps $postdeps " in
- *" $deplib "*)
- if func_lalib_p "$lib"; then
- library_names=
- old_library=
- func_source "$lib"
- for l in $old_library $library_names; do
- ll="$l"
- done
- if test "X$ll" = "X$old_library" ; then # only static version available
- found=no
- func_dirname "$lib" "" "."
- ladir="$func_dirname_result"
- lib=$ladir/$old_library
- if test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- deplibs="$deplib $deplibs"
- test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
- fi
- continue
- fi
- fi
- ;;
- *) ;;
- esac
- fi
- fi
- ;; # -l
- *.ltframework)
- if test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- deplibs="$deplib $deplibs"
- if test "$linkmode" = lib ; then
- case "$new_inherited_linker_flags " in
- *" $deplib "*) ;;
- * ) func_append new_inherited_linker_flags " $deplib" ;;
- esac
- fi
- fi
- continue
- ;;
- -L*)
- case $linkmode in
- lib)
- deplibs="$deplib $deplibs"
- test "$pass" = conv && continue
- newdependency_libs="$deplib $newdependency_libs"
- func_stripname '-L' '' "$deplib"
- func_resolve_sysroot "$func_stripname_result"
- func_append newlib_search_path " $func_resolve_sysroot_result"
- ;;
- prog)
- if test "$pass" = conv; then
- deplibs="$deplib $deplibs"
- continue
- fi
- if test "$pass" = scan; then
- deplibs="$deplib $deplibs"
- else
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- fi
- func_stripname '-L' '' "$deplib"
- func_resolve_sysroot "$func_stripname_result"
- func_append newlib_search_path " $func_resolve_sysroot_result"
- ;;
- *)
- func_warning "\`-L' is ignored for archives/objects"
- ;;
- esac # linkmode
- continue
- ;; # -L
- -R*)
- if test "$pass" = link; then
- func_stripname '-R' '' "$deplib"
- func_resolve_sysroot "$func_stripname_result"
- dir=$func_resolve_sysroot_result
- # Make sure the xrpath contains only unique directories.
- case "$xrpath " in
- *" $dir "*) ;;
- *) func_append xrpath " $dir" ;;
- esac
- fi
- deplibs="$deplib $deplibs"
- continue
- ;;
- *.la)
- func_resolve_sysroot "$deplib"
- lib=$func_resolve_sysroot_result
- ;;
- *.$libext)
- if test "$pass" = conv; then
- deplibs="$deplib $deplibs"
- continue
- fi
- case $linkmode in
- lib)
- # Linking convenience modules into shared libraries is allowed,
- # but linking other static libraries is non-portable.
- case " $dlpreconveniencelibs " in
- *" $deplib "*) ;;
- *)
- valid_a_lib=no
- case $deplibs_check_method in
- match_pattern*)
- set dummy $deplibs_check_method; shift
- match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
- if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
- | $EGREP "$match_pattern_regex" > /dev/null; then
- valid_a_lib=yes
- fi
- ;;
- pass_all)
- valid_a_lib=yes
- ;;
- esac
- if test "$valid_a_lib" != yes; then
- echo
- $ECHO "*** Warning: Trying to link with static lib archive $deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because the file extensions .$libext of this argument makes me believe"
- echo "*** that it is just a static archive that I should not use here."
- else
- echo
- $ECHO "*** Warning: Linking the shared library $output against the"
- $ECHO "*** static library $deplib is not portable!"
- deplibs="$deplib $deplibs"
- fi
- ;;
- esac
- continue
- ;;
- prog)
- if test "$pass" != link; then
- deplibs="$deplib $deplibs"
- else
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- fi
- continue
- ;;
- esac # linkmode
- ;; # *.$libext
- *.lo | *.$objext)
- if test "$pass" = conv; then
- deplibs="$deplib $deplibs"
- elif test "$linkmode" = prog; then
- if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
- # If there is no dlopen support or we're linking statically,
- # we need to preload.
- func_append newdlprefiles " $deplib"
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- func_append newdlfiles " $deplib"
- fi
- fi
- continue
- ;;
- %DEPLIBS%)
- alldeplibs=yes
- continue
- ;;
- esac # case $deplib
-
- if test "$found" = yes || test -f "$lib"; then :
- else
- func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
- fi
-
- # Check to see that this really is a libtool archive.
- func_lalib_unsafe_p "$lib" \
- || func_fatal_error "\`$lib' is not a valid libtool archive"
-
- func_dirname "$lib" "" "."
- ladir="$func_dirname_result"
-
- dlname=
- dlopen=
- dlpreopen=
- libdir=
- library_names=
- old_library=
- inherited_linker_flags=
- # If the library was installed with an old release of libtool,
- # it will not redefine variables installed, or shouldnotlink
- installed=yes
- shouldnotlink=no
- avoidtemprpath=
-
-
- # Read the .la file
- func_source "$lib"
-
- # Convert "-framework foo" to "foo.ltframework"
- if test -n "$inherited_linker_flags"; then
- tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
- for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
- case " $new_inherited_linker_flags " in
- *" $tmp_inherited_linker_flag "*) ;;
- *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
- esac
- done
- fi
- dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- if test "$linkmode,$pass" = "lib,link" ||
- test "$linkmode,$pass" = "prog,scan" ||
- { test "$linkmode" != prog && test "$linkmode" != lib; }; then
- test -n "$dlopen" && func_append dlfiles " $dlopen"
- test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
- fi
-
- if test "$pass" = conv; then
- # Only check for convenience libraries
- deplibs="$lib $deplibs"
- if test -z "$libdir"; then
- if test -z "$old_library"; then
- func_fatal_error "cannot find name of link library for \`$lib'"
- fi
- # It is a libtool convenience library, so add in its objects.
- func_append convenience " $ladir/$objdir/$old_library"
- func_append old_convenience " $ladir/$objdir/$old_library"
- elif test "$linkmode" != prog && test "$linkmode" != lib; then
- func_fatal_error "\`$lib' is not a convenience library"
- fi
- tmp_libs=
- for deplib in $dependency_libs; do
- deplibs="$deplib $deplibs"
- if $opt_preserve_dup_deps ; then
- case "$tmp_libs " in
- *" $deplib "*) func_append specialdeplibs " $deplib" ;;
- esac
- fi
- func_append tmp_libs " $deplib"
- done
- continue
- fi # $pass = conv
-
-
- # Get the name of the library we link against.
- linklib=
- if test -n "$old_library" &&
- { test "$prefer_static_libs" = yes ||
- test "$prefer_static_libs,$installed" = "built,no"; }; then
- linklib=$old_library
- else
- for l in $old_library $library_names; do
- linklib="$l"
- done
- fi
- if test -z "$linklib"; then
- func_fatal_error "cannot find name of link library for \`$lib'"
- fi
-
- # This library was specified with -dlopen.
- if test "$pass" = dlopen; then
- if test -z "$libdir"; then
- func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
- fi
- if test -z "$dlname" ||
- test "$dlopen_support" != yes ||
- test "$build_libtool_libs" = no; then
- # If there is no dlname, no dlopen support or we're linking
- # statically, we need to preload. We also need to preload any
- # dependent libraries so libltdl's deplib preloader doesn't
- # bomb out in the load deplibs phase.
- func_append dlprefiles " $lib $dependency_libs"
- else
- func_append newdlfiles " $lib"
- fi
- continue
- fi # $pass = dlopen
-
- # We need an absolute path.
- case $ladir in
- [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
- *)
- abs_ladir=`cd "$ladir" && pwd`
- if test -z "$abs_ladir"; then
- func_warning "cannot determine absolute directory name of \`$ladir'"
- func_warning "passing it literally to the linker, although it might fail"
- abs_ladir="$ladir"
- fi
- ;;
- esac
- func_basename "$lib"
- laname="$func_basename_result"
-
- # Find the relevant object directory and library name.
- if test "X$installed" = Xyes; then
- if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
- func_warning "library \`$lib' was moved."
- dir="$ladir"
- absdir="$abs_ladir"
- libdir="$abs_ladir"
- else
- dir="$lt_sysroot$libdir"
- absdir="$lt_sysroot$libdir"
- fi
- test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
- else
- if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
- dir="$ladir"
- absdir="$abs_ladir"
- # Remove this search path later
- func_append notinst_path " $abs_ladir"
- else
- dir="$ladir/$objdir"
- absdir="$abs_ladir/$objdir"
- # Remove this search path later
- func_append notinst_path " $abs_ladir"
- fi
- fi # $installed = yes
- func_stripname 'lib' '.la' "$laname"
- name=$func_stripname_result
-
- # This library was specified with -dlpreopen.
- if test "$pass" = dlpreopen; then
- if test -z "$libdir" && test "$linkmode" = prog; then
- func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
- fi
- case "$host" in
- # special handling for platforms with PE-DLLs.
- *cygwin* | *mingw* | *cegcc* )
- # Linker will automatically link against shared library if both
- # static and shared are present. Therefore, ensure we extract
- # symbols from the import library if a shared library is present
- # (otherwise, the dlopen module name will be incorrect). We do
- # this by putting the import library name into $newdlprefiles.
- # We recover the dlopen module name by 'saving' the la file
- # name in a special purpose variable, and (later) extracting the
- # dlname from the la file.
- if test -n "$dlname"; then
- func_tr_sh "$dir/$linklib"
- eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
- func_append newdlprefiles " $dir/$linklib"
- else
- func_append newdlprefiles " $dir/$old_library"
- # Keep a list of preopened convenience libraries to check
- # that they are being used correctly in the link pass.
- test -z "$libdir" && \
- func_append dlpreconveniencelibs " $dir/$old_library"
- fi
- ;;
- * )
- # Prefer using a static library (so that no silly _DYNAMIC symbols
- # are required to link).
- if test -n "$old_library"; then
- func_append newdlprefiles " $dir/$old_library"
- # Keep a list of preopened convenience libraries to check
- # that they are being used correctly in the link pass.
- test -z "$libdir" && \
- func_append dlpreconveniencelibs " $dir/$old_library"
- # Otherwise, use the dlname, so that lt_dlopen finds it.
- elif test -n "$dlname"; then
- func_append newdlprefiles " $dir/$dlname"
- else
- func_append newdlprefiles " $dir/$linklib"
- fi
- ;;
- esac
- fi # $pass = dlpreopen
-
- if test -z "$libdir"; then
- # Link the convenience library
- if test "$linkmode" = lib; then
- deplibs="$dir/$old_library $deplibs"
- elif test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$dir/$old_library $compile_deplibs"
- finalize_deplibs="$dir/$old_library $finalize_deplibs"
- else
- deplibs="$lib $deplibs" # used for prog,scan pass
- fi
- continue
- fi
-
-
- if test "$linkmode" = prog && test "$pass" != link; then
- func_append newlib_search_path " $ladir"
- deplibs="$lib $deplibs"
-
- linkalldeplibs=no
- if test "$link_all_deplibs" != no || test -z "$library_names" ||
- test "$build_libtool_libs" = no; then
- linkalldeplibs=yes
- fi
-
- tmp_libs=
- for deplib in $dependency_libs; do
- case $deplib in
- -L*) func_stripname '-L' '' "$deplib"
- func_resolve_sysroot "$func_stripname_result"
- func_append newlib_search_path " $func_resolve_sysroot_result"
- ;;
- esac
- # Need to link against all dependency_libs?
- if test "$linkalldeplibs" = yes; then
- deplibs="$deplib $deplibs"
- else
- # Need to hardcode shared library paths
- # or/and link against static libraries
- newdependency_libs="$deplib $newdependency_libs"
- fi
- if $opt_preserve_dup_deps ; then
- case "$tmp_libs " in
- *" $deplib "*) func_append specialdeplibs " $deplib" ;;
- esac
- fi
- func_append tmp_libs " $deplib"
- done # for deplib
- continue
- fi # $linkmode = prog...
-
- if test "$linkmode,$pass" = "prog,link"; then
- if test -n "$library_names" &&
- { { test "$prefer_static_libs" = no ||
- test "$prefer_static_libs,$installed" = "built,yes"; } ||
- test -z "$old_library"; }; then
- # We need to hardcode the library path
- if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
- # Make sure the rpath contains only unique directories.
- case "$temp_rpath:" in
- *"$absdir:"*) ;;
- *) func_append temp_rpath "$absdir:" ;;
- esac
- fi
-
- # Hardcode the library path.
- # Skip directories that are in the system default run-time
- # search path.
- case " $sys_lib_dlsearch_path " in
- *" $absdir "*) ;;
- *)
- case "$compile_rpath " in
- *" $absdir "*) ;;
- *) func_append compile_rpath " $absdir" ;;
- esac
- ;;
- esac
- case " $sys_lib_dlsearch_path " in
- *" $libdir "*) ;;
- *)
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) func_append finalize_rpath " $libdir" ;;
- esac
- ;;
- esac
- fi # $linkmode,$pass = prog,link...
-
- if test "$alldeplibs" = yes &&
- { test "$deplibs_check_method" = pass_all ||
- { test "$build_libtool_libs" = yes &&
- test -n "$library_names"; }; }; then
- # We only need to search for static libraries
- continue
- fi
- fi
-
- link_static=no # Whether the deplib will be linked statically
- use_static_libs=$prefer_static_libs
- if test "$use_static_libs" = built && test "$installed" = yes; then
- use_static_libs=no
- fi
- if test -n "$library_names" &&
- { test "$use_static_libs" = no || test -z "$old_library"; }; then
- case $host in
- *cygwin* | *mingw* | *cegcc*)
- # No point in relinking DLLs because paths are not encoded
- func_append notinst_deplibs " $lib"
- need_relink=no
- ;;
- *)
- if test "$installed" = no; then
- func_append notinst_deplibs " $lib"
- need_relink=yes
- fi
- ;;
- esac
- # This is a shared library
-
- # Warn about portability, can't link against -module's on some
- # systems (darwin). Don't bleat about dlopened modules though!
- dlopenmodule=""
- for dlpremoduletest in $dlprefiles; do
- if test "X$dlpremoduletest" = "X$lib"; then
- dlopenmodule="$dlpremoduletest"
- break
- fi
- done
- if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
- echo
- if test "$linkmode" = prog; then
- $ECHO "*** Warning: Linking the executable $output against the loadable module"
- else
- $ECHO "*** Warning: Linking the shared library $output against the loadable module"
- fi
- $ECHO "*** $linklib is not portable!"
- fi
- if test "$linkmode" = lib &&
- test "$hardcode_into_libs" = yes; then
- # Hardcode the library path.
- # Skip directories that are in the system default run-time
- # search path.
- case " $sys_lib_dlsearch_path " in
- *" $absdir "*) ;;
- *)
- case "$compile_rpath " in
- *" $absdir "*) ;;
- *) func_append compile_rpath " $absdir" ;;
- esac
- ;;
- esac
- case " $sys_lib_dlsearch_path " in
- *" $libdir "*) ;;
- *)
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) func_append finalize_rpath " $libdir" ;;
- esac
- ;;
- esac
- fi
-
- if test -n "$old_archive_from_expsyms_cmds"; then
- # figure out the soname
- set dummy $library_names
- shift
- realname="$1"
- shift
- libname=`eval "\\$ECHO \"$libname_spec\""`
- # use dlname if we got it. it's perfectly good, no?
- if test -n "$dlname"; then
- soname="$dlname"
- elif test -n "$soname_spec"; then
- # bleh windows
- case $host in
- *cygwin* | mingw* | *cegcc*)
- func_arith $current - $age
- major=$func_arith_result
- versuffix="-$major"
- ;;
- esac
- eval soname=\"$soname_spec\"
- else
- soname="$realname"
- fi
-
- # Make a new name for the extract_expsyms_cmds to use
- soroot="$soname"
- func_basename "$soroot"
- soname="$func_basename_result"
- func_stripname 'lib' '.dll' "$soname"
- newlib=libimp-$func_stripname_result.a
-
- # If the library has no export list, then create one now
- if test -f "$output_objdir/$soname-def"; then :
- else
- func_verbose "extracting exported symbol list from \`$soname'"
- func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
- fi
-
- # Create $newlib
- if test -f "$output_objdir/$newlib"; then :; else
- func_verbose "generating import library for \`$soname'"
- func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
- fi
- # make sure the library variables are pointing to the new library
- dir=$output_objdir
- linklib=$newlib
- fi # test -n "$old_archive_from_expsyms_cmds"
-
- if test "$linkmode" = prog || test "$opt_mode" != relink; then
- add_shlibpath=
- add_dir=
- add=
- lib_linked=yes
- case $hardcode_action in
- immediate | unsupported)
- if test "$hardcode_direct" = no; then
- add="$dir/$linklib"
- case $host in
- *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
- *-*-sysv4*uw2*) add_dir="-L$dir" ;;
- *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
- *-*-unixware7*) add_dir="-L$dir" ;;
- *-*-darwin* )
- # if the lib is a (non-dlopened) module then we can not
- # link against it, someone is ignoring the earlier warnings
- if /usr/bin/file -L $add 2> /dev/null |
- $GREP ": [^:]* bundle" >/dev/null ; then
- if test "X$dlopenmodule" != "X$lib"; then
- $ECHO "*** Warning: lib $linklib is a module, not a shared library"
- if test -z "$old_library" ; then
- echo
- echo "*** And there doesn't seem to be a static archive available"
- echo "*** The link will probably fail, sorry"
- else
- add="$dir/$old_library"
- fi
- elif test -n "$old_library"; then
- add="$dir/$old_library"
- fi
- fi
- esac
- elif test "$hardcode_minus_L" = no; then
- case $host in
- *-*-sunos*) add_shlibpath="$dir" ;;
- esac
- add_dir="-L$dir"
- add="-l$name"
- elif test "$hardcode_shlibpath_var" = no; then
- add_shlibpath="$dir"
- add="-l$name"
- else
- lib_linked=no
- fi
- ;;
- relink)
- if test "$hardcode_direct" = yes &&
- test "$hardcode_direct_absolute" = no; then
- add="$dir/$linklib"
- elif test "$hardcode_minus_L" = yes; then
- add_dir="-L$absdir"
- # Try looking first in the location we're being installed to.
- if test -n "$inst_prefix_dir"; then
- case $libdir in
- [\\/]*)
- func_append add_dir " -L$inst_prefix_dir$libdir"
- ;;
- esac
- fi
- add="-l$name"
- elif test "$hardcode_shlibpath_var" = yes; then
- add_shlibpath="$dir"
- add="-l$name"
- else
- lib_linked=no
- fi
- ;;
- *) lib_linked=no ;;
- esac
-
- if test "$lib_linked" != yes; then
- func_fatal_configuration "unsupported hardcode properties"
- fi
-
- if test -n "$add_shlibpath"; then
- case :$compile_shlibpath: in
- *":$add_shlibpath:"*) ;;
- *) func_append compile_shlibpath "$add_shlibpath:" ;;
- esac
- fi
- if test "$linkmode" = prog; then
- test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
- test -n "$add" && compile_deplibs="$add $compile_deplibs"
- else
- test -n "$add_dir" && deplibs="$add_dir $deplibs"
- test -n "$add" && deplibs="$add $deplibs"
- if test "$hardcode_direct" != yes &&
- test "$hardcode_minus_L" != yes &&
- test "$hardcode_shlibpath_var" = yes; then
- case :$finalize_shlibpath: in
- *":$libdir:"*) ;;
- *) func_append finalize_shlibpath "$libdir:" ;;
- esac
- fi
- fi
- fi
-
- if test "$linkmode" = prog || test "$opt_mode" = relink; then
- add_shlibpath=
- add_dir=
- add=
- # Finalize command for both is simple: just hardcode it.
- if test "$hardcode_direct" = yes &&
- test "$hardcode_direct_absolute" = no; then
- add="$libdir/$linklib"
- elif test "$hardcode_minus_L" = yes; then
- add_dir="-L$libdir"
- add="-l$name"
- elif test "$hardcode_shlibpath_var" = yes; then
- case :$finalize_shlibpath: in
- *":$libdir:"*) ;;
- *) func_append finalize_shlibpath "$libdir:" ;;
- esac
- add="-l$name"
- elif test "$hardcode_automatic" = yes; then
- if test -n "$inst_prefix_dir" &&
- test -f "$inst_prefix_dir$libdir/$linklib" ; then
- add="$inst_prefix_dir$libdir/$linklib"
- else
- add="$libdir/$linklib"
- fi
- else
- # We cannot seem to hardcode it, guess we'll fake it.
- add_dir="-L$libdir"
- # Try looking first in the location we're being installed to.
- if test -n "$inst_prefix_dir"; then
- case $libdir in
- [\\/]*)
- func_append add_dir " -L$inst_prefix_dir$libdir"
- ;;
- esac
- fi
- add="-l$name"
- fi
-
- if test "$linkmode" = prog; then
- test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
- test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
- else
- test -n "$add_dir" && deplibs="$add_dir $deplibs"
- test -n "$add" && deplibs="$add $deplibs"
- fi
- fi
- elif test "$linkmode" = prog; then
- # Here we assume that one of hardcode_direct or hardcode_minus_L
- # is not unsupported. This is valid on all known static and
- # shared platforms.
- if test "$hardcode_direct" != unsupported; then
- test -n "$old_library" && linklib="$old_library"
- compile_deplibs="$dir/$linklib $compile_deplibs"
- finalize_deplibs="$dir/$linklib $finalize_deplibs"
- else
- compile_deplibs="-l$name -L$dir $compile_deplibs"
- finalize_deplibs="-l$name -L$dir $finalize_deplibs"
- fi
- elif test "$build_libtool_libs" = yes; then
- # Not a shared library
- if test "$deplibs_check_method" != pass_all; then
- # We're trying link a shared library against a static one
- # but the system doesn't support it.
-
- # Just print a warning and add the library to dependency_libs so
- # that the program can be linked against the static library.
- echo
- $ECHO "*** Warning: This system can not link to static lib archive $lib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
- if test "$module" = yes; then
- echo "*** But as you try to build a module library, libtool will still create "
- echo "*** a static module, that should work as long as the dlopening application"
- echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
- if test -z "$global_symbol_pipe"; then
- echo
- echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
- echo "*** not find such a program. So, this module is probably useless."
- echo "*** \`nm' from GNU binutils and a full rebuild may help."
- fi
- if test "$build_old_libs" = no; then
- build_libtool_libs=module
- build_old_libs=yes
- else
- build_libtool_libs=no
- fi
- fi
- else
- deplibs="$dir/$old_library $deplibs"
- link_static=yes
- fi
- fi # link shared/static library?
-
- if test "$linkmode" = lib; then
- if test -n "$dependency_libs" &&
- { test "$hardcode_into_libs" != yes ||
- test "$build_old_libs" = yes ||
- test "$link_static" = yes; }; then
- # Extract -R from dependency_libs
- temp_deplibs=
- for libdir in $dependency_libs; do
- case $libdir in
- -R*) func_stripname '-R' '' "$libdir"
- temp_xrpath=$func_stripname_result
- case " $xrpath " in
- *" $temp_xrpath "*) ;;
- *) func_append xrpath " $temp_xrpath";;
- esac;;
- *) func_append temp_deplibs " $libdir";;
- esac
- done
- dependency_libs="$temp_deplibs"
- fi
-
- func_append newlib_search_path " $absdir"
- # Link against this library
- test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
- # ... and its dependency_libs
- tmp_libs=
- for deplib in $dependency_libs; do
- newdependency_libs="$deplib $newdependency_libs"
- case $deplib in
- -L*) func_stripname '-L' '' "$deplib"
- func_resolve_sysroot "$func_stripname_result";;
- *) func_resolve_sysroot "$deplib" ;;
- esac
- if $opt_preserve_dup_deps ; then
- case "$tmp_libs " in
- *" $func_resolve_sysroot_result "*)
- func_append specialdeplibs " $func_resolve_sysroot_result" ;;
- esac
- fi
- func_append tmp_libs " $func_resolve_sysroot_result"
- done
-
- if test "$link_all_deplibs" != no; then
- # Add the search paths of all dependency libraries
- for deplib in $dependency_libs; do
- path=
- case $deplib in
- -L*) path="$deplib" ;;
- *.la)
- func_resolve_sysroot "$deplib"
- deplib=$func_resolve_sysroot_result
- func_dirname "$deplib" "" "."
- dir=$func_dirname_result
- # We need an absolute path.
- case $dir in
- [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
- *)
- absdir=`cd "$dir" && pwd`
- if test -z "$absdir"; then
- func_warning "cannot determine absolute directory name of \`$dir'"
- absdir="$dir"
- fi
- ;;
- esac
- if $GREP "^installed=no" $deplib > /dev/null; then
- case $host in
- *-*-darwin*)
- depdepl=
- eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
- if test -n "$deplibrary_names" ; then
- for tmp in $deplibrary_names ; do
- depdepl=$tmp
- done
- if test -f "$absdir/$objdir/$depdepl" ; then
- depdepl="$absdir/$objdir/$depdepl"
- darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
- if test -z "$darwin_install_name"; then
- darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
- fi
- func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
- func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
- path=
- fi
- fi
- ;;
- *)
- path="-L$absdir/$objdir"
- ;;
- esac
- else
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
- test -z "$libdir" && \
- func_fatal_error "\`$deplib' is not a valid libtool archive"
- test "$absdir" != "$libdir" && \
- func_warning "\`$deplib' seems to be moved"
-
- path="-L$absdir"
- fi
- ;;
- esac
- case " $deplibs " in
- *" $path "*) ;;
- *) deplibs="$path $deplibs" ;;
- esac
- done
- fi # link_all_deplibs != no
- fi # linkmode = lib
- done # for deplib in $libs
- if test "$pass" = link; then
- if test "$linkmode" = "prog"; then
- compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
- finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
- else
- compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- fi
- fi
- dependency_libs="$newdependency_libs"
- if test "$pass" = dlpreopen; then
- # Link the dlpreopened libraries before other libraries
- for deplib in $save_deplibs; do
- deplibs="$deplib $deplibs"
- done
- fi
- if test "$pass" != dlopen; then
- if test "$pass" != conv; then
- # Make sure lib_search_path contains only unique directories.
- lib_search_path=
- for dir in $newlib_search_path; do
- case "$lib_search_path " in
- *" $dir "*) ;;
- *) func_append lib_search_path " $dir" ;;
- esac
- done
- newlib_search_path=
- fi
-
- if test "$linkmode,$pass" != "prog,link"; then
- vars="deplibs"
- else
- vars="compile_deplibs finalize_deplibs"
- fi
- for var in $vars dependency_libs; do
- # Add libraries to $var in reverse order
- eval tmp_libs=\"\$$var\"
- new_libs=
- for deplib in $tmp_libs; do
- # FIXME: Pedantically, this is the right thing to do, so
- # that some nasty dependency loop isn't accidentally
- # broken:
- #new_libs="$deplib $new_libs"
- # Pragmatically, this seems to cause very few problems in
- # practice:
- case $deplib in
- -L*) new_libs="$deplib $new_libs" ;;
- -R*) ;;
- *)
- # And here is the reason: when a library appears more
- # than once as an explicit dependence of a library, or
- # is implicitly linked in more than once by the
- # compiler, it is considered special, and multiple
- # occurrences thereof are not removed. Compare this
- # with having the same library being listed as a
- # dependency of multiple other libraries: in this case,
- # we know (pedantically, we assume) the library does not
- # need to be listed more than once, so we keep only the
- # last copy. This is not always right, but it is rare
- # enough that we require users that really mean to play
- # such unportable linking tricks to link the library
- # using -Wl,-lname, so that libtool does not consider it
- # for duplicate removal.
- case " $specialdeplibs " in
- *" $deplib "*) new_libs="$deplib $new_libs" ;;
- *)
- case " $new_libs " in
- *" $deplib "*) ;;
- *) new_libs="$deplib $new_libs" ;;
- esac
- ;;
- esac
- ;;
- esac
- done
- tmp_libs=
- for deplib in $new_libs; do
- case $deplib in
- -L*)
- case " $tmp_libs " in
- *" $deplib "*) ;;
- *) func_append tmp_libs " $deplib" ;;
- esac
- ;;
- *) func_append tmp_libs " $deplib" ;;
- esac
- done
- eval $var=\"$tmp_libs\"
- done # for var
- fi
- # Last step: remove runtime libs from dependency_libs
- # (they stay in deplibs)
- tmp_libs=
- for i in $dependency_libs ; do
- case " $predeps $postdeps $compiler_lib_search_path " in
- *" $i "*)
- i=""
- ;;
- esac
- if test -n "$i" ; then
- func_append tmp_libs " $i"
- fi
- done
- dependency_libs=$tmp_libs
- done # for pass
- if test "$linkmode" = prog; then
- dlfiles="$newdlfiles"
- fi
- if test "$linkmode" = prog || test "$linkmode" = lib; then
- dlprefiles="$newdlprefiles"
- fi
-
- case $linkmode in
- oldlib)
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- func_warning "\`-dlopen' is ignored for archives"
- fi
-
- case " $deplibs" in
- *\ -l* | *\ -L*)
- func_warning "\`-l' and \`-L' are ignored for archives" ;;
- esac
-
- test -n "$rpath" && \
- func_warning "\`-rpath' is ignored for archives"
-
- test -n "$xrpath" && \
- func_warning "\`-R' is ignored for archives"
-
- test -n "$vinfo" && \
- func_warning "\`-version-info/-version-number' is ignored for archives"
-
- test -n "$release" && \
- func_warning "\`-release' is ignored for archives"
-
- test -n "$export_symbols$export_symbols_regex" && \
- func_warning "\`-export-symbols' is ignored for archives"
-
- # Now set the variables for building old libraries.
- build_libtool_libs=no
- oldlibs="$output"
- func_append objs "$old_deplibs"
- ;;
-
- lib)
- # Make sure we only generate libraries of the form `libNAME.la'.
- case $outputname in
- lib*)
- func_stripname 'lib' '.la' "$outputname"
- name=$func_stripname_result
- eval shared_ext=\"$shrext_cmds\"
- eval libname=\"$libname_spec\"
- ;;
- *)
- test "$module" = no && \
- func_fatal_help "libtool library \`$output' must begin with \`lib'"
-
- if test "$need_lib_prefix" != no; then
- # Add the "lib" prefix for modules if required
- func_stripname '' '.la' "$outputname"
- name=$func_stripname_result
- eval shared_ext=\"$shrext_cmds\"
- eval libname=\"$libname_spec\"
- else
- func_stripname '' '.la' "$outputname"
- libname=$func_stripname_result
- fi
- ;;
- esac
-
- if test -n "$objs"; then
- if test "$deplibs_check_method" != pass_all; then
- func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
- else
- echo
- $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
- $ECHO "*** objects $objs is not portable!"
- func_append libobjs " $objs"
- fi
- fi
-
- test "$dlself" != no && \
- func_warning "\`-dlopen self' is ignored for libtool libraries"
-
- set dummy $rpath
- shift
- test "$#" -gt 1 && \
- func_warning "ignoring multiple \`-rpath's for a libtool library"
-
- install_libdir="$1"
-
- oldlibs=
- if test -z "$rpath"; then
- if test "$build_libtool_libs" = yes; then
- # Building a libtool convenience library.
- # Some compilers have problems with a `.al' extension so
- # convenience libraries should have the same extension an
- # archive normally would.
- oldlibs="$output_objdir/$libname.$libext $oldlibs"
- build_libtool_libs=convenience
- build_old_libs=yes
- fi
-
- test -n "$vinfo" && \
- func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
-
- test -n "$release" && \
- func_warning "\`-release' is ignored for convenience libraries"
- else
-
- # Parse the version information argument.
- save_ifs="$IFS"; IFS=':'
- set dummy $vinfo 0 0 0
- shift
- IFS="$save_ifs"
-
- test -n "$7" && \
- func_fatal_help "too many parameters to \`-version-info'"
-
- # convert absolute version numbers to libtool ages
- # this retains compatibility with .la files and attempts
- # to make the code below a bit more comprehensible
-
- case $vinfo_number in
- yes)
- number_major="$1"
- number_minor="$2"
- number_revision="$3"
- #
- # There are really only two kinds -- those that
- # use the current revision as the major version
- # and those that subtract age and use age as
- # a minor version. But, then there is irix
- # which has an extra 1 added just for fun
- #
- case $version_type in
- # correct linux to gnu/linux during the next big refactor
- darwin|linux|osf|windows|none)
- func_arith $number_major + $number_minor
- current=$func_arith_result
- age="$number_minor"
- revision="$number_revision"
- ;;
- freebsd-aout|freebsd-elf|qnx|sunos)
- current="$number_major"
- revision="$number_minor"
- age="0"
- ;;
- irix|nonstopux)
- func_arith $number_major + $number_minor
- current=$func_arith_result
- age="$number_minor"
- revision="$number_minor"
- lt_irix_increment=no
- ;;
- esac
- ;;
- no)
- current="$1"
- revision="$2"
- age="$3"
- ;;
- esac
-
- # Check that each of the things are valid numbers.
- case $current in
- 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
- *)
- func_error "CURRENT \`$current' must be a nonnegative integer"
- func_fatal_error "\`$vinfo' is not valid version information"
- ;;
- esac
-
- case $revision in
- 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
- *)
- func_error "REVISION \`$revision' must be a nonnegative integer"
- func_fatal_error "\`$vinfo' is not valid version information"
- ;;
- esac
-
- case $age in
- 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
- *)
- func_error "AGE \`$age' must be a nonnegative integer"
- func_fatal_error "\`$vinfo' is not valid version information"
- ;;
- esac
-
- if test "$age" -gt "$current"; then
- func_error "AGE \`$age' is greater than the current interface number \`$current'"
- func_fatal_error "\`$vinfo' is not valid version information"
- fi
-
- # Calculate the version variables.
- major=
- versuffix=
- verstring=
- case $version_type in
- none) ;;
-
- darwin)
- # Like Linux, but with the current version available in
- # verstring for coding it into the library header
- func_arith $current - $age
- major=.$func_arith_result
- versuffix="$major.$age.$revision"
- # Darwin ld doesn't like 0 for these options...
- func_arith $current + 1
- minor_current=$func_arith_result
- xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
- verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
- ;;
-
- freebsd-aout)
- major=".$current"
- versuffix=".$current.$revision";
- ;;
-
- freebsd-elf)
- major=".$current"
- versuffix=".$current"
- ;;
-
- irix | nonstopux)
- if test "X$lt_irix_increment" = "Xno"; then
- func_arith $current - $age
- else
- func_arith $current - $age + 1
- fi
- major=$func_arith_result
-
- case $version_type in
- nonstopux) verstring_prefix=nonstopux ;;
- *) verstring_prefix=sgi ;;
- esac
- verstring="$verstring_prefix$major.$revision"
-
- # Add in all the interfaces that we are compatible with.
- loop=$revision
- while test "$loop" -ne 0; do
- func_arith $revision - $loop
- iface=$func_arith_result
- func_arith $loop - 1
- loop=$func_arith_result
- verstring="$verstring_prefix$major.$iface:$verstring"
- done
-
- # Before this point, $major must not contain `.'.
- major=.$major
- versuffix="$major.$revision"
- ;;
-
- linux) # correct to gnu/linux during the next big refactor
- func_arith $current - $age
- major=.$func_arith_result
- versuffix="$major.$age.$revision"
- ;;
-
- osf)
- func_arith $current - $age
- major=.$func_arith_result
- versuffix=".$current.$age.$revision"
- verstring="$current.$age.$revision"
-
- # Add in all the interfaces that we are compatible with.
- loop=$age
- while test "$loop" -ne 0; do
- func_arith $current - $loop
- iface=$func_arith_result
- func_arith $loop - 1
- loop=$func_arith_result
- verstring="$verstring:${iface}.0"
- done
-
- # Make executables depend on our current version.
- func_append verstring ":${current}.0"
- ;;
-
- qnx)
- major=".$current"
- versuffix=".$current"
- ;;
-
- sunos)
- major=".$current"
- versuffix=".$current.$revision"
- ;;
-
- windows)
- # Use '-' rather than '.', since we only want one
- # extension on DOS 8.3 filesystems.
- func_arith $current - $age
- major=$func_arith_result
- versuffix="-$major"
- ;;
-
- *)
- func_fatal_configuration "unknown library version type \`$version_type'"
- ;;
- esac
-
- # Clear the version info if we defaulted, and they specified a release.
- if test -z "$vinfo" && test -n "$release"; then
- major=
- case $version_type in
- darwin)
- # we can't check for "0.0" in archive_cmds due to quoting
- # problems, so we reset it completely
- verstring=
- ;;
- *)
- verstring="0.0"
- ;;
- esac
- if test "$need_version" = no; then
- versuffix=
- else
- versuffix=".0.0"
- fi
- fi
-
- # Remove version info from name if versioning should be avoided
- if test "$avoid_version" = yes && test "$need_version" = no; then
- major=
- versuffix=
- verstring=""
- fi
-
- # Check to see if the archive will have undefined symbols.
- if test "$allow_undefined" = yes; then
- if test "$allow_undefined_flag" = unsupported; then
- func_warning "undefined symbols not allowed in $host shared libraries"
- build_libtool_libs=no
- build_old_libs=yes
- fi
- else
- # Don't allow undefined symbols.
- allow_undefined_flag="$no_undefined_flag"
- fi
-
- fi
-
- func_generate_dlsyms "$libname" "$libname" "yes"
- func_append libobjs " $symfileobj"
- test "X$libobjs" = "X " && libobjs=
-
- if test "$opt_mode" != relink; then
- # Remove our outputs, but don't remove object files since they
- # may have been created when compiling PIC objects.
- removelist=
- tempremovelist=`$ECHO "$output_objdir/*"`
- for p in $tempremovelist; do
- case $p in
- *.$objext | *.gcno)
- ;;
- $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
- if test "X$precious_files_regex" != "X"; then
- if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
- then
- continue
- fi
- fi
- func_append removelist " $p"
- ;;
- *) ;;
- esac
- done
- test -n "$removelist" && \
- func_show_eval "${RM}r \$removelist"
- fi
-
- # Now set the variables for building old libraries.
- if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
- func_append oldlibs " $output_objdir/$libname.$libext"
-
- # Transform .lo files to .o files.
- oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
- fi
-
- # Eliminate all temporary directories.
- #for path in $notinst_path; do
- # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
- # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
- # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
- #done
-
- if test -n "$xrpath"; then
- # If the user specified any rpath flags, then add them.
- temp_xrpath=
- for libdir in $xrpath; do
- func_replace_sysroot "$libdir"
- func_append temp_xrpath " -R$func_replace_sysroot_result"
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) func_append finalize_rpath " $libdir" ;;
- esac
- done
- if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
- dependency_libs="$temp_xrpath $dependency_libs"
- fi
- fi
-
- # Make sure dlfiles contains only unique files that won't be dlpreopened
- old_dlfiles="$dlfiles"
- dlfiles=
- for lib in $old_dlfiles; do
- case " $dlprefiles $dlfiles " in
- *" $lib "*) ;;
- *) func_append dlfiles " $lib" ;;
- esac
- done
-
- # Make sure dlprefiles contains only unique files
- old_dlprefiles="$dlprefiles"
- dlprefiles=
- for lib in $old_dlprefiles; do
- case "$dlprefiles " in
- *" $lib "*) ;;
- *) func_append dlprefiles " $lib" ;;
- esac
- done
-
- if test "$build_libtool_libs" = yes; then
- if test -n "$rpath"; then
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
- # these systems don't actually have a c library (as such)!
- ;;
- *-*-rhapsody* | *-*-darwin1.[012])
- # Rhapsody C library is in the System framework
- func_append deplibs " System.ltframework"
- ;;
- *-*-netbsd*)
- # Don't link with libc until the a.out ld.so is fixed.
- ;;
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
- # Do not include libc due to us having libc/libc_r.
- ;;
- *-*-sco3.2v5* | *-*-sco5v6*)
- # Causes problems with __ctype
- ;;
- *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
- # Compiler inserts libc in the correct place for threads to work
- ;;
- *)
- # Add libc to deplibs on all other systems if necessary.
- if test "$build_libtool_need_lc" = "yes"; then
- func_append deplibs " -lc"
- fi
- ;;
- esac
- fi
-
- # Transform deplibs into only deplibs that can be linked in shared.
- name_save=$name
- libname_save=$libname
- release_save=$release
- versuffix_save=$versuffix
- major_save=$major
- # I'm not sure if I'm treating the release correctly. I think
- # release should show up in the -l (ie -lgmp5) so we don't want to
- # add it in twice. Is that correct?
- release=""
- versuffix=""
- major=""
- newdeplibs=
- droppeddeps=no
- case $deplibs_check_method in
- pass_all)
- # Don't check for shared/static. Everything works.
- # This might be a little naive. We might want to check
- # whether the library exists or not. But this is on
- # osf3 & osf4 and I'm not really sure... Just
- # implementing what was already the behavior.
- newdeplibs=$deplibs
- ;;
- test_compile)
- # This code stresses the "libraries are programs" paradigm to its
- # limits. Maybe even breaks it. We compile a program, linking it
- # against the deplibs as a proxy for the library. Then we can check
- # whether they linked in statically or dynamically with ldd.
- $opt_dry_run || $RM conftest.c
- cat > conftest.c <<EOF
- int main() { return 0; }
-EOF
- $opt_dry_run || $RM conftest
- if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
- ldd_output=`ldd conftest`
- for i in $deplibs; do
- case $i in
- -l*)
- func_stripname -l '' "$i"
- name=$func_stripname_result
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- case " $predeps $postdeps " in
- *" $i "*)
- func_append newdeplibs " $i"
- i=""
- ;;
- esac
- fi
- if test -n "$i" ; then
- libname=`eval "\\$ECHO \"$libname_spec\""`
- deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
- set dummy $deplib_matches; shift
- deplib_match=$1
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
- func_append newdeplibs " $i"
- else
- droppeddeps=yes
- echo
- $ECHO "*** Warning: dynamic linker does not accept needed library $i."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which I believe you do not have"
- echo "*** because a test_compile did reveal that the linker did not use it for"
- echo "*** its dynamic dependency list that programs get resolved with at runtime."
- fi
- fi
- ;;
- *)
- func_append newdeplibs " $i"
- ;;
- esac
- done
- else
- # Error occurred in the first compile. Let's try to salvage
- # the situation: Compile a separate program for each library.
- for i in $deplibs; do
- case $i in
- -l*)
- func_stripname -l '' "$i"
- name=$func_stripname_result
- $opt_dry_run || $RM conftest
- if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
- ldd_output=`ldd conftest`
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- case " $predeps $postdeps " in
- *" $i "*)
- func_append newdeplibs " $i"
- i=""
- ;;
- esac
- fi
- if test -n "$i" ; then
- libname=`eval "\\$ECHO \"$libname_spec\""`
- deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
- set dummy $deplib_matches; shift
- deplib_match=$1
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
- func_append newdeplibs " $i"
- else
- droppeddeps=yes
- echo
- $ECHO "*** Warning: dynamic linker does not accept needed library $i."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because a test_compile did reveal that the linker did not use this one"
- echo "*** as a dynamic dependency that programs can get resolved with at runtime."
- fi
- fi
- else
- droppeddeps=yes
- echo
- $ECHO "*** Warning! Library $i is needed by this library but I was not able to"
- echo "*** make it link in! You will probably need to install it or some"
- echo "*** library that it depends on before this library will be fully"
- echo "*** functional. Installing it before continuing would be even better."
- fi
- ;;
- *)
- func_append newdeplibs " $i"
- ;;
- esac
- done
- fi
- ;;
- file_magic*)
- set dummy $deplibs_check_method; shift
- file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
- for a_deplib in $deplibs; do
- case $a_deplib in
- -l*)
- func_stripname -l '' "$a_deplib"
- name=$func_stripname_result
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- case " $predeps $postdeps " in
- *" $a_deplib "*)
- func_append newdeplibs " $a_deplib"
- a_deplib=""
- ;;
- esac
- fi
- if test -n "$a_deplib" ; then
- libname=`eval "\\$ECHO \"$libname_spec\""`
- if test -n "$file_magic_glob"; then
- libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
- else
- libnameglob=$libname
- fi
- test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
- for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
- if test "$want_nocaseglob" = yes; then
- shopt -s nocaseglob
- potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
- $nocaseglob
- else
- potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
- fi
- for potent_lib in $potential_libs; do
- # Follow soft links.
- if ls -lLd "$potent_lib" 2>/dev/null |
- $GREP " -> " >/dev/null; then
- continue
- fi
- # The statement above tries to avoid entering an
- # endless loop below, in case of cyclic links.
- # We might still enter an endless loop, since a link
- # loop can be closed while we follow links,
- # but so what?
- potlib="$potent_lib"
- while test -h "$potlib" 2>/dev/null; do
- potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
- case $potliblink in
- [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
- *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
- esac
- done
- if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
- $SED -e 10q |
- $EGREP "$file_magic_regex" > /dev/null; then
- func_append newdeplibs " $a_deplib"
- a_deplib=""
- break 2
- fi
- done
- done
- fi
- if test -n "$a_deplib" ; then
- droppeddeps=yes
- echo
- $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because I did check the linker path looking for a file starting"
- if test -z "$potlib" ; then
- $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
- else
- $ECHO "*** with $libname and none of the candidates passed a file format test"
- $ECHO "*** using a file magic. Last file checked: $potlib"
- fi
- fi
- ;;
- *)
- # Add a -L argument.
- func_append newdeplibs " $a_deplib"
- ;;
- esac
- done # Gone through all deplibs.
- ;;
- match_pattern*)
- set dummy $deplibs_check_method; shift
- match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
- for a_deplib in $deplibs; do
- case $a_deplib in
- -l*)
- func_stripname -l '' "$a_deplib"
- name=$func_stripname_result
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- case " $predeps $postdeps " in
- *" $a_deplib "*)
- func_append newdeplibs " $a_deplib"
- a_deplib=""
- ;;
- esac
- fi
- if test -n "$a_deplib" ; then
- libname=`eval "\\$ECHO \"$libname_spec\""`
- for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
- potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
- for potent_lib in $potential_libs; do
- potlib="$potent_lib" # see symlink-check above in file_magic test
- if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
- $EGREP "$match_pattern_regex" > /dev/null; then
- func_append newdeplibs " $a_deplib"
- a_deplib=""
- break 2
- fi
- done
- done
- fi
- if test -n "$a_deplib" ; then
- droppeddeps=yes
- echo
- $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because I did check the linker path looking for a file starting"
- if test -z "$potlib" ; then
- $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
- else
- $ECHO "*** with $libname and none of the candidates passed a file format test"
- $ECHO "*** using a regex pattern. Last file checked: $potlib"
- fi
- fi
- ;;
- *)
- # Add a -L argument.
- func_append newdeplibs " $a_deplib"
- ;;
- esac
- done # Gone through all deplibs.
- ;;
- none | unknown | *)
- newdeplibs=""
- tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- for i in $predeps $postdeps ; do
- # can't use Xsed below, because $i might contain '/'
- tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
- done
- fi
- case $tmp_deplibs in
- *[!\ \ ]*)
- echo
- if test "X$deplibs_check_method" = "Xnone"; then
- echo "*** Warning: inter-library dependencies are not supported in this platform."
- else
- echo "*** Warning: inter-library dependencies are not known to be supported."
- fi
- echo "*** All declared inter-library dependencies are being dropped."
- droppeddeps=yes
- ;;
- esac
- ;;
- esac
- versuffix=$versuffix_save
- major=$major_save
- release=$release_save
- libname=$libname_save
- name=$name_save
-
- case $host in
- *-*-rhapsody* | *-*-darwin1.[012])
- # On Rhapsody replace the C library with the System framework
- newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
- ;;
- esac
-
- if test "$droppeddeps" = yes; then
- if test "$module" = yes; then
- echo
- echo "*** Warning: libtool could not satisfy all declared inter-library"
- $ECHO "*** dependencies of module $libname. Therefore, libtool will create"
- echo "*** a static module, that should work as long as the dlopening"
- echo "*** application is linked with the -dlopen flag."
- if test -z "$global_symbol_pipe"; then
- echo
- echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
- echo "*** not find such a program. So, this module is probably useless."
- echo "*** \`nm' from GNU binutils and a full rebuild may help."
- fi
- if test "$build_old_libs" = no; then
- oldlibs="$output_objdir/$libname.$libext"
- build_libtool_libs=module
- build_old_libs=yes
- else
- build_libtool_libs=no
- fi
- else
- echo "*** The inter-library dependencies that have been dropped here will be"
- echo "*** automatically added whenever a program is linked with this library"
- echo "*** or is declared to -dlopen it."
-
- if test "$allow_undefined" = no; then
- echo
- echo "*** Since this library must not contain undefined symbols,"
- echo "*** because either the platform does not support them or"
- echo "*** it was explicitly requested with -no-undefined,"
- echo "*** libtool will only create a static version of it."
- if test "$build_old_libs" = no; then
- oldlibs="$output_objdir/$libname.$libext"
- build_libtool_libs=module
- build_old_libs=yes
- else
- build_libtool_libs=no
- fi
- fi
- fi
- fi
- # Done checking deplibs!
- deplibs=$newdeplibs
- fi
- # Time to change all our "foo.ltframework" stuff back to "-framework foo"
- case $host in
- *-*-darwin*)
- newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- ;;
- esac
-
- # move library search paths that coincide with paths to not yet
- # installed libraries to the beginning of the library search list
- new_libs=
- for path in $notinst_path; do
- case " $new_libs " in
- *" -L$path/$objdir "*) ;;
- *)
- case " $deplibs " in
- *" -L$path/$objdir "*)
- func_append new_libs " -L$path/$objdir" ;;
- esac
- ;;
- esac
- done
- for deplib in $deplibs; do
- case $deplib in
- -L*)
- case " $new_libs " in
- *" $deplib "*) ;;
- *) func_append new_libs " $deplib" ;;
- esac
- ;;
- *) func_append new_libs " $deplib" ;;
- esac
- done
- deplibs="$new_libs"
-
- # All the library-specific variables (install_libdir is set above).
- library_names=
- old_library=
- dlname=
-
- # Test again, we may have decided not to build it any more
- if test "$build_libtool_libs" = yes; then
- # Remove ${wl} instances when linking with ld.
- # FIXME: should test the right _cmds variable.
- case $archive_cmds in
- *\$LD\ *) wl= ;;
- esac
- if test "$hardcode_into_libs" = yes; then
- # Hardcode the library paths
- hardcode_libdirs=
- dep_rpath=
- rpath="$finalize_rpath"
- test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
- for libdir in $rpath; do
- if test -n "$hardcode_libdir_flag_spec"; then
- if test -n "$hardcode_libdir_separator"; then
- func_replace_sysroot "$libdir"
- libdir=$func_replace_sysroot_result
- if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
- else
- # Just accumulate the unique libdirs.
- case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
- *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
- ;;
- *)
- func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
- ;;
- esac
- fi
- else
- eval flag=\"$hardcode_libdir_flag_spec\"
- func_append dep_rpath " $flag"
- fi
- elif test -n "$runpath_var"; then
- case "$perm_rpath " in
- *" $libdir "*) ;;
- *) func_append perm_rpath " $libdir" ;;
- esac
- fi
- done
- # Substitute the hardcoded libdirs into the rpath.
- if test -n "$hardcode_libdir_separator" &&
- test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
- eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
- fi
- if test -n "$runpath_var" && test -n "$perm_rpath"; then
- # We should set the runpath_var.
- rpath=
- for dir in $perm_rpath; do
- func_append rpath "$dir:"
- done
- eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
- fi
- test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
- fi
-
- shlibpath="$finalize_shlibpath"
- test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
- if test -n "$shlibpath"; then
- eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
- fi
-
- # Get the real and link names of the library.
- eval shared_ext=\"$shrext_cmds\"
- eval library_names=\"$library_names_spec\"
- set dummy $library_names
- shift
- realname="$1"
- shift
-
- if test -n "$soname_spec"; then
- eval soname=\"$soname_spec\"
- else
- soname="$realname"
- fi
- if test -z "$dlname"; then
- dlname=$soname
- fi
-
- lib="$output_objdir/$realname"
- linknames=
- for link
- do
- func_append linknames " $link"
- done
-
- # Use standard objects if they are pic
- test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
- test "X$libobjs" = "X " && libobjs=
-
- delfiles=
- if test -n "$export_symbols" && test -n "$include_expsyms"; then
- $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
- export_symbols="$output_objdir/$libname.uexp"
- func_append delfiles " $export_symbols"
- fi
-
- orig_export_symbols=
- case $host_os in
- cygwin* | mingw* | cegcc*)
- if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
- # exporting using user supplied symfile
- if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
- # and it's NOT already a .def file. Must figure out
- # which of the given symbols are data symbols and tag
- # them as such. So, trigger use of export_symbols_cmds.
- # export_symbols gets reassigned inside the "prepare
- # the list of exported symbols" if statement, so the
- # include_expsyms logic still works.
- orig_export_symbols="$export_symbols"
- export_symbols=
- always_export_symbols=yes
- fi
- fi
- ;;
- esac
-
- # Prepare the list of exported symbols
- if test -z "$export_symbols"; then
- if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
- func_verbose "generating symbol list for \`$libname.la'"
- export_symbols="$output_objdir/$libname.exp"
- $opt_dry_run || $RM $export_symbols
- cmds=$export_symbols_cmds
- save_ifs="$IFS"; IFS='~'
- for cmd1 in $cmds; do
- IFS="$save_ifs"
- # Take the normal branch if the nm_file_list_spec branch
- # doesn't work or if tool conversion is not needed.
- case $nm_file_list_spec~$to_tool_file_cmd in
- *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
- try_normal_branch=yes
- eval cmd=\"$cmd1\"
- func_len " $cmd"
- len=$func_len_result
- ;;
- *)
- try_normal_branch=no
- ;;
- esac
- if test "$try_normal_branch" = yes \
- && { test "$len" -lt "$max_cmd_len" \
- || test "$max_cmd_len" -le -1; }
- then
- func_show_eval "$cmd" 'exit $?'
- skipped_export=false
- elif test -n "$nm_file_list_spec"; then
- func_basename "$output"
- output_la=$func_basename_result
- save_libobjs=$libobjs
- save_output=$output
- output=${output_objdir}/${output_la}.nm
- func_to_tool_file "$output"
- libobjs=$nm_file_list_spec$func_to_tool_file_result
- func_append delfiles " $output"
- func_verbose "creating $NM input file list: $output"
- for obj in $save_libobjs; do
- func_to_tool_file "$obj"
- $ECHO "$func_to_tool_file_result"
- done > "$output"
- eval cmd=\"$cmd1\"
- func_show_eval "$cmd" 'exit $?'
- output=$save_output
- libobjs=$save_libobjs
- skipped_export=false
- else
- # The command line is too long to execute in one step.
- func_verbose "using reloadable object file for export list..."
- skipped_export=:
- # Break out early, otherwise skipped_export may be
- # set to false by a later but shorter cmd.
- break
- fi
- done
- IFS="$save_ifs"
- if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
- func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
- func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
- fi
- fi
- fi
-
- if test -n "$export_symbols" && test -n "$include_expsyms"; then
- tmp_export_symbols="$export_symbols"
- test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
- $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
- fi
-
- if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
- # The given exports_symbols file has to be filtered, so filter it.
- func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
- # FIXME: $output_objdir/$libname.filter potentially contains lots of
- # 's' commands which not all seds can handle. GNU sed should be fine
- # though. Also, the filter scales superlinearly with the number of
- # global variables. join(1) would be nice here, but unfortunately
- # isn't a blessed tool.
- $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
- func_append delfiles " $export_symbols $output_objdir/$libname.filter"
- export_symbols=$output_objdir/$libname.def
- $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
- fi
-
- tmp_deplibs=
- for test_deplib in $deplibs; do
- case " $convenience " in
- *" $test_deplib "*) ;;
- *)
- func_append tmp_deplibs " $test_deplib"
- ;;
- esac
- done
- deplibs="$tmp_deplibs"
-
- if test -n "$convenience"; then
- if test -n "$whole_archive_flag_spec" &&
- test "$compiler_needs_object" = yes &&
- test -z "$libobjs"; then
- # extract the archives, so we have objects to list.
- # TODO: could optimize this to just extract one archive.
- whole_archive_flag_spec=
- fi
- if test -n "$whole_archive_flag_spec"; then
- save_libobjs=$libobjs
- eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
- test "X$libobjs" = "X " && libobjs=
- else
- gentop="$output_objdir/${outputname}x"
- func_append generated " $gentop"
-
- func_extract_archives $gentop $convenience
- func_append libobjs " $func_extract_archives_result"
- test "X$libobjs" = "X " && libobjs=
- fi
- fi
-
- if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
- eval flag=\"$thread_safe_flag_spec\"
- func_append linker_flags " $flag"
- fi
-
- # Make a backup of the uninstalled library when relinking
- if test "$opt_mode" = relink; then
- $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
- fi
-
- # Do each of the archive commands.
- if test "$module" = yes && test -n "$module_cmds" ; then
- if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
- eval test_cmds=\"$module_expsym_cmds\"
- cmds=$module_expsym_cmds
- else
- eval test_cmds=\"$module_cmds\"
- cmds=$module_cmds
- fi
- else
- if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
- eval test_cmds=\"$archive_expsym_cmds\"
- cmds=$archive_expsym_cmds
- else
- eval test_cmds=\"$archive_cmds\"
- cmds=$archive_cmds
- fi
- fi
-
- if test "X$skipped_export" != "X:" &&
- func_len " $test_cmds" &&
- len=$func_len_result &&
- test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
- :
- else
- # The command line is too long to link in one step, link piecewise
- # or, if using GNU ld and skipped_export is not :, use a linker
- # script.
-
- # Save the value of $output and $libobjs because we want to
- # use them later. If we have whole_archive_flag_spec, we
- # want to use save_libobjs as it was before
- # whole_archive_flag_spec was expanded, because we can't
- # assume the linker understands whole_archive_flag_spec.
- # This may have to be revisited, in case too many
- # convenience libraries get linked in and end up exceeding
- # the spec.
- if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
- save_libobjs=$libobjs
- fi
- save_output=$output
- func_basename "$output"
- output_la=$func_basename_result
-
- # Clear the reloadable object creation command queue and
- # initialize k to one.
- test_cmds=
- concat_cmds=
- objlist=
- last_robj=
- k=1
-
- if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
- output=${output_objdir}/${output_la}.lnkscript
- func_verbose "creating GNU ld script: $output"
- echo 'INPUT (' > $output
- for obj in $save_libobjs
- do
- func_to_tool_file "$obj"
- $ECHO "$func_to_tool_file_result" >> $output
- done
- echo ')' >> $output
- func_append delfiles " $output"
- func_to_tool_file "$output"
- output=$func_to_tool_file_result
- elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
- output=${output_objdir}/${output_la}.lnk
- func_verbose "creating linker input file list: $output"
- : > $output
- set x $save_libobjs
- shift
- firstobj=
- if test "$compiler_needs_object" = yes; then
- firstobj="$1 "
- shift
- fi
- for obj
- do
- func_to_tool_file "$obj"
- $ECHO "$func_to_tool_file_result" >> $output
- done
- func_append delfiles " $output"
- func_to_tool_file "$output"
- output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
- else
- if test -n "$save_libobjs"; then
- func_verbose "creating reloadable object files..."
- output=$output_objdir/$output_la-${k}.$objext
- eval test_cmds=\"$reload_cmds\"
- func_len " $test_cmds"
- len0=$func_len_result
- len=$len0
-
- # Loop over the list of objects to be linked.
- for obj in $save_libobjs
- do
- func_len " $obj"
- func_arith $len + $func_len_result
- len=$func_arith_result
- if test "X$objlist" = X ||
- test "$len" -lt "$max_cmd_len"; then
- func_append objlist " $obj"
- else
- # The command $test_cmds is almost too long, add a
- # command to the queue.
- if test "$k" -eq 1 ; then
- # The first file doesn't have a previous command to add.
- reload_objs=$objlist
- eval concat_cmds=\"$reload_cmds\"
- else
- # All subsequent reloadable object files will link in
- # the last one created.
- reload_objs="$objlist $last_robj"
- eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
- fi
- last_robj=$output_objdir/$output_la-${k}.$objext
- func_arith $k + 1
- k=$func_arith_result
- output=$output_objdir/$output_la-${k}.$objext
- objlist=" $obj"
- func_len " $last_robj"
- func_arith $len0 + $func_len_result
- len=$func_arith_result
- fi
- done
- # Handle the remaining objects by creating one last
- # reloadable object file. All subsequent reloadable object
- # files will link in the last one created.
- test -z "$concat_cmds" || concat_cmds=$concat_cmds~
- reload_objs="$objlist $last_robj"
- eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
- if test -n "$last_robj"; then
- eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
- fi
- func_append delfiles " $output"
-
- else
- output=
- fi
-
- if ${skipped_export-false}; then
- func_verbose "generating symbol list for \`$libname.la'"
- export_symbols="$output_objdir/$libname.exp"
- $opt_dry_run || $RM $export_symbols
- libobjs=$output
- # Append the command to create the export file.
- test -z "$concat_cmds" || concat_cmds=$concat_cmds~
- eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
- if test -n "$last_robj"; then
- eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
- fi
- fi
-
- test -n "$save_libobjs" &&
- func_verbose "creating a temporary reloadable object file: $output"
-
- # Loop through the commands generated above and execute them.
- save_ifs="$IFS"; IFS='~'
- for cmd in $concat_cmds; do
- IFS="$save_ifs"
- $opt_silent || {
- func_quote_for_expand "$cmd"
- eval "func_echo $func_quote_for_expand_result"
- }
- $opt_dry_run || eval "$cmd" || {
- lt_exit=$?
-
- # Restore the uninstalled library and exit
- if test "$opt_mode" = relink; then
- ( cd "$output_objdir" && \
- $RM "${realname}T" && \
- $MV "${realname}U" "$realname" )
- fi
-
- exit $lt_exit
- }
- done
- IFS="$save_ifs"
-
- if test -n "$export_symbols_regex" && ${skipped_export-false}; then
- func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
- func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
- fi
- fi
-
- if ${skipped_export-false}; then
- if test -n "$export_symbols" && test -n "$include_expsyms"; then
- tmp_export_symbols="$export_symbols"
- test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
- $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
- fi
-
- if test -n "$orig_export_symbols"; then
- # The given exports_symbols file has to be filtered, so filter it.
- func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
- # FIXME: $output_objdir/$libname.filter potentially contains lots of
- # 's' commands which not all seds can handle. GNU sed should be fine
- # though. Also, the filter scales superlinearly with the number of
- # global variables. join(1) would be nice here, but unfortunately
- # isn't a blessed tool.
- $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
- func_append delfiles " $export_symbols $output_objdir/$libname.filter"
- export_symbols=$output_objdir/$libname.def
- $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
- fi
- fi
-
- libobjs=$output
- # Restore the value of output.
- output=$save_output
-
- if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
- eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
- test "X$libobjs" = "X " && libobjs=
- fi
- # Expand the library linking commands again to reset the
- # value of $libobjs for piecewise linking.
-
- # Do each of the archive commands.
- if test "$module" = yes && test -n "$module_cmds" ; then
- if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
- cmds=$module_expsym_cmds
- else
- cmds=$module_cmds
- fi
- else
- if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
- cmds=$archive_expsym_cmds
- else
- cmds=$archive_cmds
- fi
- fi
- fi
-
- if test -n "$delfiles"; then
- # Append the command to remove temporary files to $cmds.
- eval cmds=\"\$cmds~\$RM $delfiles\"
- fi
-
- # Add any objects from preloaded convenience libraries
- if test -n "$dlprefiles"; then
- gentop="$output_objdir/${outputname}x"
- func_append generated " $gentop"
-
- func_extract_archives $gentop $dlprefiles
- func_append libobjs " $func_extract_archives_result"
- test "X$libobjs" = "X " && libobjs=
- fi
-
- save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- eval cmd=\"$cmd\"
- $opt_silent || {
- func_quote_for_expand "$cmd"
- eval "func_echo $func_quote_for_expand_result"
- }
- $opt_dry_run || eval "$cmd" || {
- lt_exit=$?
-
- # Restore the uninstalled library and exit
- if test "$opt_mode" = relink; then
- ( cd "$output_objdir" && \
- $RM "${realname}T" && \
- $MV "${realname}U" "$realname" )
- fi
-
- exit $lt_exit
- }
- done
- IFS="$save_ifs"
-
- # Restore the uninstalled library and exit
- if test "$opt_mode" = relink; then
- $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
-
- if test -n "$convenience"; then
- if test -z "$whole_archive_flag_spec"; then
- func_show_eval '${RM}r "$gentop"'
- fi
- fi
-
- exit $EXIT_SUCCESS
- fi
-
- # Create links to the real library.
- for linkname in $linknames; do
- if test "$realname" != "$linkname"; then
- func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
- fi
- done
-
- # If -module or -export-dynamic was specified, set the dlname.
- if test "$module" = yes || test "$export_dynamic" = yes; then
- # On all known operating systems, these are identical.
- dlname="$soname"
- fi
- fi
- ;;
-
- obj)
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- func_warning "\`-dlopen' is ignored for objects"
- fi
-
- case " $deplibs" in
- *\ -l* | *\ -L*)
- func_warning "\`-l' and \`-L' are ignored for objects" ;;
- esac
-
- test -n "$rpath" && \
- func_warning "\`-rpath' is ignored for objects"
-
- test -n "$xrpath" && \
- func_warning "\`-R' is ignored for objects"
-
- test -n "$vinfo" && \
- func_warning "\`-version-info' is ignored for objects"
-
- test -n "$release" && \
- func_warning "\`-release' is ignored for objects"
-
- case $output in
- *.lo)
- test -n "$objs$old_deplibs" && \
- func_fatal_error "cannot build library object \`$output' from non-libtool objects"
-
- libobj=$output
- func_lo2o "$libobj"
- obj=$func_lo2o_result
- ;;
- *)
- libobj=
- obj="$output"
- ;;
- esac
-
- # Delete the old objects.
- $opt_dry_run || $RM $obj $libobj
-
- # Objects from convenience libraries. This assumes
- # single-version convenience libraries. Whenever we create
- # different ones for PIC/non-PIC, this we'll have to duplicate
- # the extraction.
- reload_conv_objs=
- gentop=
- # reload_cmds runs $LD directly, so let us get rid of
- # -Wl from whole_archive_flag_spec and hope we can get by with
- # turning comma into space..
- wl=
-
- if test -n "$convenience"; then
- if test -n "$whole_archive_flag_spec"; then
- eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
- reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
- else
- gentop="$output_objdir/${obj}x"
- func_append generated " $gentop"
-
- func_extract_archives $gentop $convenience
- reload_conv_objs="$reload_objs $func_extract_archives_result"
- fi
- fi
-
- # If we're not building shared, we need to use non_pic_objs
- test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
-
- # Create the old-style object.
- reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
- output="$obj"
- func_execute_cmds "$reload_cmds" 'exit $?'
-
- # Exit if we aren't doing a library object file.
- if test -z "$libobj"; then
- if test -n "$gentop"; then
- func_show_eval '${RM}r "$gentop"'
- fi
-
- exit $EXIT_SUCCESS
- fi
-
- if test "$build_libtool_libs" != yes; then
- if test -n "$gentop"; then
- func_show_eval '${RM}r "$gentop"'
- fi
-
- # Create an invalid libtool object if no PIC, so that we don't
- # accidentally link it into a program.
- # $show "echo timestamp > $libobj"
- # $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
- exit $EXIT_SUCCESS
- fi
-
- if test -n "$pic_flag" || test "$pic_mode" != default; then
- # Only do commands if we really have different PIC objects.
- reload_objs="$libobjs $reload_conv_objs"
- output="$libobj"
- func_execute_cmds "$reload_cmds" 'exit $?'
- fi
-
- if test -n "$gentop"; then
- func_show_eval '${RM}r "$gentop"'
- fi
-
- exit $EXIT_SUCCESS
- ;;
-
- prog)
- case $host in
- *cygwin*) func_stripname '' '.exe' "$output"
- output=$func_stripname_result.exe;;
- esac
- test -n "$vinfo" && \
- func_warning "\`-version-info' is ignored for programs"
-
- test -n "$release" && \
- func_warning "\`-release' is ignored for programs"
-
- test "$preload" = yes \
- && test "$dlopen_support" = unknown \
- && test "$dlopen_self" = unknown \
- && test "$dlopen_self_static" = unknown && \
- func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
-
- case $host in
- *-*-rhapsody* | *-*-darwin1.[012])
- # On Rhapsody replace the C library is the System framework
- compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
- finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
- ;;
- esac
-
- case $host in
- *-*-darwin*)
- # Don't allow lazy linking, it breaks C++ global constructors
- # But is supposedly fixed on 10.4 or later (yay!).
- if test "$tagname" = CXX ; then
- case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
- 10.[0123])
- func_append compile_command " ${wl}-bind_at_load"
- func_append finalize_command " ${wl}-bind_at_load"
- ;;
- esac
- fi
- # Time to change all our "foo.ltframework" stuff back to "-framework foo"
- compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- ;;
- esac
-
-
- # move library search paths that coincide with paths to not yet
- # installed libraries to the beginning of the library search list
- new_libs=
- for path in $notinst_path; do
- case " $new_libs " in
- *" -L$path/$objdir "*) ;;
- *)
- case " $compile_deplibs " in
- *" -L$path/$objdir "*)
- func_append new_libs " -L$path/$objdir" ;;
- esac
- ;;
- esac
- done
- for deplib in $compile_deplibs; do
- case $deplib in
- -L*)
- case " $new_libs " in
- *" $deplib "*) ;;
- *) func_append new_libs " $deplib" ;;
- esac
- ;;
- *) func_append new_libs " $deplib" ;;
- esac
- done
- compile_deplibs="$new_libs"
-
-
- func_append compile_command " $compile_deplibs"
- func_append finalize_command " $finalize_deplibs"
-
- if test -n "$rpath$xrpath"; then
- # If the user specified any rpath flags, then add them.
- for libdir in $rpath $xrpath; do
- # This is the magic to use -rpath.
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) func_append finalize_rpath " $libdir" ;;
- esac
- done
- fi
-
- # Now hardcode the library paths
- rpath=
- hardcode_libdirs=
- for libdir in $compile_rpath $finalize_rpath; do
- if test -n "$hardcode_libdir_flag_spec"; then
- if test -n "$hardcode_libdir_separator"; then
- if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
- else
- # Just accumulate the unique libdirs.
- case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
- *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
- ;;
- *)
- func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
- ;;
- esac
- fi
- else
- eval flag=\"$hardcode_libdir_flag_spec\"
- func_append rpath " $flag"
- fi
- elif test -n "$runpath_var"; then
- case "$perm_rpath " in
- *" $libdir "*) ;;
- *) func_append perm_rpath " $libdir" ;;
- esac
- fi
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
- testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
- case :$dllsearchpath: in
- *":$libdir:"*) ;;
- ::) dllsearchpath=$libdir;;
- *) func_append dllsearchpath ":$libdir";;
- esac
- case :$dllsearchpath: in
- *":$testbindir:"*) ;;
- ::) dllsearchpath=$testbindir;;
- *) func_append dllsearchpath ":$testbindir";;
- esac
- ;;
- esac
- done
- # Substitute the hardcoded libdirs into the rpath.
- if test -n "$hardcode_libdir_separator" &&
- test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
- eval rpath=\" $hardcode_libdir_flag_spec\"
- fi
- compile_rpath="$rpath"
-
- rpath=
- hardcode_libdirs=
- for libdir in $finalize_rpath; do
- if test -n "$hardcode_libdir_flag_spec"; then
- if test -n "$hardcode_libdir_separator"; then
- if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
- else
- # Just accumulate the unique libdirs.
- case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
- *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
- ;;
- *)
- func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
- ;;
- esac
- fi
- else
- eval flag=\"$hardcode_libdir_flag_spec\"
- func_append rpath " $flag"
- fi
- elif test -n "$runpath_var"; then
- case "$finalize_perm_rpath " in
- *" $libdir "*) ;;
- *) func_append finalize_perm_rpath " $libdir" ;;
- esac
- fi
- done
- # Substitute the hardcoded libdirs into the rpath.
- if test -n "$hardcode_libdir_separator" &&
- test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
- eval rpath=\" $hardcode_libdir_flag_spec\"
- fi
- finalize_rpath="$rpath"
-
- if test -n "$libobjs" && test "$build_old_libs" = yes; then
- # Transform all the library objects into standard objects.
- compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
- finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
- fi
-
- func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
-
- # template prelinking step
- if test -n "$prelink_cmds"; then
- func_execute_cmds "$prelink_cmds" 'exit $?'
- fi
-
- wrappers_required=yes
- case $host in
- *cegcc* | *mingw32ce*)
- # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
- wrappers_required=no
- ;;
- *cygwin* | *mingw* )
- if test "$build_libtool_libs" != yes; then
- wrappers_required=no
- fi
- ;;
- *)
- if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
- wrappers_required=no
- fi
- ;;
- esac
- if test "$wrappers_required" = no; then
- # Replace the output file specification.
- compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
- link_command="$compile_command$compile_rpath"
-
- # We have no uninstalled library dependencies, so finalize right now.
- exit_status=0
- func_show_eval "$link_command" 'exit_status=$?'
-
- if test -n "$postlink_cmds"; then
- func_to_tool_file "$output"
- postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
- func_execute_cmds "$postlink_cmds" 'exit $?'
- fi
-
- # Delete the generated files.
- if test -f "$output_objdir/${outputname}S.${objext}"; then
- func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
- fi
-
- exit $exit_status
- fi
-
- if test -n "$compile_shlibpath$finalize_shlibpath"; then
- compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
- fi
- if test -n "$finalize_shlibpath"; then
- finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
- fi
-
- compile_var=
- finalize_var=
- if test -n "$runpath_var"; then
- if test -n "$perm_rpath"; then
- # We should set the runpath_var.
- rpath=
- for dir in $perm_rpath; do
- func_append rpath "$dir:"
- done
- compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
- fi
- if test -n "$finalize_perm_rpath"; then
- # We should set the runpath_var.
- rpath=
- for dir in $finalize_perm_rpath; do
- func_append rpath "$dir:"
- done
- finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
- fi
- fi
-
- if test "$no_install" = yes; then
- # We don't need to create a wrapper script.
- link_command="$compile_var$compile_command$compile_rpath"
- # Replace the output file specification.
- link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
- # Delete the old output file.
- $opt_dry_run || $RM $output
- # Link the executable and exit
- func_show_eval "$link_command" 'exit $?'
-
- if test -n "$postlink_cmds"; then
- func_to_tool_file "$output"
- postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
- func_execute_cmds "$postlink_cmds" 'exit $?'
- fi
-
- exit $EXIT_SUCCESS
- fi
-
- if test "$hardcode_action" = relink; then
- # Fast installation is not supported
- link_command="$compile_var$compile_command$compile_rpath"
- relink_command="$finalize_var$finalize_command$finalize_rpath"
-
- func_warning "this platform does not like uninstalled shared libraries"
- func_warning "\`$output' will be relinked during installation"
- else
- if test "$fast_install" != no; then
- link_command="$finalize_var$compile_command$finalize_rpath"
- if test "$fast_install" = yes; then
- relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
- else
- # fast_install is set to needless
- relink_command=
- fi
- else
- link_command="$compile_var$compile_command$compile_rpath"
- relink_command="$finalize_var$finalize_command$finalize_rpath"
- fi
- fi
-
- # Replace the output file specification.
- link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
- # Delete the old output files.
- $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
- func_show_eval "$link_command" 'exit $?'
-
- if test -n "$postlink_cmds"; then
- func_to_tool_file "$output_objdir/$outputname"
- postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
- func_execute_cmds "$postlink_cmds" 'exit $?'
- fi
-
- # Now create the wrapper script.
- func_verbose "creating $output"
-
- # Quote the relink command for shipping.
- if test -n "$relink_command"; then
- # Preserve any variables that may affect compiler behavior
- for var in $variables_saved_for_relink; do
- if eval test -z \"\${$var+set}\"; then
- relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
- elif eval var_value=\$$var; test -z "$var_value"; then
- relink_command="$var=; export $var; $relink_command"
- else
- func_quote_for_eval "$var_value"
- relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
- fi
- done
- relink_command="(cd `pwd`; $relink_command)"
- relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
- fi
-
- # Only actually do things if not in dry run mode.
- $opt_dry_run || {
- # win32 will think the script is a binary if it has
- # a .exe suffix, so we strip it off here.
- case $output in
- *.exe) func_stripname '' '.exe' "$output"
- output=$func_stripname_result ;;
- esac
- # test for cygwin because mv fails w/o .exe extensions
- case $host in
- *cygwin*)
- exeext=.exe
- func_stripname '' '.exe' "$outputname"
- outputname=$func_stripname_result ;;
- *) exeext= ;;
- esac
- case $host in
- *cygwin* | *mingw* )
- func_dirname_and_basename "$output" "" "."
- output_name=$func_basename_result
- output_path=$func_dirname_result
- cwrappersource="$output_path/$objdir/lt-$output_name.c"
- cwrapper="$output_path/$output_name.exe"
- $RM $cwrappersource $cwrapper
- trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
- func_emit_cwrapperexe_src > $cwrappersource
-
- # The wrapper executable is built using the $host compiler,
- # because it contains $host paths and files. If cross-
- # compiling, it, like the target executable, must be
- # executed on the $host or under an emulation environment.
- $opt_dry_run || {
- $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
- $STRIP $cwrapper
- }
-
- # Now, create the wrapper script for func_source use:
- func_ltwrapper_scriptname $cwrapper
- $RM $func_ltwrapper_scriptname_result
- trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
- $opt_dry_run || {
- # note: this script will not be executed, so do not chmod.
- if test "x$build" = "x$host" ; then
- $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
- else
- func_emit_wrapper no > $func_ltwrapper_scriptname_result
- fi
- }
- ;;
- * )
- $RM $output
- trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
-
- func_emit_wrapper no > $output
- chmod +x $output
- ;;
- esac
- }
- exit $EXIT_SUCCESS
- ;;
- esac
-
- # See if we need to build an old-fashioned archive.
- for oldlib in $oldlibs; do
-
- if test "$build_libtool_libs" = convenience; then
- oldobjs="$libobjs_save $symfileobj"
- addlibs="$convenience"
- build_libtool_libs=no
- else
- if test "$build_libtool_libs" = module; then
- oldobjs="$libobjs_save"
- build_libtool_libs=no
- else
- oldobjs="$old_deplibs $non_pic_objects"
- if test "$preload" = yes && test -f "$symfileobj"; then
- func_append oldobjs " $symfileobj"
- fi
- fi
- addlibs="$old_convenience"
- fi
-
- if test -n "$addlibs"; then
- gentop="$output_objdir/${outputname}x"
- func_append generated " $gentop"
-
- func_extract_archives $gentop $addlibs
- func_append oldobjs " $func_extract_archives_result"
- fi
-
- # Do each command in the archive commands.
- if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
- cmds=$old_archive_from_new_cmds
- else
-
- # Add any objects from preloaded convenience libraries
- if test -n "$dlprefiles"; then
- gentop="$output_objdir/${outputname}x"
- func_append generated " $gentop"
-
- func_extract_archives $gentop $dlprefiles
- func_append oldobjs " $func_extract_archives_result"
- fi
-
- # POSIX demands no paths to be encoded in archives. We have
- # to avoid creating archives with duplicate basenames if we
- # might have to extract them afterwards, e.g., when creating a
- # static archive out of a convenience library, or when linking
- # the entirety of a libtool archive into another (currently
- # not supported by libtool).
- if (for obj in $oldobjs
- do
- func_basename "$obj"
- $ECHO "$func_basename_result"
- done | sort | sort -uc >/dev/null 2>&1); then
- :
- else
- echo "copying selected object files to avoid basename conflicts..."
- gentop="$output_objdir/${outputname}x"
- func_append generated " $gentop"
- func_mkdir_p "$gentop"
- save_oldobjs=$oldobjs
- oldobjs=
- counter=1
- for obj in $save_oldobjs
- do
- func_basename "$obj"
- objbase="$func_basename_result"
- case " $oldobjs " in
- " ") oldobjs=$obj ;;
- *[\ /]"$objbase "*)
- while :; do
- # Make sure we don't pick an alternate name that also
- # overlaps.
- newobj=lt$counter-$objbase
- func_arith $counter + 1
- counter=$func_arith_result
- case " $oldobjs " in
- *[\ /]"$newobj "*) ;;
- *) if test ! -f "$gentop/$newobj"; then break; fi ;;
- esac
- done
- func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
- func_append oldobjs " $gentop/$newobj"
- ;;
- *) func_append oldobjs " $obj" ;;
- esac
- done
- fi
- func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
- tool_oldlib=$func_to_tool_file_result
- eval cmds=\"$old_archive_cmds\"
-
- func_len " $cmds"
- len=$func_len_result
- if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
- cmds=$old_archive_cmds
- elif test -n "$archiver_list_spec"; then
- func_verbose "using command file archive linking..."
- for obj in $oldobjs
- do
- func_to_tool_file "$obj"
- $ECHO "$func_to_tool_file_result"
- done > $output_objdir/$libname.libcmd
- func_to_tool_file "$output_objdir/$libname.libcmd"
- oldobjs=" $archiver_list_spec$func_to_tool_file_result"
- cmds=$old_archive_cmds
- else
- # the command line is too long to link in one step, link in parts
- func_verbose "using piecewise archive linking..."
- save_RANLIB=$RANLIB
- RANLIB=:
- objlist=
- concat_cmds=
- save_oldobjs=$oldobjs
- oldobjs=
- # Is there a better way of finding the last object in the list?
- for obj in $save_oldobjs
- do
- last_oldobj=$obj
- done
- eval test_cmds=\"$old_archive_cmds\"
- func_len " $test_cmds"
- len0=$func_len_result
- len=$len0
- for obj in $save_oldobjs
- do
- func_len " $obj"
- func_arith $len + $func_len_result
- len=$func_arith_result
- func_append objlist " $obj"
- if test "$len" -lt "$max_cmd_len"; then
- :
- else
- # the above command should be used before it gets too long
- oldobjs=$objlist
- if test "$obj" = "$last_oldobj" ; then
- RANLIB=$save_RANLIB
- fi
- test -z "$concat_cmds" || concat_cmds=$concat_cmds~
- eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
- objlist=
- len=$len0
- fi
- done
- RANLIB=$save_RANLIB
- oldobjs=$objlist
- if test "X$oldobjs" = "X" ; then
- eval cmds=\"\$concat_cmds\"
- else
- eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
- fi
- fi
- fi
- func_execute_cmds "$cmds" 'exit $?'
- done
-
- test -n "$generated" && \
- func_show_eval "${RM}r$generated"
-
- # Now create the libtool archive.
- case $output in
- *.la)
- old_library=
- test "$build_old_libs" = yes && old_library="$libname.$libext"
- func_verbose "creating $output"
-
- # Preserve any variables that may affect compiler behavior
- for var in $variables_saved_for_relink; do
- if eval test -z \"\${$var+set}\"; then
- relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
- elif eval var_value=\$$var; test -z "$var_value"; then
- relink_command="$var=; export $var; $relink_command"
- else
- func_quote_for_eval "$var_value"
- relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
- fi
- done
- # Quote the link command for shipping.
- relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
- relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
- if test "$hardcode_automatic" = yes ; then
- relink_command=
- fi
-
- # Only create the output if not a dry run.
- $opt_dry_run || {
- for installed in no yes; do
- if test "$installed" = yes; then
- if test -z "$install_libdir"; then
- break
- fi
- output="$output_objdir/$outputname"i
- # Replace all uninstalled libtool libraries with the installed ones
- newdependency_libs=
- for deplib in $dependency_libs; do
- case $deplib in
- *.la)
- func_basename "$deplib"
- name="$func_basename_result"
- func_resolve_sysroot "$deplib"
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
- test -z "$libdir" && \
- func_fatal_error "\`$deplib' is not a valid libtool archive"
- func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
- ;;
- -L*)
- func_stripname -L '' "$deplib"
- func_replace_sysroot "$func_stripname_result"
- func_append newdependency_libs " -L$func_replace_sysroot_result"
- ;;
- -R*)
- func_stripname -R '' "$deplib"
- func_replace_sysroot "$func_stripname_result"
- func_append newdependency_libs " -R$func_replace_sysroot_result"
- ;;
- *) func_append newdependency_libs " $deplib" ;;
- esac
- done
- dependency_libs="$newdependency_libs"
- newdlfiles=
-
- for lib in $dlfiles; do
- case $lib in
- *.la)
- func_basename "$lib"
- name="$func_basename_result"
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
- test -z "$libdir" && \
- func_fatal_error "\`$lib' is not a valid libtool archive"
- func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
- ;;
- *) func_append newdlfiles " $lib" ;;
- esac
- done
- dlfiles="$newdlfiles"
- newdlprefiles=
- for lib in $dlprefiles; do
- case $lib in
- *.la)
- # Only pass preopened files to the pseudo-archive (for
- # eventual linking with the app. that links it) if we
- # didn't already link the preopened objects directly into
- # the library:
- func_basename "$lib"
- name="$func_basename_result"
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
- test -z "$libdir" && \
- func_fatal_error "\`$lib' is not a valid libtool archive"
- func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
- ;;
- esac
- done
- dlprefiles="$newdlprefiles"
- else
- newdlfiles=
- for lib in $dlfiles; do
- case $lib in
- [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
- *) abs=`pwd`"/$lib" ;;
- esac
- func_append newdlfiles " $abs"
- done
- dlfiles="$newdlfiles"
- newdlprefiles=
- for lib in $dlprefiles; do
- case $lib in
- [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
- *) abs=`pwd`"/$lib" ;;
- esac
- func_append newdlprefiles " $abs"
- done
- dlprefiles="$newdlprefiles"
- fi
- $RM $output
- # place dlname in correct position for cygwin
- # In fact, it would be nice if we could use this code for all target
- # systems that can't hard-code library paths into their executables
- # and that have no shared library path variable independent of PATH,
- # but it turns out we can't easily determine that from inspecting
- # libtool variables, so we have to hard-code the OSs to which it
- # applies here; at the moment, that means platforms that use the PE
- # object format with DLL files. See the long comment at the top of
- # tests/bindir.at for full details.
- tdlname=$dlname
- case $host,$output,$installed,$module,$dlname in
- *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
- # If a -bindir argument was supplied, place the dll there.
- if test "x$bindir" != x ;
- then
- func_relative_path "$install_libdir" "$bindir"
- tdlname=$func_relative_path_result$dlname
- else
- # Otherwise fall back on heuristic.
- tdlname=../bin/$dlname
- fi
- ;;
- esac
- $ECHO > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags='$new_inherited_linker_flags'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Names of additional weak libraries provided by this library
-weak_library_names='$weak_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
- if test "$installed" = no && test "$need_relink" = yes; then
- $ECHO >> $output "\
-relink_command=\"$relink_command\""
- fi
- done
- }
-
- # Do a symbolic link so that the libtool archive can be found in
- # LD_LIBRARY_PATH before the program is installed.
- func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
- ;;
- esac
- exit $EXIT_SUCCESS
-}
-
-{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
- func_mode_link ${1+"$@"}
-
-
-# func_mode_uninstall arg...
-func_mode_uninstall ()
-{
- $opt_debug
- RM="$nonopt"
- files=
- rmforce=
- exit_status=0
-
- # This variable tells wrapper scripts just to set variables rather
- # than running their programs.
- libtool_install_magic="$magic"
-
- for arg
- do
- case $arg in
- -f) func_append RM " $arg"; rmforce=yes ;;
- -*) func_append RM " $arg" ;;
- *) func_append files " $arg" ;;
- esac
- done
-
- test -z "$RM" && \
- func_fatal_help "you must specify an RM program"
-
- rmdirs=
-
- for file in $files; do
- func_dirname "$file" "" "."
- dir="$func_dirname_result"
- if test "X$dir" = X.; then
- odir="$objdir"
- else
- odir="$dir/$objdir"
- fi
- func_basename "$file"
- name="$func_basename_result"
- test "$opt_mode" = uninstall && odir="$dir"
-
- # Remember odir for removal later, being careful to avoid duplicates
- if test "$opt_mode" = clean; then
- case " $rmdirs " in
- *" $odir "*) ;;
- *) func_append rmdirs " $odir" ;;
- esac
- fi
-
- # Don't error if the file doesn't exist and rm -f was used.
- if { test -L "$file"; } >/dev/null 2>&1 ||
- { test -h "$file"; } >/dev/null 2>&1 ||
- test -f "$file"; then
- :
- elif test -d "$file"; then
- exit_status=1
- continue
- elif test "$rmforce" = yes; then
- continue
- fi
-
- rmfiles="$file"
-
- case $name in
- *.la)
- # Possibly a libtool archive, so verify it.
- if func_lalib_p "$file"; then
- func_source $dir/$name
-
- # Delete the libtool libraries and symlinks.
- for n in $library_names; do
- func_append rmfiles " $odir/$n"
- done
- test -n "$old_library" && func_append rmfiles " $odir/$old_library"
-
- case "$opt_mode" in
- clean)
- case " $library_names " in
- *" $dlname "*) ;;
- *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
- esac
- test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
- ;;
- uninstall)
- if test -n "$library_names"; then
- # Do each command in the postuninstall commands.
- func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
- fi
-
- if test -n "$old_library"; then
- # Do each command in the old_postuninstall commands.
- func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
- fi
- # FIXME: should reinstall the best remaining shared library.
- ;;
- esac
- fi
- ;;
-
- *.lo)
- # Possibly a libtool object, so verify it.
- if func_lalib_p "$file"; then
-
- # Read the .lo file
- func_source $dir/$name
-
- # Add PIC object to the list of files to remove.
- if test -n "$pic_object" &&
- test "$pic_object" != none; then
- func_append rmfiles " $dir/$pic_object"
- fi
-
- # Add non-PIC object to the list of files to remove.
- if test -n "$non_pic_object" &&
- test "$non_pic_object" != none; then
- func_append rmfiles " $dir/$non_pic_object"
- fi
- fi
- ;;
-
- *)
- if test "$opt_mode" = clean ; then
- noexename=$name
- case $file in
- *.exe)
- func_stripname '' '.exe' "$file"
- file=$func_stripname_result
- func_stripname '' '.exe' "$name"
- noexename=$func_stripname_result
- # $file with .exe has already been added to rmfiles,
- # add $file without .exe
- func_append rmfiles " $file"
- ;;
- esac
- # Do a test to see if this is a libtool program.
- if func_ltwrapper_p "$file"; then
- if func_ltwrapper_executable_p "$file"; then
- func_ltwrapper_scriptname "$file"
- relink_command=
- func_source $func_ltwrapper_scriptname_result
- func_append rmfiles " $func_ltwrapper_scriptname_result"
- else
- relink_command=
- func_source $dir/$noexename
- fi
-
- # note $name still contains .exe if it was in $file originally
- # as does the version of $file that was added into $rmfiles
- func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
- if test "$fast_install" = yes && test -n "$relink_command"; then
- func_append rmfiles " $odir/lt-$name"
- fi
- if test "X$noexename" != "X$name" ; then
- func_append rmfiles " $odir/lt-${noexename}.c"
- fi
- fi
- fi
- ;;
- esac
- func_show_eval "$RM $rmfiles" 'exit_status=1'
- done
-
- # Try to remove the ${objdir}s in the directories where we deleted files
- for dir in $rmdirs; do
- if test -d "$dir"; then
- func_show_eval "rmdir $dir >/dev/null 2>&1"
- fi
- done
-
- exit $exit_status
-}
-
-{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
- func_mode_uninstall ${1+"$@"}
-
-test -z "$opt_mode" && {
- help="$generic_help"
- func_fatal_help "you must specify a MODE"
-}
-
-test -z "$exec_cmd" && \
- func_fatal_help "invalid operation mode \`$opt_mode'"
-
-if test -n "$exec_cmd"; then
- eval exec "$exec_cmd"
- exit $EXIT_FAILURE
-fi
-
-exit $exit_status
-
-
-# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries. Given conflicting
-# choices, we go for a static library, that is the most portable,
-# since we can't tell whether shared libraries were disabled because
-# the user asked for that or because the platform doesn't support
-# them. This is particularly important on AIX, because we don't
-# support having both static and shared libraries enabled at the same
-# time on that platform, so we default to a shared-only configuration.
-# If a disable-shared tag is given, we'll fallback to a static-only
-# configuration. But we'll never go from static-only to shared-only.
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-build_libtool_libs=no
-build_old_libs=yes
-# ### END LIBTOOL TAG CONFIG: disable-shared
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-static
-build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-# ### END LIBTOOL TAG CONFIG: disable-static
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
-# vi:sw=2
-
diff --git a/m4/.gitignore b/m4/.gitignore
new file mode 100644
index 0000000..5e7d273
--- /dev/null
+++ b/m4/.gitignore
@@ -0,0 +1,4 @@
+# Ignore everything in this directory
+*
+# Except this file
+!.gitignore
diff --git a/m4/libtool.m4 b/m4/libtool.m4
deleted file mode 100644
index 56666f0..0000000
--- a/m4/libtool.m4
+++ /dev/null
@@ -1,7986 +0,0 @@
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# Written by Gordon Matzigkeit, 1996
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-m4_define([_LT_COPYING], [dnl
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
-# Written by Gordon Matzigkeit, 1996
-#
-# This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING. If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-])
-
-# serial 57 LT_INIT
-
-
-# LT_PREREQ(VERSION)
-# ------------------
-# Complain and exit if this libtool version is less that VERSION.
-m4_defun([LT_PREREQ],
-[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
- [m4_default([$3],
- [m4_fatal([Libtool version $1 or higher is required],
- 63)])],
- [$2])])
-
-
-# _LT_CHECK_BUILDDIR
-# ------------------
-# Complain if the absolute build directory name contains unusual characters
-m4_defun([_LT_CHECK_BUILDDIR],
-[case `pwd` in
- *\ * | *\ *)
- AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
-esac
-])
-
-
-# LT_INIT([OPTIONS])
-# ------------------
-AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
-AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-AC_BEFORE([$0], [LT_LANG])dnl
-AC_BEFORE([$0], [LT_OUTPUT])dnl
-AC_BEFORE([$0], [LTDL_INIT])dnl
-m4_require([_LT_CHECK_BUILDDIR])dnl
-
-dnl Autoconf doesn't catch unexpanded LT_ macros by default:
-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
-dnl unless we require an AC_DEFUNed macro:
-AC_REQUIRE([LTOPTIONS_VERSION])dnl
-AC_REQUIRE([LTSUGAR_VERSION])dnl
-AC_REQUIRE([LTVERSION_VERSION])dnl
-AC_REQUIRE([LTOBSOLETE_VERSION])dnl
-m4_require([_LT_PROG_LTMAIN])dnl
-
-_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
-
-dnl Parse OPTIONS
-_LT_SET_OPTIONS([$0], [$1])
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-_LT_SETUP
-
-# Only expand once:
-m4_define([LT_INIT])
-])# LT_INIT
-
-# Old names:
-AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
-AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
-dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
-m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
- case $cc_temp in
- compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
- distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
- \-*) ;;
- *) break;;
- esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-])
-
-
-# _LT_FILEUTILS_DEFAULTS
-# ----------------------
-# It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
-m4_defun([_LT_FILEUTILS_DEFAULTS],
-[: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-])# _LT_FILEUTILS_DEFAULTS
-
-
-# _LT_SETUP
-# ---------
-m4_defun([_LT_SETUP],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
-
-_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
-dnl
-_LT_DECL([], [host_alias], [0], [The host system])dnl
-_LT_DECL([], [host], [0])dnl
-_LT_DECL([], [host_os], [0])dnl
-dnl
-_LT_DECL([], [build_alias], [0], [The build system])dnl
-_LT_DECL([], [build], [0])dnl
-_LT_DECL([], [build_os], [0])dnl
-dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-dnl
-AC_REQUIRE([AC_PROG_LN_S])dnl
-test -z "$LN_S" && LN_S="ln -s"
-_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
-dnl
-AC_REQUIRE([LT_CMD_MAX_LEN])dnl
-_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
-_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
-dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
-m4_require([_LT_CMD_RELOAD])dnl
-m4_require([_LT_CHECK_MAGIC_METHOD])dnl
-m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
-m4_require([_LT_CMD_OLD_ARCHIVE])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_WITH_SYSROOT])dnl
-
-_LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
- setopt NO_GLOB_SUBST
-fi
-])
-if test -n "${ZSH_VERSION+set}" ; then
- setopt NO_GLOB_SUBST
-fi
-
-_LT_CHECK_OBJDIR
-
-m4_require([_LT_TAG_COMPILER])dnl
-
-case $host_os in
-aix3*)
- # AIX sometimes has problems with the GCC collect2 program. For some
- # reason, if we set the COLLECT_NAMES environment variable, the problems
- # vanish in a puff of smoke.
- if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
- fi
- ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
- if test "$file_magic_cmd" = '$MAGIC_CMD'; then
- _LT_PATH_MAGIC
- fi
- ;;
-esac
-
-# Use C for the default configuration in the libtool script
-LT_SUPPORTED_TAG([CC])
-_LT_LANG_C_CONFIG
-_LT_LANG_DEFAULT_CONFIG
-_LT_CONFIG_COMMANDS
-])# _LT_SETUP
-
-
-# _LT_PREPARE_SED_QUOTE_VARS
-# --------------------------
-# Define a few sed substitution that help us do robust quoting.
-m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
-[# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-])
-
-# _LT_PROG_LTMAIN
-# ---------------
-# Note that this code is called both from `configure', and `config.status'
-# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
-# so we pass a copy along to make sure it has a sensible value anyway.
-m4_defun([_LT_PROG_LTMAIN],
-[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
-_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
-])# _LT_PROG_LTMAIN
-
-
-## ------------------------------------- ##
-## Accumulate code for creating libtool. ##
-## ------------------------------------- ##
-
-# So that we can recreate a full libtool script including additional
-# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
-# label.
-
-
-# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
-# ----------------------------------------
-# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL_INIT],
-[m4_ifval([$1],
- [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
- [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_INIT])
-
-
-# _LT_CONFIG_LIBTOOL([COMMANDS])
-# ------------------------------
-# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL],
-[m4_ifval([$1],
- [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
- [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
-
-
-# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
-# -----------------------------------------------------
-m4_defun([_LT_CONFIG_SAVE_COMMANDS],
-[_LT_CONFIG_LIBTOOL([$1])
-_LT_CONFIG_LIBTOOL_INIT([$2])
-])
-
-
-# _LT_FORMAT_COMMENT([COMMENT])
-# -----------------------------
-# Add leading comment marks to the start of each line, and a trailing
-# full-stop to the whole comment if one is not present already.
-m4_define([_LT_FORMAT_COMMENT],
-[m4_ifval([$1], [
-m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
- [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
-)])
-
-
-
-## ------------------------ ##
-## FIXME: Eliminate VARNAME ##
-## ------------------------ ##
-
-
-# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
-# -------------------------------------------------------------------
-# CONFIGNAME is the name given to the value in the libtool script.
-# VARNAME is the (base) name used in the configure script.
-# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
-# VARNAME. Any other value will be used directly.
-m4_define([_LT_DECL],
-[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
- [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
- [m4_ifval([$1], [$1], [$2])])
- lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
- m4_ifval([$4],
- [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
- lt_dict_add_subkey([lt_decl_dict], [$2],
- [tagged?], [m4_ifval([$5], [yes], [no])])])
-])
-
-
-# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
-# --------------------------------------------------------
-m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
-
-
-# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_tag_varnames],
-[_lt_decl_filter([tagged?], [yes], $@)])
-
-
-# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
-# ---------------------------------------------------------
-m4_define([_lt_decl_filter],
-[m4_case([$#],
- [0], [m4_fatal([$0: too few arguments: $#])],
- [1], [m4_fatal([$0: too few arguments: $#: $1])],
- [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
- [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
- [lt_dict_filter([lt_decl_dict], $@)])[]dnl
-])
-
-
-# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
-# --------------------------------------------------
-m4_define([lt_decl_quote_varnames],
-[_lt_decl_filter([value], [1], $@)])
-
-
-# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_dquote_varnames],
-[_lt_decl_filter([value], [2], $@)])
-
-
-# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_varnames_tagged],
-[m4_assert([$# <= 2])dnl
-_$0(m4_quote(m4_default([$1], [[, ]])),
- m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
- m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
-m4_define([_lt_decl_varnames_tagged],
-[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
-
-
-# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_all_varnames],
-[_$0(m4_quote(m4_default([$1], [[, ]])),
- m4_if([$2], [],
- m4_quote(lt_decl_varnames),
- m4_quote(m4_shift($@))))[]dnl
-])
-m4_define([_lt_decl_all_varnames],
-[lt_join($@, lt_decl_varnames_tagged([$1],
- lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
-])
-
-
-# _LT_CONFIG_STATUS_DECLARE([VARNAME])
-# ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'. VARNAME
-# must have a single quote delimited value for this to work.
-m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
-
-
-# _LT_CONFIG_STATUS_DECLARATIONS
-# ------------------------------
-# We delimit libtool config variables with single quotes, so when
-# we write them to config.status, we have to be sure to quote all
-# embedded single quotes properly. In configure, this macro expands
-# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
-#
-# <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
-m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
- [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAGS
-# ----------------
-# Output comment and list of tags supported by the script
-m4_defun([_LT_LIBTOOL_TAGS],
-[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
-])
-
-
-# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
-# -----------------------------------
-# Extract the dictionary values for VARNAME (optionally with TAG) and
-# expand to a commented shell variable setting:
-#
-# # Some comment about what VAR is for.
-# visible_name=$lt_internal_name
-m4_define([_LT_LIBTOOL_DECLARE],
-[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
- [description])))[]dnl
-m4_pushdef([_libtool_name],
- m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
-m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
- [0], [_libtool_name=[$]$1],
- [1], [_libtool_name=$lt_[]$1],
- [2], [_libtool_name=$lt_[]$1],
- [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
-m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
-])
-
-
-# _LT_LIBTOOL_CONFIG_VARS
-# -----------------------
-# Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
-# script. Tagged libtool config variables (even for the LIBTOOL CONFIG
-# section) are produced by _LT_LIBTOOL_TAG_VARS.
-m4_defun([_LT_LIBTOOL_CONFIG_VARS],
-[m4_foreach([_lt_var],
- m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
- [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAG_VARS(TAG)
-# -------------------------
-m4_define([_LT_LIBTOOL_TAG_VARS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
- [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
-
-
-# _LT_TAGVAR(VARNAME, [TAGNAME])
-# ------------------------------
-m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
-
-
-# _LT_CONFIG_COMMANDS
-# -------------------
-# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of
-# variables for single and double quote escaping we saved from calls
-# to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'. Finally, any additional code accumulated
-# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
-m4_defun([_LT_CONFIG_COMMANDS],
-[AC_PROVIDE_IFELSE([LT_OUTPUT],
- dnl If the libtool generation code has been placed in $CONFIG_LT,
- dnl instead of duplicating it all over again into config.status,
- dnl then we will have config.status run $CONFIG_LT later, so it
- dnl needs to know what name is stored there:
- [AC_CONFIG_COMMANDS([libtool],
- [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
- dnl If the libtool generation code is destined for config.status,
- dnl expand the accumulated commands and init code now:
- [AC_CONFIG_COMMANDS([libtool],
- [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
-])#_LT_CONFIG_COMMANDS
-
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
-[
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-_LT_CONFIG_STATUS_DECLARATIONS
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
- eval 'cat <<_LTECHO_EOF
-\$[]1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_quote_varnames); do
- case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
- *[[\\\\\\\`\\"\\\$]]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
- ;;
- *)
- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
- ;;
- esac
-done
-
-# Double-quote double-evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_dquote_varnames); do
- case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
- *[[\\\\\\\`\\"\\\$]]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
- ;;
- *)
- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
- ;;
- esac
-done
-
-_LT_OUTPUT_LIBTOOL_INIT
-])
-
-# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
-# ------------------------------------
-# Generate a child script FILE with all initialization necessary to
-# reuse the environment learned by the parent script, and make the
-# file executable. If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins. After this
-# macro, additional text can be appended to FILE to form the body of
-# the child script. The macro ends with non-zero status if the
-# file could not be fully written (such as if the disk is full).
-m4_ifdef([AS_INIT_GENERATED],
-[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
-[m4_defun([_LT_GENERATED_FILE_INIT],
-[m4_require([AS_PREPARE])]dnl
-[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
-[lt_write_fail=0
-cat >$1 <<_ASEOF || lt_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-$2
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$1 <<\_ASEOF || lt_write_fail=1
-AS_SHELL_SANITIZE
-_AS_PREPARE
-exec AS_MESSAGE_FD>&1
-_ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
-m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
-
-# LT_OUTPUT
-# ---------
-# This macro allows early generation of the libtool script (before
-# AC_OUTPUT is called), incase it is used in configure for compilation
-# tests.
-AC_DEFUN([LT_OUTPUT],
-[: ${CONFIG_LT=./config.lt}
-AC_MSG_NOTICE([creating $CONFIG_LT])
-_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
-[# Run this file to recreate a libtool stub with the current configuration.])
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-lt_cl_silent=false
-exec AS_MESSAGE_LOG_FD>>config.log
-{
- echo
- AS_BOX([Running $as_me.])
-} >&AS_MESSAGE_LOG_FD
-
-lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
-for use in further configure time tests before the real libtool is
-generated.
-
-Usage: $[0] [[OPTIONS]]
-
- -h, --help print this help, then exit
- -V, --version print version number, then exit
- -q, --quiet do not print progress messages
- -d, --debug don't remove temporary files
-
-Report bugs to <bug-libtool at gnu.org>."
-
-lt_cl_version="\
-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
-configured by $[0], generated by m4_PACKAGE_STRING.
-
-Copyright (C) 2011 Free Software Foundation, Inc.
-This config.lt script is free software; the Free Software Foundation
-gives unlimited permision to copy, distribute and modify it."
-
-while test $[#] != 0
-do
- case $[1] in
- --version | --v* | -V )
- echo "$lt_cl_version"; exit 0 ;;
- --help | --h* | -h )
- echo "$lt_cl_help"; exit 0 ;;
- --debug | --d* | -d )
- debug=: ;;
- --quiet | --q* | --silent | --s* | -q )
- lt_cl_silent=: ;;
-
- -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
-
- *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
- esac
- shift
-done
-
-if $lt_cl_silent; then
- exec AS_MESSAGE_FD>/dev/null
-fi
-_LTEOF
-
-cat >>"$CONFIG_LT" <<_LTEOF
-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AC_MSG_NOTICE([creating $ofile])
-_LT_OUTPUT_LIBTOOL_COMMANDS
-AS_EXIT(0)
-_LTEOF
-chmod +x "$CONFIG_LT"
-
-# configure is writing to config.log, but config.lt does its own redirection,
-# appending to config.log, which fails on DOS, as config.log is still kept
-# open by configure. Here we exec the FD to /dev/null, effectively closing
-# config.log, so it can be properly (re)opened and appended to by config.lt.
-lt_cl_success=:
-test "$silent" = yes &&
- lt_config_lt_args="$lt_config_lt_args --quiet"
-exec AS_MESSAGE_LOG_FD>/dev/null
-$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-exec AS_MESSAGE_LOG_FD>>config.log
-$lt_cl_success || AS_EXIT(1)
-])# LT_OUTPUT
-
-
-# _LT_CONFIG(TAG)
-# ---------------
-# If TAG is the built-in tag, create an initial libtool script with a
-# default configuration from the untagged config vars. Otherwise add code
-# to config.status for appending the configuration named by TAG from the
-# matching tagged config vars.
-m4_defun([_LT_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_CONFIG_SAVE_COMMANDS([
- m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
- m4_if(_LT_TAG, [C], [
- # See if we are running on zsh, and set the options which allow our
- # commands through without removal of \ escapes.
- if test -n "${ZSH_VERSION+set}" ; then
- setopt NO_GLOB_SUBST
- fi
-
- cfgfile="${ofile}T"
- trap "$RM \"$cfgfile\"; exit 1" 1 2 15
- $RM "$cfgfile"
-
- cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-_LT_COPYING
-_LT_LIBTOOL_TAGS
-
-# ### BEGIN LIBTOOL CONFIG
-_LT_LIBTOOL_CONFIG_VARS
-_LT_LIBTOOL_TAG_VARS
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
- case $host_os in
- aix3*)
- cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program. For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
-fi
-_LT_EOF
- ;;
- esac
-
- _LT_PROG_LTMAIN
-
- # We use sed instead of cat because bash on DJGPP gets confused if
- # if finds mixed CR/LF and LF-only lines. Since sed operates in
- # text mode, it properly converts lines to CR/LF. This bash problem
- # is reportedly fixed, but why not run on old versions too?
- sed '$q' "$ltmain" >> "$cfgfile" \
- || (rm -f "$cfgfile"; exit 1)
-
- _LT_PROG_REPLACE_SHELLFNS
-
- mv -f "$cfgfile" "$ofile" ||
- (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
- chmod +x "$ofile"
-],
-[cat <<_LT_EOF >> "$ofile"
-
-dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
-dnl in a comment (ie after a #).
-# ### BEGIN LIBTOOL TAG CONFIG: $1
-_LT_LIBTOOL_TAG_VARS(_LT_TAG)
-# ### END LIBTOOL TAG CONFIG: $1
-_LT_EOF
-])dnl /m4_if
-],
-[m4_if([$1], [], [
- PACKAGE='$PACKAGE'
- VERSION='$VERSION'
- TIMESTAMP='$TIMESTAMP'
- RM='$RM'
- ofile='$ofile'], [])
-])dnl /_LT_CONFIG_SAVE_COMMANDS
-])# _LT_CONFIG
-
-
-# LT_SUPPORTED_TAG(TAG)
-# ---------------------
-# Trace this macro to discover what tags are supported by the libtool
-# --tag option, using:
-# autoconf --trace 'LT_SUPPORTED_TAG:$1'
-AC_DEFUN([LT_SUPPORTED_TAG], [])
-
-
-# C support is built-in for now
-m4_define([_LT_LANG_C_enabled], [])
-m4_define([_LT_TAGS], [])
-
-
-# LT_LANG(LANG)
-# -------------
-# Enable libtool support for the given language if not already enabled.
-AC_DEFUN([LT_LANG],
-[AC_BEFORE([$0], [LT_OUTPUT])dnl
-m4_case([$1],
- [C], [_LT_LANG(C)],
- [C++], [_LT_LANG(CXX)],
- [Go], [_LT_LANG(GO)],
- [Java], [_LT_LANG(GCJ)],
- [Fortran 77], [_LT_LANG(F77)],
- [Fortran], [_LT_LANG(FC)],
- [Windows Resource], [_LT_LANG(RC)],
- [m4_ifdef([_LT_LANG_]$1[_CONFIG],
- [_LT_LANG($1)],
- [m4_fatal([$0: unsupported language: "$1"])])])dnl
-])# LT_LANG
-
-
-# _LT_LANG(LANGNAME)
-# ------------------
-m4_defun([_LT_LANG],
-[m4_ifdef([_LT_LANG_]$1[_enabled], [],
- [LT_SUPPORTED_TAG([$1])dnl
- m4_append([_LT_TAGS], [$1 ])dnl
- m4_define([_LT_LANG_]$1[_enabled], [])dnl
- _LT_LANG_$1_CONFIG($1)])dnl
-])# _LT_LANG
-
-
-m4_ifndef([AC_PROG_GO], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into #
-# GNU Autoconf as AC_PROG_GO. When it is available in #
-# a released version of Autoconf we should remove this #
-# macro and use it instead. #
-############################################################
-m4_defun([AC_PROG_GO],
-[AC_LANG_PUSH(Go)dnl
-AC_ARG_VAR([GOC], [Go compiler command])dnl
-AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
-_AC_ARG_VAR_LDFLAGS()dnl
-AC_CHECK_TOOL(GOC, gccgo)
-if test -z "$GOC"; then
- if test -n "$ac_tool_prefix"; then
- AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
- fi
-fi
-if test -z "$GOC"; then
- AC_CHECK_PROG(GOC, gccgo, gccgo, false)
-fi
-])#m4_defun
-])#m4_ifndef
-
-
-# _LT_LANG_DEFAULT_CONFIG
-# -----------------------
-m4_defun([_LT_LANG_DEFAULT_CONFIG],
-[AC_PROVIDE_IFELSE([AC_PROG_CXX],
- [LT_LANG(CXX)],
- [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_F77],
- [LT_LANG(F77)],
- [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_FC],
- [LT_LANG(FC)],
- [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
-
-dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
-dnl pulling things in needlessly.
-AC_PROVIDE_IFELSE([AC_PROG_GCJ],
- [LT_LANG(GCJ)],
- [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
- [LT_LANG(GCJ)],
- [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
- [LT_LANG(GCJ)],
- [m4_ifdef([AC_PROG_GCJ],
- [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
- m4_ifdef([A][M_PROG_GCJ],
- [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
- m4_ifdef([LT_PROG_GCJ],
- [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
-
-AC_PROVIDE_IFELSE([AC_PROG_GO],
- [LT_LANG(GO)],
- [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
-
-AC_PROVIDE_IFELSE([LT_PROG_RC],
- [LT_LANG(RC)],
- [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
-])# _LT_LANG_DEFAULT_CONFIG
-
-# Obsolete macros:
-AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
-AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
-AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
-AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
-AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
-dnl AC_DEFUN([AC_LIBTOOL_F77], [])
-dnl AC_DEFUN([AC_LIBTOOL_FC], [])
-dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
-dnl AC_DEFUN([AC_LIBTOOL_RC], [])
-
-
-# _LT_TAG_COMPILER
-# ----------------
-m4_defun([_LT_TAG_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
-_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
-_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
-_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_TAG_COMPILER
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-m4_defun([_LT_COMPILER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-m4_defun([_LT_LINKER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-])# _LT_LINKER_BOILERPLATE
-
-# _LT_REQUIRED_DARWIN_CHECKS
-# -------------------------
-m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
- case $host_os in
- rhapsody* | darwin*)
- AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
- AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
- AC_CHECK_TOOL([LIPO], [lipo], [:])
- AC_CHECK_TOOL([OTOOL], [otool], [:])
- AC_CHECK_TOOL([OTOOL64], [otool64], [:])
- _LT_DECL([], [DSYMUTIL], [1],
- [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
- _LT_DECL([], [NMEDIT], [1],
- [Tool to change global to local symbols on Mac OS X])
- _LT_DECL([], [LIPO], [1],
- [Tool to manipulate fat objects and archives on Mac OS X])
- _LT_DECL([], [OTOOL], [1],
- [ldd/readelf like tool for Mach-O binaries on Mac OS X])
- _LT_DECL([], [OTOOL64], [1],
- [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
-
- AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
- [lt_cv_apple_cc_single_mod=no
- if test -z "${LT_MULTI_MODULE}"; then
- # By default we will add the -single_module flag. You can override
- # by either setting the environment variable LT_MULTI_MODULE
- # non-empty at configure time, or by adding -multi_module to the
- # link flags.
- rm -rf libconftest.dylib*
- echo "int foo(void){return 1;}" > conftest.c
- echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
- $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
- -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
- _lt_result=$?
- # If there is a non-empty error log, and "single_module"
- # appears in it, assume the flag caused a linker warning
- if test -s conftest.err && $GREP single_module conftest.err; then
- cat conftest.err >&AS_MESSAGE_LOG_FD
- # Otherwise, if the output was created with a 0 exit code from
- # the compiler, it worked.
- elif test -f libconftest.dylib && test $_lt_result -eq 0; then
- lt_cv_apple_cc_single_mod=yes
- else
- cat conftest.err >&AS_MESSAGE_LOG_FD
- fi
- rm -rf libconftest.dylib*
- rm -f conftest.*
- fi])
-
- AC_CACHE_CHECK([for -exported_symbols_list linker flag],
- [lt_cv_ld_exported_symbols_list],
- [lt_cv_ld_exported_symbols_list=no
- save_LDFLAGS=$LDFLAGS
- echo "_main" > conftest.sym
- LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
- AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
- [lt_cv_ld_exported_symbols_list=yes],
- [lt_cv_ld_exported_symbols_list=no])
- LDFLAGS="$save_LDFLAGS"
- ])
-
- AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
- [lt_cv_ld_force_load=no
- cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
- echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
- $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
- echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
- $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
- echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
- $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
- cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
- echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
- $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
- _lt_result=$?
- if test -s conftest.err && $GREP force_load conftest.err; then
- cat conftest.err >&AS_MESSAGE_LOG_FD
- elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
- lt_cv_ld_force_load=yes
- else
- cat conftest.err >&AS_MESSAGE_LOG_FD
- fi
- rm -f conftest.err libconftest.a conftest conftest.c
- rm -rf conftest.dSYM
- ])
- case $host_os in
- rhapsody* | darwin1.[[012]])
- _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
- darwin1.*)
- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
- darwin*) # darwin 5.x on
- # if running on 10.5 or later, the deployment target defaults
- # to the OS version, if on x86, and 10.4, the deployment
- # target defaults to 10.4. Don't you love it?
- case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
- 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
- 10.[[012]]*)
- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
- 10.*)
- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
- esac
- ;;
- esac
- if test "$lt_cv_apple_cc_single_mod" = "yes"; then
- _lt_dar_single_mod='$single_module'
- fi
- if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
- _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
- else
- _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
- fi
- if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
- _lt_dsymutil='~$DSYMUTIL $lib || :'
- else
- _lt_dsymutil=
- fi
- ;;
- esac
-])
-
-
-# _LT_DARWIN_LINKER_FEATURES([TAG])
-# ---------------------------------
-# Checks for linker and compiler features on darwin
-m4_defun([_LT_DARWIN_LINKER_FEATURES],
-[
- m4_require([_LT_REQUIRED_DARWIN_CHECKS])
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_direct, $1)=no
- _LT_TAGVAR(hardcode_automatic, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
- if test "$lt_cv_ld_force_load" = "yes"; then
- _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
- m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
- [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes])
- else
- _LT_TAGVAR(whole_archive_flag_spec, $1)=''
- fi
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
- case $cc_basename in
- ifort*) _lt_dar_can_shared=yes ;;
- *) _lt_dar_can_shared=$GCC ;;
- esac
- if test "$_lt_dar_can_shared" = "yes"; then
- output_verbose_link_cmd=func_echo_all
- _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
- _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
- _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
- _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
- m4_if([$1], [CXX],
-[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then
- _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
- _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
- fi
-],[])
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
-])
-
-# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
-# ----------------------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-# Store the results from the different compilers for each TAGNAME.
-# Allow to override them for all tags through lt_cv_aix_libpath.
-m4_defun([_LT_SYS_MODULE_PATH_AIX],
-[m4_require([_LT_DECL_SED])dnl
-if test "${lt_cv_aix_libpath+set}" = set; then
- aix_libpath=$lt_cv_aix_libpath
-else
- AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
- [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
- lt_aix_libpath_sed='[
- /Import File Strings/,/^$/ {
- /^0/ {
- s/^0 *\([^ ]*\) *$/\1/
- p
- }
- }]'
- _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- # Check for a 64-bit object if we didn't find anything.
- if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
- _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
- fi],[])
- if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
- _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
- fi
- ])
- aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
-fi
-])# _LT_SYS_MODULE_PATH_AIX
-
-
-# _LT_SHELL_INIT(ARG)
-# -------------------
-m4_define([_LT_SHELL_INIT],
-[m4_divert_text([M4SH-INIT], [$1
-])])# _LT_SHELL_INIT
-
-
-
-# _LT_PROG_ECHO_BACKSLASH
-# -----------------------
-# Find how we can fake an echo command that does not interpret backslash.
-# In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
-m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-AC_MSG_CHECKING([how to print strings])
-# Test print first, because it will be a builtin if present.
-if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
- test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
- ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
- ECHO='printf %s\n'
-else
- # Use this function as a fallback that always works.
- func_fallback_echo ()
- {
- eval 'cat <<_LTECHO_EOF
-$[]1
-_LTECHO_EOF'
- }
- ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
- $ECHO "$*"
-}
-
-case "$ECHO" in
- printf*) AC_MSG_RESULT([printf]) ;;
- print*) AC_MSG_RESULT([print -r]) ;;
- *) AC_MSG_RESULT([cat]) ;;
-esac
-
-m4_ifdef([_AS_DETECT_SUGGESTED],
-[_AS_DETECT_SUGGESTED([
- test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
- ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
- ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
- ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
- PATH=/empty FPATH=/empty; export PATH FPATH
- test "X`printf %s $ECHO`" = "X$ECHO" \
- || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
-
-_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
-])# _LT_PROG_ECHO_BACKSLASH
-
-
-# _LT_WITH_SYSROOT
-# ----------------
-AC_DEFUN([_LT_WITH_SYSROOT],
-[AC_MSG_CHECKING([for sysroot])
-AC_ARG_WITH([sysroot],
-[ --with-sysroot[=DIR] Search for dependent libraries within DIR
- (or the compiler's sysroot if not specified).],
-[], [with_sysroot=no])
-
-dnl lt_sysroot will always be passed unquoted. We quote it here
-dnl in case the user passed a directory name.
-lt_sysroot=
-case ${with_sysroot} in #(
- yes)
- if test "$GCC" = yes; then
- lt_sysroot=`$CC --print-sysroot 2>/dev/null`
- fi
- ;; #(
- /*)
- lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
- ;; #(
- no|'')
- ;; #(
- *)
- AC_MSG_RESULT([${with_sysroot}])
- AC_MSG_ERROR([The sysroot must be an absolute path.])
- ;;
-esac
-
- AC_MSG_RESULT([${lt_sysroot:-no}])
-_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
-[dependent libraries, and in which our libraries should be installed.])])
-
-# _LT_ENABLE_LOCK
-# ---------------
-m4_defun([_LT_ENABLE_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
- [AS_HELP_STRING([--disable-libtool-lock],
- [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
- # Find out which ABI we are using.
- echo 'int i;' > conftest.$ac_ext
- if AC_TRY_EVAL(ac_compile); then
- case `/usr/bin/file conftest.$ac_objext` in
- *ELF-32*)
- HPUX_IA64_MODE="32"
- ;;
- *ELF-64*)
- HPUX_IA64_MODE="64"
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-*-*-irix6*)
- # Find out which ABI we are using.
- echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
- if AC_TRY_EVAL(ac_compile); then
- if test "$lt_cv_prog_gnu_ld" = yes; then
- case `/usr/bin/file conftest.$ac_objext` in
- *32-bit*)
- LD="${LD-ld} -melf32bsmip"
- ;;
- *N32*)
- LD="${LD-ld} -melf32bmipn32"
- ;;
- *64-bit*)
- LD="${LD-ld} -melf64bmip"
- ;;
- esac
- else
- case `/usr/bin/file conftest.$ac_objext` in
- *32-bit*)
- LD="${LD-ld} -32"
- ;;
- *N32*)
- LD="${LD-ld} -n32"
- ;;
- *64-bit*)
- LD="${LD-ld} -64"
- ;;
- esac
- fi
- fi
- rm -rf conftest*
- ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
- # Find out which ABI we are using.
- echo 'int i;' > conftest.$ac_ext
- if AC_TRY_EVAL(ac_compile); then
- case `/usr/bin/file conftest.o` in
- *32-bit*)
- case $host in
- x86_64-*kfreebsd*-gnu)
- LD="${LD-ld} -m elf_i386_fbsd"
- ;;
- x86_64-*linux*)
- LD="${LD-ld} -m elf_i386"
- ;;
- ppc64-*linux*|powerpc64-*linux*)
- LD="${LD-ld} -m elf32ppclinux"
- ;;
- s390x-*linux*)
- LD="${LD-ld} -m elf_s390"
- ;;
- sparc64-*linux*)
- LD="${LD-ld} -m elf32_sparc"
- ;;
- esac
- ;;
- *64-bit*)
- case $host in
- x86_64-*kfreebsd*-gnu)
- LD="${LD-ld} -m elf_x86_64_fbsd"
- ;;
- x86_64-*linux*)
- LD="${LD-ld} -m elf_x86_64"
- ;;
- ppc*-*linux*|powerpc*-*linux*)
- LD="${LD-ld} -m elf64ppc"
- ;;
- s390*-*linux*|s390*-*tpf*)
- LD="${LD-ld} -m elf64_s390"
- ;;
- sparc*-*linux*)
- LD="${LD-ld} -m elf64_sparc"
- ;;
- esac
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-
-*-*-sco3.2v5*)
- # On SCO OpenServer 5, we need -belf to get full-featured binaries.
- SAVE_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -belf"
- AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
- [AC_LANG_PUSH(C)
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
- AC_LANG_POP])
- if test x"$lt_cv_cc_needs_belf" != x"yes"; then
- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
- CFLAGS="$SAVE_CFLAGS"
- fi
- ;;
-*-*solaris*)
- # Find out which ABI we are using.
- echo 'int i;' > conftest.$ac_ext
- if AC_TRY_EVAL(ac_compile); then
- case `/usr/bin/file conftest.o` in
- *64-bit*)
- case $lt_cv_prog_gnu_ld in
- yes*)
- case $host in
- i?86-*-solaris*)
- LD="${LD-ld} -m elf_x86_64"
- ;;
- sparc*-*-solaris*)
- LD="${LD-ld} -m elf64_sparc"
- ;;
- esac
- # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
- if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
- LD="${LD-ld}_sol2"
- fi
- ;;
- *)
- if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
- LD="${LD-ld} -64"
- fi
- ;;
- esac
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-esac
-
-need_locks="$enable_libtool_lock"
-])# _LT_ENABLE_LOCK
-
-
-# _LT_PROG_AR
-# -----------
-m4_defun([_LT_PROG_AR],
-[AC_CHECK_TOOLS(AR, [ar], false)
-: ${AR=ar}
-: ${AR_FLAGS=cru}
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
-
-AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
- [lt_cv_ar_at_file=no
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
- [echo conftest.$ac_objext > conftest.lst
- lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
- AC_TRY_EVAL([lt_ar_try])
- if test "$ac_status" -eq 0; then
- # Ensure the archiver fails upon bogus file names.
- rm -f conftest.$ac_objext libconftest.a
- AC_TRY_EVAL([lt_ar_try])
- if test "$ac_status" -ne 0; then
- lt_cv_ar_at_file=@
- fi
- fi
- rm -f conftest.* libconftest.a
- ])
- ])
-
-if test "x$lt_cv_ar_at_file" = xno; then
- archiver_list_spec=
-else
- archiver_list_spec=$lt_cv_ar_at_file
-fi
-_LT_DECL([], [archiver_list_spec], [1],
- [How to feed a file listing to the archiver])
-])# _LT_PROG_AR
-
-
-# _LT_CMD_OLD_ARCHIVE
-# -------------------
-m4_defun([_LT_CMD_OLD_ARCHIVE],
-[_LT_PROG_AR
-
-AC_CHECK_TOOL(STRIP, strip, :)
-test -z "$STRIP" && STRIP=:
-_LT_DECL([], [STRIP], [1], [A symbol stripping program])
-
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-test -z "$RANLIB" && RANLIB=:
-_LT_DECL([], [RANLIB], [1],
- [Commands used to install an old-style archive])
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
- case $host_os in
- openbsd*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
- ;;
- *)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
- ;;
- esac
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
-fi
-
-case $host_os in
- darwin*)
- lock_old_archive_extraction=yes ;;
- *)
- lock_old_archive_extraction=no ;;
-esac
-_LT_DECL([], [old_postinstall_cmds], [2])
-_LT_DECL([], [old_postuninstall_cmds], [2])
-_LT_TAGDECL([], [old_archive_cmds], [2],
- [Commands used to build an old-style archive])
-_LT_DECL([], [lock_old_archive_extraction], [0],
- [Whether to use a lock for old archive extraction])
-])# _LT_CMD_OLD_ARCHIVE
-
-
-# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([_LT_COMPILER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
- [$2=no
- m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
- lt_compiler_flag="$3"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- # The option is referenced via a variable to avoid confusing sed.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
- (eval "$lt_compile" 2>conftest.err)
- ac_status=$?
- cat conftest.err >&AS_MESSAGE_LOG_FD
- echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
- if (exit $ac_status) && test -s "$ac_outfile"; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings other than the usual output.
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
- $2=yes
- fi
- fi
- $RM conftest*
-])
-
-if test x"[$]$2" = xyes; then
- m4_if([$5], , :, [$5])
-else
- m4_if([$6], , :, [$6])
-fi
-])# _LT_COMPILER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
-
-
-# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-# [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------
-# Check whether the given linker option works
-AC_DEFUN([_LT_LINKER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
- [$2=no
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS $3"
- echo "$lt_simple_link_test_code" > conftest.$ac_ext
- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
- # The linker can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- # Append any errors to the config.log.
- cat conftest.err 1>&AS_MESSAGE_LOG_FD
- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
- if diff conftest.exp conftest.er2 >/dev/null; then
- $2=yes
- fi
- else
- $2=yes
- fi
- fi
- $RM -r conftest*
- LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
- m4_if([$4], , :, [$4])
-else
- m4_if([$5], , :, [$5])
-fi
-])# _LT_LINKER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
-
-
-# LT_CMD_MAX_LEN
-#---------------
-AC_DEFUN([LT_CMD_MAX_LEN],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
- i=0
- teststring="ABCD"
-
- case $build_os in
- msdosdjgpp*)
- # On DJGPP, this test can blow up pretty badly due to problems in libc
- # (any single argument exceeding 2000 bytes causes a buffer overrun
- # during glob expansion). Even if it were fixed, the result of this
- # check would be larger than it should be.
- lt_cv_sys_max_cmd_len=12288; # 12K is about right
- ;;
-
- gnu*)
- # Under GNU Hurd, this test is not required because there is
- # no limit to the length of command line arguments.
- # Libtool will interpret -1 as no limit whatsoever
- lt_cv_sys_max_cmd_len=-1;
- ;;
-
- cygwin* | mingw* | cegcc*)
- # On Win9x/ME, this test blows up -- it succeeds, but takes
- # about 5 minutes as the teststring grows exponentially.
- # Worse, since 9x/ME are not pre-emptively multitasking,
- # you end up with a "frozen" computer, even though with patience
- # the test eventually succeeds (with a max line length of 256k).
- # Instead, let's just punt: use the minimum linelength reported by
- # all of the supported platforms: 8192 (on NT/2K/XP).
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
- mint*)
- # On MiNT this can take a long time and run out of memory.
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
- amigaos*)
- # On AmigaOS with pdksh, this test takes hours, literally.
- # So we just punt and use a minimum line length of 8192.
- lt_cv_sys_max_cmd_len=8192;
- ;;
-
- netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
- # This has been around since 386BSD, at least. Likely further.
- if test -x /sbin/sysctl; then
- lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
- elif test -x /usr/sbin/sysctl; then
- lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
- else
- lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
- fi
- # And add a safety zone
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
- ;;
-
- interix*)
- # We know the value 262144 and hardcode it with a safety zone (like BSD)
- lt_cv_sys_max_cmd_len=196608
- ;;
-
- os2*)
- # The test takes a long time on OS/2.
- lt_cv_sys_max_cmd_len=8192
- ;;
-
- osf*)
- # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
- # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
- # nice to cause kernel panics so lets avoid the loop below.
- # First set a reasonable default.
- lt_cv_sys_max_cmd_len=16384
- #
- if test -x /sbin/sysconfig; then
- case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
- *1*) lt_cv_sys_max_cmd_len=-1 ;;
- esac
- fi
- ;;
- sco3.2v5*)
- lt_cv_sys_max_cmd_len=102400
- ;;
- sysv5* | sco5v6* | sysv4.2uw2*)
- kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
- if test -n "$kargmax"; then
- lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'`
- else
- lt_cv_sys_max_cmd_len=32768
- fi
- ;;
- *)
- lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
- if test -n "$lt_cv_sys_max_cmd_len"; then
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
- else
- # Make teststring a little bigger before we do anything with it.
- # a 1K string should be a reasonable start.
- for i in 1 2 3 4 5 6 7 8 ; do
- teststring=$teststring$teststring
- done
- SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
- # If test is not a shell built-in, we'll probably end up computing a
- # maximum length that is only half of the actual maximum length, but
- # we can't tell.
- while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
- = "X$teststring$teststring"; } >/dev/null 2>&1 &&
- test $i != 17 # 1/2 MB should be enough
- do
- i=`expr $i + 1`
- teststring=$teststring$teststring
- done
- # Only check the string length outside the loop.
- lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
- teststring=
- # Add a significant safety factor because C++ compilers can tack on
- # massive amounts of additional arguments before passing them to the
- # linker. It appears as though 1/2 is a usable value.
- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
- fi
- ;;
- esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
- AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
- AC_MSG_RESULT(none)
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-_LT_DECL([], [max_cmd_len], [0],
- [What is the maximum length of a command?])
-])# LT_CMD_MAX_LEN
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
-
-
-# _LT_HEADER_DLFCN
-# ----------------
-m4_defun([_LT_HEADER_DLFCN],
-[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
-])# _LT_HEADER_DLFCN
-
-
-# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ----------------------------------------------------------------
-m4_defun([_LT_TRY_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
- [$4]
-else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<_LT_EOF
-[#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LT_DLGLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LT_DLGLOBAL DL_GLOBAL
-# else
-# define LT_DLGLOBAL 0
-# endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LT_DLLAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LT_DLLAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LT_DLLAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LT_DLLAZY_OR_NOW DL_NOW
-# else
-# define LT_DLLAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
- correspondingly for the symbols needed. */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
- int status = $lt_dlunknown;
-
- if (self)
- {
- if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else
- {
- if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
- else puts (dlerror ());
- }
- /* dlclose (self); */
- }
- else
- puts (dlerror ());
-
- return status;
-}]
-_LT_EOF
- if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
- (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
- lt_status=$?
- case x$lt_status in
- x$lt_dlno_uscore) $1 ;;
- x$lt_dlneed_uscore) $2 ;;
- x$lt_dlunknown|x*) $3 ;;
- esac
- else :
- # compilation failed
- $3
- fi
-fi
-rm -fr conftest*
-])# _LT_TRY_DLOPEN_SELF
-
-
-# LT_SYS_DLOPEN_SELF
-# ------------------
-AC_DEFUN([LT_SYS_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
- enable_dlopen=unknown
- enable_dlopen_self=unknown
- enable_dlopen_self_static=unknown
-else
- lt_cv_dlopen=no
- lt_cv_dlopen_libs=
-
- case $host_os in
- beos*)
- lt_cv_dlopen="load_add_on"
- lt_cv_dlopen_libs=
- lt_cv_dlopen_self=yes
- ;;
-
- mingw* | pw32* | cegcc*)
- lt_cv_dlopen="LoadLibrary"
- lt_cv_dlopen_libs=
- ;;
-
- cygwin*)
- lt_cv_dlopen="dlopen"
- lt_cv_dlopen_libs=
- ;;
-
- darwin*)
- # if libdl is installed we need to link against it
- AC_CHECK_LIB([dl], [dlopen],
- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
- lt_cv_dlopen="dyld"
- lt_cv_dlopen_libs=
- lt_cv_dlopen_self=yes
- ])
- ;;
-
- *)
- AC_CHECK_FUNC([shl_load],
- [lt_cv_dlopen="shl_load"],
- [AC_CHECK_LIB([dld], [shl_load],
- [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
- [AC_CHECK_FUNC([dlopen],
- [lt_cv_dlopen="dlopen"],
- [AC_CHECK_LIB([dl], [dlopen],
- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
- [AC_CHECK_LIB([svld], [dlopen],
- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
- [AC_CHECK_LIB([dld], [dld_link],
- [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
- ])
- ])
- ])
- ])
- ])
- ;;
- esac
-
- if test "x$lt_cv_dlopen" != xno; then
- enable_dlopen=yes
- else
- enable_dlopen=no
- fi
-
- case $lt_cv_dlopen in
- dlopen)
- save_CPPFLAGS="$CPPFLAGS"
- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
- save_LDFLAGS="$LDFLAGS"
- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
- save_LIBS="$LIBS"
- LIBS="$lt_cv_dlopen_libs $LIBS"
-
- AC_CACHE_CHECK([whether a program can dlopen itself],
- lt_cv_dlopen_self, [dnl
- _LT_TRY_DLOPEN_SELF(
- lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
- lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
- ])
-
- if test "x$lt_cv_dlopen_self" = xyes; then
- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
- AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
- lt_cv_dlopen_self_static, [dnl
- _LT_TRY_DLOPEN_SELF(
- lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
- lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
- ])
- fi
-
- CPPFLAGS="$save_CPPFLAGS"
- LDFLAGS="$save_LDFLAGS"
- LIBS="$save_LIBS"
- ;;
- esac
-
- case $lt_cv_dlopen_self in
- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
- *) enable_dlopen_self=unknown ;;
- esac
-
- case $lt_cv_dlopen_self_static in
- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
- *) enable_dlopen_self_static=unknown ;;
- esac
-fi
-_LT_DECL([dlopen_support], [enable_dlopen], [0],
- [Whether dlopen is supported])
-_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
- [Whether dlopen of programs is supported])
-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
- [Whether dlopen of statically linked programs is supported])
-])# LT_SYS_DLOPEN_SELF
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
-
-
-# _LT_COMPILER_C_O([TAGNAME])
-# ---------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler.
-# This macro does not hard code the compiler like AC_PROG_CC_C_O.
-m4_defun([_LT_COMPILER_C_O],
-[m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
- [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
- [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
- $RM -r conftest 2>/dev/null
- mkdir conftest
- cd conftest
- mkdir out
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- lt_compiler_flag="-o out/conftest2.$ac_objext"
- # Insert the option either (1) after the last *FLAGS variable, or
- # (2) before a word containing "conftest.", or (3) at the end.
- # Note that $ac_compile itself does not contain backslashes and begins
- # with a dollar sign (not a hyphen), so the echo should work correctly.
- lt_compile=`echo "$ac_compile" | $SED \
- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
- -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
- -e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
- (eval "$lt_compile" 2>out/conftest.err)
- ac_status=$?
- cat out/conftest.err >&AS_MESSAGE_LOG_FD
- echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
- if (exit $ac_status) && test -s out/conftest2.$ac_objext
- then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
- _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
- fi
- fi
- chmod u+w . 2>&AS_MESSAGE_LOG_FD
- $RM conftest*
- # SGI C++ compiler will create directory out/ii_files/ for
- # template instantiation
- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
- $RM out/* && rmdir out
- cd ..
- $RM -r conftest
- $RM conftest*
-])
-_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
- [Does compiler simultaneously support -c and -o options?])
-])# _LT_COMPILER_C_O
-
-
-# _LT_COMPILER_FILE_LOCKS([TAGNAME])
-# ----------------------------------
-# Check to see if we can do hard links to lock some files if needed
-m4_defun([_LT_COMPILER_FILE_LOCKS],
-[m4_require([_LT_ENABLE_LOCK])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_COMPILER_C_O([$1])
-
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
- # do not overwrite the value of need_locks provided by the user
- AC_MSG_CHECKING([if we can lock with hard links])
- hard_links=yes
- $RM conftest*
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- touch conftest.a
- ln conftest.a conftest.b 2>&5 || hard_links=no
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- AC_MSG_RESULT([$hard_links])
- if test "$hard_links" = no; then
- AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
- need_locks=warn
- fi
-else
- need_locks=no
-fi
-_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
-])# _LT_COMPILER_FILE_LOCKS
-
-
-# _LT_CHECK_OBJDIR
-# ----------------
-m4_defun([_LT_CHECK_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
- lt_cv_objdir=.libs
-else
- # MS-DOS does not allow filenames that begin with a dot.
- lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-_LT_DECL([], [objdir], [0],
- [The name of the directory that contains temporary libtool files])dnl
-m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
- [Define to the sub-directory in which libtool stores uninstalled libraries.])
-])# _LT_CHECK_OBJDIR
-
-
-# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
-# --------------------------------------
-# Check hardcoding attributes.
-m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
- test -n "$_LT_TAGVAR(runpath_var, $1)" ||
- test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
- # We can hardcode non-existent directories.
- if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
- # If the only mechanism to avoid hardcoding is shlibpath_var, we
- # have to relink, otherwise we might link with an installed library
- # when we should be linking with a yet-to-be-installed one
- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
- test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
- # Linking always hardcodes the temporary library directory.
- _LT_TAGVAR(hardcode_action, $1)=relink
- else
- # We can link without hardcoding, and we can hardcode nonexisting dirs.
- _LT_TAGVAR(hardcode_action, $1)=immediate
- fi
-else
- # We cannot hardcode anything, or else we can only hardcode existing
- # directories.
- _LT_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
- test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
- # Fast installation is not supported
- enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
- test "$enable_shared" = no; then
- # Fast installation is not necessary
- enable_fast_install=needless
-fi
-_LT_TAGDECL([], [hardcode_action], [0],
- [How to hardcode a shared library path into an executable])
-])# _LT_LINKER_HARDCODE_LIBPATH
-
-
-# _LT_CMD_STRIPLIB
-# ----------------
-m4_defun([_LT_CMD_STRIPLIB],
-[m4_require([_LT_DECL_EGREP])
-striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
- test -z "$striplib" && striplib="$STRIP --strip-unneeded"
- AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
- case $host_os in
- darwin*)
- if test -n "$STRIP" ; then
- striplib="$STRIP -x"
- old_striplib="$STRIP -S"
- AC_MSG_RESULT([yes])
- else
- AC_MSG_RESULT([no])
- fi
- ;;
- *)
- AC_MSG_RESULT([no])
- ;;
- esac
-fi
-_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
-_LT_DECL([], [striplib], [1])
-])# _LT_CMD_STRIPLIB
-
-
-# _LT_SYS_DYNAMIC_LINKER([TAG])
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-m4_defun([_LT_SYS_DYNAMIC_LINKER],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_OBJDUMP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-AC_MSG_CHECKING([dynamic linker characteristics])
-m4_if([$1],
- [], [
-if test "$GCC" = yes; then
- case $host_os in
- darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
- *) lt_awk_arg="/^libraries:/" ;;
- esac
- case $host_os in
- mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
- *) lt_sed_strip_eq="s,=/,/,g" ;;
- esac
- lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
- case $lt_search_path_spec in
- *\;*)
- # if the path contains ";" then we assume it to be the separator
- # otherwise default to the standard path separator (i.e. ":") - it is
- # assumed that no part of a normal pathname contains ";" but that should
- # okay in the real world where ";" in dirpaths is itself problematic.
- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
- ;;
- *)
- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
- ;;
- esac
- # Ok, now we have the path, separated by spaces, we can step through it
- # and add multilib dir if necessary.
- lt_tmp_lt_search_path_spec=
- lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
- for lt_sys_path in $lt_search_path_spec; do
- if test -d "$lt_sys_path/$lt_multi_os_dir"; then
- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
- else
- test -d "$lt_sys_path" && \
- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
- fi
- done
- lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
- lt_foo="";
- lt_count=0;
- for (lt_i = NF; lt_i > 0; lt_i--) {
- if ($lt_i != "" && $lt_i != ".") {
- if ($lt_i == "..") {
- lt_count++;
- } else {
- if (lt_count == 0) {
- lt_foo="/" $lt_i lt_foo;
- } else {
- lt_count--;
- }
- }
- }
- }
- if (lt_foo != "") { lt_freq[[lt_foo]]++; }
- if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
-}'`
- # AWK program above erroneously prepends '/' to C:/dos/paths
- # for these hosts.
- case $host_os in
- mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
- $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
- esac
- sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
- sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
- shlibpath_var=LIBPATH
-
- # AIX 3 has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}${shared_ext}$major'
- ;;
-
-aix[[4-9]]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- hardcode_into_libs=yes
- if test "$host_cpu" = ia64; then
- # AIX 5 supports IA64
- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- else
- # With GCC up to 2.95.x, collect2 would create an import file
- # for dependence libraries. The import file would start with
- # the line `#! .'. This would cause the generated library to
- # depend on `.', always an invalid library. This was fixed in
- # development snapshots of GCC prior to 3.0.
- case $host_os in
- aix4 | aix4.[[01]] | aix4.[[01]].*)
- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
- echo ' yes '
- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
- :
- else
- can_build_shared=no
- fi
- ;;
- esac
- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
- # soname into executable. Probably we can add versioning support to
- # collect2, so additional links can be useful in future.
- if test "$aix_use_runtimelinking" = yes; then
- # If using run time linking (on AIX 4.2 or later) use lib<name>.so
- # instead of lib<name>.a to let people know that these are not
- # typical AIX shared libraries.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- else
- # We preserve .a as extension for shared libraries through AIX4.2
- # and later when we are not doing run time linking.
- library_names_spec='${libname}${release}.a $libname.a'
- soname_spec='${libname}${release}${shared_ext}$major'
- fi
- shlibpath_var=LIBPATH
- fi
- ;;
-
-amigaos*)
- case $host_cpu in
- powerpc)
- # Since July 2007 AmigaOS4 officially supports .so libraries.
- # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- ;;
- m68k)
- library_names_spec='$libname.ixlibrary $libname.a'
- # Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
- ;;
- esac
- ;;
-
-beos*)
- library_names_spec='${libname}${shared_ext}'
- dynamic_linker="$host_os ld.so"
- shlibpath_var=LIBRARY_PATH
- ;;
-
-bsdi[[45]]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
- # the default ld.so.conf also contains /usr/contrib/lib and
- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
- # libtool to hard-code these into programs
- ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
- version_type=windows
- shrext_cmds=".dll"
- need_version=no
- need_lib_prefix=no
-
- case $GCC,$cc_basename in
- yes,*)
- # gcc
- library_names_spec='$libname.dll.a'
- # DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname~
- chmod a+x \$dldir/$dlname~
- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
- fi'
- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $RM \$dlpath'
- shlibpath_overrides_runpath=yes
-
- case $host_os in
- cygwin*)
- # Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-m4_if([$1], [],[
- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
- ;;
- mingw* | cegcc*)
- # MinGW DLLs use traditional 'lib' prefix
- soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
- ;;
- pw32*)
- # pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
- ;;
- esac
- dynamic_linker='Win32 ld.exe'
- ;;
-
- *,cl*)
- # Native MSVC
- libname_spec='$name'
- soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
- library_names_spec='${libname}.dll.lib'
-
- case $build_os in
- mingw*)
- sys_lib_search_path_spec=
- lt_save_ifs=$IFS
- IFS=';'
- for lt_path in $LIB
- do
- IFS=$lt_save_ifs
- # Let DOS variable expansion print the short 8.3 style file name.
- lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
- sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
- done
- IFS=$lt_save_ifs
- # Convert to MSYS style.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
- ;;
- cygwin*)
- # Convert to unix form, then to dos form, then back to unix form
- # but this time dos style (no spaces!) so that the unix form looks
- # like /cygdrive/c/PROGRA~1:/cygdr...
- sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
- sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
- sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- ;;
- *)
- sys_lib_search_path_spec="$LIB"
- if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
- # It is most probably a Windows format PATH.
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
- else
- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
- fi
- # FIXME: find the short name or the path components, as spaces are
- # common. (e.g. "Program Files" -> "PROGRA~1")
- ;;
- esac
-
- # DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog $dir/$dlname \$dldir/$dlname'
- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $RM \$dlpath'
- shlibpath_overrides_runpath=yes
- dynamic_linker='Win32 link.exe'
- ;;
-
- *)
- # Assume MSVC wrapper
- library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
- dynamic_linker='Win32 ld.exe'
- ;;
- esac
- # FIXME: first we should search . and the directory the executable is in
- shlibpath_var=PATH
- ;;
-
-darwin* | rhapsody*)
- dynamic_linker="$host_os dyld"
- version_type=darwin
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
- soname_spec='${libname}${release}${major}$shared_ext'
- shlibpath_overrides_runpath=yes
- shlibpath_var=DYLD_LIBRARY_PATH
- shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-m4_if([$1], [],[
- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
- sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
- ;;
-
-dgux*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-freebsd* | dragonfly*)
- # DragonFly does not have aout. When/if they implement a new
- # versioning mechanism, adjust this.
- if test -x /usr/bin/objformat; then
- objformat=`/usr/bin/objformat`
- else
- case $host_os in
- freebsd[[23]].*) objformat=aout ;;
- *) objformat=elf ;;
- esac
- fi
- version_type=freebsd-$objformat
- case $version_type in
- freebsd-elf*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- need_version=no
- need_lib_prefix=no
- ;;
- freebsd-*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
- need_version=yes
- ;;
- esac
- shlibpath_var=LD_LIBRARY_PATH
- case $host_os in
- freebsd2.*)
- shlibpath_overrides_runpath=yes
- ;;
- freebsd3.[[01]]* | freebsdelf3.[[01]]*)
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
- freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
- freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
- *) # from 4.6 on, and DragonFly
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
- esac
- ;;
-
-gnu*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-haiku*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- dynamic_linker="$host_os runtime_loader"
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
- hardcode_into_libs=yes
- ;;
-
-hpux9* | hpux10* | hpux11*)
- # Give a soname corresponding to the major version so that dld.sl refuses to
- # link against other versions.
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- case $host_cpu in
- ia64*)
- shrext_cmds='.so'
- hardcode_into_libs=yes
- dynamic_linker="$host_os dld.so"
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- if test "X$HPUX_IA64_MODE" = X32; then
- sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
- else
- sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
- fi
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
- ;;
- hppa*64*)
- shrext_cmds='.sl'
- hardcode_into_libs=yes
- dynamic_linker="$host_os dld.sl"
- shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
- ;;
- *)
- shrext_cmds='.sl'
- dynamic_linker="$host_os dld.sl"
- shlibpath_var=SHLIB_PATH
- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- ;;
- esac
- # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
- postinstall_cmds='chmod 555 $lib'
- # or fails outright, so override atomically:
- install_override_mode=555
- ;;
-
-interix[[3-9]]*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-irix5* | irix6* | nonstopux*)
- case $host_os in
- nonstopux*) version_type=nonstopux ;;
- *)
- if test "$lt_cv_prog_gnu_ld" = yes; then
- version_type=linux # correct to gnu/linux during the next big refactor
- else
- version_type=irix
- fi ;;
- esac
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
- case $host_os in
- irix5* | nonstopux*)
- libsuff= shlibsuff=
- ;;
- *)
- case $LD in # libtool.m4 will add one of these switches to LD
- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
- libsuff= shlibsuff= libmagic=32-bit;;
- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
- libsuff=32 shlibsuff=N32 libmagic=N32;;
- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
- libsuff=64 shlibsuff=64 libmagic=64-bit;;
- *) libsuff= shlibsuff= libmagic=never-match;;
- esac
- ;;
- esac
- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
- hardcode_into_libs=yes
- ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
- dynamic_linker=no
- ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
-
- # Some binutils ld are patched to set DT_RUNPATH
- AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
- [lt_cv_shlibpath_overrides_runpath=no
- save_LDFLAGS=$LDFLAGS
- save_libdir=$libdir
- eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
- LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
- AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
- [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
- [lt_cv_shlibpath_overrides_runpath=yes])])
- LDFLAGS=$save_LDFLAGS
- libdir=$save_libdir
- ])
- shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
- # This implies no fast_install, which is unacceptable.
- # Some rework will be needed to allow for fast_install
- # before this can be enabled.
- hardcode_into_libs=yes
-
- # Add ABI-specific directories to the system library path.
- sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
-
- # Append ld.so.conf contents to the search path
- if test -f /etc/ld.so.conf; then
- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
- sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
-
- fi
-
- # We used to test for /lib/ld.so.1 and disable shared libraries on
- # powerpc, because MkLinux only supported shared libraries with the
- # GNU dynamic linker. Since this was broken with cross compilers,
- # most powerpc-linux boxes support dynamic linking these days and
- # people can always --disable-shared, the test was removed, and we
- # assume the GNU/Linux dynamic linker is in use.
- dynamic_linker='GNU/Linux ld.so'
- ;;
-
-netbsd*)
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- dynamic_linker='NetBSD (a.out) ld.so'
- else
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- dynamic_linker='NetBSD ld.elf_so'
- fi
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
-
-newsos6)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- ;;
-
-*nto* | *qnx*)
- version_type=qnx
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- dynamic_linker='ldqnx.so'
- ;;
-
-openbsd*)
- version_type=sunos
- sys_lib_dlsearch_path_spec="/usr/lib"
- need_lib_prefix=no
- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
- case $host_os in
- openbsd3.3 | openbsd3.3.*) need_version=yes ;;
- *) need_version=no ;;
- esac
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- case $host_os in
- openbsd2.[[89]] | openbsd2.[[89]].*)
- shlibpath_overrides_runpath=no
- ;;
- *)
- shlibpath_overrides_runpath=yes
- ;;
- esac
- else
- shlibpath_overrides_runpath=yes
- fi
- ;;
-
-os2*)
- libname_spec='$name'
- shrext_cmds=".dll"
- need_lib_prefix=no
- library_names_spec='$libname${shared_ext} $libname.a'
- dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
- ;;
-
-osf3* | osf4* | osf5*)
- version_type=osf
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
- ;;
-
-rdos*)
- dynamic_linker=no
- ;;
-
-solaris*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- # ldd complains unless libraries are executable
- postinstall_cmds='chmod +x $lib'
- ;;
-
-sunos4*)
- version_type=sunos
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- if test "$with_gnu_ld" = yes; then
- need_lib_prefix=no
- fi
- need_version=yes
- ;;
-
-sysv4 | sysv4.3*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- case $host_vendor in
- sni)
- shlibpath_overrides_runpath=no
- need_lib_prefix=no
- runpath_var=LD_RUN_PATH
- ;;
- siemens)
- need_lib_prefix=no
- ;;
- motorola)
- need_lib_prefix=no
- need_version=no
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
- ;;
- esac
- ;;
-
-sysv4*MP*)
- if test -d /usr/nec ;then
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
- soname_spec='$libname${shared_ext}.$major'
- shlibpath_var=LD_LIBRARY_PATH
- fi
- ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- version_type=freebsd-elf
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- if test "$with_gnu_ld" = yes; then
- sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
- else
- sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
- case $host_os in
- sco3.2v5*)
- sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
- ;;
- esac
- fi
- sys_lib_dlsearch_path_spec='/usr/lib'
- ;;
-
-tpf*)
- # TPF is a cross-target only. Preferred cross-host = GNU/Linux.
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
-uts4*)
- version_type=linux # correct to gnu/linux during the next big refactor
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-*)
- dynamic_linker=no
- ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-_LT_DECL([], [variables_saved_for_relink], [1],
- [Variables whose values should be saved in libtool wrapper scripts and
- restored at link time])
-_LT_DECL([], [need_lib_prefix], [0],
- [Do we need the "lib" prefix for modules?])
-_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
-_LT_DECL([], [version_type], [0], [Library versioning type])
-_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable])
-_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
-_LT_DECL([], [shlibpath_overrides_runpath], [0],
- [Is shlibpath searched before the hard-coded library search path?])
-_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
-_LT_DECL([], [library_names_spec], [1],
- [[List of archive names. First name is the real one, the rest are links.
- The last name is the one that the linker finds with -lNAME]])
-_LT_DECL([], [soname_spec], [1],
- [[The coded name of the library, if different from the real name]])
-_LT_DECL([], [install_override_mode], [1],
- [Permission mode override for installation of shared libraries])
-_LT_DECL([], [postinstall_cmds], [2],
- [Command to use after installation of a shared archive])
-_LT_DECL([], [postuninstall_cmds], [2],
- [Command to use after uninstallation of a shared archive])
-_LT_DECL([], [finish_cmds], [2],
- [Commands used to finish a libtool library installation in a directory])
-_LT_DECL([], [finish_eval], [1],
- [[As "finish_cmds", except a single script fragment to be evaled but
- not shown]])
-_LT_DECL([], [hardcode_into_libs], [0],
- [Whether we should hardcode library paths into libraries])
-_LT_DECL([], [sys_lib_search_path_spec], [2],
- [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
- [Run-time system search path for libraries])
-])# _LT_SYS_DYNAMIC_LINKER
-
-
-# _LT_PATH_TOOL_PREFIX(TOOL)
-# --------------------------
-# find a file program which can recognize shared library
-AC_DEFUN([_LT_PATH_TOOL_PREFIX],
-[m4_require([_LT_DECL_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] | ?:[\\/]*])
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
- ;;
-*)
- lt_save_MAGIC_CMD="$MAGIC_CMD"
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word. This closes a longstanding sh security hole.
- ac_dummy="m4_if([$2], , $PATH, [$2])"
- for ac_dir in $ac_dummy; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$1; then
- lt_cv_path_MAGIC_CMD="$ac_dir/$1"
- if test -n "$file_magic_test_file"; then
- case $deplibs_check_method in
- "file_magic "*)
- file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
- $EGREP "$file_magic_regex" > /dev/null; then
- :
- else
- cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such. This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem. Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
- fi ;;
- esac
- fi
- break
- fi
- done
- IFS="$lt_save_ifs"
- MAGIC_CMD="$lt_save_MAGIC_CMD"
- ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
- AC_MSG_RESULT($MAGIC_CMD)
-else
- AC_MSG_RESULT(no)
-fi
-_LT_DECL([], [MAGIC_CMD], [0],
- [Used to examine libraries when file_magic_cmd begins with "file"])dnl
-])# _LT_PATH_TOOL_PREFIX
-
-# Old name:
-AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
-
-
-# _LT_PATH_MAGIC
-# --------------
-# find a file program which can recognize a shared library
-m4_defun([_LT_PATH_MAGIC],
-[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
- if test -n "$ac_tool_prefix"; then
- _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
- else
- MAGIC_CMD=:
- fi
-fi
-])# _LT_PATH_MAGIC
-
-
-# LT_PATH_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([LT_PATH_LD],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
-
-AC_ARG_WITH([gnu-ld],
- [AS_HELP_STRING([--with-gnu-ld],
- [assume the C compiler uses GNU ld @<:@default=no@:>@])],
- [test "$withval" = no || with_gnu_ld=yes],
- [with_gnu_ld=no])dnl
-
-ac_prog=ld
-if test "$GCC" = yes; then
- # Check if gcc -print-prog-name=ld gives a path.
- AC_MSG_CHECKING([for ld used by $CC])
- case $host in
- *-*-mingw*)
- # gcc leaves a trailing carriage return which upsets mingw
- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
- *)
- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
- esac
- case $ac_prog in
- # Accept absolute paths.
- [[\\/]]* | ?:[[\\/]]*)
- re_direlt='/[[^/]][[^/]]*/\.\./'
- # Canonicalize the pathname of ld
- ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
- while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
- done
- test -z "$LD" && LD="$ac_prog"
- ;;
- "")
- # If it fails, then pretend we aren't using GCC.
- ac_prog=ld
- ;;
- *)
- # If it is relative, then search for the first ld in PATH.
- with_gnu_ld=unknown
- ;;
- esac
-elif test "$with_gnu_ld" = yes; then
- AC_MSG_CHECKING([for GNU ld])
-else
- AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
- lt_cv_path_LD="$ac_dir/$ac_prog"
- # Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some variants of GNU ld only accept -v.
- # Break only if it was the GNU/non-GNU ld that we prefer.
- case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
- *GNU* | *'with BFD'*)
- test "$with_gnu_ld" != no && break
- ;;
- *)
- test "$with_gnu_ld" != yes && break
- ;;
- esac
- fi
- done
- IFS="$lt_save_ifs"
-else
- lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
- AC_MSG_RESULT($LD)
-else
- AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-_LT_PATH_LD_GNU
-AC_SUBST([LD])
-
-_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
-])# LT_PATH_LD
-
-# Old names:
-AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
-AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_LD], [])
-dnl AC_DEFUN([AC_PROG_LD], [])
-
-
-# _LT_PATH_LD_GNU
-#- --------------
-m4_defun([_LT_PATH_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
- lt_cv_prog_gnu_ld=yes
- ;;
-*)
- lt_cv_prog_gnu_ld=no
- ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# _LT_PATH_LD_GNU
-
-
-# _LT_CMD_RELOAD
-# --------------
-# find reload flag for linker
-# -- PORTME Some linkers may need a different reload flag.
-m4_defun([_LT_CMD_RELOAD],
-[AC_CACHE_CHECK([for $LD option to reload object files],
- lt_cv_ld_reload_flag,
- [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
- if test "$GCC" != yes; then
- reload_cmds=false
- fi
- ;;
- darwin*)
- if test "$GCC" = yes; then
- reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
- else
- reload_cmds='$LD$reload_flag -o $output$reload_objs'
- fi
- ;;
-esac
-_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_TAGDECL([], [reload_cmds], [2])dnl
-])# _LT_CMD_RELOAD
-
-
-# _LT_CHECK_MAGIC_METHOD
-# ----------------------
-# how to check for library dependencies
-# -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_MAGIC_METHOD],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-AC_CACHE_CHECK([how to recognize dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[[4-9]]*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-beos*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-bsdi[[45]]*)
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
- lt_cv_file_magic_cmd='/usr/bin/file -L'
- lt_cv_file_magic_test_file=/shlib/libc.so
- ;;
-
-cygwin*)
- # func_win32_libid is a shell function defined in ltmain.sh
- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
- lt_cv_file_magic_cmd='func_win32_libid'
- ;;
-
-mingw* | pw32*)
- # Base MSYS/MinGW do not provide the 'file' command needed by
- # func_win32_libid shell function, so use a weaker test based on 'objdump',
- # unless we find 'file', for example because we are cross-compiling.
- # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
- if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
- lt_cv_file_magic_cmd='func_win32_libid'
- else
- # Keep this pattern in sync with the one in func_win32_libid.
- lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
- lt_cv_file_magic_cmd='$OBJDUMP -f'
- fi
- ;;
-
-cegcc*)
- # use the weaker test based on 'objdump'. See mingw*.
- lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
- lt_cv_file_magic_cmd='$OBJDUMP -f'
- ;;
-
-darwin* | rhapsody*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-freebsd* | dragonfly*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
- case $host_cpu in
- i*86 )
- # Not sure whether the presence of OpenBSD here was a mistake.
- # Let's accept both of them until this is cleared up.
- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
- ;;
- esac
- else
- lt_cv_deplibs_check_method=pass_all
- fi
- ;;
-
-gnu*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-haiku*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-hpux10.20* | hpux11*)
- lt_cv_file_magic_cmd=/usr/bin/file
- case $host_cpu in
- ia64*)
- lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
- lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
- ;;
- hppa*64*)
- [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
- lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
- ;;
- *)
- lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
- lt_cv_file_magic_test_file=/usr/lib/libc.sl
- ;;
- esac
- ;;
-
-interix[[3-9]]*)
- # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
- ;;
-
-irix5* | irix6* | nonstopux*)
- case $LD in
- *-32|*"-32 ") libmagic=32-bit;;
- *-n32|*"-n32 ") libmagic=N32;;
- *-64|*"-64 ") libmagic=64-bit;;
- *) libmagic=never-match;;
- esac
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
- else
- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
- fi
- ;;
-
-newos6*)
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=/usr/lib/libnls.so
- ;;
-
-*nto* | *qnx*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-openbsd*)
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
- else
- lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
- fi
- ;;
-
-osf3* | osf4* | osf5*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-rdos*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-solaris*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sysv4 | sysv4.3*)
- case $host_vendor in
- motorola)
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
- ;;
- ncr)
- lt_cv_deplibs_check_method=pass_all
- ;;
- sequent)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
- ;;
- sni)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
- lt_cv_file_magic_test_file=/lib/libc.so
- ;;
- siemens)
- lt_cv_deplibs_check_method=pass_all
- ;;
- pc)
- lt_cv_deplibs_check_method=pass_all
- ;;
- esac
- ;;
-
-tpf*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-esac
-])
-
-file_magic_glob=
-want_nocaseglob=no
-if test "$build" = "$host"; then
- case $host_os in
- mingw* | pw32*)
- if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
- want_nocaseglob=yes
- else
- file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
- fi
- ;;
- esac
-fi
-
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-_LT_DECL([], [deplibs_check_method], [1],
- [Method to check whether dependent libraries are shared objects])
-_LT_DECL([], [file_magic_cmd], [1],
- [Command to use when deplibs_check_method = "file_magic"])
-_LT_DECL([], [file_magic_glob], [1],
- [How to find potential files when deplibs_check_method = "file_magic"])
-_LT_DECL([], [want_nocaseglob], [1],
- [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
-])# _LT_CHECK_MAGIC_METHOD
-
-
-# LT_PATH_NM
-# ----------
-# find the pathname to a BSD- or MS-compatible name lister
-AC_DEFUN([LT_PATH_NM],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
-[if test -n "$NM"; then
- # Let the user override the test.
- lt_cv_path_NM="$NM"
-else
- lt_nm_to_check="${ac_tool_prefix}nm"
- if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
- lt_nm_to_check="$lt_nm_to_check nm"
- fi
- for lt_tmp_nm in $lt_nm_to_check; do
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
- IFS="$lt_save_ifs"
- test -z "$ac_dir" && ac_dir=.
- tmp_nm="$ac_dir/$lt_tmp_nm"
- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
- # Check to see if the nm accepts a BSD-compat flag.
- # Adding the `sed 1q' prevents false positives on HP-UX, which says:
- # nm: unknown option "B" ignored
- # Tru64's nm complains that /dev/null is an invalid object file
- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
- */dev/null* | *'Invalid file or object type'*)
- lt_cv_path_NM="$tmp_nm -B"
- break
- ;;
- *)
- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
- */dev/null*)
- lt_cv_path_NM="$tmp_nm -p"
- break
- ;;
- *)
- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
- continue # so that we can try to find one that supports BSD flags
- ;;
- esac
- ;;
- esac
- fi
- done
- IFS="$lt_save_ifs"
- done
- : ${lt_cv_path_NM=no}
-fi])
-if test "$lt_cv_path_NM" != "no"; then
- NM="$lt_cv_path_NM"
-else
- # Didn't find any BSD compatible name lister, look for dumpbin.
- if test -n "$DUMPBIN"; then :
- # Let the user override the test.
- else
- AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
- case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
- *COFF*)
- DUMPBIN="$DUMPBIN -symbols"
- ;;
- *)
- DUMPBIN=:
- ;;
- esac
- fi
- AC_SUBST([DUMPBIN])
- if test "$DUMPBIN" != ":"; then
- NM="$DUMPBIN"
- fi
-fi
-test -z "$NM" && NM=nm
-AC_SUBST([NM])
-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
-
-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
- [lt_cv_nm_interface="BSD nm"
- echo "int some_variable = 0;" > conftest.$ac_ext
- (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
- (eval "$ac_compile" 2>conftest.err)
- cat conftest.err >&AS_MESSAGE_LOG_FD
- (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
- (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
- cat conftest.err >&AS_MESSAGE_LOG_FD
- (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
- cat conftest.out >&AS_MESSAGE_LOG_FD
- if $GREP 'External.*some_variable' conftest.out > /dev/null; then
- lt_cv_nm_interface="MS dumpbin"
- fi
- rm -f conftest*])
-])# LT_PATH_NM
-
-# Old names:
-AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
-AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_NM], [])
-dnl AC_DEFUN([AC_PROG_NM], [])
-
-# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
-# --------------------------------
-# how to determine the name of the shared library
-# associated with a specific link library.
-# -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-m4_require([_LT_DECL_DLLTOOL])
-AC_CACHE_CHECK([how to associate runtime and link libraries],
-lt_cv_sharedlib_from_linklib_cmd,
-[lt_cv_sharedlib_from_linklib_cmd='unknown'
-
-case $host_os in
-cygwin* | mingw* | pw32* | cegcc*)
- # two different shell functions defined in ltmain.sh
- # decide which to use based on capabilities of $DLLTOOL
- case `$DLLTOOL --help 2>&1` in
- *--identify-strict*)
- lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
- ;;
- *)
- lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
- ;;
- esac
- ;;
-*)
- # fallback: assume linklib IS sharedlib
- lt_cv_sharedlib_from_linklib_cmd="$ECHO"
- ;;
-esac
-])
-sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
-test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
-
-_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
- [Command to associate shared and link libraries])
-])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
-
-
-# _LT_PATH_MANIFEST_TOOL
-# ----------------------
-# locate the manifest tool
-m4_defun([_LT_PATH_MANIFEST_TOOL],
-[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
-test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
-AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
- [lt_cv_path_mainfest_tool=no
- echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
- $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
- cat conftest.err >&AS_MESSAGE_LOG_FD
- if $GREP 'Manifest Tool' conftest.out > /dev/null; then
- lt_cv_path_mainfest_tool=yes
- fi
- rm -f conftest*])
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
- MANIFEST_TOOL=:
-fi
-_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
-])# _LT_PATH_MANIFEST_TOOL
-
-
-# LT_LIB_M
-# --------
-# check for math library
-AC_DEFUN([LT_LIB_M],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
- # These system don't have libm, or don't need it
- ;;
-*-ncr-sysv4.3*)
- AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
- AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
- ;;
-*)
- AC_CHECK_LIB(m, cos, LIBM="-lm")
- ;;
-esac
-AC_SUBST([LIBM])
-])# LT_LIB_M
-
-# Old name:
-AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_CHECK_LIBM], [])
-
-
-# _LT_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------
-m4_defun([_LT_COMPILER_NO_RTTI],
-[m4_require([_LT_TAG_COMPILER])dnl
-
-_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
- case $cc_basename in
- nvcc*)
- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
- esac
-
- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
- lt_cv_prog_compiler_rtti_exceptions,
- [-fno-rtti -fno-exceptions], [],
- [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
- [Compiler flag to turn off builtin functions])
-])# _LT_COMPILER_NO_RTTI
-
-
-# _LT_CMD_GLOBAL_SYMBOLS
-# ----------------------
-m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix. What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
- symcode='[[BCDT]]'
- ;;
-cygwin* | mingw* | pw32* | cegcc*)
- symcode='[[ABCDGISTW]]'
- ;;
-hpux*)
- if test "$host_cpu" = ia64; then
- symcode='[[ABCDEGRST]]'
- fi
- ;;
-irix* | nonstopux*)
- symcode='[[BCDEGRST]]'
- ;;
-osf*)
- symcode='[[BCDEGQRST]]'
- ;;
-solaris*)
- symcode='[[BDRT]]'
- ;;
-sco3.2v5*)
- symcode='[[DT]]'
- ;;
-sysv4.2uw2*)
- symcode='[[DT]]'
- ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
- symcode='[[ABDT]]'
- ;;
-sysv4)
- symcode='[[DFNSTU]]'
- ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
- symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
- opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
- ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
- # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
- symxfrm="\\1 $ac_symprfx\\2 \\2"
-
- # Write the raw and C identifiers.
- if test "$lt_cv_nm_interface" = "MS dumpbin"; then
- # Fake it for dumpbin and say T for any non-static function
- # and D for any global variable.
- # Also find C++ and __fastcall symbols from MSVC++,
- # which start with @ or ?.
- lt_cv_sys_global_symbol_pipe="$AWK ['"\
-" {last_section=section; section=\$ 3};"\
-" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
-" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-" \$ 0!~/External *\|/{next};"\
-" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-" {if(hide[section]) next};"\
-" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-" s[1]~/^[@?]/{print s[1], s[1]; next};"\
-" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-" ' prfx=^$ac_symprfx]"
- else
- lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
- fi
- lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
-
- # Check to see that the pipe works correctly.
- pipe_works=no
-
- rm -f conftest*
- cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
- if AC_TRY_EVAL(ac_compile); then
- # Now try to grab the symbols.
- nlist=conftest.nm
- if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
- # Try sorting and uniquifying the output.
- if sort "$nlist" | uniq > "$nlist"T; then
- mv -f "$nlist"T "$nlist"
- else
- rm -f "$nlist"T
- fi
-
- # Make sure that we snagged all the symbols we need.
- if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
- if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
- cat <<_LT_EOF > conftest.$ac_ext
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
- relocations are performed -- see ld's documentation on pseudo-relocs. */
-# define LT@&t at _DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data. */
-# define LT@&t at _DLSYM_CONST
-#else
-# define LT@&t at _DLSYM_CONST const
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
- # Now generate the symbol file.
- eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
- cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols. */
-LT@&t at _DLSYM_CONST struct {
- const char *name;
- void *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[[]] =
-{
- { "@PROGRAM@", (void *) 0 },
-_LT_EOF
- $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
- cat <<\_LT_EOF >> conftest.$ac_ext
- {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
- return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
- # Now try linking the two files.
- mv conftest.$ac_objext conftstm.$ac_objext
- lt_globsym_save_LIBS=$LIBS
- lt_globsym_save_CFLAGS=$CFLAGS
- LIBS="conftstm.$ac_objext"
- CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
- if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
- pipe_works=yes
- fi
- LIBS=$lt_globsym_save_LIBS
- CFLAGS=$lt_globsym_save_CFLAGS
- else
- echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
- fi
- else
- echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
- fi
- else
- echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
- fi
- else
- echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
- cat conftest.$ac_ext >&5
- fi
- rm -rf conftest* conftst*
-
- # Do not use the global_symbol_pipe unless it works.
- if test "$pipe_works" = yes; then
- break
- else
- lt_cv_sys_global_symbol_pipe=
- fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
- lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
- AC_MSG_RESULT(failed)
-else
- AC_MSG_RESULT(ok)
-fi
-
-# Response file support.
-if test "$lt_cv_nm_interface" = "MS dumpbin"; then
- nm_file_list_spec='@'
-elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
- nm_file_list_spec='@'
-fi
-
-_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
- [Take the output of nm and produce a listing of raw symbols and C names])
-_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
- [Transform the output of nm in a proper C declaration])
-_LT_DECL([global_symbol_to_c_name_address],
- [lt_cv_sys_global_symbol_to_c_name_address], [1],
- [Transform the output of nm in a C name address pair])
-_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
- [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
- [Transform the output of nm in a C name address pair when lib prefix is needed])
-_LT_DECL([], [nm_file_list_spec], [1],
- [Specify filename containing input files for $NM])
-]) # _LT_CMD_GLOBAL_SYMBOLS
-
-
-# _LT_COMPILER_PIC([TAGNAME])
-# ---------------------------
-m4_defun([_LT_COMPILER_PIC],
-[m4_require([_LT_TAG_COMPILER])dnl
-_LT_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_TAGVAR(lt_prog_compiler_static, $1)=
-
-m4_if([$1], [CXX], [
- # C++ specific cases for pic, static, wl, etc.
- if test "$GXX" = yes; then
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
- case $host_os in
- aix*)
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- m68k)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
- ;;
- esac
- ;;
-
- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
- # PIC is the default for these OSes.
- ;;
- mingw* | cygwin* | os2* | pw32* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- # Although the cygwin gcc ignores -fPIC, still need this for old-style
- # (--disable-auto-import) libraries
- m4_if([$1], [GCJ], [],
- [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
- ;;
- darwin* | rhapsody*)
- # PIC is the default on this platform
- # Common symbols not allowed in MH_DYLIB files
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
- ;;
- *djgpp*)
- # DJGPP does not support shared libraries at all
- _LT_TAGVAR(lt_prog_compiler_pic, $1)=
- ;;
- haiku*)
- # PIC is the default for Haiku.
- # The "-static" flag exists, but is broken.
- _LT_TAGVAR(lt_prog_compiler_static, $1)=
- ;;
- interix[[3-9]]*)
- # Interix 3.x gcc -fpic/-fPIC options generate broken code.
- # Instead, we relocate shared libraries at runtime.
- ;;
- sysv4*MP*)
- if test -d /usr/nec; then
- _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
- fi
- ;;
- hpux*)
- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
- # sets the default TLS model and affects inlining.
- case $host_cpu in
- hppa*64*)
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- esac
- ;;
- *qnx* | *nto*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- esac
- else
- case $host_os in
- aix[[4-9]]*)
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- else
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
- fi
- ;;
- chorus*)
- case $cc_basename in
- cxch68*)
- # Green Hills C++ Compiler
- # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
- ;;
- esac
- ;;
- mingw* | cygwin* | os2* | pw32* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- m4_if([$1], [GCJ], [],
- [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
- ;;
- dgux*)
- case $cc_basename in
- ec++*)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- ;;
- ghcx*)
- # Green Hills C++ Compiler
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
- ;;
- *)
- ;;
- esac
- ;;
- freebsd* | dragonfly*)
- # FreeBSD uses GNU C++
- ;;
- hpux9* | hpux10* | hpux11*)
- case $cc_basename in
- CC*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
- if test "$host_cpu" != ia64; then
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
- fi
- ;;
- aCC*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
- case $host_cpu in
- hppa*64*|ia64*)
- # +Z the default
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
- ;;
- esac
- ;;
- *)
- ;;
- esac
- ;;
- interix*)
- # This is c89, which is MS Visual C++ (no shared libs)
- # Anyone wants to do a port?
- ;;
- irix5* | irix6* | nonstopux*)
- case $cc_basename in
- CC*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- # CC pic flag -KPIC is the default.
- ;;
- *)
- ;;
- esac
- ;;
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
- case $cc_basename in
- KCC*)
- # KAI C++ Compiler
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- ecpc* )
- # old Intel C++ for x86_64 which still supported -KPIC.
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
- ;;
- icpc* )
- # Intel C++, used to be incompatible with GCC.
- # ICC 10 doesn't accept -KPIC any more.
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
- ;;
- pgCC* | pgcpp*)
- # Portland Group C++ compiler
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
- cxx*)
- # Compaq C++
- # Make sure the PIC flag is empty. It appears that all Alpha
- # Linux and Compaq Tru64 Unix objects are PIC.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)=
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- ;;
- xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
- # IBM XL 8.0, 9.0 on PPC and BlueGene
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
- ;;
- esac
- ;;
- esac
- ;;
- lynxos*)
- ;;
- m88k*)
- ;;
- mvs*)
- case $cc_basename in
- cxx*)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
- ;;
- *)
- ;;
- esac
- ;;
- netbsd*)
- ;;
- *qnx* | *nto*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
- ;;
- osf3* | osf4* | osf5*)
- case $cc_basename in
- KCC*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
- ;;
- RCC*)
- # Rational C++ 2.4.1
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
- ;;
- cxx*)
- # Digital/Compaq C++
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- # Make sure the PIC flag is empty. It appears that all Alpha
- # Linux and Compaq Tru64 Unix objects are PIC.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)=
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- ;;
- *)
- ;;
- esac
- ;;
- psos*)
- ;;
- solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # Sun C++ 4.2, 5.x and Centerline C++
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
- ;;
- gcx*)
- # Green Hills C++ Compiler
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
- ;;
- *)
- ;;
- esac
- ;;
- sunos4*)
- case $cc_basename in
- CC*)
- # Sun C++ 4.x
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
- lcc*)
- # Lucid
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
- ;;
- *)
- ;;
- esac
- ;;
- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
- case $cc_basename in
- CC*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
- esac
- ;;
- tandem*)
- case $cc_basename in
- NCC*)
- # NonStop-UX NCC 3.20
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- ;;
- *)
- ;;
- esac
- ;;
- vxworks*)
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
- ;;
- esac
- fi
-],
-[
- if test "$GCC" = yes; then
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
- case $host_os in
- aix*)
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- m68k)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
- ;;
- esac
- ;;
-
- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
- # PIC is the default for these OSes.
- ;;
-
- mingw* | cygwin* | pw32* | os2* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- # Although the cygwin gcc ignores -fPIC, still need this for old-style
- # (--disable-auto-import) libraries
- m4_if([$1], [GCJ], [],
- [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
- ;;
-
- darwin* | rhapsody*)
- # PIC is the default on this platform
- # Common symbols not allowed in MH_DYLIB files
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
- ;;
-
- haiku*)
- # PIC is the default for Haiku.
- # The "-static" flag exists, but is broken.
- _LT_TAGVAR(lt_prog_compiler_static, $1)=
- ;;
-
- hpux*)
- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag
- # sets the default TLS model and affects inlining.
- case $host_cpu in
- hppa*64*)
- # +Z the default
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- esac
- ;;
-
- interix[[3-9]]*)
- # Interix 3.x gcc -fpic/-fPIC options generate broken code.
- # Instead, we relocate shared libraries at runtime.
- ;;
-
- msdosdjgpp*)
- # Just because we use GCC doesn't mean we suddenly get shared libraries
- # on systems that don't support them.
- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
- enable_shared=no
- ;;
-
- *nto* | *qnx*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec; then
- _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
- fi
- ;;
-
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- ;;
- esac
-
- case $cc_basename in
- nvcc*) # Cuda Compiler Driver 2.2
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
- if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
- _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
- fi
- ;;
- esac
- else
- # PORTME Check for flag to pass linker flags through the system compiler.
- case $host_os in
- aix*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- else
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
- fi
- ;;
-
- mingw* | cygwin* | pw32* | os2* | cegcc*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- m4_if([$1], [GCJ], [],
- [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
- ;;
-
- hpux9* | hpux10* | hpux11*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
- # not for PA HP-UX.
- case $host_cpu in
- hppa*64*|ia64*)
- # +Z the default
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
- ;;
- esac
- # Is there a better lt_prog_compiler_static that works with the bundled CC?
- _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
- ;;
-
- irix5* | irix6* | nonstopux*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- # PIC (with -KPIC) is the default.
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- ;;
-
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
- case $cc_basename in
- # old Intel for x86_64 which still supported -KPIC.
- ecc*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
- ;;
- # icc used to be incompatible with GCC.
- # ICC 10 doesn't accept -KPIC any more.
- icc* | ifort*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
- ;;
- # Lahey Fortran 8.1.
- lf95*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
- ;;
- nagfor*)
- # NAG Fortran compiler
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
- pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
- # Portland Group compilers (*not* the Pentium gcc compiler,
- # which looks to be a dead project)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
- ccc*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- # All Alpha code is PIC.
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- ;;
- xl* | bgxl* | bgf* | mpixl*)
- # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
- # Sun Fortran 8.3 passes all unrecognized flags to the linker
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
- ;;
- *Sun\ F* | *Sun*Fortran*)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
- ;;
- *Sun\ C*)
- # Sun C 5.9
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- ;;
- *Intel*\ [[CF]]*Compiler*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
- ;;
- *Portland\ Group*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
- esac
- ;;
- esac
- ;;
-
- newsos6)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
-
- *nto* | *qnx*)
- # QNX uses GNU C++, but need to define -shared option too, otherwise
- # it will coredump.
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
- ;;
-
- osf3* | osf4* | osf5*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- # All OSF/1 code is PIC.
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- ;;
-
- rdos*)
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
- ;;
-
- solaris*)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- case $cc_basename in
- f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
- *)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
- esac
- ;;
-
- sunos4*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
-
- sysv4 | sysv4.2uw2* | sysv4.3*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec ;then
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- fi
- ;;
-
- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
-
- unicos*)
- _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
- ;;
-
- uts4*)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
- ;;
-
- *)
- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
- ;;
- esac
- fi
-])
-case $host_os in
- # For platforms which do not support PIC, -DPIC is meaningless:
- *djgpp*)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)=
- ;;
- *)
- _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
- ;;
-esac
-
-AC_CACHE_CHECK([for $compiler option to produce PIC],
- [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
- [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
- [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
- [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
- [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
- "" | " "*) ;;
- *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
- esac],
- [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
- _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
- [Additional compiler flags for building library objects])
-
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
- [How to pass a linker flag through the compiler])
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
-_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
- _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
- $lt_tmp_static_flag,
- [],
- [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
-_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
- [Compiler flag to prevent dynamic linking])
-])# _LT_COMPILER_PIC
-
-
-# _LT_LINKER_SHLIBS([TAGNAME])
-# ----------------------------
-# See if the linker supports building shared libraries.
-m4_defun([_LT_LINKER_SHLIBS],
-[AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-m4_if([$1], [CXX], [
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
- case $host_os in
- aix[[4-9]]*)
- # If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to AIX nm, but means don't demangle with GNU nm
- # Also, AIX nm treats weak defined symbols like other global defined
- # symbols, whereas GNU nm marks them as "W".
- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- else
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- fi
- ;;
- pw32*)
- _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
- ;;
- cygwin* | mingw* | cegcc*)
- case $cc_basename in
- cl*)
- _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
- ;;
- *)
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
- _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
- ;;
- esac
- ;;
- *)
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- ;;
- esac
-], [
- runpath_var=
- _LT_TAGVAR(allow_undefined_flag, $1)=
- _LT_TAGVAR(always_export_symbols, $1)=no
- _LT_TAGVAR(archive_cmds, $1)=
- _LT_TAGVAR(archive_expsym_cmds, $1)=
- _LT_TAGVAR(compiler_needs_object, $1)=no
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
- _LT_TAGVAR(export_dynamic_flag_spec, $1)=
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
- _LT_TAGVAR(hardcode_automatic, $1)=no
- _LT_TAGVAR(hardcode_direct, $1)=no
- _LT_TAGVAR(hardcode_direct_absolute, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
- _LT_TAGVAR(hardcode_libdir_separator, $1)=
- _LT_TAGVAR(hardcode_minus_L, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
- _LT_TAGVAR(inherit_rpath, $1)=no
- _LT_TAGVAR(link_all_deplibs, $1)=unknown
- _LT_TAGVAR(module_cmds, $1)=
- _LT_TAGVAR(module_expsym_cmds, $1)=
- _LT_TAGVAR(old_archive_from_new_cmds, $1)=
- _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
- _LT_TAGVAR(thread_safe_flag_spec, $1)=
- _LT_TAGVAR(whole_archive_flag_spec, $1)=
- # include_expsyms should be a list of space-separated symbols to be *always*
- # included in the symbol list
- _LT_TAGVAR(include_expsyms, $1)=
- # exclude_expsyms can be an extended regexp of symbols to exclude
- # it will be wrapped by ` (' and `)$', so one must not match beginning or
- # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
- # as well as any symbol that contains `d'.
- _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
- # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
- # platforms (ab)use it in PIC code, but their linkers get confused if
- # the symbol is explicitly referenced. Since portable code cannot
- # rely on this symbol name, it's probably fine to never include it in
- # preloaded symbol tables.
- # Exclude shared library initialization/finalization symbols.
-dnl Note also adjust exclude_expsyms for C++ above.
- extract_expsyms_cmds=
-
- case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
- # FIXME: the MSVC++ port hasn't been tested in a loooong time
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- if test "$GCC" != yes; then
- with_gnu_ld=no
- fi
- ;;
- interix*)
- # we just hope/assume this is gcc and not c89 (= MSVC++)
- with_gnu_ld=yes
- ;;
- openbsd*)
- with_gnu_ld=no
- ;;
- esac
-
- _LT_TAGVAR(ld_shlibs, $1)=yes
-
- # On some targets, GNU ld is compatible enough with the native linker
- # that we're better off using the native interface for both.
- lt_use_gnu_ld_interface=no
- if test "$with_gnu_ld" = yes; then
- case $host_os in
- aix*)
- # The AIX port of GNU ld has always aspired to compatibility
- # with the native linker. However, as the warning in the GNU ld
- # block says, versions before 2.19.5* couldn't really create working
- # shared libraries, regardless of the interface used.
- case `$LD -v 2>&1` in
- *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
- *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
- *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
- *)
- lt_use_gnu_ld_interface=yes
- ;;
- esac
- ;;
- *)
- lt_use_gnu_ld_interface=yes
- ;;
- esac
- fi
-
- if test "$lt_use_gnu_ld_interface" = yes; then
- # If archive_cmds runs LD, not CC, wlarc should be empty
- wlarc='${wl}'
-
- # Set some defaults for GNU ld with shared library support. These
- # are reset later if shared libraries are not supported. Putting them
- # here allows them to be overridden if necessary.
- runpath_var=LD_RUN_PATH
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
- # ancient GNU ld didn't support --whole-archive et. al.
- if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
- _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- else
- _LT_TAGVAR(whole_archive_flag_spec, $1)=
- fi
- supports_anon_versioning=no
- case `$LD -v 2>&1` in
- *GNU\ gold*) supports_anon_versioning=yes ;;
- *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
- *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
- *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
- *\ 2.11.*) ;; # other 2.11 versions
- *) supports_anon_versioning=yes ;;
- esac
-
- # See if GNU ld supports shared libraries.
- case $host_os in
- aix[[3-9]]*)
- # On AIX/PPC, the GNU linker is very broken
- if test "$host_cpu" != ia64; then
- _LT_TAGVAR(ld_shlibs, $1)=no
- cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support. If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)=''
- ;;
- m68k)
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- ;;
- esac
- ;;
-
- beos*)
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
- # support --undefined. This deserves some investigation. FIXME
- _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- cygwin* | mingw* | pw32* | cegcc*)
- # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
- # as there is no search path for DLLs.
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(always_export_symbols, $1)=no
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
- _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
-
- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is; otherwise, prepend...
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname.def;
- else
- echo EXPORTS > $output_objdir/$soname.def;
- cat $export_symbols >> $output_objdir/$soname.def;
- fi~
- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- haiku*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- ;;
-
- interix[[3-9]]*)
- _LT_TAGVAR(hardcode_direct, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
- # Instead, shared libraries are loaded at an image base (0x10000000 by
- # default) and relocated if they conflict, which is a slow very memory
- # consuming and fragmenting process. To avoid this, we pick a random,
- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
- # time. Moving up from 0x10000000 also allows more sbrk(2) space.
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- ;;
-
- gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
- tmp_diet=no
- if test "$host_os" = linux-dietlibc; then
- case $cc_basename in
- diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
- esac
- fi
- if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
- && test "$tmp_diet" = no
- then
- tmp_addflag=' $pic_flag'
- tmp_sharedflag='-shared'
- case $cc_basename,$host_cpu in
- pgcc*) # Portland Group C compiler
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- tmp_addflag=' $pic_flag'
- ;;
- pgf77* | pgf90* | pgf95* | pgfortran*)
- # Portland Group f77 and f90 compilers
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- tmp_addflag=' $pic_flag -Mnomain' ;;
- ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
- tmp_addflag=' -i_dynamic' ;;
- efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
- tmp_addflag=' -i_dynamic -nofor_main' ;;
- ifc* | ifort*) # Intel Fortran compiler
- tmp_addflag=' -nofor_main' ;;
- lf95*) # Lahey Fortran 8.1
- _LT_TAGVAR(whole_archive_flag_spec, $1)=
- tmp_sharedflag='--shared' ;;
- xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
- tmp_sharedflag='-qmkshrobj'
- tmp_addflag= ;;
- nvcc*) # Cuda Compiler Driver 2.2
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- _LT_TAGVAR(compiler_needs_object, $1)=yes
- ;;
- esac
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*) # Sun C 5.9
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- _LT_TAGVAR(compiler_needs_object, $1)=yes
- tmp_sharedflag='-G' ;;
- *Sun\ F*) # Sun Fortran 8.3
- tmp_sharedflag='-G' ;;
- esac
- _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
- if test "x$supports_anon_versioning" = xyes; then
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
- fi
-
- case $cc_basename in
- xlf* | bgf* | bgxlf* | mpixlf*)
- # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
- _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
- fi
- ;;
- esac
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
- wlarc=
- else
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- fi
- ;;
-
- solaris*)
- if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
- _LT_TAGVAR(ld_shlibs, $1)=no
- cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems. Therefore, libtool
-*** is disabling shared libraries support. We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer. Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
- elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
- case `$LD -v 2>&1` in
- *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
- _LT_TAGVAR(ld_shlibs, $1)=no
- cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems. Therefore, libtool
-*** is disabling shared libraries support. We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
- ;;
- *)
- # For security reasons, it is highly recommended that you always
- # use absolute paths for naming shared libraries, and exclude the
- # DT_RUNPATH tag from executables and libraries. But doing so
- # requires that you compile everything twice, which is a pain.
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
- esac
- ;;
-
- sunos4*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- wlarc=
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- *)
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
- esac
-
- if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
- runpath_var=
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
- _LT_TAGVAR(export_dynamic_flag_spec, $1)=
- _LT_TAGVAR(whole_archive_flag_spec, $1)=
- fi
- else
- # PORTME fill in a description of your system's linker (not GNU ld)
- case $host_os in
- aix3*)
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(always_export_symbols, $1)=yes
- _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
- # Note: this linker hardcodes the directories in LIBPATH if there
- # are no directories specified by -L.
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
- # Neither direct hardcoding nor static linking is supported with a
- # broken collect2.
- _LT_TAGVAR(hardcode_direct, $1)=unsupported
- fi
- ;;
-
- aix[[4-9]]*)
- if test "$host_cpu" = ia64; then
- # On IA64, the linker does run time linking by default, so we don't
- # have to do anything special.
- aix_use_runtimelinking=no
- exp_sym_flag='-Bexport'
- no_entry_flag=""
- else
- # If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to AIX nm, but means don't demangle with GNU nm
- # Also, AIX nm treats weak defined symbols like other global
- # defined symbols, whereas GNU nm marks them as "W".
- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- else
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
- fi
- aix_use_runtimelinking=no
-
- # Test if we are trying to use run time linking or normal
- # AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
- case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
- for ld_flag in $LDFLAGS; do
- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
- aix_use_runtimelinking=yes
- break
- fi
- done
- ;;
- esac
-
- exp_sym_flag='-bexport'
- no_entry_flag='-bnoentry'
- fi
-
- # When large executables or shared objects are built, AIX ld can
- # have problems creating the table of contents. If linking a library
- # or program results in "error TOC overflow" add -mminimal-toc to
- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
- _LT_TAGVAR(archive_cmds, $1)=''
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
- if test "$GCC" = yes; then
- case $host_os in aix4.[[012]]|aix4.[[012]].*)
- # We only want to do this on AIX 4.2 and lower, the check
- # below for broken collect2 doesn't work under 4.3+
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" &&
- strings "$collect2name" | $GREP resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- :
- else
- # We have old collect2
- _LT_TAGVAR(hardcode_direct, $1)=unsupported
- # It fails to find uninstalled libraries when the uninstalled
- # path is not listed in the libpath. Setting hardcode_minus_L
- # to unsupported forces relinking
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=
- fi
- ;;
- esac
- shared_flag='-shared'
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag="$shared_flag "'${wl}-G'
- fi
- else
- # not using gcc
- if test "$host_cpu" = ia64; then
- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
- # chokes on -Wl,-G. The following line is correct:
- shared_flag='-G'
- else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
- else
- shared_flag='${wl}-bM:SRE'
- fi
- fi
- fi
-
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
- # It seems that -bexpall does not export symbols beginning with
- # underscore (_), so it is better to generate a list of symbols to export.
- _LT_TAGVAR(always_export_symbols, $1)=yes
- if test "$aix_use_runtimelinking" = yes; then
- # Warning - without using the other runtime loading flags (-brtl),
- # -berok will link without error, but may produce a broken library.
- _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
- # Determine the default libpath from the value encoded in an
- # empty executable.
- _LT_SYS_MODULE_PATH_AIX([$1])
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
- else
- if test "$host_cpu" = ia64; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
- _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
- else
- # Determine the default libpath from the value encoded in an
- # empty executable.
- _LT_SYS_MODULE_PATH_AIX([$1])
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
- # Warning - without using the other run time loading flags,
- # -berok will link without error, but may produce a broken library.
- _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
- if test "$with_gnu_ld" = yes; then
- # We only use this code for GNU lds that support --whole-archive.
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- else
- # Exported symbols can be pulled into shared objects from archives
- _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
- fi
- _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
- # This is similar to how AIX traditionally builds its shared libraries.
- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
- fi
- fi
- ;;
-
- amigaos*)
- case $host_cpu in
- powerpc)
- # see comment about AmigaOS4 .so support
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)=''
- ;;
- m68k)
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- ;;
- esac
- ;;
-
- bsdi[[45]]*)
- _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
- ;;
-
- cygwin* | mingw* | pw32* | cegcc*)
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- case $cc_basename in
- cl*)
- # Native MSVC
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(always_export_symbols, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='@'
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
- else
- sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
- fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
- linknames='
- # The linker will not automatically build a static lib if we build a DLL.
- # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
- _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
- # Don't use ranlib
- _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
- _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
- lt_tool_outputfile="@TOOL_OUTPUT@"~
- case $lt_outputfile in
- *.exe|*.EXE) ;;
- *)
- lt_outputfile="$lt_outputfile.exe"
- lt_tool_outputfile="$lt_tool_outputfile.exe"
- ;;
- esac~
- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
- $RM "$lt_outputfile.manifest";
- fi'
- ;;
- *)
- # Assume MSVC wrapper
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
- # The linker will automatically build a .lib file if we build a DLL.
- _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
- # FIXME: Should let the user specify the lib program.
- _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
- ;;
- esac
- ;;
-
- darwin* | rhapsody*)
- _LT_DARWIN_LINKER_FEATURES($1)
- ;;
-
- dgux*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
- # support. Future versions do this automatically, but an explicit c++rt0.o
- # does not break anything, and helps significantly (at the cost of a little
- # extra space).
- freebsd2.2*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- # Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2.*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
- freebsd* | dragonfly*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- hpux9*)
- if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- else
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- fi
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(hardcode_direct, $1)=yes
-
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- ;;
-
- hpux10*)
- if test "$GCC" = yes && test "$with_gnu_ld" = no; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
- else
- _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
- fi
- if test "$with_gnu_ld" = no; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- fi
- ;;
-
- hpux11*)
- if test "$GCC" = yes && test "$with_gnu_ld" = no; then
- case $host_cpu in
- hppa*64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- esac
- else
- case $host_cpu in
- hppa*64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- *)
- m4_if($1, [], [
- # Older versions of the 11.00 compiler do not understand -b yet
- # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
- _LT_LINKER_OPTION([if $CC understands -b],
- _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
- [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
- [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
- [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
- ;;
- esac
- fi
- if test "$with_gnu_ld" = no; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
- case $host_cpu in
- hppa*64*|ia64*)
- _LT_TAGVAR(hardcode_direct, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
- *)
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- ;;
- esac
- fi
- ;;
-
- irix5* | irix6* | nonstopux*)
- if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- # Try to use the -exported_symbol ld option, if it does not
- # work, assume that -exports_file does not work either and
- # implicitly export all symbols.
- # This should be the same for all languages, so no per-tag cache variable.
- AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
- [lt_cv_irix_exported_symbol],
- [save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
- AC_LINK_IFELSE(
- [AC_LANG_SOURCE(
- [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
- [C++], [[int foo (void) { return 0; }]],
- [Fortran 77], [[
- subroutine foo
- end]],
- [Fortran], [[
- subroutine foo
- end]])])],
- [lt_cv_irix_exported_symbol=yes],
- [lt_cv_irix_exported_symbol=no])
- LDFLAGS="$save_LDFLAGS"])
- if test "$lt_cv_irix_exported_symbol" = yes; then
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
- fi
- else
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
- fi
- _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(inherit_rpath, $1)=yes
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
- else
- _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
- fi
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- newsos6)
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- *nto* | *qnx*)
- ;;
-
- openbsd*)
- if test -f /usr/libexec/ld.so; then
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- else
- case $host_os in
- openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- ;;
- esac
- fi
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- os2*)
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
- _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
- ;;
-
- osf3*)
- if test "$GCC" = yes; then
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- fi
- _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- ;;
-
- osf4* | osf5*) # as osf3* with the addition of -msym flag
- if test "$GCC" = yes; then
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- else
- _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
- # Both c and cxx compiler support -rpath directly
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
- fi
- _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- ;;
-
- solaris*)
- _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
- if test "$GCC" = yes; then
- wlarc='${wl}'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
- else
- case `$CC -V 2>&1` in
- *"Compilers 5.0"*)
- wlarc=''
- _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
- ;;
- *)
- wlarc='${wl}'
- _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
- ;;
- esac
- fi
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- case $host_os in
- solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
- *)
- # The compiler driver will combine and reorder linker options,
- # but understands `-z linker_flag'. GCC discards it without `$wl',
- # but is careful enough not to reorder.
- # Supported since Solaris 2.6 (maybe 2.5.1?)
- if test "$GCC" = yes; then
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
- else
- _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
- fi
- ;;
- esac
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- ;;
-
- sunos4*)
- if test "x$host_vendor" = xsequent; then
- # Use $CC to link under sequent, because it throws in some extra .o
- # files that make .init and .fini sections work.
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
- fi
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- sysv4)
- case $host_vendor in
- sni)
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
- ;;
- siemens)
- ## LD is ld it makes a PLAMLIB
- ## CC just makes a GrossModule.
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
- _LT_TAGVAR(hardcode_direct, $1)=no
- ;;
- motorola)
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
- ;;
- esac
- runpath_var='LD_RUN_PATH'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- sysv4.3*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec; then
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- runpath_var=LD_RUN_PATH
- hardcode_runpath_var=yes
- _LT_TAGVAR(ld_shlibs, $1)=yes
- fi
- ;;
-
- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- runpath_var='LD_RUN_PATH'
-
- if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- fi
- ;;
-
- sysv5* | sco3.2v5* | sco5v6*)
- # Note: We can NOT use -z defs as we might desire, because we do not
- # link with -lc, and that would cause any symbols used from libc to
- # always be unresolved, which means just about no library would
- # ever link correctly. If we're not using GNU ld we use -z text
- # though, which does catch some bad symbols but isn't as heavy-handed
- # as -z defs.
- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
- _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
- runpath_var='LD_RUN_PATH'
-
- if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- fi
- ;;
-
- uts4*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
-
- *)
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
-
- if test x$host_vendor = xsni; then
- case $host in
- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
- ;;
- esac
- fi
- fi
-])
-AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
-
-_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
-_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
-_LT_DECL([], [extract_expsyms_cmds], [2],
- [The commands to extract the exported symbol list from a shared archive])
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
- # Assume -lc should be added
- _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-
- if test "$enable_shared" = yes && test "$GCC" = yes; then
- case $_LT_TAGVAR(archive_cmds, $1) in
- *'~'*)
- # FIXME: we may have to deal with multi-command sequences.
- ;;
- '$CC '*)
- # Test whether the compiler implicitly links with -lc since on some
- # systems, -lgcc has to come before -lc. If gcc already passes -lc
- # to ld, don't add -lc before -lgcc.
- AC_CACHE_CHECK([whether -lc should be explicitly linked in],
- [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
- [$RM conftest*
- echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
- if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
- soname=conftest
- lib=conftest
- libobjs=conftest.$ac_objext
- deplibs=
- wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
- pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
- compiler_flags=-v
- linker_flags=-v
- verstring=
- output_objdir=.
- libname=conftest
- lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
- _LT_TAGVAR(allow_undefined_flag, $1)=
- if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
- then
- lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
- else
- lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
- fi
- _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
- else
- cat conftest.err 1>&5
- fi
- $RM conftest*
- ])
- _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
- ;;
- esac
- fi
- ;;
-esac
-
-_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
- [Whether or not to add -lc for building shared libraries])
-_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
- [enable_shared_with_static_runtimes], [0],
- [Whether or not to disallow shared libs when runtime libs are static])
-_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
- [Compiler flag to allow reflexive dlopens])
-_LT_TAGDECL([], [whole_archive_flag_spec], [1],
- [Compiler flag to generate shared objects directly from archives])
-_LT_TAGDECL([], [compiler_needs_object], [1],
- [Whether the compiler copes with passing no objects directly])
-_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
- [Create an old-style archive from a shared archive])
-_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
- [Create a temporary old-style archive to link instead of a shared archive])
-_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
-_LT_TAGDECL([], [archive_expsym_cmds], [2])
-_LT_TAGDECL([], [module_cmds], [2],
- [Commands used to build a loadable module if different from building
- a shared archive.])
-_LT_TAGDECL([], [module_expsym_cmds], [2])
-_LT_TAGDECL([], [with_gnu_ld], [1],
- [Whether we are building with GNU ld or not])
-_LT_TAGDECL([], [allow_undefined_flag], [1],
- [Flag that allows shared libraries with undefined symbols to be built])
-_LT_TAGDECL([], [no_undefined_flag], [1],
- [Flag that enforces no undefined symbols])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
- [Flag to hardcode $libdir into a binary during linking.
- This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_separator], [1],
- [Whether we need a single "-rpath" flag with a separated argument])
-_LT_TAGDECL([], [hardcode_direct], [0],
- [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
- DIR into the resulting binary])
-_LT_TAGDECL([], [hardcode_direct_absolute], [0],
- [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
- DIR into the resulting binary and the resulting library dependency is
- "absolute", i.e impossible to change by setting ${shlibpath_var} if the
- library is relocated])
-_LT_TAGDECL([], [hardcode_minus_L], [0],
- [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
- into the resulting binary])
-_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
- [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
- into the resulting binary])
-_LT_TAGDECL([], [hardcode_automatic], [0],
- [Set to "yes" if building a shared library automatically hardcodes DIR
- into the library and all subsequent libraries and executables linked
- against it])
-_LT_TAGDECL([], [inherit_rpath], [0],
- [Set to yes if linker adds runtime paths of dependent libraries
- to runtime path list])
-_LT_TAGDECL([], [link_all_deplibs], [0],
- [Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [always_export_symbols], [0],
- [Set to "yes" if exported symbols are required])
-_LT_TAGDECL([], [export_symbols_cmds], [2],
- [The commands to list exported symbols])
-_LT_TAGDECL([], [exclude_expsyms], [1],
- [Symbols that should not be listed in the preloaded symbols])
-_LT_TAGDECL([], [include_expsyms], [1],
- [Symbols that must always be exported])
-_LT_TAGDECL([], [prelink_cmds], [2],
- [Commands necessary for linking programs (against libraries) with templates])
-_LT_TAGDECL([], [postlink_cmds], [2],
- [Commands necessary for finishing linking programs])
-_LT_TAGDECL([], [file_list_spec], [1],
- [Specify filename containing input files])
-dnl FIXME: Not yet implemented
-dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
-dnl [Compiler flag to generate thread safe objects])
-])# _LT_LINKER_SHLIBS
-
-
-# _LT_LANG_C_CONFIG([TAG])
-# ------------------------
-# Ensure that the configuration variables for a C compiler are suitably
-# defined. These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_C_CONFIG],
-[m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-_LT_TAG_COMPILER
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
- _LT_COMPILER_NO_RTTI($1)
- _LT_COMPILER_PIC($1)
- _LT_COMPILER_C_O($1)
- _LT_COMPILER_FILE_LOCKS($1)
- _LT_LINKER_SHLIBS($1)
- _LT_SYS_DYNAMIC_LINKER($1)
- _LT_LINKER_HARDCODE_LIBPATH($1)
- LT_SYS_DLOPEN_SELF
- _LT_CMD_STRIPLIB
-
- # Report which library types will actually be built
- AC_MSG_CHECKING([if libtool supports shared libraries])
- AC_MSG_RESULT([$can_build_shared])
-
- AC_MSG_CHECKING([whether to build shared libraries])
- test "$can_build_shared" = "no" && enable_shared=no
-
- # On AIX, shared libraries and static libraries use the same namespace, and
- # are all built from PIC.
- case $host_os in
- aix3*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
-
- aix[[4-9]]*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
- fi
- ;;
- esac
- AC_MSG_RESULT([$enable_shared])
-
- AC_MSG_CHECKING([whether to build static libraries])
- # Make sure either enable_shared or enable_static is yes.
- test "$enable_shared" = yes || enable_static=yes
- AC_MSG_RESULT([$enable_static])
-
- _LT_CONFIG($1)
-fi
-AC_LANG_POP
-CC="$lt_save_CC"
-])# _LT_LANG_C_CONFIG
-
-
-# _LT_LANG_CXX_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a C++ compiler are suitably
-# defined. These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_CXX_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
- ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
- (test "X$CXX" != "Xg++"))) ; then
- AC_PROG_CXXCPP
-else
- _lt_caught_CXX_error=yes
-fi
-
-AC_LANG_PUSH(C++)
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(compiler_needs_object, $1)=no
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working. Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
- # Code to be used in simple compile tests
- lt_simple_compile_test_code="int some_variable = 0;"
-
- # Code to be used in simple link tests
- lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
-
- # ltmain only uses $CC for tagged configurations so make sure $CC is set.
- _LT_TAG_COMPILER
-
- # save warnings/boilerplate of simple test code
- _LT_COMPILER_BOILERPLATE
- _LT_LINKER_BOILERPLATE
-
- # Allow CC to be a program name with arguments.
- lt_save_CC=$CC
- lt_save_CFLAGS=$CFLAGS
- lt_save_LD=$LD
- lt_save_GCC=$GCC
- GCC=$GXX
- lt_save_with_gnu_ld=$with_gnu_ld
- lt_save_path_LD=$lt_cv_path_LD
- if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
- lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
- else
- $as_unset lt_cv_prog_gnu_ld
- fi
- if test -n "${lt_cv_path_LDCXX+set}"; then
- lt_cv_path_LD=$lt_cv_path_LDCXX
- else
- $as_unset lt_cv_path_LD
- fi
- test -z "${LDCXX+set}" || LD=$LDCXX
- CC=${CXX-"c++"}
- CFLAGS=$CXXFLAGS
- compiler=$CC
- _LT_TAGVAR(compiler, $1)=$CC
- _LT_CC_BASENAME([$compiler])
-
- if test -n "$compiler"; then
- # We don't want -fno-exception when compiling C++ code, so set the
- # no_builtin_flag separately
- if test "$GXX" = yes; then
- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
- else
- _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
- fi
-
- if test "$GXX" = yes; then
- # Set up default GNU C++ configuration
-
- LT_PATH_LD
-
- # Check if GNU C++ uses GNU ld as the underlying linker, since the
- # archiving commands below assume that GNU ld is being used.
- if test "$with_gnu_ld" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
- # If archive_cmds runs LD, not CC, wlarc should be empty
- # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
- # investigate it a little bit more. (MM)
- wlarc='${wl}'
-
- # ancient GNU ld didn't support --whole-archive et. al.
- if eval "`$CC -print-prog-name=ld` --help 2>&1" |
- $GREP 'no-whole-archive' > /dev/null; then
- _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- else
- _LT_TAGVAR(whole_archive_flag_spec, $1)=
- fi
- else
- with_gnu_ld=no
- wlarc=
-
- # A generic and very simple default shared library creation
- # command for GNU C++ for the case where it uses the native
- # linker, instead of GNU ld. If possible, this setting should
- # overridden to take advantage of the native linker features on
- # the platform it is being used on.
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
- fi
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
- else
- GXX=no
- with_gnu_ld=no
- wlarc=
- fi
-
- # PORTME: fill in a description of your system's C++ link characteristics
- AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
- _LT_TAGVAR(ld_shlibs, $1)=yes
- case $host_os in
- aix3*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- aix[[4-9]]*)
- if test "$host_cpu" = ia64; then
- # On IA64, the linker does run time linking by default, so we don't
- # have to do anything special.
- aix_use_runtimelinking=no
- exp_sym_flag='-Bexport'
- no_entry_flag=""
- else
- aix_use_runtimelinking=no
-
- # Test if we are trying to use run time linking or normal
- # AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
- case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
- for ld_flag in $LDFLAGS; do
- case $ld_flag in
- *-brtl*)
- aix_use_runtimelinking=yes
- break
- ;;
- esac
- done
- ;;
- esac
-
- exp_sym_flag='-bexport'
- no_entry_flag='-bnoentry'
- fi
-
- # When large executables or shared objects are built, AIX ld can
- # have problems creating the table of contents. If linking a library
- # or program results in "error TOC overflow" add -mminimal-toc to
- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
- _LT_TAGVAR(archive_cmds, $1)=''
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
- if test "$GXX" = yes; then
- case $host_os in aix4.[[012]]|aix4.[[012]].*)
- # We only want to do this on AIX 4.2 and lower, the check
- # below for broken collect2 doesn't work under 4.3+
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" &&
- strings "$collect2name" | $GREP resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- :
- else
- # We have old collect2
- _LT_TAGVAR(hardcode_direct, $1)=unsupported
- # It fails to find uninstalled libraries when the uninstalled
- # path is not listed in the libpath. Setting hardcode_minus_L
- # to unsupported forces relinking
- _LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=
- fi
- esac
- shared_flag='-shared'
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag="$shared_flag "'${wl}-G'
- fi
- else
- # not using gcc
- if test "$host_cpu" = ia64; then
- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
- # chokes on -Wl,-G. The following line is correct:
- shared_flag='-G'
- else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
- else
- shared_flag='${wl}-bM:SRE'
- fi
- fi
- fi
-
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
- # It seems that -bexpall does not export symbols beginning with
- # underscore (_), so it is better to generate a list of symbols to
- # export.
- _LT_TAGVAR(always_export_symbols, $1)=yes
- if test "$aix_use_runtimelinking" = yes; then
- # Warning - without using the other runtime loading flags (-brtl),
- # -berok will link without error, but may produce a broken library.
- _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
- # Determine the default libpath from the value encoded in an empty
- # executable.
- _LT_SYS_MODULE_PATH_AIX([$1])
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
- else
- if test "$host_cpu" = ia64; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
- _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
- else
- # Determine the default libpath from the value encoded in an
- # empty executable.
- _LT_SYS_MODULE_PATH_AIX([$1])
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
- # Warning - without using the other run time loading flags,
- # -berok will link without error, but may produce a broken library.
- _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
- if test "$with_gnu_ld" = yes; then
- # We only use this code for GNU lds that support --whole-archive.
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- else
- # Exported symbols can be pulled into shared objects from archives
- _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
- fi
- _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
- # This is similar to how AIX traditionally builds its shared
- # libraries.
- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
- fi
- fi
- ;;
-
- beos*)
- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
- # support --undefined. This deserves some investigation. FIXME
- _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- chorus*)
- case $cc_basename in
- *)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
- ;;
-
- cygwin* | mingw* | pw32* | cegcc*)
- case $GXX,$cc_basename in
- ,cl* | no,cl*)
- # Native MSVC
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(always_export_symbols, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='@'
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
- # FIXME: Setting linknames here is a bad hack.
- _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
- else
- $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
- fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
- linknames='
- # The linker will not automatically build a static lib if we build a DLL.
- # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
- # Don't use ranlib
- _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
- _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
- lt_tool_outputfile="@TOOL_OUTPUT@"~
- case $lt_outputfile in
- *.exe|*.EXE) ;;
- *)
- lt_outputfile="$lt_outputfile.exe"
- lt_tool_outputfile="$lt_tool_outputfile.exe"
- ;;
- esac~
- func_to_tool_file "$lt_outputfile"~
- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
- $RM "$lt_outputfile.manifest";
- fi'
- ;;
- *)
- # g++
- # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
- # as there is no search path for DLLs.
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
- _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(always_export_symbols, $1)=no
- _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is; otherwise, prepend...
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname.def;
- else
- echo EXPORTS > $output_objdir/$soname.def;
- cat $export_symbols >> $output_objdir/$soname.def;
- fi~
- $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
- esac
- ;;
- darwin* | rhapsody*)
- _LT_DARWIN_LINKER_FEATURES($1)
- ;;
-
- dgux*)
- case $cc_basename in
- ec++*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- ghcx*)
- # Green Hills C++ Compiler
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
- ;;
-
- freebsd2.*)
- # C++ shared libraries reported to be fairly broken before
- # switch to ELF
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- freebsd-elf*)
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- ;;
-
- freebsd* | dragonfly*)
- # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
- # conventions
- _LT_TAGVAR(ld_shlibs, $1)=yes
- ;;
-
- gnu*)
- ;;
-
- haiku*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- ;;
-
- hpux9*)
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
- # but as the default
- # location of the library.
-
- case $cc_basename in
- CC*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- aCC*)
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- ;;
- *)
- if test "$GXX" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
- else
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
- esac
- ;;
-
- hpux10*|hpux11*)
- if test $with_gnu_ld = no; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
- case $host_cpu in
- hppa*64*|ia64*)
- ;;
- *)
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- ;;
- esac
- fi
- case $host_cpu in
- hppa*64*|ia64*)
- _LT_TAGVAR(hardcode_direct, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- ;;
- *)
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
- # but as the default
- # location of the library.
- ;;
- esac
-
- case $cc_basename in
- CC*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- aCC*)
- case $host_cpu in
- hppa*64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- esac
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- ;;
- *)
- if test "$GXX" = yes; then
- if test $with_gnu_ld = no; then
- case $host_cpu in
- hppa*64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- ;;
- esac
- fi
- else
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
- esac
- ;;
-
- interix[[3-9]]*)
- _LT_TAGVAR(hardcode_direct, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
- # Instead, shared libraries are loaded at an image base (0x10000000 by
- # default) and relocated if they conflict, which is a slow very memory
- # consuming and fragmenting process. To avoid this, we pick a random,
- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
- # time. Moving up from 0x10000000 also allows more sbrk(2) space.
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- ;;
- irix5* | irix6*)
- case $cc_basename in
- CC*)
- # SGI C++
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
- # Archives containing C++ object files must be created using
- # "CC -ar", where "CC" is the IRIX C++ compiler. This is
- # necessary to make sure instantiated templates are included
- # in the archive.
- _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
- ;;
- *)
- if test "$GXX" = yes; then
- if test "$with_gnu_ld" = no; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
- fi
- fi
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- ;;
- esac
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(inherit_rpath, $1)=yes
- ;;
-
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
- case $cc_basename in
- KCC*)
- # Kuck and Associates, Inc. (KAI) C++ Compiler
-
- # KCC will only create a shared library if the output file
- # ends with ".so" (or ".sl" for HP-UX), so rename the library
- # to its proper name (with version) after linking.
- _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
- # Archives containing C++ object files must be created using
- # "CC -Bstatic", where "CC" is the KAI C++ compiler.
- _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
- ;;
- icpc* | ecpc* )
- # Intel C++
- with_gnu_ld=yes
- # version 8.0 and above of icpc choke on multiply defined symbols
- # if we add $predep_objects and $postdep_objects, however 7.1 and
- # earlier do not add the objects themselves.
- case `$CC -V 2>&1` in
- *"Version 7."*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- ;;
- *) # Version 8.0 or newer
- tmp_idyn=
- case $host_cpu in
- ia64*) tmp_idyn=' -i_dynamic';;
- esac
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- ;;
- esac
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- ;;
- pgCC* | pgcpp*)
- # Portland Group C++ compiler
- case `$CC -V` in
- *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
- _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
- compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
- _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
- $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
- $RANLIB $oldlib'
- _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
- ;;
- *) # Version 6 and above use weak symbols
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
- ;;
- esac
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- ;;
- cxx*)
- # Compaq C++
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
- runpath_var=LD_RUN_PATH
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
- ;;
- xl* | mpixl* | bgxl*)
- # IBM XL 8.0 on PPC, with GNU ld
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
- _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
- fi
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
- _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
- _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
- _LT_TAGVAR(compiler_needs_object, $1)=yes
-
- # Not sure whether something based on
- # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
- # would be better.
- output_verbose_link_cmd='func_echo_all'
-
- # Archives containing C++ object files must be created using
- # "CC -xar", where "CC" is the Sun C++ compiler. This is
- # necessary to make sure instantiated templates are included
- # in the archive.
- _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
- ;;
- esac
- ;;
- esac
- ;;
-
- lynxos*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- m88k*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- mvs*)
- case $cc_basename in
- cxx*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
- wlarc=
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- fi
- # Workaround some broken pre-1.5 toolchains
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
- ;;
-
- *nto* | *qnx*)
- _LT_TAGVAR(ld_shlibs, $1)=yes
- ;;
-
- openbsd2*)
- # C++ shared libraries are fairly broken
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- openbsd*)
- if test -f /usr/libexec/ld.so; then
- _LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- fi
- output_verbose_link_cmd=func_echo_all
- else
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
-
- osf3* | osf4* | osf5*)
- case $cc_basename in
- KCC*)
- # Kuck and Associates, Inc. (KAI) C++ Compiler
-
- # KCC will only create a shared library if the output file
- # ends with ".so" (or ".sl" for HP-UX), so rename the library
- # to its proper name (with version) after linking.
- _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
- # Archives containing C++ object files must be created using
- # the KAI C++ compiler.
- case $host in
- osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
- *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
- esac
- ;;
- RCC*)
- # Rational C++ 2.4.1
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- cxx*)
- case $host in
- osf3*)
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- ;;
- *)
- _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
- echo "-hidden">> $lib.exp~
- $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
- $RM $lib.exp'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
- ;;
- esac
-
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- #
- # There doesn't appear to be a way to prevent this compiler from
- # explicitly linking system object files so we need to strip them
- # from the output so that they don't get included in the library
- # dependencies.
- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- ;;
- *)
- if test "$GXX" = yes && test "$with_gnu_ld" = no; then
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- case $host in
- osf3*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- ;;
- esac
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
- else
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- fi
- ;;
- esac
- ;;
-
- psos*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- sunos4*)
- case $cc_basename in
- CC*)
- # Sun C++ 4.x
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- lcc*)
- # Lucid
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
- ;;
-
- solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # Sun C++ 4.2, 5.x and Centerline C++
- _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
- _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
- _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- case $host_os in
- solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
- *)
- # The compiler driver will combine and reorder linker options,
- # but understands `-z linker_flag'.
- # Supported since Solaris 2.6 (maybe 2.5.1?)
- _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
- ;;
- esac
- _LT_TAGVAR(link_all_deplibs, $1)=yes
-
- output_verbose_link_cmd='func_echo_all'
-
- # Archives containing C++ object files must be created using
- # "CC -xar", where "CC" is the Sun C++ compiler. This is
- # necessary to make sure instantiated templates are included
- # in the archive.
- _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
- ;;
- gcx*)
- # Green Hills C++ Compiler
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
- # The C++ compiler must be used to create the archive.
- _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
- ;;
- *)
- # GNU C++ compiler with Solaris linker
- if test "$GXX" = yes && test "$with_gnu_ld" = no; then
- _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
- if $CC --version | $GREP -v '^2\.7' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
- else
- # g++ 2.7 appears to require `-G' NOT `-shared' on this
- # platform.
- _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
- # Commands to make compiler produce verbose output that lists
- # what "hidden" libraries, object files and flags are used when
- # linking a shared library.
- output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
- fi
-
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
- case $host_os in
- solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
- *)
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
- ;;
- esac
- fi
- ;;
- esac
- ;;
-
- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- runpath_var='LD_RUN_PATH'
-
- case $cc_basename in
- CC*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- esac
- ;;
-
- sysv5* | sco3.2v5* | sco5v6*)
- # Note: We can NOT use -z defs as we might desire, because we do not
- # link with -lc, and that would cause any symbols used from libc to
- # always be unresolved, which means just about no library would
- # ever link correctly. If we're not using GNU ld we use -z text
- # though, which does catch some bad symbols but isn't as heavy-handed
- # as -z defs.
- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
- _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
- _LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
- _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
- _LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
- runpath_var='LD_RUN_PATH'
-
- case $cc_basename in
- CC*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
- '"$_LT_TAGVAR(old_archive_cmds, $1)"
- _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
- '"$_LT_TAGVAR(reload_cmds, $1)"
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- ;;
- esac
- ;;
-
- tandem*)
- case $cc_basename in
- NCC*)
- # NonStop-UX NCC 3.20
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- *)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
- ;;
-
- vxworks*)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- *)
- # FIXME: insert proper C++ library support
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
- esac
-
- AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
- test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
- _LT_TAGVAR(GCC, $1)="$GXX"
- _LT_TAGVAR(LD, $1)="$LD"
-
- ## CAVEAT EMPTOR:
- ## There is no encapsulation within the following macros, do not change
- ## the running order or otherwise move them around unless you know exactly
- ## what you are doing...
- _LT_SYS_HIDDEN_LIBDEPS($1)
- _LT_COMPILER_PIC($1)
- _LT_COMPILER_C_O($1)
- _LT_COMPILER_FILE_LOCKS($1)
- _LT_LINKER_SHLIBS($1)
- _LT_SYS_DYNAMIC_LINKER($1)
- _LT_LINKER_HARDCODE_LIBPATH($1)
-
- _LT_CONFIG($1)
- fi # test -n "$compiler"
-
- CC=$lt_save_CC
- CFLAGS=$lt_save_CFLAGS
- LDCXX=$LD
- LD=$lt_save_LD
- GCC=$lt_save_GCC
- with_gnu_ld=$lt_save_with_gnu_ld
- lt_cv_path_LDCXX=$lt_cv_path_LD
- lt_cv_path_LD=$lt_save_path_LD
- lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
- lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-AC_LANG_POP
-])# _LT_LANG_CXX_CONFIG
-
-
-# _LT_FUNC_STRIPNAME_CNF
-# ----------------------
-# func_stripname_cnf prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-#
-# This function is identical to the (non-XSI) version of func_stripname,
-# except this one can be used by m4 code that may be executed by configure,
-# rather than the libtool script.
-m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
-AC_REQUIRE([_LT_DECL_SED])
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
-func_stripname_cnf ()
-{
- case ${2} in
- .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
- *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
- esac
-} # func_stripname_cnf
-])# _LT_FUNC_STRIPNAME_CNF
-
-# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
-# ---------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
-# Dependencies to place before and after the object being linked:
-_LT_TAGVAR(predep_objects, $1)=
-_LT_TAGVAR(postdep_objects, $1)=
-_LT_TAGVAR(predeps, $1)=
-_LT_TAGVAR(postdeps, $1)=
-_LT_TAGVAR(compiler_lib_search_path, $1)=
-
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library. It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
-int a;
-void foo (void) { a = 0; }
-_LT_EOF
-], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
- Foo (void) { a = 0; }
-private:
- int a;
-};
-_LT_EOF
-], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
- subroutine foo
- implicit none
- integer*4 a
- a=0
- return
- end
-_LT_EOF
-], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
- subroutine foo
- implicit none
- integer a
- a=0
- return
- end
-_LT_EOF
-], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
-public class foo {
- private int a;
- public void bar (void) {
- a = 0;
- }
-};
-_LT_EOF
-], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
-package foo
-func foo() {
-}
-_LT_EOF
-])
-
-_lt_libdeps_save_CFLAGS=$CFLAGS
-case "$CC $CFLAGS " in #(
-*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
-*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
-*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
-esac
-
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
- # Parse the compiler output and extract the necessary
- # objects, libraries and library flags.
-
- # Sentinel used to keep track of whether or not we are before
- # the conftest object file.
- pre_test_object_deps_done=no
-
- for p in `eval "$output_verbose_link_cmd"`; do
- case ${prev}${p} in
-
- -L* | -R* | -l*)
- # Some compilers place space between "-{L,R}" and the path.
- # Remove the space.
- if test $p = "-L" ||
- test $p = "-R"; then
- prev=$p
- continue
- fi
-
- # Expand the sysroot to ease extracting the directories later.
- if test -z "$prev"; then
- case $p in
- -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
- -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
- -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
- esac
- fi
- case $p in
- =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
- esac
- if test "$pre_test_object_deps_done" = no; then
- case ${prev} in
- -L | -R)
- # Internal compiler library paths should come after those
- # provided the user. The postdeps already come after the
- # user supplied libs so there is no need to process them.
- if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
- _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
- else
- _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
- fi
- ;;
- # The "-l" case would never come before the object being
- # linked, so don't bother handling this case.
- esac
- else
- if test -z "$_LT_TAGVAR(postdeps, $1)"; then
- _LT_TAGVAR(postdeps, $1)="${prev}${p}"
- else
- _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
- fi
- fi
- prev=
- ;;
-
- *.lto.$objext) ;; # Ignore GCC LTO objects
- *.$objext)
- # This assumes that the test object file only shows up
- # once in the compiler output.
- if test "$p" = "conftest.$objext"; then
- pre_test_object_deps_done=yes
- continue
- fi
-
- if test "$pre_test_object_deps_done" = no; then
- if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
- _LT_TAGVAR(predep_objects, $1)="$p"
- else
- _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
- fi
- else
- if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
- _LT_TAGVAR(postdep_objects, $1)="$p"
- else
- _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
- fi
- fi
- ;;
-
- *) ;; # Ignore the rest.
-
- esac
- done
-
- # Clean up.
- rm -f a.out a.exe
-else
- echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$RM -f confest.$objext
-CFLAGS=$_lt_libdeps_save_CFLAGS
-
-# PORTME: override above test on systems where it is broken
-m4_if([$1], [CXX],
-[case $host_os in
-interix[[3-9]]*)
- # Interix 3.5 installs completely hosed .la files for C++, so rather than
- # hack all around it, let's just trust "g++" to DTRT.
- _LT_TAGVAR(predep_objects,$1)=
- _LT_TAGVAR(postdep_objects,$1)=
- _LT_TAGVAR(postdeps,$1)=
- ;;
-
-linux*)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
-
- # The more standards-conforming stlport4 library is
- # incompatible with the Cstd library. Avoid specifying
- # it if it's in CXXFLAGS. Ignore libCrun as
- # -library=stlport4 depends on it.
- case " $CXX $CXXFLAGS " in
- *" -library=stlport4 "*)
- solaris_use_stlport4=yes
- ;;
- esac
-
- if test "$solaris_use_stlport4" != yes; then
- _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
- fi
- ;;
- esac
- ;;
-
-solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # The more standards-conforming stlport4 library is
- # incompatible with the Cstd library. Avoid specifying
- # it if it's in CXXFLAGS. Ignore libCrun as
- # -library=stlport4 depends on it.
- case " $CXX $CXXFLAGS " in
- *" -library=stlport4 "*)
- solaris_use_stlport4=yes
- ;;
- esac
-
- # Adding this requires a known-good setup of shared libraries for
- # Sun compiler versions before 5.6, else PIC objects from an old
- # archive will be linked into the output, leading to subtle bugs.
- if test "$solaris_use_stlport4" != yes; then
- _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
- fi
- ;;
- esac
- ;;
-esac
-])
-
-case " $_LT_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=
-if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
- [The directories searched by this compiler when creating a shared library])
-_LT_TAGDECL([], [predep_objects], [1],
- [Dependencies to place before and after the objects being linked to
- create a shared library])
-_LT_TAGDECL([], [postdep_objects], [1])
-_LT_TAGDECL([], [predeps], [1])
-_LT_TAGDECL([], [postdeps], [1])
-_LT_TAGDECL([], [compiler_lib_search_path], [1],
- [The library search path used internally by the compiler when linking
- a shared library])
-])# _LT_SYS_HIDDEN_LIBDEPS
-
-
-# _LT_LANG_F77_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a Fortran 77 compiler are
-# suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_F77_CONFIG],
-[AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
- _lt_disable_F77=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the F77 compiler isn't working. Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
- # Code to be used in simple compile tests
- lt_simple_compile_test_code="\
- subroutine t
- return
- end
-"
-
- # Code to be used in simple link tests
- lt_simple_link_test_code="\
- program t
- end
-"
-
- # ltmain only uses $CC for tagged configurations so make sure $CC is set.
- _LT_TAG_COMPILER
-
- # save warnings/boilerplate of simple test code
- _LT_COMPILER_BOILERPLATE
- _LT_LINKER_BOILERPLATE
-
- # Allow CC to be a program name with arguments.
- lt_save_CC="$CC"
- lt_save_GCC=$GCC
- lt_save_CFLAGS=$CFLAGS
- CC=${F77-"f77"}
- CFLAGS=$FFLAGS
- compiler=$CC
- _LT_TAGVAR(compiler, $1)=$CC
- _LT_CC_BASENAME([$compiler])
- GCC=$G77
- if test -n "$compiler"; then
- AC_MSG_CHECKING([if libtool supports shared libraries])
- AC_MSG_RESULT([$can_build_shared])
-
- AC_MSG_CHECKING([whether to build shared libraries])
- test "$can_build_shared" = "no" && enable_shared=no
-
- # On AIX, shared libraries and static libraries use the same namespace, and
- # are all built from PIC.
- case $host_os in
- aix3*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
- aix[[4-9]]*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
- fi
- ;;
- esac
- AC_MSG_RESULT([$enable_shared])
-
- AC_MSG_CHECKING([whether to build static libraries])
- # Make sure either enable_shared or enable_static is yes.
- test "$enable_shared" = yes || enable_static=yes
- AC_MSG_RESULT([$enable_static])
-
- _LT_TAGVAR(GCC, $1)="$G77"
- _LT_TAGVAR(LD, $1)="$LD"
-
- ## CAVEAT EMPTOR:
- ## There is no encapsulation within the following macros, do not change
- ## the running order or otherwise move them around unless you know exactly
- ## what you are doing...
- _LT_COMPILER_PIC($1)
- _LT_COMPILER_C_O($1)
- _LT_COMPILER_FILE_LOCKS($1)
- _LT_LINKER_SHLIBS($1)
- _LT_SYS_DYNAMIC_LINKER($1)
- _LT_LINKER_HARDCODE_LIBPATH($1)
-
- _LT_CONFIG($1)
- fi # test -n "$compiler"
-
- GCC=$lt_save_GCC
- CC="$lt_save_CC"
- CFLAGS="$lt_save_CFLAGS"
-fi # test "$_lt_disable_F77" != yes
-
-AC_LANG_POP
-])# _LT_LANG_F77_CONFIG
-
-
-# _LT_LANG_FC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for a Fortran compiler are
-# suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_FC_CONFIG],
-[AC_LANG_PUSH(Fortran)
-
-if test -z "$FC" || test "X$FC" = "Xno"; then
- _lt_disable_FC=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for fc test sources.
-ac_ext=${ac_fc_srcext-f}
-
-# Object file extension for compiled fc test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the FC compiler isn't working. Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
- # Code to be used in simple compile tests
- lt_simple_compile_test_code="\
- subroutine t
- return
- end
-"
-
- # Code to be used in simple link tests
- lt_simple_link_test_code="\
- program t
- end
-"
-
- # ltmain only uses $CC for tagged configurations so make sure $CC is set.
- _LT_TAG_COMPILER
-
- # save warnings/boilerplate of simple test code
- _LT_COMPILER_BOILERPLATE
- _LT_LINKER_BOILERPLATE
-
- # Allow CC to be a program name with arguments.
- lt_save_CC="$CC"
- lt_save_GCC=$GCC
- lt_save_CFLAGS=$CFLAGS
- CC=${FC-"f95"}
- CFLAGS=$FCFLAGS
- compiler=$CC
- GCC=$ac_cv_fc_compiler_gnu
-
- _LT_TAGVAR(compiler, $1)=$CC
- _LT_CC_BASENAME([$compiler])
-
- if test -n "$compiler"; then
- AC_MSG_CHECKING([if libtool supports shared libraries])
- AC_MSG_RESULT([$can_build_shared])
-
- AC_MSG_CHECKING([whether to build shared libraries])
- test "$can_build_shared" = "no" && enable_shared=no
-
- # On AIX, shared libraries and static libraries use the same namespace, and
- # are all built from PIC.
- case $host_os in
- aix3*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
- aix[[4-9]]*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
- fi
- ;;
- esac
- AC_MSG_RESULT([$enable_shared])
-
- AC_MSG_CHECKING([whether to build static libraries])
- # Make sure either enable_shared or enable_static is yes.
- test "$enable_shared" = yes || enable_static=yes
- AC_MSG_RESULT([$enable_static])
-
- _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
- _LT_TAGVAR(LD, $1)="$LD"
-
- ## CAVEAT EMPTOR:
- ## There is no encapsulation within the following macros, do not change
- ## the running order or otherwise move them around unless you know exactly
- ## what you are doing...
- _LT_SYS_HIDDEN_LIBDEPS($1)
- _LT_COMPILER_PIC($1)
- _LT_COMPILER_C_O($1)
- _LT_COMPILER_FILE_LOCKS($1)
- _LT_LINKER_SHLIBS($1)
- _LT_SYS_DYNAMIC_LINKER($1)
- _LT_LINKER_HARDCODE_LIBPATH($1)
-
- _LT_CONFIG($1)
- fi # test -n "$compiler"
-
- GCC=$lt_save_GCC
- CC=$lt_save_CC
- CFLAGS=$lt_save_CFLAGS
-fi # test "$_lt_disable_FC" != yes
-
-AC_LANG_POP
-])# _LT_LANG_FC_CONFIG
-
-
-# _LT_LANG_GCJ_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Java Compiler compiler
-# are suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GCJ_CONFIG],
-[AC_REQUIRE([LT_PROG_GCJ])dnl
-AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GCJ-"gcj"}
-CFLAGS=$GCJFLAGS
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
- _LT_COMPILER_NO_RTTI($1)
- _LT_COMPILER_PIC($1)
- _LT_COMPILER_C_O($1)
- _LT_COMPILER_FILE_LOCKS($1)
- _LT_LINKER_SHLIBS($1)
- _LT_LINKER_HARDCODE_LIBPATH($1)
-
- _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_GCJ_CONFIG
-
-
-# _LT_LANG_GO_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Go compiler
-# are suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GO_CONFIG],
-[AC_REQUIRE([LT_PROG_GO])dnl
-AC_LANG_SAVE
-
-# Source file extension for Go test sources.
-ac_ext=go
-
-# Object file extension for compiled Go test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="package main; func main() { }"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='package main; func main() { }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GOC-"gccgo"}
-CFLAGS=$GOFLAGS
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# Go did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
- _LT_COMPILER_NO_RTTI($1)
- _LT_COMPILER_PIC($1)
- _LT_COMPILER_C_O($1)
- _LT_COMPILER_FILE_LOCKS($1)
- _LT_LINKER_SHLIBS($1)
- _LT_LINKER_HARDCODE_LIBPATH($1)
-
- _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_GO_CONFIG
-
-
-# _LT_LANG_RC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for the Windows resource compiler
-# are suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_RC_CONFIG],
-[AC_REQUIRE([LT_PROG_RC])dnl
-AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=
-CC=${RC-"windres"}
-CFLAGS=
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-if test -n "$compiler"; then
- :
- _LT_CONFIG($1)
-fi
-
-GCC=$lt_save_GCC
-AC_LANG_RESTORE
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_RC_CONFIG
-
-
-# LT_PROG_GCJ
-# -----------
-AC_DEFUN([LT_PROG_GCJ],
-[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
- [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
- [AC_CHECK_TOOL(GCJ, gcj,)
- test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
- AC_SUBST(GCJFLAGS)])])[]dnl
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
-
-
-# LT_PROG_GO
-# ----------
-AC_DEFUN([LT_PROG_GO],
-[AC_CHECK_TOOL(GOC, gccgo,)
-])
-
-
-# LT_PROG_RC
-# ----------
-AC_DEFUN([LT_PROG_RC],
-[AC_CHECK_TOOL(RC, windres,)
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_RC], [])
-
-
-# _LT_DECL_EGREP
-# --------------
-# If we don't have a new enough Autoconf to choose the best grep
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_EGREP],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_REQUIRE([AC_PROG_FGREP])dnl
-test -z "$GREP" && GREP=grep
-_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
-_LT_DECL([], [EGREP], [1], [An ERE matcher])
-_LT_DECL([], [FGREP], [1], [A literal string matcher])
-dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
-AC_SUBST([GREP])
-])
-
-
-# _LT_DECL_OBJDUMP
-# --------------
-# If we don't have a new enough Autoconf to choose the best objdump
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_OBJDUMP],
-[AC_CHECK_TOOL(OBJDUMP, objdump, false)
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
-AC_SUBST([OBJDUMP])
-])
-
-# _LT_DECL_DLLTOOL
-# ----------------
-# Ensure DLLTOOL variable is set.
-m4_defun([_LT_DECL_DLLTOOL],
-[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
-AC_SUBST([DLLTOOL])
-])
-
-# _LT_DECL_SED
-# ------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible. Prefer GNU sed if found.
-m4_defun([_LT_DECL_SED],
-[AC_PROG_SED
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
-_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
- [Sed that helps us avoid accidentally triggering echo(1) options like -n])
-])# _LT_DECL_SED
-
-m4_ifndef([AC_PROG_SED], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into #
-# GNU Autoconf as AC_PROG_SED. When it is available in #
-# a released version of Autoconf we should remove this #
-# macro and use it instead. #
-############################################################
-
-m4_defun([AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for lt_ac_prog in sed gsed; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
- lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
- fi
- done
- done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
- test ! -f $lt_ac_sed && continue
- cat /dev/null > conftest.in
- lt_ac_count=0
- echo $ECHO_N "0123456789$ECHO_C" >conftest.in
- # Check for GNU sed and select it if it is found.
- if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
- lt_cv_path_SED=$lt_ac_sed
- break
- fi
- while true; do
- cat conftest.in conftest.in >conftest.tmp
- mv conftest.tmp conftest.in
- cp conftest.in conftest.nl
- echo >>conftest.nl
- $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
- cmp -s conftest.out conftest.nl || break
- # 10000 chars as input seems more than enough
- test $lt_ac_count -gt 10 && break
- lt_ac_count=`expr $lt_ac_count + 1`
- if test $lt_ac_count -gt $lt_ac_max; then
- lt_ac_max=$lt_ac_count
- lt_cv_path_SED=$lt_ac_sed
- fi
- done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])#AC_PROG_SED
-])#m4_ifndef
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_SED], [])
-
-
-# _LT_CHECK_SHELL_FEATURES
-# ------------------------
-# Find out whether the shell is Bourne or XSI compatible,
-# or has some other useful features.
-m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
- test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
- = c,a/b,b/c, \
- && eval 'test $(( 1 + 1 )) -eq 2 \
- && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
- && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
- >/dev/null 2>&1 \
- && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
- lt_unset=unset
-else
- lt_unset=false
-fi
-_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
- # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
- lt_SP2NL='tr \040 \012'
- lt_NL2SP='tr \015\012 \040\040'
- ;;
- *) # EBCDIC based system
- lt_SP2NL='tr \100 \n'
- lt_NL2SP='tr \r\n \100\100'
- ;;
-esac
-_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
-_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
-])# _LT_CHECK_SHELL_FEATURES
-
-
-# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
-# ------------------------------------------------------
-# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
-# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
-m4_defun([_LT_PROG_FUNCTION_REPLACE],
-[dnl {
-sed -e '/^$1 ()$/,/^} # $1 /c\
-$1 ()\
-{\
-m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1])
-} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-])
-
-
-# _LT_PROG_REPLACE_SHELLFNS
-# -------------------------
-# Replace existing portable implementations of several shell functions with
-# equivalent extended shell implementations where those features are available..
-m4_defun([_LT_PROG_REPLACE_SHELLFNS],
-[if test x"$xsi_shell" = xyes; then
- _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
- case ${1} in
- */*) func_dirname_result="${1%/*}${2}" ;;
- * ) func_dirname_result="${3}" ;;
- esac])
-
- _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
- func_basename_result="${1##*/}"])
-
- _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
- case ${1} in
- */*) func_dirname_result="${1%/*}${2}" ;;
- * ) func_dirname_result="${3}" ;;
- esac
- func_basename_result="${1##*/}"])
-
- _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
- # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
- # positional parameters, so assign one to ordinary parameter first.
- func_stripname_result=${3}
- func_stripname_result=${func_stripname_result#"${1}"}
- func_stripname_result=${func_stripname_result%"${2}"}])
-
- _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
- func_split_long_opt_name=${1%%=*}
- func_split_long_opt_arg=${1#*=}])
-
- _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
- func_split_short_opt_arg=${1#??}
- func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
-
- _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
- case ${1} in
- *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
- *) func_lo2o_result=${1} ;;
- esac])
-
- _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo])
-
- _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))])
-
- _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}])
-fi
-
-if test x"$lt_shell_append" = xyes; then
- _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"])
-
- _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
- func_quote_for_eval "${2}"
-dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
- eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
-
- # Save a `func_append' function call where possible by direct use of '+='
- sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
- test 0 -eq $? || _lt_function_replace_fail=:
-else
- # Save a `func_append' function call even when '+=' is not available
- sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
- test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
- AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
-fi
-])
-
-# _LT_PATH_CONVERSION_FUNCTIONS
-# -----------------------------
-# Determine which file name conversion functions should be used by
-# func_to_host_file (and, implicitly, by func_to_host_path). These are needed
-# for certain cross-compile configurations and native mingw.
-m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_MSG_CHECKING([how to convert $build file names to $host format])
-AC_CACHE_VAL(lt_cv_to_host_file_cmd,
-[case $host in
- *-*-mingw* )
- case $build in
- *-*-mingw* ) # actually msys
- lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
- ;;
- *-*-cygwin* )
- lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
- ;;
- * ) # otherwise, assume *nix
- lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
- ;;
- esac
- ;;
- *-*-cygwin* )
- case $build in
- *-*-mingw* ) # actually msys
- lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
- ;;
- *-*-cygwin* )
- lt_cv_to_host_file_cmd=func_convert_file_noop
- ;;
- * ) # otherwise, assume *nix
- lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
- ;;
- esac
- ;;
- * ) # unhandled hosts (and "normal" native builds)
- lt_cv_to_host_file_cmd=func_convert_file_noop
- ;;
-esac
-])
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
-_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
- [0], [convert $build file names to $host format])dnl
-
-AC_MSG_CHECKING([how to convert $build file names to toolchain format])
-AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
-[#assume ordinary cross tools, or native build.
-lt_cv_to_tool_file_cmd=func_convert_file_noop
-case $host in
- *-*-mingw* )
- case $build in
- *-*-mingw* ) # actually msys
- lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
- ;;
- esac
- ;;
-esac
-])
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
-_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
- [0], [convert $build files to toolchain format])dnl
-])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4
deleted file mode 100644
index 5d9acd8..0000000
--- a/m4/ltoptions.m4
+++ /dev/null
@@ -1,384 +0,0 @@
-# Helper functions for option handling. -*- Autoconf -*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 7 ltoptions.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
-
-
-# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
-# ------------------------------------------
-m4_define([_LT_MANGLE_OPTION],
-[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
-
-
-# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
-# ---------------------------------------
-# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
-# matching handler defined, dispatch to it. Other OPTION-NAMEs are
-# saved as a flag.
-m4_define([_LT_SET_OPTION],
-[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
-m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
- _LT_MANGLE_DEFUN([$1], [$2]),
- [m4_warning([Unknown $1 option `$2'])])[]dnl
-])
-
-
-# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
-# ------------------------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-m4_define([_LT_IF_OPTION],
-[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
-
-
-# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
-# -------------------------------------------------------
-# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
-# are set.
-m4_define([_LT_UNLESS_OPTIONS],
-[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
- [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
- [m4_define([$0_found])])])[]dnl
-m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
-])[]dnl
-])
-
-
-# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
-# ----------------------------------------
-# OPTION-LIST is a space-separated list of Libtool options associated
-# with MACRO-NAME. If any OPTION has a matching handler declared with
-# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
-# the unknown option and exit.
-m4_defun([_LT_SET_OPTIONS],
-[# Set options
-m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
- [_LT_SET_OPTION([$1], _LT_Option)])
-
-m4_if([$1],[LT_INIT],[
- dnl
- dnl Simply set some default values (i.e off) if boolean options were not
- dnl specified:
- _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
- ])
- _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
- ])
- dnl
- dnl If no reference was made to various pairs of opposing options, then
- dnl we run the default mode handler for the pair. For example, if neither
- dnl `shared' nor `disable-shared' was passed, we enable building of shared
- dnl archives by default:
- _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
- _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
- _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
- _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
- [_LT_ENABLE_FAST_INSTALL])
- ])
-])# _LT_SET_OPTIONS
-
-
-## --------------------------------- ##
-## Macros to handle LT_INIT options. ##
-## --------------------------------- ##
-
-# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
-# -----------------------------------------
-m4_define([_LT_MANGLE_DEFUN],
-[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
-
-
-# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
-# -----------------------------------------------
-m4_define([LT_OPTION_DEFINE],
-[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
-])# LT_OPTION_DEFINE
-
-
-# dlopen
-# ------
-LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
-])
-
-AU_DEFUN([AC_LIBTOOL_DLOPEN],
-[_LT_SET_OPTION([LT_INIT], [dlopen])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
-
-
-# win32-dll
-# ---------
-# Declare package support for building win32 dll's.
-LT_OPTION_DEFINE([LT_INIT], [win32-dll],
-[enable_win32_dll=yes
-
-case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
- AC_CHECK_TOOL(AS, as, false)
- AC_CHECK_TOOL(DLLTOOL, dlltool, false)
- AC_CHECK_TOOL(OBJDUMP, objdump, false)
- ;;
-esac
-
-test -z "$AS" && AS=as
-_LT_DECL([], [AS], [1], [Assembler program])dnl
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
-])# win32-dll
-
-AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-_LT_SET_OPTION([LT_INIT], [win32-dll])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
-
-
-# _LT_ENABLE_SHARED([DEFAULT])
-# ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_SHARED],
-[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([shared],
- [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
- [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
- [p=${PACKAGE-default}
- case $enableval in
- yes) enable_shared=yes ;;
- no) enable_shared=no ;;
- *)
- enable_shared=no
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for pkg in $enableval; do
- IFS="$lt_save_ifs"
- if test "X$pkg" = "X$p"; then
- enable_shared=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac],
- [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
-
- _LT_DECL([build_libtool_libs], [enable_shared], [0],
- [Whether or not to build shared libraries])
-])# _LT_ENABLE_SHARED
-
-LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
-])
-
-AC_DEFUN([AC_DISABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], [disable-shared])
-])
-
-AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
-AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_SHARED], [])
-dnl AC_DEFUN([AM_DISABLE_SHARED], [])
-
-
-
-# _LT_ENABLE_STATIC([DEFAULT])
-# ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_STATIC],
-[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([static],
- [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
- [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
- [p=${PACKAGE-default}
- case $enableval in
- yes) enable_static=yes ;;
- no) enable_static=no ;;
- *)
- enable_static=no
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for pkg in $enableval; do
- IFS="$lt_save_ifs"
- if test "X$pkg" = "X$p"; then
- enable_static=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac],
- [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
-
- _LT_DECL([build_old_libs], [enable_static], [0],
- [Whether or not to build static libraries])
-])# _LT_ENABLE_STATIC
-
-LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
-])
-
-AC_DEFUN([AC_DISABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], [disable-static])
-])
-
-AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
-AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_STATIC], [])
-dnl AC_DEFUN([AM_DISABLE_STATIC], [])
-
-
-
-# _LT_ENABLE_FAST_INSTALL([DEFAULT])
-# ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_FAST_INSTALL],
-[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([fast-install],
- [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
- [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
- [p=${PACKAGE-default}
- case $enableval in
- yes) enable_fast_install=yes ;;
- no) enable_fast_install=no ;;
- *)
- enable_fast_install=no
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for pkg in $enableval; do
- IFS="$lt_save_ifs"
- if test "X$pkg" = "X$p"; then
- enable_fast_install=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac],
- [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
-
-_LT_DECL([fast_install], [enable_fast_install], [0],
- [Whether or not to optimize for fast installation])dnl
-])# _LT_ENABLE_FAST_INSTALL
-
-LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
-
-# Old names:
-AU_DEFUN([AC_ENABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
-])
-
-AU_DEFUN([AC_DISABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
-dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
-
-
-# _LT_WITH_PIC([MODE])
-# --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
-# LT_INIT options.
-# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
-m4_define([_LT_WITH_PIC],
-[AC_ARG_WITH([pic],
- [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
- [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
- [lt_p=${PACKAGE-default}
- case $withval in
- yes|no) pic_mode=$withval ;;
- *)
- pic_mode=default
- # Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
- for lt_pkg in $withval; do
- IFS="$lt_save_ifs"
- if test "X$lt_pkg" = "X$lt_p"; then
- pic_mode=yes
- fi
- done
- IFS="$lt_save_ifs"
- ;;
- esac],
- [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
-
-_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
-])# _LT_WITH_PIC
-
-LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
-
-# Old name:
-AU_DEFUN([AC_LIBTOOL_PICMODE],
-[_LT_SET_OPTION([LT_INIT], [pic-only])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
-
-## ----------------- ##
-## LTDL_INIT Options ##
-## ----------------- ##
-
-m4_define([_LTDL_MODE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
- [m4_define([_LTDL_MODE], [nonrecursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [recursive],
- [m4_define([_LTDL_MODE], [recursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [subproject],
- [m4_define([_LTDL_MODE], [subproject])])
-
-m4_define([_LTDL_TYPE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [installable],
- [m4_define([_LTDL_TYPE], [installable])])
-LT_OPTION_DEFINE([LTDL_INIT], [convenience],
- [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4
deleted file mode 100644
index 9000a05..0000000
--- a/m4/ltsugar.m4
+++ /dev/null
@@ -1,123 +0,0 @@
-# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltsugar.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
-
-
-# lt_join(SEP, ARG1, [ARG2...])
-# -----------------------------
-# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
-# associated separator.
-# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
-# versions in m4sugar had bugs.
-m4_define([lt_join],
-[m4_if([$#], [1], [],
- [$#], [2], [[$2]],
- [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
-m4_define([_lt_join],
-[m4_if([$#$2], [2], [],
- [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
-
-
-# lt_car(LIST)
-# lt_cdr(LIST)
-# ------------
-# Manipulate m4 lists.
-# These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
-m4_define([lt_car], [[$1]])
-m4_define([lt_cdr],
-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
- [$#], 1, [],
- [m4_dquote(m4_shift($@))])])
-m4_define([lt_unquote], $1)
-
-
-# lt_append(MACRO-NAME, STRING, [SEPARATOR])
-# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
-# Note that neither SEPARATOR nor STRING are expanded; they are appended
-# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
-# No SEPARATOR is output if MACRO-NAME was previously undefined (different
-# than defined and empty).
-#
-# This macro is needed until we can rely on Autoconf 2.62, since earlier
-# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
-m4_define([lt_append],
-[m4_define([$1],
- m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
-
-
-
-# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
-# ----------------------------------------------------------
-# Produce a SEP delimited list of all paired combinations of elements of
-# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list
-# has the form PREFIXmINFIXSUFFIXn.
-# Needed until we can rely on m4_combine added in Autoconf 2.62.
-m4_define([lt_combine],
-[m4_if(m4_eval([$# > 3]), [1],
- [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
-[[m4_foreach([_Lt_prefix], [$2],
- [m4_foreach([_Lt_suffix],
- ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
- [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
-
-
-# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
-# -----------------------------------------------------------------------
-# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
-# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
-m4_define([lt_if_append_uniq],
-[m4_ifdef([$1],
- [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
- [lt_append([$1], [$2], [$3])$4],
- [$5])],
- [lt_append([$1], [$2], [$3])$4])])
-
-
-# lt_dict_add(DICT, KEY, VALUE)
-# -----------------------------
-m4_define([lt_dict_add],
-[m4_define([$1($2)], [$3])])
-
-
-# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
-# --------------------------------------------
-m4_define([lt_dict_add_subkey],
-[m4_define([$1($2:$3)], [$4])])
-
-
-# lt_dict_fetch(DICT, KEY, [SUBKEY])
-# ----------------------------------
-m4_define([lt_dict_fetch],
-[m4_ifval([$3],
- m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
- m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
-
-
-# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
-# -----------------------------------------------------------------
-m4_define([lt_if_dict_fetch],
-[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
- [$5],
- [$6])])
-
-
-# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
-# --------------------------------------------------------------
-m4_define([lt_dict_filter],
-[m4_if([$5], [], [],
- [lt_join(m4_quote(m4_default([$4], [[, ]])),
- lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
- [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
-])
diff --git a/m4/ltversion.m4 b/m4/ltversion.m4
deleted file mode 100644
index 07a8602..0000000
--- a/m4/ltversion.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# ltversion.m4 -- version numbers -*- Autoconf -*-
-#
-# Copyright (C) 2004 Free Software Foundation, Inc.
-# Written by Scott James Remnant, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# @configure_input@
-
-# serial 3337 ltversion.m4
-# This file is part of GNU Libtool
-
-m4_define([LT_PACKAGE_VERSION], [2.4.2])
-m4_define([LT_PACKAGE_REVISION], [1.3337])
-
-AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.2'
-macro_revision='1.3337'
-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
-_LT_DECL(, macro_revision, 0)
-])
diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4
deleted file mode 100644
index c573da9..0000000
--- a/m4/lt~obsolete.m4
+++ /dev/null
@@ -1,98 +0,0 @@
-# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
-# Written by Scott James Remnant, 2004.
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 5 lt~obsolete.m4
-
-# These exist entirely to fool aclocal when bootstrapping libtool.
-#
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
-# which have later been changed to m4_define as they aren't part of the
-# exported API, or moved to Autoconf or Automake where they belong.
-#
-# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN
-# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
-# using a macro with the same name in our local m4/libtool.m4 it'll
-# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
-# and doesn't know about Autoconf macros at all.)
-#
-# So we provide this file, which has a silly filename so it's always
-# included after everything else. This provides aclocal with the
-# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
-# because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
-#
-# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
-# Yes, that means every name once taken will need to remain here until
-# we give up compatibility with versions before 1.7, at which point
-# we need to keep only those names which we still refer to.
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
-
-m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
-m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])])
-m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])])
-m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
-m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])])
-m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])])
-m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
-m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])])
-m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])])
-m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])])
-m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
-m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
-m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
-m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
-m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
-m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
-m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
-m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])])
-m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])])
-m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
-m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
-m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
-m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
-m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])])
-m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])])
-m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])])
-m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
-m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
-m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])])
-m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])])
-m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
-m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
-m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])])
-m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
-m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
-m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
-m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
-m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
-m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
-m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
-m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
-m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
-m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
-m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
-m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
-m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
-m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
-m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
-m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
-m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
diff --git a/missing b/missing
deleted file mode 100755
index 86a8fc3..0000000
--- a/missing
+++ /dev/null
@@ -1,331 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2012-01-06.13; # UTC
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
-# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
- echo 1>&2 "Try \`$0 --help' for more information"
- exit 1
-fi
-
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
- configure_ac=configure.ac
-else
- configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case $1 in
---run)
- # Try to run requested program, and just exit if it succeeds.
- run=
- shift
- "$@" && exit 0
- # Exit code 63 means version mismatch. This often happens
- # when the user try to use an ancient version of a tool on
- # a file that requires a minimum version. In this case we
- # we should proceed has if the program had been absent, or
- # if --run hadn't been passed.
- if test $? = 63; then
- run=:
- msg="probably too old"
- fi
- ;;
-
- -h|--h|--he|--hel|--help)
- echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
- -h, --help display this help and exit
- -v, --version output version information and exit
- --run try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
- aclocal touch file \`aclocal.m4'
- autoconf touch file \`configure'
- autoheader touch file \`config.h.in'
- autom4te touch the output file, or create a stub one
- automake touch all \`Makefile.in' files
- bison create \`y.tab.[ch]', if possible, from existing .[ch]
- flex create \`lex.yy.c', if possible, from existing .c
- help2man touch the output file
- lex create \`lex.yy.c', if possible, from existing .c
- makeinfo touch the output file
- yacc create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
-\`g' are ignored when checking the name.
-
-Send bug reports to <bug-automake at gnu.org>."
- exit $?
- ;;
-
- -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
- echo "missing $scriptversion (GNU Automake)"
- exit $?
- ;;
-
- -*)
- echo 1>&2 "$0: Unknown \`$1' option"
- echo 1>&2 "Try \`$0 --help' for more information"
- exit 1
- ;;
-
-esac
-
-# normalize program name to check for.
-program=`echo "$1" | sed '
- s/^gnu-//; t
- s/^gnu//; t
- s/^g//; t'`
-
-# Now exit if we have it, but it failed. Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program). This is about non-GNU programs, so use $1 not
-# $program.
-case $1 in
- lex*|yacc*)
- # Not GNU programs, they don't have --version.
- ;;
-
- *)
- if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
- # We have it, but it failed.
- exit 1
- elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
- # Could not run --version or --help. This is probably someone
- # running `$TOOL --version' or `$TOOL --help' to check whether
- # $TOOL exists and not knowing $TOOL uses missing.
- exit 1
- fi
- ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $program in
- aclocal*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`acinclude.m4' or \`${configure_ac}'. You might want
- to install the \`Automake' and \`Perl' packages. Grab them from
- any GNU archive site."
- touch aclocal.m4
- ;;
-
- autoconf*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`${configure_ac}'. You might want to install the
- \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
- archive site."
- touch configure
- ;;
-
- autoheader*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`acconfig.h' or \`${configure_ac}'. You might want
- to install the \`Autoconf' and \`GNU m4' packages. Grab them
- from any GNU archive site."
- files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
- test -z "$files" && files="config.h"
- touch_files=
- for f in $files; do
- case $f in
- *:*) touch_files="$touch_files "`echo "$f" |
- sed -e 's/^[^:]*://' -e 's/:.*//'`;;
- *) touch_files="$touch_files $f.in";;
- esac
- done
- touch $touch_files
- ;;
-
- automake*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
- You might want to install the \`Automake' and \`Perl' packages.
- Grab them from any GNU archive site."
- find . -type f -name Makefile.am -print |
- sed 's/\.am$/.in/' |
- while read f; do touch "$f"; done
- ;;
-
- autom4te*)
- echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
- You might have modified some files without having the
- proper tools for further handling them.
- You can get \`$1' as part of \`Autoconf' from any GNU
- archive site."
-
- file=`echo "$*" | sed -n "$sed_output"`
- test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
- if test -f "$file"; then
- touch $file
- else
- test -z "$file" || exec >$file
- echo "#! /bin/sh"
- echo "# Created by GNU Automake missing as a replacement of"
- echo "# $ $@"
- echo "exit 0"
- chmod +x $file
- exit 1
- fi
- ;;
-
- bison*|yacc*)
- echo 1>&2 "\
-WARNING: \`$1' $msg. You should only need it if
- you modified a \`.y' file. You may need the \`Bison' package
- in order for those modifications to take effect. You can get
- \`Bison' from any GNU archive site."
- rm -f y.tab.c y.tab.h
- if test $# -ne 1; then
- eval LASTARG=\${$#}
- case $LASTARG in
- *.y)
- SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
- if test -f "$SRCFILE"; then
- cp "$SRCFILE" y.tab.c
- fi
- SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
- if test -f "$SRCFILE"; then
- cp "$SRCFILE" y.tab.h
- fi
- ;;
- esac
- fi
- if test ! -f y.tab.h; then
- echo >y.tab.h
- fi
- if test ! -f y.tab.c; then
- echo 'main() { return 0; }' >y.tab.c
- fi
- ;;
-
- lex*|flex*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a \`.l' file. You may need the \`Flex' package
- in order for those modifications to take effect. You can get
- \`Flex' from any GNU archive site."
- rm -f lex.yy.c
- if test $# -ne 1; then
- eval LASTARG=\${$#}
- case $LASTARG in
- *.l)
- SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
- if test -f "$SRCFILE"; then
- cp "$SRCFILE" lex.yy.c
- fi
- ;;
- esac
- fi
- if test ! -f lex.yy.c; then
- echo 'main() { return 0; }' >lex.yy.c
- fi
- ;;
-
- help2man*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a dependency of a manual page. You may need the
- \`Help2man' package in order for those modifications to take
- effect. You can get \`Help2man' from any GNU archive site."
-
- file=`echo "$*" | sed -n "$sed_output"`
- test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
- if test -f "$file"; then
- touch $file
- else
- test -z "$file" || exec >$file
- echo ".ab help2man is required to generate this page"
- exit $?
- fi
- ;;
-
- makeinfo*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a \`.texi' or \`.texinfo' file, or any other file
- indirectly affecting the aspect of the manual. The spurious
- call might also be the consequence of using a buggy \`make' (AIX,
- DU, IRIX). You might want to install the \`Texinfo' package or
- the \`GNU make' package. Grab either from any GNU archive site."
- # The file to touch is that specified with -o ...
- file=`echo "$*" | sed -n "$sed_output"`
- test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
- if test -z "$file"; then
- # ... or it is the one specified with @setfilename ...
- infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
- file=`sed -n '
- /^@setfilename/{
- s/.* \([^ ]*\) *$/\1/
- p
- q
- }' $infile`
- # ... or it is derived from the source name (dir/f.texi becomes f.info)
- test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
- fi
- # If the file does not exist, the user really needs makeinfo;
- # let's fail without touching anything.
- test -f $file || exit 1
- touch $file
- ;;
-
- *)
- echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
- You might have modified some files without having the
- proper tools for further handling them. Check the \`README' file,
- it often tells you about the needed prerequisites for installing
- this package. You may also peek at any GNU archive site, in case
- some other package would contain this missing \`$1' program."
- exit 1
- ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/sub_commands/bc_main.cc b/sub_commands/bc_main.cc
new file mode 100644
index 0000000..20bdcf6
--- /dev/null
+++ b/sub_commands/bc_main.cc
@@ -0,0 +1,161 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <signal.h>
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <chrono>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/mer_overlap_sequence_parser.hpp>
+#include <jellyfish/mer_iterator.hpp>
+#include <jellyfish/stream_manager.hpp>
+#include <jellyfish/generator_manager.hpp>
+#include <jellyfish/mer_dna_bloom_counter.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/file_header.hpp>
+#include <sub_commands/bc_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+using std::chrono::system_clock;
+using std::chrono::duration;
+using std::chrono::duration_cast;
+
+template<typename DtnType>
+inline double as_seconds(DtnType dtn) { return duration_cast<duration<double>>(dtn).count(); }
+
+static bc_main_cmdline args; // Command line switches and arguments
+typedef std::vector<const char*> file_vector;
+using jellyfish::mer_dna;
+using jellyfish::mer_dna_bloom_counter;
+typedef jellyfish::mer_overlap_sequence_parser<jellyfish::stream_manager<file_vector::const_iterator> > sequence_parser;
+typedef jellyfish::mer_iterator<sequence_parser, jellyfish::mer_dna> mer_iterator;
+
+template<typename PathIterator>
+class mer_bloom_counter : public jellyfish::thread_exec {
+ int nb_threads_;
+ mer_dna_bloom_counter& filter_;
+ jellyfish::stream_manager<PathIterator> streams_;
+ sequence_parser parser_;
+
+public:
+ mer_bloom_counter(int nb_threads, mer_dna_bloom_counter& filter,
+ PathIterator file_begin, PathIterator file_end,
+ PathIterator pipe_begin, PathIterator pipe_end,
+ uint32_t concurent_files) :
+ filter_(filter),
+ streams_(file_begin, file_end, pipe_begin, pipe_end, concurent_files),
+ parser_(jellyfish::mer_dna::k(), streams_.nb_streams(), 3 * nb_threads, 4096, streams_)
+ { }
+
+ virtual void start(int thid) {
+ for(mer_iterator mers(parser_, args.canonical_flag) ; mers; ++mers) {
+ filter_.insert(*mers);
+ }
+ }
+};
+
+// If get a termination signal, kill the manager and then kill myself.
+static pid_t manager_pid = 0;
+static void signal_handler(int sig) {
+ if(manager_pid)
+ kill(manager_pid, SIGTERM);
+ signal(sig, SIG_DFL);
+ kill(getpid(), sig);
+ _exit(EXIT_FAILURE); // Should not be reached
+}
+
+int bc_main(int argc, char *argv[])
+{
+ auto start_time = system_clock::now();
+
+ jellyfish::file_header header;
+ header.fill_standard();
+ header.set_cmdline(argc, argv);
+
+ args.parse(argc, argv);
+ mer_dna::k(args.mer_len_arg);
+
+ std::unique_ptr<jellyfish::generator_manager> generator_manager;
+ if(args.generator_given) {
+ auto gm =
+ new jellyfish::generator_manager(args.generator_arg, args.Generators_arg,
+ args.shell_given ? args.shell_arg : (const char*)0);
+ generator_manager.reset(gm);
+ generator_manager->start();
+ manager_pid = generator_manager->pid();
+ struct sigaction act;
+ memset(&act, '\0', sizeof(act));
+ act.sa_handler = signal_handler;
+ assert(sigaction(SIGTERM, &act, 0) == 0);
+ }
+
+ header.canonical(args.canonical_flag);
+ std::ofstream output(args.output_arg);
+ if(!output.good())
+ err::die(err::msg() << "Can't open output file '" << args.output_arg << "'");
+
+ header.format("bloomcounter");
+ header.key_len(args.mer_len_arg * 2);
+ jellyfish::hash_pair<mer_dna> hash_fns;
+ header.matrix(hash_fns.m1, 1);
+ header.matrix(hash_fns.m2, 2);
+
+ mer_dna_bloom_counter filter(args.fpr_arg, args.size_arg, hash_fns);
+ header.size(filter.m());
+ header.nb_hashes(filter.k());
+ header.write(output);
+
+ auto after_init_time = system_clock::now();
+
+ // Iterators to the multi pipe paths. If no generator manager,
+ // generate an empty range.
+ auto pipes_begin = generator_manager.get() ? generator_manager->pipes().begin() : args.file_arg.end();
+ auto pipes_end = (bool)generator_manager ? generator_manager->pipes().end() : args.file_arg.end();
+
+ mer_bloom_counter<file_vector::const_iterator> counter(args.threads_arg, filter,
+ args.file_arg.begin(), args.file_arg.end(),
+ pipes_begin, pipes_end, args.Files_arg);
+ counter.exec_join(args.threads_arg);
+
+ // If we have a manager, wait for it
+ if(generator_manager) {
+ signal(SIGTERM, SIG_DFL);
+ manager_pid = 0;
+ if(!generator_manager->wait())
+ err::die("Some generator commands failed");
+ generator_manager.reset();
+ }
+
+ auto after_count_time = system_clock::now();
+
+ filter.write_bits(output);
+ output.close();
+
+ auto after_dump_time = system_clock::now();
+
+ if(args.timing_given) {
+ std::ofstream timing_file(args.timing_arg);
+ timing_file << "Init " << as_seconds(after_init_time - start_time) << "\n"
+ << "Counting " << as_seconds(after_count_time - after_init_time) << "\n"
+ << "Writing " << as_seconds(after_dump_time - after_count_time) << "\n";
+ }
+
+ return 0;
+}
diff --git a/sub_commands/bc_main_cmdline.yaggo b/sub_commands/bc_main_cmdline.yaggo
new file mode 100644
index 0000000..b32c798
--- /dev/null
+++ b/sub_commands/bc_main_cmdline.yaggo
@@ -0,0 +1,45 @@
+purpose "Create a bloom filter from the input k-mers"
+package "jellyfish bc"
+description "Here, a bloom filter is a data structure than can tell if
+a k-mer has been since 0 times, once, or at least twice. The data
+structure is very memory efficient but has some probability of error.
+
+After creating the bloom filter, it can be passed to the count
+subcommand to avoid counting most k-mers which occur only once."
+
+option("s", "size") {
+ description "Expected number of k-mers in input"
+ uint64; suffix; required }
+option("m", "mer-len") {
+ description "Length of mer"
+ uint32; required }
+option("f", "fpr") {
+ description "False positive rate"
+ double; default 0.001 }
+option("C", "canonical") {
+ description "Count both strand, canonical representation"
+ flag; off }
+option("t", "threads") {
+ description "Number of threads"
+ uint32; default 1 }
+option("output", "o") {
+ description "Output file"
+ c_string; default "mer_bloom_filter" }
+option("F", "Files") {
+ description "Number files open simultaneously"
+ uint32; default "1" }
+option("g", "generator") {
+ description "File of commands generating fast[aq]"
+ c_string; typestr "path" }
+option("G", "Generators") {
+ description "Number of generators run simultaneously"
+ uint32; default "1" }
+option("S", "shell") {
+ description "Shell used to run generator commands ($SHELL or /bin/sh)"
+ c_string }
+option("timing") {
+ description "Print timing information"
+ c_string; typestr "Timing file" }
+arg("file") {
+ description "Sequence file(s) in fasta or fastq format"
+ c_string; multiple; typestr "path" }
diff --git a/jellyfish/cite.cc b/sub_commands/cite_main.cc
similarity index 90%
rename from jellyfish/cite.cc
rename to sub_commands/cite_main.cc
index 087ab3a..06481a4 100644
--- a/jellyfish/cite.cc
+++ b/sub_commands/cite_main.cc
@@ -14,7 +14,7 @@
along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
*/
-const char *cite =
+const char *cite =
"A fast, lock-free approach for efficient parallel counting of occurrences of k-mers\n"
"Guillaume Marcais; Carl Kingsford\n"
"Bioinformatics (2011) 27(6): 764-770 first published online January 7, 2011 doi:10.1093/bioinformatics/btr011\n";
@@ -23,7 +23,7 @@ const char *url =
"http://www.cbcb.umd.edu/software/jellyfish\n"
"http://bioinformatics.oxfordjournals.org/content/early/2011/01/07/bioinformatics.btr011";
-const char *bibtex =
+const char *bibtex =
"@article{Jellyfish2010,\n"
" author = {Mar\\c{c}ais, Guillaume and Kingsford, Carl},\n"
" title = {A fast, lock-free approach for efficient parallel counting of occurrences of k-mers},\n"
@@ -43,16 +43,17 @@ const char *bibtex =
#include <jellyfish/err.hpp>
#include <jellyfish/misc.hpp>
#include <jellyfish/fstream_default.hpp>
+#include <sub_commands/cite_main_cmdline.hpp>
-#include <jellyfish/cite_cmdline.hpp>
+namespace err = jellyfish::err;
int cite_main(int argc, char *argv[])
{
- cite_cmdline args(argc, argv);
+ cite_main_cmdline args(argc, argv);
ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
if(!out.good())
- die << "Can't open output file '" << args.output_arg << "'" << err::no;
+ err::die(err::msg() << "Can't open output file '" << args.output_arg << "'");
if(args.bibtex_flag) {
out << bibtex << std::endl;
diff --git a/sub_commands/cite_main_cmdline.yaggo b/sub_commands/cite_main_cmdline.yaggo
new file mode 100644
index 0000000..3ede1c9
--- /dev/null
+++ b/sub_commands/cite_main_cmdline.yaggo
@@ -0,0 +1,12 @@
+purpose "How to cite Jellyfish's paper"
+package "jellyfish cite"
+description "Citation of paper"
+
+option("bibtex", "b") {
+ description "Bibtex format"
+ flag; off
+}
+option("output", "o") {
+ description "Output file"
+ c_string
+}
diff --git a/sub_commands/count_main.cc b/sub_commands/count_main.cc
new file mode 100644
index 0000000..cdfc7f4
--- /dev/null
+++ b/sub_commands/count_main.cc
@@ -0,0 +1,354 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <cstdlib>
+#include <unistd.h>
+#include <assert.h>
+#include <signal.h>
+
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <vector>
+#include <map>
+#include <sstream>
+#include <memory>
+#include <chrono>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/hash_counter.hpp>
+#include <jellyfish/locks_pthread.hpp>
+#include <jellyfish/stream_manager.hpp>
+#include <jellyfish/mer_overlap_sequence_parser.hpp>
+#include <jellyfish/whole_sequence_parser.hpp>
+#include <jellyfish/mer_iterator.hpp>
+#include <jellyfish/mer_qual_iterator.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <jellyfish/merge_files.hpp>
+#include <jellyfish/mer_dna_bloom_counter.hpp>
+#include <jellyfish/generator_manager.hpp>
+#include <sub_commands/count_main_cmdline.hpp>
+
+static count_main_cmdline args; // Command line switches and arguments
+
+namespace err = jellyfish::err;
+
+using std::chrono::system_clock;
+using std::chrono::duration;
+using std::chrono::duration_cast;
+
+template<typename DtnType>
+inline double as_seconds(DtnType dtn) { return duration_cast<duration<double>>(dtn).count(); }
+
+using jellyfish::mer_dna;
+using jellyfish::mer_dna_bloom_counter;
+using jellyfish::mer_dna_bloom_filter;
+typedef std::vector<const char*> file_vector;
+
+// Types for parsing arbitrary sequence ignoring quality scores
+typedef jellyfish::mer_overlap_sequence_parser<jellyfish::stream_manager<file_vector::const_iterator> > sequence_parser;
+typedef jellyfish::mer_iterator<sequence_parser, mer_dna> mer_iterator;
+
+// Types for parsing reads with quality score. Interface match type
+// above.
+class sequence_qual_parser :
+ public jellyfish::whole_sequence_parser<jellyfish::stream_manager<file_vector::const_iterator> >
+{
+ typedef jellyfish::stream_manager<file_vector::const_iterator> StreamIterator;
+ typedef jellyfish::whole_sequence_parser<StreamIterator> super;
+public:
+ sequence_qual_parser(uint16_t mer_len, uint32_t max_producers, uint32_t size, size_t buf_size,
+ StreamIterator& streams) :
+ super(size, 100, max_producers, streams)
+ { }
+};
+
+class mer_qual_iterator : public jellyfish::mer_qual_iterator<sequence_qual_parser, mer_dna> {
+ typedef jellyfish::mer_qual_iterator<sequence_qual_parser, mer_dna> super;
+public:
+ mer_qual_iterator(sequence_qual_parser& parser, bool canonical = false) :
+ super(parser, args.min_qual_char_arg[0], canonical)
+ { }
+};
+
+// k-mer filters. Organized in a linked list, interpreted as a &&
+// (logical and). I.e. all filter must return true for the result to
+// be true. By default, filter returns true.
+struct filter {
+ filter* prev_;
+ filter(filter* prev = 0) : prev_(prev) { }
+ virtual ~filter() { }
+ virtual bool operator()(const mer_dna& x) { return and_res(true, x); }
+ bool and_res(bool r, const mer_dna& x) const {
+ return r ? (prev_ ? (*prev_)(x) : true) : false;
+ }
+};
+
+struct filter_bc : public filter {
+ const mer_dna_bloom_counter& counter_;
+ filter_bc(const mer_dna_bloom_counter& counter, filter* prev = 0) :
+ filter(prev),
+ counter_(counter)
+ { }
+ bool operator()(const mer_dna& m) {
+ unsigned int c = counter_.check(m);
+ return and_res(c > 1, m);
+ }
+};
+
+struct filter_bf : public filter {
+ mer_dna_bloom_filter& bf_;
+ filter_bf(mer_dna_bloom_filter& bf, filter* prev = 0) :
+ filter(prev),
+ bf_(bf)
+ { }
+ bool operator()(const mer_dna& m) {
+ unsigned int c = bf_.insert(m);
+ return and_res(c > 0, m);
+ }
+};
+
+enum OPERATION { COUNT, PRIME, UPDATE };
+template<typename PathIterator, typename MerIteratorType, typename ParserType>
+class mer_counter_base : public jellyfish::thread_exec {
+ int nb_threads_;
+ mer_hash& ary_;
+ jellyfish::stream_manager<PathIterator> streams_;
+ ParserType parser_;
+ filter* filter_;
+ OPERATION op_;
+
+public:
+ mer_counter_base(int nb_threads, mer_hash& ary,
+ PathIterator file_begin, PathIterator file_end,
+ PathIterator pipe_begin, PathIterator pipe_end,
+ uint32_t concurent_files,
+ OPERATION op, filter* filter = new struct filter) :
+ ary_(ary),
+ streams_(file_begin, file_end, pipe_begin, pipe_end, concurent_files),
+ parser_(mer_dna::k(), streams_.nb_streams(), 3 * nb_threads, 4096, streams_),
+ filter_(filter),
+ op_(op)
+ { }
+
+ virtual void start(int thid) {
+ size_t count = 0;
+ MerIteratorType mers(parser_, args.canonical_flag);
+
+ switch(op_) {
+ case COUNT:
+ for( ; mers; ++mers) {
+ if((*filter_)(*mers))
+ ary_.add(*mers, 1);
+ ++count;
+ }
+ break;
+
+ case PRIME:
+ for( ; mers; ++mers) {
+ if((*filter_)(*mers))
+ ary_.set(*mers);
+ ++count;
+ }
+ break;
+
+ case UPDATE:
+ mer_dna tmp;
+ for( ; mers; ++mers) {
+ if((*filter_)(*mers))
+ ary_.update_add(*mers, 1, tmp);
+ ++count;
+ }
+ break;
+ }
+
+ ary_.done();
+ }
+};
+
+// Counter with and without quality value
+typedef mer_counter_base<file_vector::const_iterator, mer_iterator, sequence_parser> mer_counter;
+typedef mer_counter_base<file_vector::const_iterator, mer_qual_iterator, sequence_qual_parser> mer_qual_counter;
+
+mer_dna_bloom_counter* load_bloom_filter(const char* path) {
+ std::ifstream in(path, std::ios::in|std::ios::binary);
+ jellyfish::file_header header(in);
+ if(!in.good())
+ err::die(err::msg() << "Failed to parse bloom filter file '" << path << "'");
+ if(header.format() != "bloomcounter")
+ err::die(err::msg() << "Invalid format '" << header.format() << "'. Expected 'bloomcounter'");
+ if(header.key_len() != mer_dna::k() * 2)
+ err::die("Invalid mer length in bloom filter");
+ jellyfish::hash_pair<mer_dna> fns(header.matrix(1), header.matrix(2));
+ auto res = new mer_dna_bloom_counter(header.size(), header.nb_hashes(), in, fns);
+ if(!in.good())
+ err::die("Bloom filter file is truncated");
+ in.close();
+ return res;
+}
+
+// If get a termination signal, kill the manager and then kill myself.
+static pid_t manager_pid = 0;
+static void signal_handler(int sig) {
+ if(manager_pid)
+ kill(manager_pid, SIGTERM);
+ signal(sig, SIG_DFL);
+ kill(getpid(), sig);
+ _exit(EXIT_FAILURE); // Should not be reached
+}
+
+int count_main(int argc, char *argv[])
+{
+ auto start_time = system_clock::now();
+
+ jellyfish::file_header header;
+ header.fill_standard();
+ header.set_cmdline(argc, argv);
+
+ args.parse(argc, argv);
+
+ if(args.min_qual_char_given && args.min_qual_char_arg.size() != 1)
+ count_main_cmdline::error("[-Q, --min-qual-char] must be one character.");
+
+ mer_dna::k(args.mer_len_arg);
+
+ std::unique_ptr<jellyfish::generator_manager> generator_manager;
+ if(args.generator_given) {
+ auto gm =
+ new jellyfish::generator_manager(args.generator_arg, args.Generators_arg,
+ args.shell_given ? args.shell_arg : (const char*)0);
+ generator_manager.reset(gm);
+ generator_manager->start();
+ manager_pid = generator_manager->pid();
+ struct sigaction act;
+ memset(&act, '\0', sizeof(act));
+ act.sa_handler = signal_handler;
+ assert(sigaction(SIGTERM, &act, 0) == 0);
+ }
+
+ header.canonical(args.canonical_flag);
+ mer_hash ary(args.size_arg, args.mer_len_arg * 2, args.counter_len_arg, args.threads_arg, args.reprobes_arg);
+ if(args.disk_flag)
+ ary.do_size_doubling(false);
+
+ std::auto_ptr<jellyfish::dumper_t<mer_array> > dumper;
+ if(args.text_flag)
+ dumper.reset(new text_dumper(args.threads_arg, args.output_arg, &header));
+ else
+ dumper.reset(new binary_dumper(args.out_counter_len_arg, ary.key_len(), args.threads_arg, args.output_arg, &header));
+ ary.dumper(dumper.get());
+
+ auto after_init_time = system_clock::now();
+
+ OPERATION do_op = COUNT;
+ if(args.if_given) {
+ mer_counter counter(args.threads_arg, ary,
+ args.if_arg.begin(), args.if_arg.end(),
+ args.if_arg.end(), args.if_arg.end(), // no multi pipes
+ args.Files_arg, PRIME);
+ counter.exec_join(args.threads_arg);
+ do_op = UPDATE;
+ }
+
+ // Iterators to the multi pipe paths. If no generator manager,
+ // generate an empty range.
+ auto pipes_begin = generator_manager.get() ? generator_manager->pipes().begin() : args.file_arg.end();
+ auto pipes_end = (bool)generator_manager ? generator_manager->pipes().end() : args.file_arg.end();
+
+ // Bloom counter read from file to filter out low frequency
+ // k-mers. Two pass algorithm.
+ std::unique_ptr<filter> mer_filter(new filter);
+ std::unique_ptr<mer_dna_bloom_counter> bc;
+ if(args.bc_given) {
+ bc.reset(load_bloom_filter(args.bc_arg));
+ mer_filter.reset(new filter_bc(*bc));
+ }
+
+ // Bloom filter to filter out low frequency k-mers. One pass
+ // algorithm.
+ std::unique_ptr<mer_dna_bloom_filter> bf;
+ if(args.bf_size_given) {
+ bf.reset(new mer_dna_bloom_filter(args.bf_fp_arg, args.bf_size_arg));
+ mer_filter.reset(new filter_bf(*bf));
+ }
+
+ if(args.min_qual_char_given) {
+ mer_qual_counter counter(args.threads_arg, ary,
+ args.file_arg.begin(), args.file_arg.end(),
+ pipes_begin, pipes_end,
+ args.Files_arg,
+ do_op, mer_filter.get());
+ counter.exec_join(args.threads_arg);
+ } else {
+ mer_counter counter(args.threads_arg, ary,
+ args.file_arg.begin(), args.file_arg.end(),
+ pipes_begin, pipes_end,
+ args.Files_arg,
+ do_op, mer_filter.get());
+ counter.exec_join(args.threads_arg);
+ }
+
+ // If we have a manager, wait for it
+ if(generator_manager) {
+ signal(SIGTERM, SIG_DFL);
+ manager_pid = 0;
+ if(!generator_manager->wait())
+ err::die("Some generator commands failed");
+ generator_manager.reset();
+ }
+
+ auto after_count_time = system_clock::now();
+
+ // If no intermediate files, dump directly into output file. If not, will do a round of merging
+ if(!args.no_write_flag) {
+ if(dumper->nb_files() == 0) {
+ dumper->one_file(true);
+ if(args.lower_count_given)
+ dumper->min(args.lower_count_arg);
+ if(args.upper_count_given)
+ dumper->max(args.upper_count_arg);
+ dumper->dump(ary.ary());
+ } else {
+ dumper->dump(ary.ary());
+ if(!args.no_merge_flag) {
+ std::vector<const char*> files = dumper->file_names_cstr();
+ uint64_t min = args.lower_count_given ? args.lower_count_arg : 0;
+ uint64_t max = args.upper_count_given ? args.upper_count_arg : std::numeric_limits<uint64_t>::max();
+ try {
+ merge_files(files, args.output_arg, header, min, max);
+ } catch(MergeError e) {
+ err::die(err::msg() << e.what());
+ }
+ if(!args.no_unlink_flag) {
+ for(int i =0; i < dumper->nb_files(); ++i)
+ unlink(files[i]);
+ }
+ } // if(!args.no_merge_flag
+ } // if(!args.no_merge_flag
+ }
+
+ auto after_dump_time = system_clock::now();
+
+ if(args.timing_given) {
+ std::ofstream timing_file(args.timing_arg);
+ timing_file << "Init " << as_seconds(after_init_time - start_time) << "\n"
+ << "Counting " << as_seconds(after_count_time - after_init_time) << "\n"
+ << "Writing " << as_seconds(after_dump_time - after_count_time) << "\n";
+ }
+
+ return 0;
+}
diff --git a/sub_commands/count_main_cmdline.yaggo b/sub_commands/count_main_cmdline.yaggo
new file mode 100644
index 0000000..5803194
--- /dev/null
+++ b/sub_commands/count_main_cmdline.yaggo
@@ -0,0 +1,102 @@
+purpose "Count k-mers in fasta or fastq files"
+package "jellyfish count"
+
+option("mer-len", "m") {
+ description "Length of mer"
+ uint32; required }
+option("size", "s") {
+ description "Initial hash size"
+ uint64; suffix; required }
+option("threads", "t") {
+ description "Number of threads"
+ uint32; default "1" }
+option("F", "Files") {
+ description "Number files open simultaneously"
+ uint32; default "1" }
+option("g", "generator") {
+ description "File of commands generating fast[aq]"
+ c_string; typestr "path" }
+option("G", "Generators") {
+ description "Number of generators run simultaneously"
+ uint32; default "1" }
+option("S", "shell") {
+ description "Shell used to run generator commands ($SHELL or /bin/sh)"
+ c_string }
+option("output", "o") {
+ description "Output file"
+ c_string; default "mer_counts.jf" }
+option("counter-len", "c") {
+ description "Length bits of counting field"
+ uint32; default "7"; typestr "Length in bits" }
+option("out-counter-len") {
+ description "Length in bytes of counter field in output"
+ uint32; default "4"; typestr "Length in bytes" }
+option("C", "canonical") {
+ description "Count both strand, canonical representation"
+ flag; off }
+option("bc") {
+ description "Bloom counter to filter out singleton mers"
+ c_string; typestr "peath"; }
+option("bf-size") {
+ description "Use bloom filter to count high-frequency mers"
+ uint64; suffix; conflict "bc" }
+option("bf-fp") {
+ description "False positive rate of bloom filter"
+ double; default 0.01 }
+option("if") {
+ description "Count only k-mers in this files"
+ c_string; typestr "path"; multiple }
+option("Q", "min-qual-char") {
+ description "Any base with quality below this character is changed to N"
+ string }
+option("reprobes", "p") {
+ description "Maximum number of reprobes"
+ uint32; default "126" }
+option("text") {
+ description "Dump in text format"
+ off }
+option("disk") {
+ description "Disk operation. Do not do size doubling"
+ off }
+option("no-merge") {
+ description "Do not merge files intermediary files"
+ off; hidden }
+option("no-unlink") {
+ description "Do not unlink intermediary files after automatic merging"
+ off; hidden }
+# option("raw", "r") {
+# description "Write raw database"
+# flag; off }
+# option("both") {
+# description "Write sorted list and raw database"
+# flag; off; hidden }
+# option("quality-start") {
+# description "Starting ASCII for quality values"
+# uint32; default "64" }
+# option("min-quality") {
+# description "Minimum quality. A base with lesser quality becomes an N"
+# uint32; default "0" }
+option("lower-count", "L") {
+ description "Don't output k-mer with count < lower-count"
+ uint64 }
+option("upper-count", "U") {
+ description "Don't output k-mer with count > upper-count"
+ uint64 }
+# option("invalid-char") {
+# description "How to treat invalid characters. The char is changed to a N."
+# enum "warn", "ignore", "error" }
+# option("matrix") {
+# description "Hash function binary matrix"
+# string; typestr "Matrix file" }
+option("timing") {
+ description "Print timing information"
+ c_string; typestr "Timing file" }
+# option("stats") {
+# description "Print stats"
+# c_string; typestr "Stats file" }
+option("no-write") {
+ description "Don't write database"
+ flag; off; hidden }
+arg("file") {
+ description "Sequence file(s) in fasta or fastq format"
+ c_string; multiple; typestr "path" }
diff --git a/sub_commands/dump_main.cc b/sub_commands/dump_main.cc
new file mode 100644
index 0000000..4acf3da
--- /dev/null
+++ b/sub_commands/dump_main.cc
@@ -0,0 +1,88 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <iostream>
+#include <fstream>
+#include <limits>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/fstream_default.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <sub_commands/dump_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+static dump_main_cmdline args; // Command line switches and arguments
+
+template<typename iterator>
+void dump(iterator& it, std::ostream &out,
+ uint64_t lower_count, uint64_t upper_count) {
+ if(args.column_flag) {
+ char spacer = args.tab_flag ? '\t' : ' ';
+ while(it.next()) {
+ if(it.val() < lower_count || it.val() > upper_count)
+ continue;
+ out << it.key() << spacer << it.val() << "\n";
+ }
+ } else {
+ while(it.next()) {
+ if(it.val() < lower_count || it.val() > upper_count)
+ continue;
+ out << ">" << it.val() << "\n" << it.key() << "\n";
+ }
+ }
+}
+
+int dump_main(int argc, char *argv[])
+{
+ args.parse(argc, argv);
+ std::ios::sync_with_stdio(false); // No sync with stdio -> faster
+
+ ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
+ if(!out.good())
+ err::die(err::msg() << "Error opening output file '" << args.output_arg << "'");
+
+ std::ifstream is(args.db_arg);
+ if(!is.good())
+ err::die(err::msg() << "Failed to open input file '" << args.db_arg << "'");
+ jellyfish::file_header header;
+ header.read(is);
+ jellyfish::mer_dna::k(header.key_len() / 2);
+
+ if(!args.lower_count_given)
+ args.lower_count_arg = 0;
+ if(!args.upper_count_given)
+ args.upper_count_arg = std::numeric_limits<uint64_t>::max();
+
+ if(!header.format().compare(binary_dumper::format)) {
+ binary_reader reader(is, &header);
+ dump(reader, out, args.lower_count_arg, args.upper_count_arg);
+ } else if(!header.format().compare(text_dumper::format)) {
+ text_reader reader(is, &header);
+ dump(reader, out, args.lower_count_arg, args.upper_count_arg);
+ } else {
+ err::die(err::msg() << "Unknown format '" << header.format() << "'");
+ }
+
+ out.close();
+
+ return 0;
+}
diff --git a/sub_commands/dump_main_cmdline.yaggo b/sub_commands/dump_main_cmdline.yaggo
new file mode 100644
index 0000000..3882698
--- /dev/null
+++ b/sub_commands/dump_main_cmdline.yaggo
@@ -0,0 +1,24 @@
+purpose "Dump k-mer counts"
+package "jellyfish dump"
+description "By default, dump in a fasta format where the header is the count and
+the sequence is the sequence of the k-mer. The column format is a 2
+column output: k-mer count."
+
+option("column", "c") {
+ description "Column format"
+ flag; off }
+option("tab", "t") {
+ description "Tab separator"
+ flag; off }
+option("lower-count", "L") {
+ description "Don't output k-mer with count < lower-count"
+ uint64; }
+option("upper-count", "U") {
+ description "Don't output k-mer with count > upper-count"
+ uint64 }
+option("output", "o") {
+ description "Output file"
+ c_string }
+arg("db") {
+ description "Jellyfish database"
+ c_string; typestr "path" }
diff --git a/sub_commands/histo_main.cc b/sub_commands/histo_main.cc
new file mode 100644
index 0000000..b971841
--- /dev/null
+++ b/sub_commands/histo_main.cc
@@ -0,0 +1,90 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/fstream_default.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <sub_commands/histo_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+template<typename reader_type>
+void compute_histo(reader_type& reader, const uint64_t base, const uint64_t ceil,
+ uint64_t* histo, const uint64_t nb_buckets, const uint64_t inc) {
+ while(reader.next()) {
+ if(reader.val() < base)
+ ++histo[0];
+ else if(reader.val() > ceil)
+ ++histo[nb_buckets - 1];
+ else
+ ++histo[(reader.val() - base) / inc];
+ }
+}
+
+
+int histo_main(int argc, char *argv[])
+{
+ histo_main_cmdline args(argc, argv);
+
+ std::ifstream is(args.db_arg);
+ if(!is.good())
+ err::die(err::msg() << "Failed to open input file '" << args.db_arg << "'");
+ jellyfish::file_header header;
+ header.read(is);
+ jellyfish::mer_dna::k(header.key_len() / 2);
+
+ if(args.high_arg < args.low_arg)
+ histo_main_cmdline::error("High count value must be >= to low count value");
+ ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
+ if(!out.good())
+ err::die(err::msg() << "Error opening output file '" << args.output_arg << "'");
+
+ const uint64_t base = args.increment_arg >= args.low_arg ? 0 : args.low_arg - args.increment_arg;
+ const uint64_t ceil = args.high_arg + args.increment_arg;
+ const uint64_t inc = args.increment_arg;
+
+ const uint64_t nb_buckets = (ceil + inc - base) / inc;
+ uint64_t* histo = new uint64_t[nb_buckets];
+ memset(histo, '\0', sizeof(uint64_t) * nb_buckets);
+
+ if(!header.format().compare(binary_dumper::format)) {
+ binary_reader reader(is, &header);
+ compute_histo(reader, base, ceil, histo, nb_buckets, inc);
+ } else if(!header.format().compare(text_dumper::format)) {
+ text_reader reader(is, &header);
+ compute_histo(reader, base, ceil, histo, nb_buckets, inc);
+ } else {
+ err::die(err::msg() << "Unknown format '" << header.format() << "'");
+ }
+
+ for(uint64_t i = 0, col = base; i < nb_buckets; ++i, col += inc)
+ if(histo[i] > 0 || args.full_flag)
+ out << col << " " << histo[i] << "\n";
+
+ delete [] histo;
+ out.close();
+
+ return 0;
+}
diff --git a/sub_commands/histo_main_cmdline.yaggo b/sub_commands/histo_main_cmdline.yaggo
new file mode 100644
index 0000000..49a2e73
--- /dev/null
+++ b/sub_commands/histo_main_cmdline.yaggo
@@ -0,0 +1,38 @@
+purpose "Create an histogram of k-mer occurrences"
+package "jellyfish histo"
+description "Create an histogram with the number of k-mers having a given
+count. In bucket 'i' are tallied the k-mers which have a count 'c'
+satisfying 'low+i*inc <= c < low+(i+1)*inc'. Buckets in the output are
+labeled by the low end point (low+i*inc).
+
+The last bucket in the output behaves as a catchall: it tallies all
+k-mers with a count greater or equal to the low end point of this
+bucket."
+
+option("low", "l") {
+ description "Low count value of histogram"
+ uint64; default "1" }
+option("high", "h") {
+ description "High count value of histogram"
+ uint64; default "10000" }
+option("increment", "i") {
+ description "Increment value for buckets"
+ uint64; default "1" }
+option("threads", "t") {
+ description "Number of threads"
+ uint32; default "1" }
+option("full", "f") {
+ description "Full histo. Don't skip count 0."
+ flag; off }
+option("output", "o") {
+ description "Output file"
+ c_string }
+option("buffer-size", "s") {
+ description "Length in bytes of input buffer"
+ uint64; default "10000000"; suffix; hidden; typestr "Buffer length" }
+option("verbose", "v") {
+ description "Output information"
+ flag; off }
+arg("db") {
+ description "Jellyfish database"
+ c_string; typestr "path" }
diff --git a/sub_commands/info_main.cc b/sub_commands/info_main.cc
new file mode 100644
index 0000000..d6cd43e
--- /dev/null
+++ b/sub_commands/info_main.cc
@@ -0,0 +1,54 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/misc.hpp>
+#include <sub_commands/info_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+static info_main_cmdline args;
+
+std::string get_command(const jellyfish::generic_file_header& h) {
+ std::string cmd(h["exe_path"]);
+ std::vector<std::string> cmdline = h.cmdline();
+ for(auto it = cmdline.cbegin(); it != cmdline.cend(); ++it)
+ (cmd += " ") += jellyfish::quote_arg(*it);
+
+ return cmd;
+}
+
+std::string get_where(const jellyfish::generic_file_header& h) {
+ std::string res(jellyfish::quote_arg(h["hostname"]));
+ if(!res.empty())
+ res += ":";
+ res += jellyfish::quote_arg(h["pwd"]);
+ return res;
+}
+
+int info_main(int argc, char *argv[]) {
+ args.parse(argc, argv);
+
+ std::ifstream file(args.file_arg);
+ if(!file.good())
+ err::die(err::msg() << "Can't open '" << args.file_arg << "'");
+
+ jellyfish::file_header header;
+ header.read(file);
+
+ if(args.skip_flag)
+ std::cout << file.rdbuf();
+ else if(args.json_flag)
+ std::cout << header;
+ else if(args.cmd_flag)
+ std::cout << get_command(header) << "\n";
+ else
+ std::cout << "command: " << get_command(header) << "\n"
+ << "where: " << get_where(header) << "\n"
+ << "when: " << header["time"] << "\n"
+ << "canonical: " << (header.canonical() ? "yes" : "no") << "\n";
+
+ return 0;
+}
diff --git a/sub_commands/info_main_cmdline.yaggo b/sub_commands/info_main_cmdline.yaggo
new file mode 100644
index 0000000..34d98cf
--- /dev/null
+++ b/sub_commands/info_main_cmdline.yaggo
@@ -0,0 +1,23 @@
+purpose "Display information about a jellyfish file"
+package "jellyfish info"
+
+description <<EOS
+This command shows some information about how this jellyfish output
+file was created. Without any argument, it displays the command line
+used, when and where it was run.
+EOS
+
+option("s", "skip") {
+ description "Skip header and dump remainder of file"
+ off }
+option("j", "json") {
+ description "Dump full header in JSON format"
+ off
+ conflict "skip" }
+option("c", "cmd") {
+ description "Display only the command line"
+ off
+ conflict "skip", "json" }
+arg("file") {
+ description "Input file in jellyfish format"
+ c_string; typestr "path" }
diff --git a/jellyfish/jellyfish.cc b/sub_commands/jellyfish.cc
similarity index 91%
rename from jellyfish/jellyfish.cc
rename to sub_commands/jellyfish.cc
index 932f514..53549fd 100644
--- a/jellyfish/jellyfish.cc
+++ b/sub_commands/jellyfish.cc
@@ -23,15 +23,18 @@
typedef int (main_func_t)(int argc, char *argv[]);
main_func_t count_main;
+main_func_t bc_main;
+main_func_t info_main;
main_func_t stats_main;
main_func_t merge_main;
main_func_t histo_main;
main_func_t query_main;
main_func_t dump_main;
main_func_t cite_main;
-main_func_t dump_fastq_main;
-main_func_t histo_fastq_main;
-main_func_t hash_fastq_merge_main;
+main_func_t mem_main;
+// main_func_t dump_fastq_main;
+// main_func_t histo_fastq_main;
+// main_func_t hash_fastq_merge_main;
main_func_t sos;
main_func_t version;
main_func_t jf_main;
@@ -43,15 +46,18 @@ struct cmd_func {
};
cmd_func cmd_list[] = {
{"count", &count_main},
+ {"bc", &bc_main},
+ {"info", &info_main},
{"stats", &stats_main},
{"histo", &histo_main},
{"dump", &dump_main},
{"merge", &merge_main},
{"query", &query_main},
{"cite", &cite_main},
- {"qhisto", &histo_fastq_main},
- {"qdump", &dump_fastq_main},
- {"qmerge", &hash_fastq_merge_main},
+ {"mem", &mem_main},
+ // {"qhisto", &histo_fastq_main},
+ // {"qdump", &dump_fastq_main},
+ // {"qmerge", &hash_fastq_merge_main},
{"jf", &jf_main},
/* help in all its form. Must be first non-command */
diff --git a/sub_commands/mem_main.cc b/sub_commands/mem_main.cc
new file mode 100644
index 0000000..07c7ae3
--- /dev/null
+++ b/sub_commands/mem_main.cc
@@ -0,0 +1,54 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <iostream>
+#include <string>
+
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/large_hash_array.hpp>
+#include <sub_commands/mem_main_cmdline.hpp>
+
+static const char* suffixes = "kMGTPE";
+
+template<uint64_t U>
+std::string add_suffix(uint64_t x) {
+ const int max_i = strlen(suffixes);
+ int i = 0;
+ while(x >= U && i <= max_i) {
+ x /= U;
+ ++i;
+ }
+ std::ostringstream res;
+ res << x;
+ if(i > 0)
+ res << suffixes[i - 1];
+ return res.str();
+}
+
+int mem_main(int argc, char *argv[]) {
+ mem_main_cmdline args(argc, argv);
+ jellyfish::large_hash::array<jellyfish::mer_dna>::usage_info usage(args.mer_len_arg * 2, args.counter_len_arg, args.reprobes_arg);
+
+ if(args.size_given) {
+ uint64_t val = usage.mem(args.size_arg);
+ std::cout << val << " (" << add_suffix<1024>(val) << ")\n";
+ } else {
+ uint64_t val = usage.size(args.mem_arg);
+ std::cout << val << " (" << add_suffix<1000>(val) << ")\n";
+ }
+
+ return 0;
+}
diff --git a/sub_commands/mem_main_cmdline.yaggo b/sub_commands/mem_main_cmdline.yaggo
new file mode 100644
index 0000000..e4f5447
--- /dev/null
+++ b/sub_commands/mem_main_cmdline.yaggo
@@ -0,0 +1,123 @@
+purpose "Give memory usage information"
+package "jellyfish mem"
+
+description <<EOS
+The mem subcommand gives some information about the memory usage of
+Jellyfish when counting mers. If one replace 'count' by 'mem' in the
+command line, it displays the amount of memory needed. All the
+switches of the count subcommand are supported, although only the
+meaningful one for computing the memory usage are used.
+
+If the '--size' (-s) switch is omitted and the --mem switch is passed
+with an amount of memory in bytes, then the largest size that fit in
+that amount of memory is returned.
+
+The memory usage information only takes into account the hash to store
+the k-mers, not various buffers (e.g. in parsing the input files). But
+typically those will be small in comparison to the hash.
+EOS
+
+option("mer-len", "m") {
+ description "Length of mer"
+ uint32; required }
+option("size", "s") {
+ description "Initial hash size"
+ uint64; suffix }
+option("counter-len", "c") {
+ description "Length bits of counting field"
+ uint32; default "7"; typestr "Length in bits" }
+option("reprobes", "p") {
+ description "Maximum number of reprobes"
+ uint32; default "126" }
+option("mem") {
+ description "Return maximum size to fit within that memory"
+ uint64; suffix; conflict "size" }
+
+
+option("threads", "t") {
+ description "Ignored switch"
+ uint32; hidden }
+option("F", "Files") {
+ description "Ignored switch"
+ uint32; hidden }
+option("g", "generator") {
+ description "Ignored switch"
+ c_string; typestr "path"; hidden }
+option("G", "Generators") {
+ description "Ignored switch"
+ uint32; hidden }
+option("S", "shell") {
+ description "Ignored switch"
+ c_string; hidden }
+option("output", "o") {
+ description "Ignored switch"
+ c_string; hidden }
+option("out-counter-len") {
+ description "Ignored switch"
+ uint32; hidden }
+option("C", "canonical") {
+ description "Ignored switch"
+ flag; off; hidden }
+option("bc") {
+ description "Ignored switch"
+ c_string; typestr "peath"; }
+option("bf-size") {
+ description "Ignored switch"
+ uint64; suffix; conflict "bc"; hidden }
+option("bf-fp") {
+ description "Ignored switch"
+ double; default 0.01; hidden }
+option("if") {
+ description "Ignored switch"
+ c_string; typestr "path"; multiple; hidden }
+option("Q", "min-qual-char") {
+ description "Ignored switch"
+ string; hidden }
+option("text") {
+ description "Ignored switch"
+ off; hidden }
+option("disk") {
+ description "Ignored switch"
+ off; hidden }
+option("no-merge") {
+ description "Ignored switch"
+ off; hidden; hidden }
+option("no-unlink") {
+ description "Ignored switch"
+ off; hidden }
+# option("raw", "r") {
+# description "Ignored switch" "Write raw database"
+# flag; off }
+# option("both") {
+# description "Ignored switch" "Write sorted list and raw database"
+# flag; off; hidden }
+# option("quality-start") {
+# description "Ignored switch" "Starting ASCII for quality values"
+# uint32; default "64" }
+# option("min-quality") {
+# description "Ignored switch" "Minimum quality. A base with lesser quality becomes an N"
+# uint32; default "0" }
+option("lower-count", "L") {
+ description "Ignored switch"
+ uint64; hidden }
+option("upper-count", "U") {
+ description "Ignored switch"
+ uint64; hidden }
+# option("invalid-char") {
+# description "Ignored switch" "How to treat invalid characters. The char is changed to a N."
+# enum "warn", "ignore", "error" }
+# option("matrix") {
+# description "Ignored switch" "Hash function binary matrix"
+# string; typestr "Matrix file" }
+option("timing") {
+ description "Ignored switch"
+ c_string; typestr "Timing file"; hidden }
+# option("stats") {
+# description "Ignored switch" "Print stats"
+# c_string; typestr "Stats file" }
+option("no-write") {
+ description "Ignored switch"
+ flag; off; hidden }
+arg("file") {
+ description "Ignored switch"
+ c_string; multiple; typestr "path" }
diff --git a/jellyfish/parse_read.cc b/sub_commands/merge_main.cc
similarity index 50%
rename from jellyfish/parse_read.cc
rename to sub_commands/merge_main.cc
index cb040d7..eae3d84 100644
--- a/jellyfish/parse_read.cc
+++ b/sub_commands/merge_main.cc
@@ -14,27 +14,28 @@
along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <jellyfish/parse_read.hpp>
-
-void jellyfish::parse_read::fill() {
- read_parser::reads_t *new_seq = write_next();
-
- while(new_seq) {
- new_seq->file = fparser;
- bool input_eof = !fparser->next_reads(new_seq);
- if(new_seq->nb_reads > 0) {
- new_seq->link();
- write_release(new_seq);
- new_seq = write_next();
- }
- if(input_eof) {
- fparser->unlink();
- if(++current_file == files.end()) {
- close();
- break;
- }
- fparser = read_parser::new_parser(*current_file);
- fparser->link();
- }
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/merge_files.hpp>
+
+#include <sub_commands/merge_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+int merge_main(int argc, char *argv[])
+{
+ jellyfish::file_header out_header;
+ out_header.fill_standard();
+ out_header.set_cmdline(argc, argv);
+
+ merge_main_cmdline args(argc, argv);
+ uint64_t min = args.lower_count_given ? args.lower_count_arg : 0;
+ uint64_t max = args.upper_count_given ? args.upper_count_arg : std::numeric_limits<uint64_t>::max();
+
+ try {
+ merge_files(args.input_arg, args.output_arg, out_header, min, max);
+ } catch(MergeError e) {
+ err::die(err::msg() << e.what());
}
+
+ return 0;
}
diff --git a/sub_commands/merge_main_cmdline.yaggo b/sub_commands/merge_main_cmdline.yaggo
new file mode 100644
index 0000000..0633b97
--- /dev/null
+++ b/sub_commands/merge_main_cmdline.yaggo
@@ -0,0 +1,15 @@
+purpose "Merge jellyfish databases"
+package "jellyfish merge"
+
+option("output", "o") {
+ description "Output file"
+ c_string; default "mer_counts_merged.jf" }
+option("lower-count", "L") {
+ description "Don't output k-mer with count < lower-count"
+ uint64 }
+option("upper-count", "U") {
+ description "Don't output k-mer with count > upper-count"
+ uint64 }
+arg("input") {
+ description "Jellyfish hash"
+ c_string; multiple; at_least 2 }
diff --git a/sub_commands/query_main.cc b/sub_commands/query_main.cc
new file mode 100644
index 0000000..bde99f3
--- /dev/null
+++ b/sub_commands/query_main.cc
@@ -0,0 +1,123 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <vector>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/stream_manager.hpp>
+#include <jellyfish/mer_overlap_sequence_parser.hpp>
+#include <jellyfish/mer_iterator.hpp>
+#include <jellyfish/mer_dna_bloom_counter.hpp>
+#include <jellyfish/fstream_default.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <sub_commands/query_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+using jellyfish::mer_dna;
+using jellyfish::mer_dna_bloom_counter;
+typedef std::vector<const char*> file_vector;
+typedef jellyfish::mer_overlap_sequence_parser<jellyfish::stream_manager<file_vector::iterator> > sequence_parser;
+typedef jellyfish::mer_iterator<sequence_parser, mer_dna> mer_iterator;
+
+static query_main_cmdline args;
+
+// mer_dna_bloom_counter query_load_bloom_filter(const char* path) {
+// return res;
+// }
+
+template<typename PathIterator, typename Database>
+void query_from_sequence(PathIterator file_begin, PathIterator file_end, const Database& db,
+ std::ostream& out, bool canonical) {
+ jellyfish::stream_manager<PathIterator> streams(file_begin, file_end);
+ sequence_parser parser(mer_dna::k(), 1, 3, 4096, streams);
+ for(mer_iterator mers(parser, canonical); mers; ++mers)
+ out << *mers << " " << db.check(*mers) << "\n";
+}
+
+template<typename Database>
+void query_from_cmdline(std::vector<const char*> mers, const Database& db, std::ostream& out,
+ bool canonical) {
+ mer_dna m;
+ for(auto it = mers.cbegin(); it != mers.cend(); ++it) {
+ try {
+ m = *it;
+ if(canonical)
+ m.canonicalize();
+ out << m << " " << db.check(m) << "\n";
+ } catch(std::length_error e) {
+ std::cerr << "Invalid mer '" << *it << "'\n";
+ }
+ }
+}
+
+template<typename Database>
+void query_from_stdin(const Database& db, std::ostream& out, bool canonical) {
+ std::string buffer;
+ mer_dna m;
+
+ while(getline(std::cin, buffer)) {
+ try {
+ m = buffer;
+ if(canonical)
+ m.canonicalize();
+ out << db.check(m) << std::endl; // a flush is need for interactive use
+ } catch(std::length_error e) {
+ std::cerr << "Invalid mer '" << buffer << "'" << std::endl;
+ }
+ }
+}
+
+int query_main(int argc, char *argv[])
+{
+ args.parse(argc, argv);
+
+ ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
+ if(!out.good())
+ err::die(err::msg() << "Error opening output file '" << args.output_arg << "'");
+
+ std::ifstream in(args.file_arg, std::ios::in|std::ios::binary);
+ jellyfish::file_header header(in);
+ if(!in.good())
+ err::die(err::msg() << "Failed to parse header of file '" << args.file_arg << "'");
+ mer_dna::k(header.key_len() / 2);
+ if(header.format() == "bloomcounter") {
+ jellyfish::hash_pair<mer_dna> fns(header.matrix(1), header.matrix(2));
+ mer_dna_bloom_counter filter(header.size(), header.nb_hashes(), in, fns);
+ if(!in.good())
+ err::die("Bloom filter file is truncated");
+ in.close();
+ query_from_sequence(args.sequence_arg.begin(), args.sequence_arg.end(), filter, out, header.canonical());
+ query_from_cmdline(args.mers_arg, filter, out, header.canonical());
+ if(args.interactive_flag) query_from_stdin(filter, out, header.canonical());
+ } else if(header.format() == binary_dumper::format) {
+ jellyfish::mapped_file binary_map(args.file_arg);
+ if(!args.no_load_flag &&
+ (args.load_flag || (args.sequence_arg.begin() != args.sequence_arg.end()) || (args.mers_arg.size() > 100)))
+ binary_map.load();
+ binary_query bq(binary_map.base() + header.offset(), header.key_len(), header.counter_len(), header.matrix(),
+ header.size() - 1, binary_map.length() - header.offset());
+ query_from_sequence(args.sequence_arg.begin(), args.sequence_arg.end(), bq, out, header.canonical());
+ query_from_cmdline(args.mers_arg, bq, out, header.canonical());
+ if(args.interactive_flag) query_from_stdin(bq, out, header.canonical());
+ } else {
+ err::die(err::msg() << "Unsupported format '" << header.format() << "'. Must be a bloom counter or binary list.");
+ }
+
+ return 0;
+}
diff --git a/sub_commands/query_main_cmdline.yaggo b/sub_commands/query_main_cmdline.yaggo
new file mode 100644
index 0000000..d210a8d
--- /dev/null
+++ b/sub_commands/query_main_cmdline.yaggo
@@ -0,0 +1,24 @@
+purpose "Query a Jellyfish database"
+package "jellyfish query"
+
+option("s", "sequence") {
+ description "Output counts for all mers in sequence"
+ c_string; typestr "path"; multiple }
+option("o", "output") {
+ description "Output file (stdout)"
+ c_string; typestr "path" }
+option("i", "interactive") {
+ description "Interactive, queries from stdin"
+ flag; off }
+option("l", "load") {
+ description "Force pre-loading of database file into memory"
+ off }
+option("L", "no-load") {
+ description "Disable pre-loading of database file into memory"
+ off }
+arg("file") {
+ description "Jellyfish database"
+ c_string; typestr "path" }
+arg("mers") {
+ description "mers to query"
+ c_string; multiple }
diff --git a/sub_commands/stats_main.cc b/sub_commands/stats_main.cc
new file mode 100644
index 0000000..7512473
--- /dev/null
+++ b/sub_commands/stats_main.cc
@@ -0,0 +1,83 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <iostream>
+#include <fstream>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/fstream_default.hpp>
+#include <jellyfish/jellyfish.hpp>
+#include <sub_commands/stats_main_cmdline.hpp>
+
+namespace err = jellyfish::err;
+
+template<typename reader_type>
+void compute_stats(reader_type& reader, uint64_t low, uint64_t high,
+ uint64_t& uniq, uint64_t& distinct, uint64_t& total,
+ uint64_t& max) {
+ uniq = distinct = total = max = 0;
+
+ while(reader.next()) {
+ if(reader.val() < low || reader.val() > high) continue;
+ uniq += reader.val() == 1;
+ total += reader.val();
+ max = std::max(max, reader.val());
+ ++distinct;
+ }
+}
+
+
+int stats_main(int argc, char *argv[])
+{
+ stats_main_cmdline args(argc, argv);
+
+ std::ifstream is(args.db_arg);
+ if(!is.good())
+ err::die(err::msg() << "Failed to open input file '" << args.db_arg << "'");
+ jellyfish::file_header header;
+ header.read(is);
+ jellyfish::mer_dna::k(header.key_len() / 2);
+
+ ofstream_default out(args.output_given ? args.output_arg : 0, std::cout);
+ if(!out.good())
+ err::die(err::msg() << "Error opening output file '" << args.output_arg << "'");
+
+ if(!args.upper_count_given)
+ args.upper_count_arg = std::numeric_limits<uint64_t>::max();
+ uint64_t uniq = 0, distinct = 0, total = 0, max = 0;
+ if(!header.format().compare(binary_dumper::format)) {
+ binary_reader reader(is, &header);
+ compute_stats(reader, args.lower_count_arg, args.upper_count_arg, uniq, distinct, total, max);
+ } else if(!header.format().compare(text_dumper::format)) {
+ text_reader reader(is, &header);
+ compute_stats(reader, args.lower_count_arg, args.upper_count_arg, uniq, distinct, total, max);
+ } else {
+ err::die(err::msg() << "Unknown format '" << header.format() << "'");
+ }
+
+ out << "Unique: " << uniq << "\n"
+ << "Distinct: " << distinct << "\n"
+ << "Total: " << total << "\n"
+ << "Max_count: " << max << "\n";
+ out.close();
+
+ return 0;
+}
diff --git a/sub_commands/stats_main_cmdline.yaggo b/sub_commands/stats_main_cmdline.yaggo
new file mode 100644
index 0000000..4b93124
--- /dev/null
+++ b/sub_commands/stats_main_cmdline.yaggo
@@ -0,0 +1,28 @@
+purpose "Statistics"
+package "jellyfish stats"
+description "Display some statistics about the k-mers in the hash:
+
+Unique: Number of k-mers which occur only once.
+Distinct: Number of k-mers, not counting multiplicity.
+Total: Number of k-mers, including multiplicity.
+Max_count: Maximum number of occurrence of a k-mer.
+"
+
+option("recompute", "r") {
+ description "Recompute"
+ flag; off; hidden }
+option("lower-count", "L") {
+ description "Don't consider k-mer with count < lower-count"
+ uint64; default 0 }
+option("upper-count", "U") {
+ description "Don't consider k-mer with count > upper-count (2^64)"
+ uint64 }
+option("verbose", "v") {
+ description "Verbose"
+ flag; off }
+option("output", "o") {
+ description "Output file"
+ c_string }
+arg("db") {
+ description "Jellyfish database"
+ c_string; typestr "path" }
diff --git a/swig/Readme.md b/swig/Readme.md
new file mode 100644
index 0000000..ee297af
--- /dev/null
+++ b/swig/Readme.md
@@ -0,0 +1,154 @@
+What is it?
+===========
+
+Bindings of the Jellyfish library to various scripting languages
+(Python, Ruby and Perl currently). This allows to query the Jellyfish
+output files and use the Jellyfish hash within these scripting
+languages, which is much more convenient than in C++, although
+somewhat slower.
+
+Installation
+============
+
+Requirements
+------------
+
+In the following, it is assumed that Jellyfish has been properly
+installed and is visible to the 'pkg-config' tool. The following
+command:
+
+```Shell
+pkg-config --exists jellyfish-2.0 && echo yes
+```
+
+Must print 'yes'. If not, see the README in the Jellyfish on how to
+install and, if necessary, setup the 'PKG\_CONFIG\_PATH' variable.
+
+The [swig](http://www.swig.org/) software package must be
+installed. All the testing is done with version 3.x. Version 2.x MAY
+work, but is not tested.
+
+Python
+------
+
+The following was tested with Python version 3.3.3. To install:
+
+```Shell
+python setup.py build
+sudo python setup.py install
+```
+
+Ruby
+----
+
+The following was tested with Ruby version 1.9.3. To install:
+
+```Shell
+ruby extconf.rb
+make
+sudo make install
+```
+
+Perl
+----
+
+The following was tested with Perl version 5.18.1. The Perl headers
+may not compile properly with recent version of g++. It compiles
+properly with g++ version 4.4. Hence, you may need to pass something
+like 'CC=g++-4.4' to the 'make' command for it to compile.
+
+```Shell
+perl Makefile.PL
+make
+sudo make install
+```
+
+Examples
+========
+
+Some simplified examples on how to use the Jellyfish binding.
+
+jellyfish dump
+--------------
+
+The following is roughly equivalent to the dump subcommand. It dumps
+in text format the content of a Jellyfish database.
+
+----
+##### Python
+```Python
+import jellyfish
+
+mf = jellyfish.ReadMerFile(sys.argv[1])
+for mer, count in mf:
+ print(mer, " ", count)
+```
+
+----
+##### Ruby
+```Ruby
+require 'jellyfish'
+
+mf = Jellyfish::ReadMerFile.new ARGV[0]
+mf.each { |mer, count|
+ puts("#{mer} #{count}")
+}
+```
+
+----
+##### Perl
+```Perl
+use jellyfish;
+
+my $mf = jellyfish::ReadMerFile->new($ARGV[0]);
+while($mf->next_mer) {
+ print($mf->mer, " ", $mf->count, "\n");
+}
+```
+----
+
+jellyfish query
+---------------
+
+The following is roughly equivalent to the command query
+subcommand. For every mer passed on the command line, it prints its
+count in the Jellyfish database, where the mer is in canonical form.
+
+----
+##### Python
+```Python
+import jellyfish
+
+qf = jellyfish.QueryMerFile(sys.argv.[1])
+for m in sys.argv[2:]:
+ mer = jellyfish.MerDNA(m)
+ mer.canonicalize()
+ print(mer, " ", qf[mer])
+```
+
+----
+##### Ruby
+```Ruby
+require 'jellyfish'
+
+qf = Jellyfish::QueryMerFile(ARGV.shift)
+ARGV.each { |m|
+ mer = Jellyfish::MerDNA.new(m)
+ mer.canonicalize!
+ puts("#{mer} #{qf[mer]}")
+}
+```
+
+----
+##### Perl
+```Perl
+use jellyfish;
+
+my $qf = jellyfish::QueryMerFile->new(shift(@ARGV));
+foreach my $m (@ARGV) {
+ my $mer = Jellyfish::MerDNA->new($m);
+ $mer->canonicalize;
+ print($mer, " ", $qf->get($mer), "\n");
+}
+```
+----
diff --git a/swig/Tuprules.tup b/swig/Tuprules.tup
new file mode 100644
index 0000000..d85099b
--- /dev/null
+++ b/swig/Tuprules.tup
@@ -0,0 +1,120 @@
+# Default rules
+!cc = |> ^ CC %f^ $(CC) $(CPPFLAGS) $(CPPFLAGS_%B) @(CPPFLAGS) $(CFLAGS) $(CFLAGS_%B) @(CFLAGS) -c -o %o %f |> %B.o
+!cxx = |> ^ CXX %f^ $(CXX) $(CPPFLAGS) $(CPPFLAGS_%B) @(CPPFLAGS) $(CXXFLAGS) $(CXXFLAGS_%B) @(CXXFLAGS) -c -o %o %f |> %B.o
+!ld = |> ^ LD %o^ $(CC) $(T_LDFLAGS) $(LDFLAGS) $(LDFLAGS_%O) $(LOADLIBES) $(LDLIBS) %f -o %o |>
+!lxxd = |> ^ LXX %o^ $(CXX) $(T_LDFLAGS) $(LDFLAGS) $(LDFLAGS_%o) @(LDFLAGS) %f $(LOADLIBES) $(LDLIBS) $(LDLIBS_%o) -o %o |>
+!cld = |> ^ CLD %o^ $(CC) $(CPPFLAGS) $(CPPFLAGS_%B) @(CPPFLAGS) $(CFLAGS) $(CFLAGS_%B) @(CFLAGS) %f -o %o |>
+!cxxld = |> ^ CXXLD %o^ $(CXX) $(CPPFLAGS) $(CPPFLAGS_%B) @(CPPFLAGS) $(CXXFLAGS) $(CXXFLAGS_%B) @(CXXFLAGS) $(LDFLAGS) $(LDFLAGS_%o) @(LDFLAGS) %f $(LOADLIBES) $(LDLIBS) $(LDLIBS_%o) -o %o |> %B
+!ar = |> ^ AR %o^ $(AR) sruv $(ARFLAGS) $(ARFLAGS_%O) @(ARFLAGS) %o %f |>
+!yaggo = |> ^ YAGGO %f^ $(YAGGO) %f |> %B.hpp
+!swigxx = |> ^ SWIG %f^ $(SWIG) -c++ $(SWIGFLAGS) $(SWIGFLAGS_%B) -o %o %f |> %B.cxx
+
+# Default variables
+ifdef CC
+ CC = @(CC)
+else
+ CC = gcc
+endif
+
+ifdef CXX
+ CXX = @(CXX)
+else
+ CXX = g++
+endif
+
+ifdef AR
+ AR = @(AR)
+else
+ AR = ar
+endif
+
+ifdef YAGGO
+ YAGGO = @(YAGGO)
+else
+ YAGGO = yaggo
+endif
+
+ifdef SWIG
+ SWIG = @(SWIG)
+else
+ SWIG = swig
+endif
+
+ifdef PYTHON
+ PYTHON = @(PYTHON)
+else
+ PYTHON = python
+endif
+
+ifdef RUBY
+ RUBY = @(RUBY)
+else
+ RUBY = ruby
+endif
+
+ifdef PERL
+ PERL = @(PERL)
+else
+ PERL = perl
+endif
+
+ifdef JELLYFISH
+ JELLYFISH = @(JELLYFISH)
+else
+ JELLYFISH = jellyfish
+endif
+
+CXXFLAGS = -Wall -std=c++0x
+ifdef JELLYFISH_CFLAGS
+ JELLYFISH_CFLAGS = @(JELLYFISH_CFLAGS)
+else
+ JELLYFISH_CFLAGS = `pkg-config --cflags jellyfish-2.0`
+endif
+
+ifdef JELLYFISH_LIBS
+ JELLYFISH_LIBS = @(JELLYFISH_LIBS)
+else
+ JELLYFISH_LIBS = `pkg-config --libs jellyfish-2.0`
+endif
+
+ifdef JELLYFISH_RPATH
+ JELLYFISH_RPATH = @(JELLYFISH_RPATH)
+else
+ JELLYFISH_RPATH = `pkg-config --libs-only-L jellyfish-2.0 | sed -e 's/-L/-Wl,-rpath,/g'`
+endif
+
+ifdef RUBY_CFLAGS
+ RUBY_CFLAGS = @(RUBY_CFLAGS)
+else
+ RUBY_CFLAGS = `pkg-config --cflags ruby-1.9`
+endif
+
+ifdef RUBY_LIBS
+ RUBY_LIBS = @(RUBY_LIBS)
+else
+ RUBY_LIBS = `pkg-config --libs ruby-1.9`
+endif
+
+ifdef PYTHON_CFLAGS
+ PYTHON_CFLAGS = @(PYTHON_CFLAGS)
+else
+ PYTHON_CFLAGS = `pkg-config --cflags python3`
+endif
+
+ifdef PYTHON_LIBS
+ PYTHON_LIBS = @(PYTHON_LIBS)
+else
+ PYTHON_LIBS = `pkg-config --libs python3`
+endif
+
+ifdef PERL_CFLAGS
+ PERL_CFLAGS = @(PERL_CFLAGS)
+else
+ PERL_CFLAGS = `perl -MConfig -e 'print("-I$Config{archlibexp}/CORE")'`
+endif
+
+ifdef PERL_LIBS
+ PERL_LIBS = @(PERL_LIBS)
+else
+ PERL_LIBS = `perl -MConfig -e 'print($Config{ccdlflags})'`
+endif
diff --git a/swig/hash_counter.i b/swig/hash_counter.i
new file mode 100644
index 0000000..097990a
--- /dev/null
+++ b/swig/hash_counter.i
@@ -0,0 +1,56 @@
+/*********************************************************************/
+/* Proxy class for hash counter: auto size doubling hash on mer_dna. */
+/*********************************************************************/
+%{
+ class HashCounter : public jellyfish::cooperative::hash_counter<jellyfish::mer_dna> {
+ typedef jellyfish::cooperative::hash_counter<jellyfish::mer_dna> super;
+ public:
+ HashCounter(size_t size, unsigned int val_len, unsigned int nb_threads = 1) : \
+ super(size, jellyfish::mer_dna::k() * 2, val_len, nb_threads)
+ { }
+
+ bool add(const MerDNA& m, const int& x) {
+ bool res;
+ size_t id;
+ super::add(m, x, &res, &id);
+ return res;
+ }
+
+ };
+%}
+
+// Typemaps to return nil/undef/None if the mer asked for is not in
+// the hash
+%typemap(in, numinputs=0) std::pair<bool, uint64_t>* COUNT (std::pair<bool, uint64_t> tmp) {
+ $1 = &tmp;
+ }
+%typemap(argout) std::pair<bool, uint64_t>* COUNT {
+ if(($1)->first) {
+ SWIG_Object o = SWIG_From(unsigned long)(($1)->second);
+ %append_output(o);
+ } else {
+ %append_output(VOID_Object);
+ }
+ }
+
+class HashCounter {
+public:
+ HashCounter(size_t size, unsigned int val_len, unsigned int nb_threads = 1);
+ size_t size() const;
+ unsigned int val_len() const;
+ // unsigned int nb_threads() const;
+
+ bool add(const MerDNA& m, const int& x);
+ bool update_add(const MerDNA&, const int&);
+
+ %extend {
+ void get(const MerDNA& m, std::pair<bool, uint64_t>* COUNT) const {
+ COUNT->first = $self->ary()->get_val_for_key(m, &COUNT->second);
+ }
+#ifndef SWIGPERL
+ void __getitem__(const MerDNA& m, std::pair<bool, uint64_t>* COUNT) const {
+ COUNT->first = $self->ary()->get_val_for_key(m, &COUNT->second);
+ }
+#endif
+ }
+};
diff --git a/swig/hash_set.i b/swig/hash_set.i
new file mode 100644
index 0000000..72ccf57
--- /dev/null
+++ b/swig/hash_set.i
@@ -0,0 +1,35 @@
+/*********************************************************************/
+/* Proxy class for hash counter: auto size doubling hash on mer_dna. */
+/*********************************************************************/
+%{
+ class HashSet : public jellyfish::cooperative::hash_counter<jellyfish::mer_dna> {
+ typedef jellyfish::cooperative::hash_counter<jellyfish::mer_dna> super;
+ public:
+ HashSet(size_t size, unsigned int nb_threads = 1) : \
+ super(size, jellyfish::mer_dna::k() * 2, 0, nb_threads)
+ { }
+
+ bool add(const MerDNA& m) {
+ bool res;
+ size_t id;
+ super::set(m, &res, &id);
+ return res;
+ }
+ };
+%}
+
+class HashSet {
+public:
+ HashSet(size_t size, unsigned int nb_threads = 1);
+ size_t size() const;
+ // unsigned int nb_threads() const;
+
+ bool add(const MerDNA& m);
+
+ %extend {
+ bool get(const MerDNA& m) const { return $self->ary()->has_key(m); }
+#ifndef SWIGPERL
+ bool __getitem__(const MerDNA& m) const { return $self->ary()->has_key(m); }
+#endif
+ }
+};
diff --git a/swig/jellyfish.i b/swig/jellyfish.i
new file mode 100644
index 0000000..90a446b
--- /dev/null
+++ b/swig/jellyfish.i
@@ -0,0 +1,28 @@
+%module(docstring="Jellyfish binding") jellyfish
+%naturalvar; // Use const reference instead of pointers
+%include "std_string.i"
+%include "exception.i"
+%include "std_except.i"
+%include "typemaps.i"
+%feature("autodoc", "2");
+
+%{
+#ifdef SWIGPYTHON
+#define SWIG_FILE_WITH_INIT
+#endif
+
+#include <fstream>
+#include <stdexcept>
+#undef die
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/mer_dna_bloom_counter.hpp>
+#include <jellyfish/hash_counter.hpp>
+#include <jellyfish/jellyfish.hpp>
+#undef die
+%}
+
+%include "mer_dna.i"
+%include "mer_file.i"
+%include "hash_counter.i"
+%include "hash_set.i"
diff --git a/swig/mer_dna.i b/swig/mer_dna.i
new file mode 100644
index 0000000..0e6827d
--- /dev/null
+++ b/swig/mer_dna.i
@@ -0,0 +1,99 @@
+/**********************************/
+/* MerDNA proxy class for mer_dna */
+/**********************************/
+%{
+ class MerDNA : public jellyfish::mer_dna {
+ public:
+ MerDNA() = default;
+ MerDNA(const char* s) : jellyfish::mer_dna(s) { }
+ MerDNA(const MerDNA& m) : jellyfish::mer_dna(m) { }
+ MerDNA& operator=(const jellyfish::mer_dna& m) { *static_cast<jellyfish::mer_dna*>(this) = m; return *this; }
+ };
+%}
+
+#ifdef SWIGRUBY
+%bang MerDNA::randomize();
+%bang MerDNA::canonicalize();
+%bang MerDNA::reverse_complement();
+%bang MerDNA::polyA();
+%bang MerDNA::polyC();
+%bang MerDNA::polyG();
+%bang MerDNA::polyT();
+// %predicate MerDNA::is_homopolymer(); // Does not work???
+%rename("MerDNA::homopolymer?") MerDNA::is_homopolymer();
+%rename("MerDNA::complement") MerDNA::get_reverse_complement();
+%rename("MerDNA::canonical") MerDNA::get_canonical();
+#endif
+
+
+%feature("autodoc", "Class representing a mer. All the mers have the same length, which must be set BEFORE instantiating any mers with jellyfish::MerDNA::k(int)");
+class MerDNA {
+public:
+ MerDNA();
+ MerDNA(const char*);
+ MerDNA(const MerDNA&);
+
+ %feature("autodoc", "Get the length of the k-mers");
+ static unsigned int k();
+ %feature("autodoc", "Set the length of the k-mers");
+ static unsigned int k(unsigned int);
+
+ %feature("autodoc", "Change the mer to a homopolymer of A");
+ void polyA();
+ %feature("autodoc", "Change the mer to a homopolymer of C");
+ void polyC();
+ %feature("autodoc", "Change the mer to a homopolymer of G");
+ void polyG();
+ %feature("autodoc", "Change the mer to a homopolymer of T");
+ void polyT();
+ %feature("autodoc", "Change the mer to a random one");
+ void randomize();
+ %feature("autodoc", "Check if the mer is a homopolymer");
+ bool is_homopolymer() const;
+
+ %feature("autodoc", "Shift a base to the left and the leftmost base is return . \"ACGT\", shift_left('A') becomes \"CGTA\" and 'A' is returned");
+ char shift_left(char);
+ %feature("autodoc", "Shift a base to the right and the rightmost base is return . \"ACGT\", shift_right('A') becomes \"AACG\" and 'T' is returned");
+ char shift_right(char);
+
+ %feature("autodoc", "Change the mer to its canonical representation");
+ void canonicalize();
+ %feature("autodoc", "Change the mer to its reverse complement");
+ void reverse_complement();
+ %feature("autodoc", "Return canonical representation of the mer");
+ MerDNA get_canonical() const;
+ %feature("autodoc", "Return the reverse complement of the mer");
+ MerDNA get_reverse_complement() const;
+
+ %feature("autodoc", "Equality between mers");
+ bool operator==(const MerDNA&) const;
+ %feature("autodoc", "Lexicographic less-than");
+ bool operator<(const MerDNA&) const;
+ %feature("autodoc", "Lexicographic greater-than");
+ bool operator>(const MerDNA&) const;
+
+
+ %extend{
+ %feature("autodoc", "Duplicate the mer");
+ MerDNA dup() const { return MerDNA(*self); }
+ %feature("autodoc", "Return string representation of the mer");
+ std::string __str__() { return self->to_str(); }
+ %feature("autodoc", "Set the mer from a string");
+ void set(const char* s) throw(std::length_error) { *static_cast<jellyfish::mer_dna*>(self) = s; }
+
+#ifdef SWIGPERL
+ char get_base(unsigned int i) { return (char)self->base(i); }
+ void set_base(unsigned int i, char b) { self->base(i) = b; }
+#else
+ %feature("autodoc", "Get base i (0 <= i < k)");
+ char __getitem__(unsigned int i) { return (char)self->base(i); }
+ %feature("autodoc", "Set base i (0 <= i < k)");
+ void __setitem__(unsigned int i, char b) { self->base(i) = b; }
+ // MerDNA __neg__() const { return self->get_reverse_complement(); }
+ %feature("autodoc", "Shift a base to the left and return the mer");
+ MerDNA& __lshift__(char b) { self->shift_left(b); return *self; }
+ %feature("autodoc", "Shift a base to the right and return the mer");
+ MerDNA& __rshift__(char b) { self->shift_right(b); return *self; }
+#endif
+ }
+};
diff --git a/swig/mer_file.i b/swig/mer_file.i
new file mode 100644
index 0000000..130695a
--- /dev/null
+++ b/swig/mer_file.i
@@ -0,0 +1,191 @@
+/******************************/
+/* Query output of jellyfish. */
+/******************************/
+%{
+ class QueryMerFile {
+ std::unique_ptr<jellyfish::mer_dna_bloom_filter> bf;
+ jellyfish::mapped_file binary_map;
+ std::unique_ptr<binary_query> jf;
+
+ public:
+ QueryMerFile(const char* path) throw(std::runtime_error) {
+ std::ifstream in(path);
+ if(!in.good())
+ throw std::runtime_error(std::string("Can't open file '") + path + "'");
+ jellyfish::file_header header(in);
+ jellyfish::mer_dna::k(header.key_len() / 2);
+ if(header.format() == "bloomcounter") {
+ jellyfish::hash_pair<jellyfish::mer_dna> fns(header.matrix(1), header.matrix(2));
+ bf.reset(new jellyfish::mer_dna_bloom_filter(header.size(), header.nb_hashes(), in, fns));
+ if(!in.good())
+ throw std::runtime_error("Bloom filter file is truncated");
+ } else if(header.format() == "binary/sorted") {
+ binary_map.map(path);
+ jf.reset(new binary_query(binary_map.base() + header.offset(), header.key_len(), header.counter_len(), header.matrix(),
+ header.size() - 1, binary_map.length() - header.offset()));
+ } else {
+ throw std::runtime_error(std::string("Unsupported format '") + header.format() + "'");
+ }
+ }
+
+#ifdef SWIGPERL
+ unsigned int get(const MerDNA& m) { return jf ? jf->check(m) : bf->check(m); }
+#else
+ unsigned int __getitem__(const MerDNA& m) { return jf ? jf->check(m) : bf->check(m); }
+#endif
+ };
+%}
+
+%feature("autodoc", "Give random access to a Jellyfish database. Given a mer, it returns the count associated with that mer");
+class QueryMerFile {
+ public:
+ %feature("autodoc", "Open the jellyfish database");
+ QueryMerFile(const char* path) throw(std::runtime_error);
+
+ %feature("autodoc", "Get the count for the mer m");
+#ifdef SWIGPERL
+ unsigned int get(const MerDNA& m);
+#else
+ unsigned int __getitem__(const MerDNA& m);
+#endif
+};
+
+
+/****************************/
+/* Read output of jellyfish */
+/****************************/
+#ifdef SWIGRUBY
+%mixin ReadMerFile "Enumerable";
+#endif
+
+#ifdef SWIGPYTHON
+// For python iteratable, throw StopIteration if at end of iterator
+%exception __next__ {
+ $action;
+ if(!result.first) {
+ PyErr_SetString(PyExc_StopIteration, "Done");
+ SWIG_fail;
+ }
+ }
+%exception next {
+ $action;
+ if(!result.first) {
+ PyErr_SetString(PyExc_StopIteration, "Done");
+ SWIG_fail;
+ }
+ }
+%typemap(out) std::pair<const MerDNA*, uint64_t> {
+ SWIG_Object m = SWIG_NewPointerObj(const_cast<MerDNA*>(($1).first), SWIGTYPE_p_MerDNA, 0);
+ SWIG_Object c = SWIG_From(unsigned long)(($1).second);
+ %append_output(m);
+ %append_output(c);
+ }
+#endif
+
+#ifdef SWIGPERL
+// For perl, return an empty array at end of iterator
+%typemap(out) std::pair<const MerDNA*, uint64_t> {
+ if(($1).first) {
+ SWIG_Object m = SWIG_NewPointerObj(const_cast<MerDNA*>(($1).first), SWIGTYPE_p_MerDNA, 0);
+ SWIG_Object c = SWIG_From(unsigned long)(($1).second);
+ %append_output(m);
+ %append_output(c);
+ }
+ }
+#endif
+
+%{
+ class ReadMerFile {
+ std::ifstream in;
+ std::unique_ptr<binary_reader> binary;
+ std::unique_ptr<text_reader> text;
+
+ std::pair<const MerDNA*, uint64_t> next_mer__() {
+ std::pair<const MerDNA*, uint64_t> res((const MerDNA*)0, 0);
+ if(next_mer()) {
+ res.first = mer();
+ res.second = count();
+ }
+ return res;
+ }
+
+ public:
+ ReadMerFile(const char* path) throw(std::runtime_error) :
+ in(path)
+ {
+ if(!in.good())
+ throw std::runtime_error(std::string("Can't open file '") + path + "'");
+ jellyfish::file_header header(in);
+ jellyfish::mer_dna::k(header.key_len() / 2);
+ if(header.format() == binary_dumper::format)
+ binary.reset(new binary_reader(in, &header));
+ else if(header.format() == text_dumper::format)
+ text.reset(new text_reader(in, &header));
+ else
+ throw std::runtime_error(std::string("Unsupported format '") + header.format() + "'");
+ }
+
+ bool next_mer() {
+ if(binary) {
+ if(binary->next()) return true;
+ binary.reset();
+ } else if(text) {
+ if(text->next()) return true;
+ text.reset();
+ }
+ return false;
+ }
+
+ const MerDNA* mer() const { return static_cast<const MerDNA*>(binary ? &binary->key() : &text->key()); }
+ unsigned long count() const { return binary ? binary->val() : text->val(); }
+
+#ifdef SWIGRUBY
+ void each() {
+ if(!rb_block_given_p()) return;
+ while(next_mer()) {
+ auto m = SWIG_NewPointerObj(const_cast<MerDNA*>(mer()), SWIGTYPE_p_MerDNA, 0);
+ auto c = SWIG_From_unsigned_SS_long(count());
+ rb_yield(rb_ary_new3(2, m, c));
+ }
+ }
+#endif
+
+#ifdef SWIGPERL
+ std::pair<const MerDNA*, uint64_t> each() { return next_mer__(); }
+#endif
+
+#ifdef SWIGPYTHON
+ ReadMerFile* __iter__() { return this; }
+ std::pair<const MerDNA*, uint64_t> __next__() { return next_mer__(); }
+ std::pair<const MerDNA*, uint64_t> next() { return next_mer__(); }
+#endif
+ };
+%}
+
+%feature("autodoc", "Read a Jellyfish database sequentially");
+class ReadMerFile {
+ public:
+ %feature("autodoc", "Open the jellyfish database");
+ ReadMerFile(const char* path) throw(std::runtime_error);
+ %feature("autodoc", "Move to the next mer in the file. Returns false if no mers left, true otherwise");
+ bool next_mer();
+ %feature("autodoc", "Returns current mer");
+ const MerDNA* mer() const;
+ %feature("autodoc", "Returns the count of the current mer");
+ unsigned long count() const;
+
+ %feature("autodoc", "Iterate through all the mers in the file, passing two values: a mer and its count");
+#ifdef SWIGRUBY
+ void each();
+#endif
+
+#ifdef SWIGPERL
+ std::pair<const MerDNA*, uint64_t> each();
+#endif
+
+#ifdef SWIGPYTHON
+ ReadMerFile* __iter__();
+ std::pair<const MerDNA*, uint64_t> __next__();
+ std::pair<const MerDNA*, uint64_t> next() { return __next__(); }
+#endif
+ };
diff --git a/swig/perl5/Makefile.PL b/swig/perl5/Makefile.PL
new file mode 100644
index 0000000..f8461f9
--- /dev/null
+++ b/swig/perl5/Makefile.PL
@@ -0,0 +1,20 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use ExtUtils::MakeMaker;
+
+mkdir('lib');
+system('swig', '-c++', '-perl5', '-o', 'jellyfish_wrap.cxx', '../jellyfish.i');
+
+my $jf_cflags = `pkg-config --cflags jellyfish-2.0`;
+my $jf_libs = `pkg-config --libs jellyfish-2.0`;
+my $jf_rpath = `pkg-config --libs-only-L jellyfish-2.0 | sed -e 's/-L/-Wl,-rpath,/g'`;
+
+WriteMakefile(NAME => 'jellyfish',
+ CC => 'g++-4.4',
+ LD => 'g++-4.4',
+ CCFLAGS => "-std=c++0x $jf_cflags",
+ LIBS => "$jf_libs",
+ OBJECT => 'jellyfish_wrap.o',
+ VERSION => '0.0.1');
diff --git a/swig/perl5/Tupfile b/swig/perl5/Tupfile
new file mode 100644
index 0000000..85a8948
--- /dev/null
+++ b/swig/perl5/Tupfile
@@ -0,0 +1,14 @@
+include_rules
+
+export PKG_CONFIG_PATH
+SWIGFLAGS = -perl5
+CXXFLAGS += $(JELLYFISH_CFLAGS) $(PERL_CFLAGS) -fPIC
+LDFLAGS += -shared $(JELLYFISH_LIBS) $(JELLYFISH_RPATH) $(PERL_LIBS)
+
+: ../jellyfish.i |> !swigxx |> jellyfish_wrap.cxx | jellyfish.pm <jf>
+: jellyfish_wrap.cxx |> !cxx |>
+: jellyfish_wrap.o |> !lxxd |> jellyfish.so <jf>
+
+TESTS = t/test_mer_file.t t/test_hash_counter.t
+
+: foreach $(TESTS) | <jf> ../tests/<seq> |> $(PERL) -I. %f ../tests > %o 2>&1 |> %B
diff --git a/swig/perl5/t/test_hash_counter.t b/swig/perl5/t/test_hash_counter.t
new file mode 100644
index 0000000..1f5579c
--- /dev/null
+++ b/swig/perl5/t/test_hash_counter.t
@@ -0,0 +1,44 @@
+use strict;
+use warnings;
+use Test::More;
+use jellyfish;
+
+require_ok('jellyfish');
+my $data = shift(@ARGV);
+
+jellyfish::MerDNA::k(100);
+my $hash = jellyfish::HashCounter->new(1024, 5);
+
+# Check info
+ok(100 == jellyfish::MerDNA::k, "mer_dna k");
+ok(1024 == $hash->size, "Hash size");
+ok(5 == $hash->val_len, "Hash value length");
+
+# Test adding mers
+{
+ my $mer = jellyfish::MerDNA->new;
+ my $good = 1;
+ for(my $i = 0; $i < 1000; $i++) {
+ $mer->randomize();
+ my $val = int(rand(1000));
+ $good &&= $hash->add($mer, $val) or
+ (ok($good, "Adding to new mer") || last);
+ if($i % 3 > 0) {
+ my $nval = int(rand(1000));
+ $val += $nval;
+ if($i % 3 == 1) {
+ $good &&= !$hash->add($mer, $nval) or
+ (ok($good, "Adding to existing mer") || last);
+ } else {
+ $good &&= $hash->update_add($mer, $nval) or
+ (ok($good, "Updating existing mer") || last);
+ }
+ }
+ $good &&= $val == $hash->get($mer) or
+ (ok($good, "Value in hash") || last);
+
+ }
+ ok($good, "Adding mer to hash");
+}
+
+done_testing;
diff --git a/swig/perl5/t/test_mer_file.t b/swig/perl5/t/test_mer_file.t
new file mode 100644
index 0000000..2403545
--- /dev/null
+++ b/swig/perl5/t/test_mer_file.t
@@ -0,0 +1,51 @@
+use strict;
+use warnings;
+use Test::More;
+
+require_ok('jellyfish');
+my $data = shift(@ARGV);
+
+# Compare histo
+{
+ my $rf = jellyfish::ReadMerFile->new($data . "/sequence.jf");
+ my @histo;
+ $histo[$rf->count]++ while($rf->next_mer);
+
+ open(my $io, "<", $data . "/sequence.histo");
+ my @jf_histo;
+ while(<$io>) {
+ my ($freq, $count) = split;
+ $jf_histo[$freq] = $count;
+ }
+
+ is_deeply(\@histo, \@jf_histo, "Histogram");
+}
+
+# Compare dump
+{
+ my $rf = jellyfish::ReadMerFile->new($data . "/sequence.jf");
+ my $equal = open(my $io, "<", $data . "/sequence.dump");
+ while(<$io>) {
+ my ($mer, $count) = split;
+ $equal &&= $rf->next_mer;
+ $equal &&= ($mer eq $rf->mer);
+ $equal &&= ($count == $rf->count);
+ last unless $equal;
+ }
+ $equal &&= !$rf->next_mer;
+ ok($equal, "Dump");
+}
+
+# Query
+{
+ my $rf = jellyfish::ReadMerFile->new($data . "/sequence.jf");
+ my $qf = jellyfish::QueryMerFile->new($data . "/sequence.jf");
+ my $good = 1;
+ while(my ($mer, $count) = $rf->each) {
+ $good &&= $count == $qf->get($mer) or
+ (ok($good, "Query mer") || last);
+ }
+ ok($good, "Query identical to read");
+}
+
+done_testing;
diff --git a/swig/python/Tupfile b/swig/python/Tupfile
new file mode 100644
index 0000000..dd75133
--- /dev/null
+++ b/swig/python/Tupfile
@@ -0,0 +1,14 @@
+include_rules
+
+export PKG_CONFIG_PATH
+SWIGFLAGS = -python
+CXXFLAGS += $(JELLYFISH_CFLAGS) $(PYTHON_CFLAGS) -fPIC
+LDFLAGS += -shared $(JELLYFISH_LIBS) $(JELLYFISH_RPATH) $(PYTHON_LIBS)
+
+: ../jellyfish.i |> !swigxx |> jellyfish_wrap.cxx | jellyfish.py <jf>
+: jellyfish_wrap.cxx |> !cxx |>
+: jellyfish_wrap.o |> !lxxd |> _jellyfish.so <jf>
+
+TESTS = test_mer_file.py test_hash_counter.py
+
+: foreach $(TESTS) | <jf> ../tests/<seq> |> PYTHONPATH=.:$PYTHONPATH $(PYTHON) -B %f ../tests > %o 2>&1 |> %B
diff --git a/swig/python/setup.py b/swig/python/setup.py
new file mode 100644
index 0000000..1611889
--- /dev/null
+++ b/swig/python/setup.py
@@ -0,0 +1,45 @@
+#! /usr/bin/env python
+
+import os
+import re
+from distutils.core import setup, Extension
+
+# Don't use Extension support for swig, it is more annoying than
+# anything! (1)It does not support very well having the .i in a
+# different directory. (2)It runs swig every single time, even if it
+# ran successfully before. So (3)doing first build, then install as
+# root rebuilds the modules as root.
+swig_time = os.path.getmtime('../jellyfish.i')
+older = True
+try:
+ older = os.path.getmtime('jellyfish_wrap.cxx') < swig_time or os.path.getmtime('jellyfish.py') < swig_time
+except FileNotFoundError:
+ older = True
+
+if older:
+ print("Running swig: swig -c++ -python -o jellyfish_wrap.cxx ../jellyfish.i")
+ os.system("swig -c++ -python -o jellyfish_wrap.cxx ../jellyfish.i")
+
+jf_include = [re.sub(r'-I', '', x) for x in os.popen("pkg-config --cflags-only-I jellyfish-2.0").read().rstrip().split()]
+jf_cflags = os.popen("pkg-config --cflags-only-other").read().rstrip().split()
+
+jf_libs = [re.sub(r'-l', '', x) for x in os.popen("pkg-config --libs-only-l jellyfish-2.0").read().rstrip().split()]
+jf_libdir = [re.sub(r'-L', '', x) for x in os.popen("pkg-config --libs-only-L jellyfish-2.0").read().rstrip().split()]
+jf_rpath = [re.sub(r'^', '-Wl,-rpath,', x) for x in jf_libdir]
+jf_ldflags = os.popen("pkg-config --libs-only-other jellyfish-2.0").read().rstrip().split()
+
+
+jellyfish_module = Extension('_jellyfish',
+ sources = ['jellyfish_wrap.cxx'],
+ include_dirs = jf_include,
+ libraries = jf_libs,
+ library_dirs = jf_libdir,
+ extra_compile_args = ["-std=c++0x"] + jf_cflags,
+ extra_link_args = jf_ldflags + jf_rpath,
+ language = "c++")
+setup(name = 'jellyfish',
+ version = '0.0.1',
+ author = 'Guillaume Marcais',
+ description = 'Access to jellyfish k-mer counting',
+ ext_modules = [jellyfish_module],
+ py_modules = ["jellyfish"])
diff --git a/swig/python/test_hash_counter.py b/swig/python/test_hash_counter.py
new file mode 100644
index 0000000..8632d6d
--- /dev/null
+++ b/swig/python/test_hash_counter.py
@@ -0,0 +1,39 @@
+import unittest
+import sys
+import random
+import jellyfish
+
+class TestHashCounter(unittest.TestCase):
+ def setUp(self):
+ jellyfish.MerDNA.k(100)
+ self.hash = jellyfish.HashCounter(1024, 5)
+
+ def test_info(self):
+ self.assertEqual(100, jellyfish.MerDNA.k())
+ self.assertEqual(1024, self.hash.size())
+ self.assertEqual(5, self.hash.val_len())
+
+ def test_add(self):
+ mer = jellyfish.MerDNA()
+ good = True
+ for i in range(1000):
+ mer.randomize()
+ val = random.randrange(1000)
+ good = good and self.hash.add(mer, val)
+ if not good: break
+ if i % 3 > 0:
+ nval = random.randrange(1000)
+ val = val + nval
+ if i % 3 == 1:
+ good = good and (not self.hash.add(mer, nval))
+ else:
+ good = good and self.hash.update_add(mer, nval)
+ if not good: break
+ good = good and (val == self.hash.get(mer)) and (val == self.hash[mer])
+ if not good: break
+ self.assertTrue(good)
+
+
+if __name__ == '__main__':
+ data = sys.argv.pop(1)
+ unittest.main()
diff --git a/swig/python/test_mer_file.py b/swig/python/test_mer_file.py
new file mode 100644
index 0000000..34a8cf6
--- /dev/null
+++ b/swig/python/test_mer_file.py
@@ -0,0 +1,57 @@
+import jellyfish
+import unittest
+import sys
+import os
+from collections import Counter
+
+class TestMerFile(unittest.TestCase):
+ def setUp(self):
+ self.mf = jellyfish.ReadMerFile(os.path.join(data, "sequence.jf"))
+
+ def test_histo(self):
+ histo = Counter()
+ while self.mf.next_mer():
+ histo[self.mf.count()] += 1
+
+ jf_histo = Counter()
+ with open(os.path.join(data, "sequence.histo")) as f:
+ for line in f:
+ num, count = [int(n) for n in line.split()]
+ self.assertEqual(count, histo[num])
+
+ def test_dump(self):
+ good = True
+ with open(os.path.join(data, "sequence.dump")) as f:
+ for line in f:
+ good = good and self.mf.next_mer()
+ if not good: break
+ a = line.split()
+ good = good and a[0] == str(self.mf.mer()) and int(a[1]) == self.mf.count()
+ if not good: break
+ self.assertTrue(good)
+
+ def test_iter(self):
+ good = True
+ with open(os.path.join(data, "sequence.dump")) as f:
+ for mer, count in self.mf:
+ line = f.readline()
+ good = good and line
+ if not good: break
+ fmer, fcount = line.split()
+ good = good and fmer == str(mer) and int(fcount) == count
+ if not good: break
+ self.assertTrue(good)
+ line = f.readline()
+ self.assertTrue(not line)
+
+ def test_query(self):
+ good = True
+ qf = jellyfish.QueryMerFile(os.path.join(data, "sequence.jf"))
+ for mer, count in self.mf:
+ good = good and count == qf[mer]
+ if not good: break
+ self.assertTrue(good)
+
+if __name__ == '__main__':
+ data = sys.argv.pop(1)
+ unittest.main()
diff --git a/swig/ruby/Tupfile b/swig/ruby/Tupfile
new file mode 100644
index 0000000..c4ebb0d
--- /dev/null
+++ b/swig/ruby/Tupfile
@@ -0,0 +1,14 @@
+include_rules
+
+export PKG_CONFIG_PATH
+SWIGFLAGS = -ruby
+CXXFLAGS += $(JELLYFISH_CFLAGS) $(RUBY_CFLAGS) -fPIC
+LDFLAGS += -shared $(JELLYFISH_LIBS) $(JELLYFISH_RPATH) $(RUBY_LIBS)
+
+: ../jellyfish.i |> !swigxx |> jellyfish_wrap.cxx
+: jellyfish_wrap.cxx |> !cxx |>
+: jellyfish_wrap.o |> !lxxd |> jellyfish.so <jf>
+
+TESTS = test_mer_file.rb test_hash_counter.rb
+
+: foreach $(TESTS) | <jf> ../tests/<seq> |> $(RUBY) -I. %f ../tests > %o |> %B
diff --git a/swig/ruby/extconf.rb b/swig/ruby/extconf.rb
new file mode 100644
index 0000000..ea4aa2e
--- /dev/null
+++ b/swig/ruby/extconf.rb
@@ -0,0 +1,12 @@
+#! /usr/bin/env ruby
+
+require 'mkmf'
+
+swig = find_executable('swig')
+system(swig, '-c++', '-ruby', '-o', 'jellyfish_wrap.cxx', '../jellyfish.i')
+
+$defs << `pkg-config --cflags jellyfish-2.0`.chomp << '-std=c++0x'
+$libs << `pkg-config --libs jellyfish-2.0`.chomp
+$libs << `pkg-config --libs-only-L jellyfish-2.0 | sed -e 's/-L/-Wl,-rpath,/g'`.chomp
+
+create_makefile('jellyfish')
diff --git a/swig/ruby/test_hash_counter.rb b/swig/ruby/test_hash_counter.rb
new file mode 100644
index 0000000..6845d9d
--- /dev/null
+++ b/swig/ruby/test_hash_counter.rb
@@ -0,0 +1,42 @@
+require 'minitest/autorun'
+require 'jellyfish'
+
+class TestHashCounter < MiniTest::Unit::TestCase
+ def setup
+ Jellyfish::MerDNA::k(100)
+ @hash = Jellyfish::HashCounter.new(1024, 5)
+ end
+
+ def test_info
+ assert_equal(100, Jellyfish::MerDNA::k)
+ assert_equal(1024, @hash.size)
+ assert_equal(5, @hash.val_len)
+# assert_equal(1, @hash.nb_threads)
+ end
+
+ def test_add
+ mer = Jellyfish::MerDNA.new
+
+ 1000.times { |i|
+ mer.randomize!
+ val = rand(1000)
+ assert(@hash.add(mer, val))
+ if i % 3 > 0
+ nval = rand(1000)
+ val += nval
+ if i % 3 == 1
+ assert(!@hash.add(mer, nval))
+ else
+ assert(@hash.update_add(mer, nval))
+ end
+ end
+ assert_equal(val, @hash.get(mer))
+ assert_equal(val, @hash[mer])
+ }
+
+ mer.randomize!
+ assert_nil(@hash.get(mer))
+ assert_nil(@hash[mer])
+ assert(!@hash.update_add(mer, 1))
+ end
+end
diff --git a/swig/ruby/test_mer_file.rb b/swig/ruby/test_mer_file.rb
new file mode 100644
index 0000000..92dc60c
--- /dev/null
+++ b/swig/ruby/test_mer_file.rb
@@ -0,0 +1,57 @@
+require 'minitest/autorun'
+require 'jellyfish'
+
+$data = ARGV.shift
+
+class TestMerFile < MiniTest::Unit::TestCase
+ def setup
+ @mf = Jellyfish::ReadMerFile.new(File.join($data, "sequence.jf"))
+ end
+
+ def test_histo
+ histo = []
+ histo[@mf.count] = (histo[@mf.count] || 0) + 1 while @mf.next_mer
+
+ jf_histo = []
+ open(File.join($data, "sequence.histo")) { |f|
+ f.lines.each { |l|
+ freq, count = l.split.map {|x| x.to_i }
+ jf_histo[freq] = count
+ }
+ }
+
+ assert_equal jf_histo, histo
+ end
+
+ def test_each
+ open(File.join($data, "sequence.dump")) { |f|
+ @mf.each { |m, c|
+ l = f.readline
+ assert l
+ fm, fc = l.split
+ assert_equal fm, m.to_s
+ assert_equal fc.to_i, c
+ }
+ assert_raises(EOFError) { f.readline }
+ }
+ end
+
+ def test_dump
+ open(File.join($data, "sequence.dump")) { |f|
+ f.lines.each { |l|
+ mer, count = l.split
+ assert @mf.next_mer
+ assert_equal(mer, @mf.mer.to_s)
+ assert_equal(count.to_i, @mf.count)
+ }
+ }
+ assert !@mf.next_mer
+ end
+
+ def test_query
+ query = Jellyfish::QueryMerFile.new(File.join($data, "sequence.jf"))
+ @mf.each { |m, c|
+ assert_equal c, query[m]
+ }
+ end
+end
diff --git a/swig/tests/Tupfile b/swig/tests/Tupfile
new file mode 100644
index 0000000..6c717ee
--- /dev/null
+++ b/swig/tests/Tupfile
@@ -0,0 +1,6 @@
+include_rules
+
+: |> (echo ">read"; head -c 1000000 /dev/urandom | ruby -e 'b="ACGT"; STDIN.bytes.each { |x| 4.times { |i| print(b[(x >> (2*i)) & 3]) } }') > %o |> sequence.fasta
+: sequence.fasta |> $(JELLYFISH) count -m 10 -s 10M -t 10 -C -o %o %f |> sequence.jf <seq>
+: sequence.jf |> $(JELLYFISH) histo %f > %o |> sequence.histo <seq>
+: sequence.jf |> $(JELLYFISH) dump -c %f > %o |> sequence.dump <seq>
diff --git a/tests/big.sh b/tests/big.sh
index 5e5f1f7..5d983f0 100644
--- a/tests/big.sh
+++ b/tests/big.sh
@@ -8,23 +8,22 @@ if [ -z "$BIG" ]; then
exit 77
fi
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
f52abd3e2a7cc5089cc8f32cb607c4c5 ${pref}_16.histo
-eac5dafa9db7af2c5202dec8c6c33d00 ${pref}_16.stats
EOF
# $JF count -m 31 -s 4000000000 -o ${pref}_31 -c 4 -p 253 -C -r -t $nCPUs --timing ${pref}_31.timing \
# seq30g.fa && \
# $JF histo ${pref}_31_0 > ${pref}_31.histo && \
-echo "Generate 30 Gigs of sequence and count k-mers on it" && \
- ([ -f seq30g.fa ] || ${DIR}/generate_sequence -v -o seq30g -r 1000 -s 1602176487 30000000000) && \
- $JF count -m 16 -s 4000000000 -o ${pref}_16 -c 4 -p 253 -C --out-counter-len 2 \
- -t $nCPUs --timing ${pref}_16.timing --stats ${pref}_16.stats $JFPARAM seq30g.fa && \
- $JF histo ${pref}_16_0 > ${pref}_16.histo && \
+echo "Count k-mers on big data set" && \
+ ([ -f seq30g.fa ] || ${DIR}/generate_sequence -v -o seq30g -r 1000 -s 1602176487 30000000000) &&
+ $JF count -m 16 -s 4000000000 -o ${pref}_16.jf -c 4 -p 253 -C --out-counter-len 2 \
+ -t $nCPUs $JFPARAM seq30g.fa && \
+ $JF histo ${pref}_16.jf > ${pref}_16.histo && \
check ${pref}.md5sum
RET=$?
-echo "16-mer timing"; cat ${pref}_16.timing
+# echo "16-mer timing"; cat ${pref}_16.timing
exit $RET
diff --git a/tests/bloom_counter.sh b/tests/bloom_counter.sh
new file mode 100644
index 0000000..4244e48
--- /dev/null
+++ b/tests/bloom_counter.sh
@@ -0,0 +1,47 @@
+#! /bin/sh
+
+cd tests
+. ./compat.sh
+
+sort -k2,2 > ${pref}.md5sum <<EOF
+9251799dd5dbd3f617124aa2ff72112a ${pref}.histo
+9251799dd5dbd3f617124aa2ff72112a ${pref}_filtered.histo
+EOF
+
+cat > ${pref}_commands <<EOF
+gunzip -c seq1m_0.fa.gz
+gunzip -c seq1m_0.fa.gz
+EOF
+$JF bc -t $nCPUs -o ${pref}.bc -s 1M -C -m 40 --timing ${pref}.timing -g ${pref}_commands -G 2
+# Counting without filtering
+$JF count -t $nCPUs -o ${pref}.jf -s 2M -C -m 40 seq1m_0.fa
+# Filtereing should not do anything here: all mers are loaded twice in the bc
+$JF count -t $nCPUs -o ${pref}_filtered.jf --bc ${pref}.bc -s 2M -C -m 40 seq1m_0.fa
+
+$JF bc -t $nCPUs -o ${pref}_none.bc -s 2M -C -m 40 seq1m_0.fa seq1m_1.fa seq1m_1.fa
+$JF count -t $nCPUs -o ${pref}_none.jf --bc ${pref}_none.bc -s 1M -C -m 40 seq1m_0.fa
+$JF histo ${pref}_none.jf > ${pref}_none.histo
+
+$JF histo ${pref}.jf > ${pref}.histo
+$JF histo ${pref}_filtered.jf > ${pref}_filtered.histo
+
+TOTAL=$(cut -d\ -f2 ${pref}.histo)
+COLLISION=$(cut -d\ -f2 ${pref}_none.histo)
+# FPR is 1 in 1000. Should not get more than 1/500 collisions.
+[ $((TOTAL / 500 > COLLISION)) = 1 ] || {
+ echo >&2 "Too many collisions"
+ false
+}
+
+QUERY_TOT=$($JF query -s seq1m_0.fa ${pref}.bc | grep -c ' 2$')
+[ $QUERY_TOT = $TOTAL ] || {
+ echo >&2 "Queried count 2 mers should be all mers"
+ false
+}
+QUERY_COL=$($JF query -s seq1m_0.fa ${pref}_none.bc | grep -c ' 2$')
+[ $QUERY_COL = $COLLISION ] || {
+ echo >&2 "Queried count 2 mers should equal collisions"
+ false
+}
+
+check ${pref}.md5sum
diff --git a/tests/bloom_filter.sh b/tests/bloom_filter.sh
new file mode 100644
index 0000000..035a6a7
--- /dev/null
+++ b/tests/bloom_filter.sh
@@ -0,0 +1,23 @@
+#! /bin/sh
+
+cd tests
+. ./compat.sh
+
+# sort -k2,2 > ${pref}.md5sum <<EOF
+# EOF
+
+$JF count --bf-size 10M --bf-fp 0.001 -t $nCPUs -o ${pref}_10m.jf -s 1M -m 40 seq10m.fa
+$JF histo ${pref}_10m.jf > ${pref}_10m.histo
+COLLISIONS=$(cut -d\ -f2 ${pref}_10m.histo | paste -sd+ - | bc)
+[ $((COLLISIONS > 10000)) = 0 ] || {
+ echo >& "Too many collisions"
+ false
+}
+
+$JF count --bf-size 3M --bf-fp 0.001 -t $nCPUs -o ${pref}_3m.jf -s 1M -m 40 seq1m_0.fa seq1m_1.fa seq1m_0.fa seq1m_2.fa
+$JF histo ${pref}_3m.jf > ${pref}_3m.histo
+COLLISIONS=$(cut -d\ -f2 ${pref}_3m.histo | paste -sd+ - | bc)
+[ $((COLLISIONS - 1000000 > 20000)) = 0 ] || {
+ echo >& "Too many collisions"
+ false
+}
diff --git a/tests/compat.sh.in b/tests/compat.sh.in
index ee924d5..29bf812 100644
--- a/tests/compat.sh.in
+++ b/tests/compat.sh.in
@@ -3,14 +3,17 @@ if [ -z "$nCPUs" ]; then
fi
pref=$(basename $0 .sh)
DIR=../bin
-JF=$DIR/jellyfish
+JF="$DIR/jellyfish"
+[ -n "$VALGRIND" ] && JF="valgrind $JF"
check () {
- cut -d\ -f 2 $1 | xargs @MD5@ | sed -e 's/ \*//' | sort | diff -w $1 -
+ cut -d\ -f 2 $1 | xargs @MD5@ | sort -k2,2 | diff -w $DIFFFLAGS $1 -
}
+
if [ -n "$DEBUG" ]; then
set -x;
+ DIFFFLAGS="-y"
fi
set -e
diff --git a/tests/from_stream.sh b/tests/from_stream.sh
index ac8a5a1..5d3163a 100644
--- a/tests/from_stream.sh
+++ b/tests/from_stream.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
4fd24c05f7c18c47e7b69f77aa071f1f ${pref}_0
7059a4e90b6670b2d814e44e2bc7d429 ${pref}.histo
c3233e107bb6b42d0c979707f156264c ${pref}.query
diff --git a/tests/from_stream_fastq.sh b/tests/from_stream_fastq.sh
index c8843be..b1321f3 100644
--- a/tests/from_stream_fastq.sh
+++ b/tests/from_stream_fastq.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
c448e173e5e18264ed00fad0008d5340 ${pref}.histo
EOF
diff --git a/tests/generate_sequence.sh b/tests/generate_sequence.sh
index 75fead3..0ff6785 100755
--- a/tests/generate_sequence.sh
+++ b/tests/generate_sequence.sh
@@ -5,3 +5,9 @@ cd tests
${DIR}/generate_sequence -v -o seq10m -m 10 -m 22 -s 3141592653 10000000
${DIR}/generate_sequence -v -o seq1m -s 1040104553 1000000 1000000 1000000 1000000 1000000
+
+for i in 0 1 2 3 4; do
+ gzip -c seq1m_$i.fa > seq1m_$i.fa.gz
+done
+
+${DIR}/generate_sequence -v -q -o seq10m -s 1473540700 10000000
diff --git a/tests/large_key.sh b/tests/large_key.sh
new file mode 100644
index 0000000..c00f1d6
--- /dev/null
+++ b/tests/large_key.sh
@@ -0,0 +1,18 @@
+#! /bin/sh
+
+cd tests
+. ./compat.sh
+
+sort -k2,2 > ${pref}.md5sum <<EOF
+ded3925fe6bbaca10accc10d1bde11b5 ${pref}_m100_2M_ordered
+ded3925fe6bbaca10accc10d1bde11b5 ${pref}_m100_2k_ordered
+ded3925fe6bbaca10accc10d1bde11b5 ${pref}_m100_2k_disk_ordered
+EOF
+
+head -n 10001 seq1m_0.fa | time $JF count -t $nCPUs -o ${pref}_m100_2M.jf -s 2M -m 100 /dev/fd/0
+$JF dump -c ${pref}_m100_2M.jf | cut -d\ -f 1 | sort > ${pref}_m100_2M_ordered
+head -n 10001 seq1m_0.fa | time $JF count -t $nCPUs -o ${pref}_m100_2k.jf -s 2k -m 100 /dev/fd/0
+$JF dump -c ${pref}_m100_2k.jf | cut -d\ -f 1 | sort > ${pref}_m100_2k_ordered
+head -n 10001 seq1m_0.fa | time $JF count -t $nCPUs -o ${pref}_m100_2k_disk.jf -s 2k --disk -m 100 /dev/fd/0
+$JF dump -c ${pref}_m100_2k_disk.jf | cut -d\ -f 1 | sort > ${pref}_m100_2k_disk_ordered
+check ${pref}.md5sum
diff --git a/tests/merge.sh b/tests/merge.sh
index b2aa346..86c6e49 100644
--- a/tests/merge.sh
+++ b/tests/merge.sh
@@ -3,16 +3,28 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
-c448e173e5e18264ed00fad0008d5340 ${pref}_quake.histo
+sort -k2,2 > ${pref}.md5sum <<EOF
+72f1913b3503114c7df7a4dcc68ce867 ${pref}_m40_s16m.histo
+72f1913b3503114c7df7a4dcc68ce867 ${pref}_automerge_m40_s1m.histo
+72f1913b3503114c7df7a4dcc68ce867 ${pref}_m40_s1m_merged.histo
+72f1913b3503114c7df7a4dcc68ce867 ${pref}_m40_s1m_text.histo
EOF
-echo "Counting mers and merging" && \
- $JF count --quake --matrix seq10m_matrix_19 -m 19 -t $nCPUs \
- -o ${pref}_quake -s 3000000 --timing ${pref}_quake.timing seq10m.fq && \
- $JF qmerge -s 10000000 -m 19 -o ${pref}_quake_merged ${pref}_quake_[012] && \
- $JF qhisto -f -h 3 -i 0.01 -l 0 ${pref}_quake_merged_0 > ${pref}_quake.histo && \
- check ${pref}.md5sum
-RET=$?
-
-echo "Qmer timing"; cat ${pref}_quake.timing 2>/dev/null
-exit $RET
+
+FILES="seq1m_0.fa seq1m_1.fa seq1m_0.fa seq1m_2.fa seq1m_2.fa"
+echo $FILES | xargs $JF count -t $nCPUs -o ${pref}_m40_s16m.jf -s 4M -C -m 40
+$JF histo ${pref}_m40_s16m.jf > ${pref}_m40_s16m.histo
+
+ls | grep "^${pref}_m40_s1m[0-9].*" | xargs rm -f
+echo $FILES | xargs $JF count -t $nCPUs -o ${pref}_m40_s1m -s 1M --disk --no-merge -C -m 40
+$JF merge -o ${pref}_m40_s1m_merged.jf ${pref}_m40_s1m[0-9]*
+ls | grep "^${pref}_m40_s1m[0-9].*" | xargs rm -f
+
+echo $FILES | xargs $JF count -t $nCPUs -o ${pref}_automerge_m40_s1m.jf -s 1M --disk -C -m 40
+
+echo $FILES | xargs $JF count -t $nCPUs -o ${pref}_m40_s1m_text.jf -s 1M --text --disk -C -m 40
+
+$JF histo ${pref}_automerge_m40_s1m.jf > ${pref}_automerge_m40_s1m.histo
+$JF histo ${pref}_m40_s1m_merged.jf > ${pref}_m40_s1m_merged.histo
+$JF histo ${pref}_m40_s1m_text.jf > ${pref}_m40_s1m_text.histo
+
+check ${pref}.md5sum
diff --git a/tests/min_qual.sh b/tests/min_qual.sh
index ffc0120..024a9ee 100644
--- a/tests/min_qual.sh
+++ b/tests/min_qual.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
7f78bc16dedc972fc253bf1378e01561 ${pref}.histo
EOF
diff --git a/tests/multi_file.sh b/tests/multi_file.sh
index b1fe022..cdff3c7 100644
--- a/tests/multi_file.sh
+++ b/tests/multi_file.sh
@@ -3,16 +3,40 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
-0e2705617b44144daedc5f9e35ba7b93 ${pref}.stats
+sort -k2,2 > ${pref}.md5sum <<EOF
+d93b7678037814c256d1d9120a0e6422 ${pref}_m15_s2M.histo
+d93b7678037814c256d1d9120a0e6422 ${pref}_m15_s2M_zip.histo
EOF
-echo "Counting 22-mers on ${nCPUs} CPU" && \
- $JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs \
- -o $pref -s 5000000 --timing ${pref}.timing seq1m_*.fa && \
- $JF stats ${pref}_0 > ${pref}.stats && \
- check ${pref}.md5sum
-RET=$?
-
-# [ -z "$NODEL" ] && \
-# rm -f ${pref}_* ${pref}.md5sum ${pref}.timing ${pref}.stats
-exit $RET
+
+# Count multiple files with many readers
+$JF count -t $nCPUs -F 4 -o ${pref}_m15_s2M.jf -s 2M -C -m 15 seq1m_0.fa seq1m_1.fa seq1m_2.fa seq10m.fa seq1m_3.fa seq1m_4.fa
+$JF histo ${pref}_m15_s2M.jf > ${pref}_m15_s2M.histo
+
+cat > ${pref}_gunzip_cmds <<EOF
+
+
+ # Empty lines and comments just for fun
+
+EOF
+find . -name 'seq1m_*.fa.gz' | xargs -n 1 echo gunzip -c >> ${pref}_gunzip_cmds
+$JF count -t $nCPUs -g ${pref}_gunzip_cmds -G 2 -C -m 15 -s 2M -o ${pref}_m15_s2M_zip.jf seq10m.fa
+$JF histo ${pref}_m15_s2M_zip.jf > ${pref}_m15_s2M_zip.histo
+
+# Test failure of generator
+echo false > ${pref}_fail_cmds
+STATUS=
+$JF count -t $nCPUs -g ${pref}_fail_cmds -G 2 -C -m 15 -s 2M -o ${pref}_fail.jf || STATUS=$?
+if [ -z "$STATUS" ]; then
+ echo >&2 "Jellyfish did not report failure in generator command"
+ false
+fi
+
+# Test failure to open file
+STATUS=
+$JF count -t $nCPUs -C -m 15 -s 2M -o ${pref}_fail.jf non_existent_sequence.fa || STATUS=$?
+if [ -z "$STATUS" ]; then
+ echo >&2 "Jellyfish did not report failure in opening a file"
+ false
+fi
+
+check ${pref}.md5sum
diff --git a/tests/multi_file_fastq.sh b/tests/multi_file_fastq.sh
index 8b44334..dc7546d 100644
--- a/tests/multi_file_fastq.sh
+++ b/tests/multi_file_fastq.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
8ebb01305cbb36754ef060c1e37d6e4d ${pref}.histo
EOF
echo "Counting 22-mers on ${nCPUs} CPU" && \
diff --git a/tests/parallel_direct_indexing.sh b/tests/parallel_direct_indexing.sh
index ef7e046..f067ec7 100755
--- a/tests/parallel_direct_indexing.sh
+++ b/tests/parallel_direct_indexing.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
dcbb23c4a74a923c37a3b059f6a6d89a ${pref}_0
7b7419dea9e3917c2e27b7a7a35f64ca ${pref}.histo
7b7419dea9e3917c2e27b7a7a35f64ca ${pref}_S.histo
diff --git a/tests/parallel_fastq_direct_indexing.sh b/tests/parallel_fastq_direct_indexing.sh
index d69aae5..b18b840 100644
--- a/tests/parallel_fastq_direct_indexing.sh
+++ b/tests/parallel_fastq_direct_indexing.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
8bfdd1b137b73ebfed05d0496bbddd0c ${pref}.histo
9418b1a2e05a2526a81ae9b1200ed5df ${pref}_Q.histo
768e261fc7d7ede192f4a0eeae6e839f ${pref}_LU.histo
diff --git a/tests/parallel_fastq_hashing.sh b/tests/parallel_fastq_hashing.sh
index e01b6fd..d069acf 100644
--- a/tests/parallel_fastq_hashing.sh
+++ b/tests/parallel_fastq_hashing.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
c448e173e5e18264ed00fad0008d5340 ${pref}.histo
554c9c76fb1f54f2c7526dd1af5aa252 ${pref}_lines.dump
174c7b3873c8aaa5ffee36d5d405bbce ${pref}.stats
diff --git a/tests/parallel_fastq_sequence_hashing.sh b/tests/parallel_fastq_sequence_hashing.sh
index ed37a4c..0b1f838 100644
--- a/tests/parallel_fastq_sequence_hashing.sh
+++ b/tests/parallel_fastq_sequence_hashing.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
8a0fe8ee1293f341fbde69e670beb74c ${pref}.histo
EOF
echo "Counting 22-mers, fastq format, no quality, on ${nCPUs} CPU" && \
diff --git a/tests/parallel_hashing.sh b/tests/parallel_hashing.sh
index 6ff008f..6d3ab20 100755
--- a/tests/parallel_hashing.sh
+++ b/tests/parallel_hashing.sh
@@ -3,39 +3,80 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
-4fd24c05f7c18c47e7b69f77aa071f1f ${pref}_0
-7059a4e90b6670b2d814e44e2bc7d429 ${pref}.histo
-c3233e107bb6b42d0c979707f156264c ${pref}.query
-dbe881e4649406321d0e481da08eab5c ${pref}_L.dump
-dbe881e4649406321d0e481da08eab5c ${pref}.dump
-dbe881e4649406321d0e481da08eab5c ${pref}_stream.dump
-77054a9564aaf59fb330dfa6af92b428 ${pref}_all.dump
-77054a9564aaf59fb330dfa6af92b428 ${pref}_S_all.dump
-a210906960cf36c09eecad62a4c04973 ${pref}.stats
+sort -k2,2 > ${pref}.md5sum <<EOF
+864c0b0826854bdc72a85d170549b64b ${pref}_m15_s2M.histo
+864c0b0826854bdc72a85d170549b64b ${pref}_m15_s16M.histo
+41fd8408dde0ea14bec7425b1a877140 ${pref}_m15.stats
+376761a6e273b57b3428c14e3b536edf ${pref}_binary.dump
+376761a6e273b57b3428c14e3b536edf ${pref}_text.dump
+9251799dd5dbd3f617124aa2ff72112a ${pref}_binary.histo
+c30cba4fe2886cea4abb27f5c30ea35e ${pref}_binary.stats
+9251799dd5dbd3f617124aa2ff72112a ${pref}_text.histo
+c30cba4fe2886cea4abb27f5c30ea35e ${pref}_text.stats
+94625cd2d59e278f08421a673eb0926a ${pref}_m15_s2M_L2_U3.histo
+94625cd2d59e278f08421a673eb0926a ${pref}_m15_s2M_L2_U3_automerge.histo
+45fb383344e0fb0b7540718339be4c03 ${pref}_query_one_count
EOF
-echo "Counting 22-mers on ${nCPUs} CPU"
+
+# Count with in memory hash doubling
+$JF count -t $nCPUs -o ${pref}_m15_s2M.jf -s 2M -C -m 15 seq10m.fa
+$JF histo ${pref}_m15_s2M.jf > ${pref}_m15_s2M.histo
+$JF stats ${pref}_m15_s2M.jf > ${pref}_m15.stats
+
+# Count without size doubling
+$JF count -t $nCPUs -o ${pref}_m15_s16M.jf -s 16M -C -m 15 seq10m.fa
+$JF histo ${pref}_m15_s16M.jf > ${pref}_m15_s16M.histo
+
+# Count large merges in binary and text. Should agree
+$JF count -m 40 -t $nCPUs -o ${pref}_text.jf -s 2M --text seq1m_0.fa
+$JF count -m 40 -t $nCPUs -o ${pref}_binary.jf -s 2M seq1m_0.fa
+$JF histo ${pref}_text.jf > ${pref}_text.histo
+$JF stats ${pref}_text.jf > ${pref}_text.stats
+$JF histo ${pref}_binary.jf > ${pref}_binary.histo
+$JF stats ${pref}_binary.jf > ${pref}_binary.stats
+$JF dump -c ${pref}_text.jf | sort > ${pref}_text.dump
+$JF dump -c ${pref}_binary.jf | sort > ${pref}_binary.dump
+
+# Check the lower and upper count without merging
+$JF count -t $nCPUs -o ${pref}_m15_s2M_L2_U3.jf -s 2M -C -m 15 -L2 -U3 seq10m.fa
+$JF histo ${pref}_m15_s2M_L2_U3.jf > ${pref}_m15_s2M_L2_U3.histo
+
+# Check the lower and upper count limits with merging
+$JF count -t $nCPUs -o ${pref}_m15_s2M_L2_U3_automerge.jf -s 2M -C -m 15 -L2 -U3 --disk seq10m.fa
+$JF histo ${pref}_m15_s2M_L2_U3_automerge.jf > ${pref}_m15_s2M_L2_U3_automerge.histo
+
+# Check query
+$JF query ${pref}_binary.jf -s seq1m_0.fa | grep ' 1$' | wc -l | sed -e 's/ //g' > ${pref}_query_one_count
+# $JF query ${pref}_binary.jf -s seq1m_0.fa -C | grep ' 1$' | wc -l | sed -e 's/ //g' > ${pref}_query_canonical_one_count
+
+# $JF count -m 40 -t $nCPUs -o ${pref}_text -s 2M --text seq1m_0.fa
+# $JF info -s ${pref}_text0 | sort > ${pref}_text0_dump
+
+# $JF count -m 40 -t $nCPUs -o ${pref}_bin -s 2M seq1m_0.fa
+# $JF dump -c ${pref}_bin0 | sort > ${pref}_bin0_dump
+
+# $JF histo ${pref}_bin0 > ${pref}.histo
# Count all k-mers
-$JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs -o $pref \
- -s 10000000 --timing ${pref}.timing --stats ${pref}.stats seq10m.fa
-# Output only counts >= 2
-$JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs -o ${pref}_L \
- -s 10000000 --timing ${pref}.timing -L 2 seq10m.fa
-# Stream output
-$JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs -o /dev/fd/1 -O \
- -s 10000000 --timing ${pref}.timing --stats ${pref}.stats seq10m.fa | \
- cat > ${pref}_S
-
-$JF histo -f ${pref}_0 > ${pref}.histo
-$JF dump -c ${pref}_L_0 > ${pref}_L.dump
-$JF dump -c -L 2 ${pref}_0 > ${pref}.dump
-cat ${pref}_0 | $JF dump -c -L 2 /dev/fd/0 > ${pref}_stream.dump
-echo "GCCATTTCGATTAAAGAATGAT TAGGCATGCAACGCTTCCCTTT" | $JF query ${pref}_0 > ${pref}.query
-$JF dump -c ${pref}_0 > ${pref}_all.dump
-$JF dump -c ${pref}_S > ${pref}_S_all.dump
+# $JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs -o $pref \
+# -s 10000000 --timing ${pref}.timing --stats ${pref}.stats seq10m.fa
+# # Output only counts >= 2
+# $JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs -o ${pref}_L \
+# -s 10000000 --timing ${pref}.timing -L 2 seq10m.fa
+# # Stream output
+# $JF count --matrix seq10m_matrix_22 -m 22 -t $nCPUs -o /dev/fd/1 -O \
+# -s 10000000 --timing ${pref}.timing --stats ${pref}.stats seq10m.fa | \
+# cat > ${pref}_S
+
+# $JF histo -f ${pref}_0 > ${pref}.histo
+# $JF dump -c ${pref}_L_0 > ${pref}_L.dump
+# $JF dump -c -L 2 ${pref}_0 > ${pref}.dump
+# cat ${pref}_0 | $JF dump -c -L 2 /dev/fd/0 > ${pref}_stream.dump
+# echo "GCCATTTCGATTAAAGAATGAT TAGGCATGCAACGCTTCCCTTT" | $JF query ${pref}_0 > ${pref}.query
+# $JF dump -c ${pref}_0 > ${pref}_all.dump
+# $JF dump -c ${pref}_S > ${pref}_S_all.dump
check ${pref}.md5sum
-cat ${pref}.timing
+# cat ${pref}.timing
diff --git a/tests/parsers.sh b/tests/parsers.sh
index f41dbc6..043845a 100644
--- a/tests/parsers.sh
+++ b/tests/parsers.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
EOF
echo "Test double fifo" &&
diff --git a/tests/quality_filter.sh b/tests/quality_filter.sh
new file mode 100644
index 0000000..3144eb3
--- /dev/null
+++ b/tests/quality_filter.sh
@@ -0,0 +1,25 @@
+#! /bin/sh
+
+cd tests
+. ./compat.sh
+
+sort -k2,2 > ${pref}.md5sum <<EOF
+46c5d23c3560cf908fea997fff8abc1c ${pref}.histo
+46c5d23c3560cf908fea997fff8abc1c ${pref}_q at .histo
+d41d8cd98f00b204e9800998ecf8427e ${pref}_qi.histo
+4faa0517f41d7dc808ec0b930fe0d88e ${pref}_qC.histo
+EOF
+
+count_histo () {
+ PREFIX=$1
+ shift
+ $JF count -t $nCPUs -o $PREFIX.jf -s 10M -C -m 15 seq10m.fq "$@"
+ $JF histo $PREFIX.jf > $PREFIX.histo
+}
+
+count_histo ${pref}
+count_histo ${pref}_q@ -Q '@'
+count_histo ${pref}_qi -Q 'i'
+count_histo ${pref}_qC -Q 'C'
+
+check ${pref}.md5sum
diff --git a/tests/raw_hash.sh b/tests/raw_hash.sh
index d93e18c..0a1e4b8 100644
--- a/tests/raw_hash.sh
+++ b/tests/raw_hash.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
5c5d07dfb4e3de89b7fe4c72c714b921 ${pref}.stats
dbe881e4649406321d0e481da08eab5c ${pref}_L.dump
c3233e107bb6b42d0c979707f156264c ${pref}.query
diff --git a/tests/serial_direct_indexing.sh b/tests/serial_direct_indexing.sh
index d813a16..b67230a 100755
--- a/tests/serial_direct_indexing.sh
+++ b/tests/serial_direct_indexing.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
dcbb23c4a74a923c37a3b059f6a6d89a ${pref}_0
EOF
echo "Counting 10-mers on 1 CPU" && \
diff --git a/tests/serial_hashing.sh b/tests/serial_hashing.sh
index fc35d92..6eabf7f 100755
--- a/tests/serial_hashing.sh
+++ b/tests/serial_hashing.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
4fd24c05f7c18c47e7b69f77aa071f1f ${pref}_0
7059a4e90b6670b2d814e44e2bc7d429 ${pref}.histo
EOF
diff --git a/tests/small.sh b/tests/small.sh
index 28bea2a..b4dc487 100755
--- a/tests/small.sh
+++ b/tests/small.sh
@@ -3,7 +3,7 @@
cd tests
. ./compat.sh
-sort > ${pref}.md5sum <<EOF
+sort -k2,2 > ${pref}.md5sum <<EOF
bbceae352707eaa945ce2057137f3a7a ${pref}.histo
c697577f78593fef303b5fcaad86e336 ${pref}.stats
EOF
diff --git a/tests/subset_hashing.sh b/tests/subset_hashing.sh
new file mode 100644
index 0000000..092d4a8
--- /dev/null
+++ b/tests/subset_hashing.sh
@@ -0,0 +1,19 @@
+#! /bin/sh
+
+cd tests/
+. ./compat.sh
+
+sort -k2,2 > ${pref}.md5sum <<EOF
+bd7a5f6ba000b282cd79cb9f342e7ede ${pref}_m35_s2M_if.histo
+8eb6d4a50aeba178e4847c2da71dbb70 ${pref}_m10_s2M_if.histo
+EOF
+
+# Partial count (in _0 and _2) with 35-mers
+$JF count -t $nCPUs -o ${pref}_m35_s2M_if.jf -s 2M -C -m 35 --if seq1m_0.fa --if seq1m_2.fa seq1m_1.fa seq1m_0.fa seq1m_3.fa seq1m_2.fa
+$JF histo ${pref}_m35_s2M_if.jf > ${pref}_m35_s2M_if.histo
+
+# Idem with 10-mers
+$JF count -t $nCPUs -o ${pref}_m10_s2M_if.jf -s 6M -C -m 10 --if seq1m_0.fa --if seq1m_2.fa seq1m_1.fa seq1m_0.fa seq1m_3.fa seq1m_2.fa
+$JF histo ${pref}_m10_s2M_if.jf > ${pref}_m10_s2M_if.histo
+
+check ${pref}.md5sum
diff --git a/unit_tests/Makefile b/unit_tests/Makefile
new file mode 100644
index 0000000..7906558
--- /dev/null
+++ b/unit_tests/Makefile
@@ -0,0 +1,82 @@
+# SYNOPSIS:
+#
+# make [all] - makes everything.
+# make TARGET - makes the given target.
+# make clean - removes all files generated by make.
+
+# Points to the root of Google Test, relative to where this file is.
+# Remember to tweak this if you move this file.
+GTEST_DIR = gtest-1.4.0
+
+# Where to find user code.
+UPDIR = $(realpath ..)
+USER_DIR = $(UPDIR)
+
+VPATH = $(USER_DIR)
+
+CC = g++
+# Flags passed to the preprocessor.
+CPPFLAGS += -I. -I$(GTEST_DIR) -I$(GTEST_DIR)/include $(patsubst %,-I%,$(USER_DIR)) -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS -DHAVE_SSE
+
+# Flags passed to the C++ compiler.
+# For profiling -fprofile-arcs -ftest-coverage -O0
+# TODO: remove lax-vector-conversions
+CXXFLAGS += -g -Wall -Wextra -Werror -DSSE -march=native -msse -msse2 -O3
+
+LDFLAGS = -lpthread -lrt -lm
+
+# All tests produced by this Makefile. Remember to add new tests you
+# created to the list.
+#TESTS = test_large_block test_mutex test_cond test_packed_key_value_array test_square_binary_matrix test_misc test_offsets_key_value
+TESTS = test_offsets_key_value
+SOURCES = $(patsubst %,%.cc,$(TESTS))
+
+# All Google Test headers. Usually you shouldn't change this
+# definition.
+GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
+ $(GTEST_DIR)/include/gtest/internal/*.h
+
+# House-keeping build targets.
+
+%.d: %.cc
+ $(CC) -M -MM -MG -MP $(CPPFLAGS) $< > $@.tmp
+ sed -e 's/$*.o/& $@/g' $@.tmp > $@ && rm $@.tmp
+
+all : $(TESTS)
+
+run: all
+ @for i in $(TESTS); do ./$$i; done
+
+clean :
+ rm -f $(TESTS) gtest.a gtest_main.a *.o
+
+$(TESTS): gtest_main.a
+
+# Some extra dependencies
+test_packed_key_value_array: storage.o
+
+test_square_binary_matrix: square_binary_matrix.o
+
+# Builds gtest.a and gtest_main.a.
+
+# Usually you shouldn't tweak such internal variables, indicated by a
+# trailing _.
+GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)
+
+# For simplicity and to avoid depending on Google Test's
+# implementation details, the dependencies specified below are
+# conservative and not optimized. This is fine as Google Test
+# compiles fast and for ordinary users its source rarely changes.
+gtest-all.o : $(GTEST_SRCS_)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(GTEST_DIR)/src/gtest-all.cc
+
+gtest_main.o : $(GTEST_SRCS_)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(GTEST_DIR)/src/gtest_main.cc
+
+gtest.a : gtest-all.o
+ $(AR) $(ARFLAGS) $@ $^
+
+gtest_main.a : gtest-all.o gtest_main.o
+ $(AR) $(ARFLAGS) $@ $^
+
+include $(SOURCES:.cc=.d)
diff --git a/unit_tests/gtest/gtest.h b/unit_tests/gtest/gtest.h
new file mode 100644
index 0000000..4f3804f
--- /dev/null
+++ b/unit_tests/gtest/gtest.h
@@ -0,0 +1,20061 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for Google Test. It should be
+// included by any test program that uses Google Test.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
+// program!
+//
+// Acknowledgment: Google Test borrowed the idea of automatic test
+// registration from Barthelemy Dagenais' (barthelemy at prologique.com)
+// easyUnit framework.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_H_
+
+#include <limits>
+#include <ostream>
+#include <vector>
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares functions and macros used internally by
+// Google Test. They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan)
+//
+// Low-level types and utilities for porting Google Test to various
+// platforms. They are subject to change without notice. DO NOT USE
+// THEM IN USER CODE.
+//
+// This file is fundamental to Google Test. All other Google Test source
+// files are expected to #include this. Therefore, it cannot #include
+// any other Google Test header.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+// The user can define the following macros in the build script to
+// control Google Test's behavior. If the user doesn't define a macro
+// in this list, Google Test will define it.
+//
+// GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2)
+// is/isn't available.
+// GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions
+// are enabled.
+// GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string
+// is/isn't available (some systems define
+// ::string, which is different to std::string).
+// GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
+// is/isn't available (some systems define
+// ::wstring, which is different to std::wstring).
+// GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular
+// expressions are/aren't available.
+// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h>
+// is/isn't available.
+// GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't
+// enabled.
+// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that
+// std::wstring does/doesn't work (Google Test can
+// be used where std::wstring is unavailable).
+// GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple
+// is/isn't available.
+// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the
+// compiler supports Microsoft's "Structured
+// Exception Handling".
+// GTEST_HAS_STREAM_REDIRECTION
+// - Define it to 1/0 to indicate whether the
+// platform supports I/O stream redirection using
+// dup() and dup2().
+// GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google
+// Test's own tr1 tuple implementation should be
+// used. Unused when the user sets
+// GTEST_HAS_TR1_TUPLE to 0.
+// GTEST_LANG_CXX11 - Define it to 1/0 to indicate that Google Test
+// is building in C++11/C++98 mode.
+// GTEST_LINKED_AS_SHARED_LIBRARY
+// - Define to 1 when compiling tests that use
+// Google Test as a shared library (known as
+// DLL on Windows).
+// GTEST_CREATE_SHARED_LIBRARY
+// - Define to 1 when compiling Google Test itself
+// as a shared library.
+
+// This header defines the following utilities:
+//
+// Macros indicating the current platform (defined to 1 if compiled on
+// the given platform; otherwise undefined):
+// GTEST_OS_AIX - IBM AIX
+// GTEST_OS_CYGWIN - Cygwin
+// GTEST_OS_HPUX - HP-UX
+// GTEST_OS_LINUX - Linux
+// GTEST_OS_LINUX_ANDROID - Google Android
+// GTEST_OS_MAC - Mac OS X
+// GTEST_OS_IOS - iOS
+// GTEST_OS_IOS_SIMULATOR - iOS simulator
+// GTEST_OS_NACL - Google Native Client (NaCl)
+// GTEST_OS_OPENBSD - OpenBSD
+// GTEST_OS_QNX - QNX
+// GTEST_OS_SOLARIS - Sun Solaris
+// GTEST_OS_SYMBIAN - Symbian
+// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile)
+// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop
+// GTEST_OS_WINDOWS_MINGW - MinGW
+// GTEST_OS_WINDOWS_MOBILE - Windows Mobile
+// GTEST_OS_ZOS - z/OS
+//
+// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
+// most stable support. Since core members of the Google Test project
+// don't have access to other platforms, support for them may be less
+// stable. If you notice any problems on your platform, please notify
+// googletestframework at googlegroups.com (patches for fixing them are
+// even more welcome!).
+//
+// Note that it is possible that none of the GTEST_OS_* macros are defined.
+//
+// Macros indicating available Google Test features (defined to 1 if
+// the corresponding feature is supported; otherwise undefined):
+// GTEST_HAS_COMBINE - the Combine() function (for value-parameterized
+// tests)
+// GTEST_HAS_DEATH_TEST - death tests
+// GTEST_HAS_PARAM_TEST - value-parameterized tests
+// GTEST_HAS_TYPED_TEST - typed tests
+// GTEST_HAS_TYPED_TEST_P - type-parameterized tests
+// GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with
+// GTEST_HAS_POSIX_RE (see above) which users can
+// define themselves.
+// GTEST_USES_SIMPLE_RE - our own simple regex is used;
+// the above two are mutually exclusive.
+// GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
+//
+// Macros for basic C++ coding:
+// GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
+// GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a
+// variable don't have to be used.
+// GTEST_DISALLOW_ASSIGN_ - disables operator=.
+// GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
+// GTEST_MUST_USE_RESULT_ - declares that a function's result must be used.
+//
+// Synchronization:
+// Mutex, MutexLock, ThreadLocal, GetThreadCount()
+// - synchronization primitives.
+// GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
+// synchronization primitives have real implementations
+// and Google Test is thread-safe; or 0 otherwise.
+//
+// Template meta programming:
+// is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only.
+// IteratorTraits - partial implementation of std::iterator_traits, which
+// is not available in libCstd when compiled with Sun C++.
+//
+// Smart pointers:
+// scoped_ptr - as in TR2.
+//
+// Regular expressions:
+// RE - a simple regular expression class using the POSIX
+// Extended Regular Expression syntax on UNIX-like
+// platforms, or a reduced regular exception syntax on
+// other platforms, including Windows.
+//
+// Logging:
+// GTEST_LOG_() - logs messages at the specified severity level.
+// LogToStderr() - directs all log messages to stderr.
+// FlushInfoLog() - flushes informational log messages.
+//
+// Stdout and stderr capturing:
+// CaptureStdout() - starts capturing stdout.
+// GetCapturedStdout() - stops capturing stdout and returns the captured
+// string.
+// CaptureStderr() - starts capturing stderr.
+// GetCapturedStderr() - stops capturing stderr and returns the captured
+// string.
+//
+// Integer types:
+// TypeWithSize - maps an integer to a int type.
+// Int32, UInt32, Int64, UInt64, TimeInMillis
+// - integers of known sizes.
+// BiggestInt - the biggest signed integer type.
+//
+// Command-line utilities:
+// GTEST_FLAG() - references a flag.
+// GTEST_DECLARE_*() - declares a flag.
+// GTEST_DEFINE_*() - defines a flag.
+// GetInjectableArgvs() - returns the command line as a vector of strings.
+//
+// Environment variable utilities:
+// GetEnv() - gets the value of an environment variable.
+// BoolFromGTestEnv() - parses a bool environment variable.
+// Int32FromGTestEnv() - parses an Int32 environment variable.
+// StringFromGTestEnv() - parses a string environment variable.
+
+#include <ctype.h> // for isspace, etc
+#include <stddef.h> // for ptrdiff_t
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#ifndef _WIN32_WCE
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif // !_WIN32_WCE
+
+#if defined __APPLE__
+# include <AvailabilityMacros.h>
+# include <TargetConditionals.h>
+#endif
+
+#include <iostream> // NOLINT
+#include <sstream> // NOLINT
+#include <string> // NOLINT
+
+#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
+#define GTEST_FLAG_PREFIX_ "gtest_"
+#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
+#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
+#define GTEST_NAME_ "Google Test"
+#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
+
+// Determines the version of gcc that is used to compile this.
+#ifdef __GNUC__
+// 40302 means version 4.3.2.
+# define GTEST_GCC_VER_ \
+ (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+#endif // __GNUC__
+
+// Determines the platform on which Google Test is compiled.
+#ifdef __CYGWIN__
+# define GTEST_OS_CYGWIN 1
+#elif defined __SYMBIAN32__
+# define GTEST_OS_SYMBIAN 1
+#elif defined _WIN32
+# define GTEST_OS_WINDOWS 1
+# ifdef _WIN32_WCE
+# define GTEST_OS_WINDOWS_MOBILE 1
+# elif defined(__MINGW__) || defined(__MINGW32__)
+# define GTEST_OS_WINDOWS_MINGW 1
+# else
+# define GTEST_OS_WINDOWS_DESKTOP 1
+# endif // _WIN32_WCE
+#elif defined __APPLE__
+# define GTEST_OS_MAC 1
+# if TARGET_OS_IPHONE
+# define GTEST_OS_IOS 1
+# if TARGET_IPHONE_SIMULATOR
+# define GTEST_OS_IOS_SIMULATOR 1
+# endif
+# endif
+#elif defined __linux__
+# define GTEST_OS_LINUX 1
+# if defined __ANDROID__
+# define GTEST_OS_LINUX_ANDROID 1
+# endif
+#elif defined __MVS__
+# define GTEST_OS_ZOS 1
+#elif defined(__sun) && defined(__SVR4)
+# define GTEST_OS_SOLARIS 1
+#elif defined(_AIX)
+# define GTEST_OS_AIX 1
+#elif defined(__hpux)
+# define GTEST_OS_HPUX 1
+#elif defined __native_client__
+# define GTEST_OS_NACL 1
+#elif defined __OpenBSD__
+# define GTEST_OS_OPENBSD 1
+#elif defined __QNX__
+# define GTEST_OS_QNX 1
+#endif // __CYGWIN__
+
+#ifndef GTEST_LANG_CXX11
+// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
+// -std={c,gnu}++{0x,11} is passed. The C++11 standard specifies a
+// value for __cplusplus, and recent versions of clang, gcc, and
+// probably other compilers set that too in C++11 mode.
+# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
+// Compiling in at least C++11 mode.
+# define GTEST_LANG_CXX11 1
+# else
+# define GTEST_LANG_CXX11 0
+# endif
+#endif
+
+// Brings in definitions for functions used in the testing::internal::posix
+// namespace (read, write, close, chdir, isatty, stat). We do not currently
+// use them on Windows Mobile.
+#if !GTEST_OS_WINDOWS
+// This assumes that non-Windows OSes provide unistd.h. For OSes where this
+// is not the case, we need to include headers that provide the functions
+// mentioned above.
+# include <unistd.h>
+# include <strings.h>
+#elif !GTEST_OS_WINDOWS_MOBILE
+# include <direct.h>
+# include <io.h>
+#endif
+
+#if GTEST_OS_LINUX_ANDROID
+// Used to define __ANDROID_API__ matching the target NDK API level.
+# include <android/api-level.h> // NOLINT
+#endif
+
+// Defines this to true iff Google Test can use POSIX regular expressions.
+#ifndef GTEST_HAS_POSIX_RE
+# if GTEST_OS_LINUX_ANDROID
+// On Android, <regex.h> is only available starting with Gingerbread.
+# define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
+# else
+# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# endif
+#endif
+
+#if GTEST_HAS_POSIX_RE
+
+// On some platforms, <regex.h> needs someone to define size_t, and
+// won't compile otherwise. We can #include it here as we already
+// included <stdlib.h>, which is guaranteed to define size_t through
+// <stddef.h>.
+# include <regex.h> // NOLINT
+
+# define GTEST_USES_POSIX_RE 1
+
+#elif GTEST_OS_WINDOWS
+
+// <regex.h> is not available on Windows. Use our own simple regex
+// implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#else
+
+// <regex.h> may not be available on this platform. Use our own
+// simple regex implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#endif // GTEST_HAS_POSIX_RE
+
+#ifndef GTEST_HAS_EXCEPTIONS
+// The user didn't tell us whether exceptions are enabled, so we need
+// to figure it out.
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
+// macro to enable exceptions, so we'll do the same.
+// Assumes that exceptions are enabled by default.
+# ifndef _HAS_EXCEPTIONS
+# define _HAS_EXCEPTIONS 1
+# endif // _HAS_EXCEPTIONS
+# define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
+# elif defined(__GNUC__) && __EXCEPTIONS
+// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
+# define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__SUNPRO_CC)
+// Sun Pro CC supports exceptions. However, there is no compile-time way of
+// detecting whether they are enabled or not. Therefore, we assume that
+// they are enabled unless the user tells us otherwise.
+# define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__IBMCPP__) && __EXCEPTIONS
+// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
+# define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__HP_aCC)
+// Exception handling is in effect by default in HP aCC compiler. It has to
+// be turned of by +noeh compiler option if desired.
+# define GTEST_HAS_EXCEPTIONS 1
+# else
+// For other compilers, we assume exceptions are disabled to be
+// conservative.
+# define GTEST_HAS_EXCEPTIONS 0
+# endif // defined(_MSC_VER) || defined(__BORLANDC__)
+#endif // GTEST_HAS_EXCEPTIONS
+
+#if !defined(GTEST_HAS_STD_STRING)
+// Even though we don't use this macro any longer, we keep it in case
+// some clients still depend on it.
+# define GTEST_HAS_STD_STRING 1
+#elif !GTEST_HAS_STD_STRING
+// The user told us that ::std::string isn't available.
+# error "Google Test cannot be used where ::std::string isn't available."
+#endif // !defined(GTEST_HAS_STD_STRING)
+
+#ifndef GTEST_HAS_GLOBAL_STRING
+// The user didn't tell us whether ::string is available, so we need
+// to figure it out.
+
+# define GTEST_HAS_GLOBAL_STRING 0
+
+#endif // GTEST_HAS_GLOBAL_STRING
+
+#ifndef GTEST_HAS_STD_WSTRING
+// The user didn't tell us whether ::std::wstring is available, so we need
+// to figure it out.
+// TODO(wan at google.com): uses autoconf to detect whether ::std::wstring
+// is available.
+
+// Cygwin 1.7 and below doesn't support ::std::wstring.
+// Solaris' libc++ doesn't support it either. Android has
+// no support for it at least as recent as Froyo (2.2).
+# define GTEST_HAS_STD_WSTRING \
+ (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
+
+#endif // GTEST_HAS_STD_WSTRING
+
+#ifndef GTEST_HAS_GLOBAL_WSTRING
+// The user didn't tell us whether ::wstring is available, so we need
+// to figure it out.
+# define GTEST_HAS_GLOBAL_WSTRING \
+ (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
+#endif // GTEST_HAS_GLOBAL_WSTRING
+
+// Determines whether RTTI is available.
+#ifndef GTEST_HAS_RTTI
+// The user didn't tell us whether RTTI is enabled, so we need to
+// figure it out.
+
+# ifdef _MSC_VER
+
+# ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled.
+# define GTEST_HAS_RTTI 1
+# else
+# define GTEST_HAS_RTTI 0
+# endif
+
+// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
+
+# ifdef __GXX_RTTI
+// When building against STLport with the Android NDK and with
+// -frtti -fno-exceptions, the build fails at link time with undefined
+// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
+// so disable RTTI when detected.
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
+ !defined(__EXCEPTIONS)
+# define GTEST_HAS_RTTI 0
+# else
+# define GTEST_HAS_RTTI 1
+# endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
+# else
+# define GTEST_HAS_RTTI 0
+# endif // __GXX_RTTI
+
+// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
+// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
+// first version with C++ support.
+# elif defined(__clang__)
+
+# define GTEST_HAS_RTTI __has_feature(cxx_rtti)
+
+// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
+// both the typeid and dynamic_cast features are present.
+# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
+
+# ifdef __RTTI_ALL__
+# define GTEST_HAS_RTTI 1
+# else
+# define GTEST_HAS_RTTI 0
+# endif
+
+# else
+
+// For all other compilers, we assume RTTI is enabled.
+# define GTEST_HAS_RTTI 1
+
+# endif // _MSC_VER
+
+#endif // GTEST_HAS_RTTI
+
+// It's this header's responsibility to #include <typeinfo> when RTTI
+// is enabled.
+#if GTEST_HAS_RTTI
+# include <typeinfo>
+#endif
+
+// Determines whether Google Test can use the pthreads library.
+#ifndef GTEST_HAS_PTHREAD
+// The user didn't tell us explicitly, so we assume pthreads support is
+// available on Linux and Mac.
+//
+// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
+// to your compiler flags.
+# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
+ || GTEST_OS_QNX)
+#endif // GTEST_HAS_PTHREAD
+
+#if GTEST_HAS_PTHREAD
+// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
+// true.
+# include <pthread.h> // NOLINT
+
+// For timespec and nanosleep, used below.
+# include <time.h> // NOLINT
+#endif
+
+// Determines whether Google Test can use tr1/tuple. You can define
+// this macro to 0 to prevent Google Test from using tuple (any
+// feature depending on tuple with be disabled in this mode).
+#ifndef GTEST_HAS_TR1_TUPLE
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
+// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
+# define GTEST_HAS_TR1_TUPLE 0
+# else
+// The user didn't tell us not to do it, so we assume it's OK.
+# define GTEST_HAS_TR1_TUPLE 1
+# endif
+#endif // GTEST_HAS_TR1_TUPLE
+
+// Determines whether Google Test's own tr1 tuple implementation
+// should be used.
+#ifndef GTEST_USE_OWN_TR1_TUPLE
+// The user didn't tell us, so we need to figure it out.
+
+// We use our own TR1 tuple if we aren't sure the user has an
+// implementation of it already. At this time, libstdc++ 4.0.0+ and
+// MSVC 2010 are the only mainstream standard libraries that come
+// with a TR1 tuple implementation. NVIDIA's CUDA NVCC compiler
+// pretends to be GCC by defining __GNUC__ and friends, but cannot
+// compile GCC's tuple implementation. MSVC 2008 (9.0) provides TR1
+// tuple in a 323 MB Feature Pack download, which we cannot assume the
+// user has. QNX's QCC compiler is a modified GCC but it doesn't
+// support TR1 tuple. libc++ only provides std::tuple, in C++11 mode,
+// and it can be used with some compilers that define __GNUC__.
+# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
+ && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
+# define GTEST_ENV_HAS_TR1_TUPLE_ 1
+# endif
+
+// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
+// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
+// can build with clang but need to use gcc4.2's libstdc++).
+# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
+# define GTEST_ENV_HAS_STD_TUPLE_ 1
+# endif
+
+# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
+# define GTEST_USE_OWN_TR1_TUPLE 0
+# else
+# define GTEST_USE_OWN_TR1_TUPLE 1
+# endif
+
+#endif // GTEST_USE_OWN_TR1_TUPLE
+
+// To avoid conditional compilation everywhere, we make it
+// gtest-port.h's responsibility to #include the header implementing
+// tr1/tuple.
+#if GTEST_HAS_TR1_TUPLE
+
+# if GTEST_USE_OWN_TR1_TUPLE
+// This file was GENERATED by command:
+// pump.py gtest-tuple.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2009 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+
+#include <utility> // For ::std::pair.
+
+// The compiler used in Symbian has a bug that prevents us from declaring the
+// tuple template as a friend (it complains that tuple is redefined). This
+// hack bypasses the bug by declaring the members that should otherwise be
+// private as public.
+// Sun Studio versions < 12 also have the above bug.
+#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
+#else
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
+ template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
+ private:
+#endif
+
+// GTEST_n_TUPLE_(T) is the type of an n-tuple.
+#define GTEST_0_TUPLE_(T) tuple<>
+#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
+ void, void, void>
+#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
+ void, void, void>
+#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
+ void, void, void>
+#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
+ void, void, void>
+#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
+ void, void, void>
+#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
+ void, void, void>
+#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+ void, void, void>
+#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+ T##7, void, void>
+#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+ T##7, T##8, void>
+#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+ T##7, T##8, T##9>
+
+// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
+#define GTEST_0_TYPENAMES_(T)
+#define GTEST_1_TYPENAMES_(T) typename T##0
+#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
+#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
+#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3
+#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3, typename T##4
+#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3, typename T##4, typename T##5
+#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3, typename T##4, typename T##5, typename T##6
+#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
+#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3, typename T##4, typename T##5, typename T##6, \
+ typename T##7, typename T##8
+#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+ typename T##3, typename T##4, typename T##5, typename T##6, \
+ typename T##7, typename T##8, typename T##9
+
+// In theory, defining stuff in the ::std namespace is undefined
+// behavior. We can do this as we are playing the role of a standard
+// library vendor.
+namespace std {
+namespace tr1 {
+
+template <typename T0 = void, typename T1 = void, typename T2 = void,
+ typename T3 = void, typename T4 = void, typename T5 = void,
+ typename T6 = void, typename T7 = void, typename T8 = void,
+ typename T9 = void>
+class tuple;
+
+// Anything in namespace gtest_internal is Google Test's INTERNAL
+// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
+namespace gtest_internal {
+
+// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
+template <typename T>
+struct ByRef { typedef const T& type; }; // NOLINT
+template <typename T>
+struct ByRef<T&> { typedef T& type; }; // NOLINT
+
+// A handy wrapper for ByRef.
+#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
+
+// AddRef<T>::type is T if T is a reference; otherwise it's T&. This
+// is the same as tr1::add_reference<T>::type.
+template <typename T>
+struct AddRef { typedef T& type; }; // NOLINT
+template <typename T>
+struct AddRef<T&> { typedef T& type; }; // NOLINT
+
+// A handy wrapper for AddRef.
+#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
+
+// A helper for implementing get<k>().
+template <int k> class Get;
+
+// A helper for implementing tuple_element<k, T>. kIndexValid is true
+// iff k < the number of fields in tuple type T.
+template <bool kIndexValid, int kIndex, class Tuple>
+struct TupleElement;
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
+ typedef T0 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
+ typedef T1 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
+ typedef T2 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
+ typedef T3 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
+ typedef T4 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
+ typedef T5 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
+ typedef T6 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
+ typedef T7 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
+ typedef T8 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
+ typedef T9 type;
+};
+
+} // namespace gtest_internal
+
+template <>
+class tuple<> {
+ public:
+ tuple() {}
+ tuple(const tuple& /* t */) {}
+ tuple& operator=(const tuple& /* t */) { return *this; }
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+class GTEST_1_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
+
+ tuple(const tuple& t) : f0_(t.f0_) {}
+
+ template <GTEST_1_TYPENAMES_(U)>
+ tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_1_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_1_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ return *this;
+ }
+
+ T0 f0_;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+class GTEST_2_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
+ f1_(f1) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
+
+ template <GTEST_2_TYPENAMES_(U)>
+ tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
+ template <typename U0, typename U1>
+ tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_2_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+ template <typename U0, typename U1>
+ tuple& operator=(const ::std::pair<U0, U1>& p) {
+ f0_ = p.first;
+ f1_ = p.second;
+ return *this;
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_2_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+class GTEST_3_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+ template <GTEST_3_TYPENAMES_(U)>
+ tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_3_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_3_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+class GTEST_4_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
+ f3_(f3) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
+
+ template <GTEST_4_TYPENAMES_(U)>
+ tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_4_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_4_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+class GTEST_5_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
+ GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+ f4_(t.f4_) {}
+
+ template <GTEST_5_TYPENAMES_(U)>
+ tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_), f4_(t.f4_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_5_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_5_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ f4_ = t.f4_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+ T4 f4_;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+class GTEST_6_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+ GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+ f5_(f5) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+ f4_(t.f4_), f5_(t.f5_) {}
+
+ template <GTEST_6_TYPENAMES_(U)>
+ tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_6_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_6_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ f4_ = t.f4_;
+ f5_ = t.f5_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+ T4 f4_;
+ T5 f5_;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+class GTEST_7_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+ GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
+ f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+ f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+ template <GTEST_7_TYPENAMES_(U)>
+ tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_7_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_7_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ f4_ = t.f4_;
+ f5_ = t.f5_;
+ f6_ = t.f6_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+ T4 f4_;
+ T5 f5_;
+ T6 f6_;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+class GTEST_8_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+ GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
+ GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+ f5_(f5), f6_(f6), f7_(f7) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+ f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+ template <GTEST_8_TYPENAMES_(U)>
+ tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_8_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_8_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ f4_ = t.f4_;
+ f5_ = t.f5_;
+ f6_ = t.f6_;
+ f7_ = t.f7_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+ T4 f4_;
+ T5 f5_;
+ T6 f6_;
+ T7 f7_;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+class GTEST_9_TUPLE_(T) {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+ GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+ GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+ f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+ f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+ template <GTEST_9_TYPENAMES_(U)>
+ tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_9_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_9_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ f4_ = t.f4_;
+ f5_ = t.f5_;
+ f6_ = t.f6_;
+ f7_ = t.f7_;
+ f8_ = t.f8_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+ T4 f4_;
+ T5 f5_;
+ T6 f6_;
+ T7 f7_;
+ T8 f8_;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+class tuple {
+ public:
+ template <int k> friend class gtest_internal::Get;
+
+ tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
+ f9_() {}
+
+ explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+ GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+ GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+ GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
+ f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
+
+ tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+ f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
+
+ template <GTEST_10_TYPENAMES_(U)>
+ tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+ f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
+ f9_(t.f9_) {}
+
+ tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+ template <GTEST_10_TYPENAMES_(U)>
+ tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
+ return CopyFrom(t);
+ }
+
+ GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+ template <GTEST_10_TYPENAMES_(U)>
+ tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
+ f0_ = t.f0_;
+ f1_ = t.f1_;
+ f2_ = t.f2_;
+ f3_ = t.f3_;
+ f4_ = t.f4_;
+ f5_ = t.f5_;
+ f6_ = t.f6_;
+ f7_ = t.f7_;
+ f8_ = t.f8_;
+ f9_ = t.f9_;
+ return *this;
+ }
+
+ T0 f0_;
+ T1 f1_;
+ T2 f2_;
+ T3 f3_;
+ T4 f4_;
+ T5 f5_;
+ T6 f6_;
+ T7 f7_;
+ T8 f8_;
+ T9 f9_;
+};
+
+// 6.1.3.2 Tuple creation functions.
+
+// Known limitations: we don't support passing an
+// std::tr1::reference_wrapper<T> to make_tuple(). And we don't
+// implement tie().
+
+inline tuple<> make_tuple() { return tuple<>(); }
+
+template <GTEST_1_TYPENAMES_(T)>
+inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
+ return GTEST_1_TUPLE_(T)(f0);
+}
+
+template <GTEST_2_TYPENAMES_(T)>
+inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
+ return GTEST_2_TUPLE_(T)(f0, f1);
+}
+
+template <GTEST_3_TYPENAMES_(T)>
+inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
+ return GTEST_3_TUPLE_(T)(f0, f1, f2);
+}
+
+template <GTEST_4_TYPENAMES_(T)>
+inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3) {
+ return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
+}
+
+template <GTEST_5_TYPENAMES_(T)>
+inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3, const T4& f4) {
+ return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
+}
+
+template <GTEST_6_TYPENAMES_(T)>
+inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3, const T4& f4, const T5& f5) {
+ return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
+}
+
+template <GTEST_7_TYPENAMES_(T)>
+inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
+ return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
+}
+
+template <GTEST_8_TYPENAMES_(T)>
+inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
+ return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
+}
+
+template <GTEST_9_TYPENAMES_(T)>
+inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+ const T8& f8) {
+ return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
+}
+
+template <GTEST_10_TYPENAMES_(T)>
+inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+ const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+ const T8& f8, const T9& f9) {
+ return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
+}
+
+// 6.1.3.3 Tuple helper classes.
+
+template <typename Tuple> struct tuple_size;
+
+template <GTEST_0_TYPENAMES_(T)>
+struct tuple_size<GTEST_0_TUPLE_(T) > {
+ static const int value = 0;
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+struct tuple_size<GTEST_1_TUPLE_(T) > {
+ static const int value = 1;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+struct tuple_size<GTEST_2_TUPLE_(T) > {
+ static const int value = 2;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+struct tuple_size<GTEST_3_TUPLE_(T) > {
+ static const int value = 3;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+struct tuple_size<GTEST_4_TUPLE_(T) > {
+ static const int value = 4;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+struct tuple_size<GTEST_5_TUPLE_(T) > {
+ static const int value = 5;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+struct tuple_size<GTEST_6_TUPLE_(T) > {
+ static const int value = 6;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+struct tuple_size<GTEST_7_TUPLE_(T) > {
+ static const int value = 7;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+struct tuple_size<GTEST_8_TUPLE_(T) > {
+ static const int value = 8;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+struct tuple_size<GTEST_9_TUPLE_(T) > {
+ static const int value = 9;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct tuple_size<GTEST_10_TUPLE_(T) > {
+ static const int value = 10;
+};
+
+template <int k, class Tuple>
+struct tuple_element {
+ typedef typename gtest_internal::TupleElement<
+ k < (tuple_size<Tuple>::value), k, Tuple>::type type;
+};
+
+#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
+
+// 6.1.3.4 Element access.
+
+namespace gtest_internal {
+
+template <>
+class Get<0> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+ Field(Tuple& t) { return t.f0_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+ ConstField(const Tuple& t) { return t.f0_; }
+};
+
+template <>
+class Get<1> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+ Field(Tuple& t) { return t.f1_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+ ConstField(const Tuple& t) { return t.f1_; }
+};
+
+template <>
+class Get<2> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+ Field(Tuple& t) { return t.f2_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+ ConstField(const Tuple& t) { return t.f2_; }
+};
+
+template <>
+class Get<3> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+ Field(Tuple& t) { return t.f3_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+ ConstField(const Tuple& t) { return t.f3_; }
+};
+
+template <>
+class Get<4> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+ Field(Tuple& t) { return t.f4_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+ ConstField(const Tuple& t) { return t.f4_; }
+};
+
+template <>
+class Get<5> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+ Field(Tuple& t) { return t.f5_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+ ConstField(const Tuple& t) { return t.f5_; }
+};
+
+template <>
+class Get<6> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+ Field(Tuple& t) { return t.f6_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+ ConstField(const Tuple& t) { return t.f6_; }
+};
+
+template <>
+class Get<7> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+ Field(Tuple& t) { return t.f7_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+ ConstField(const Tuple& t) { return t.f7_; }
+};
+
+template <>
+class Get<8> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+ Field(Tuple& t) { return t.f8_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+ ConstField(const Tuple& t) { return t.f8_; }
+};
+
+template <>
+class Get<9> {
+ public:
+ template <class Tuple>
+ static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+ Field(Tuple& t) { return t.f9_; } // NOLINT
+
+ template <class Tuple>
+ static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+ ConstField(const Tuple& t) { return t.f9_; }
+};
+
+} // namespace gtest_internal
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
+get(GTEST_10_TUPLE_(T)& t) {
+ return gtest_internal::Get<k>::Field(t);
+}
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
+get(const GTEST_10_TUPLE_(T)& t) {
+ return gtest_internal::Get<k>::ConstField(t);
+}
+
+// 6.1.3.5 Relational operators
+
+// We only implement == and !=, as we don't have a need for the rest yet.
+
+namespace gtest_internal {
+
+// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
+// first k fields of t1 equals the first k fields of t2.
+// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
+// k1 != k2.
+template <int kSize1, int kSize2>
+struct SameSizeTuplePrefixComparator;
+
+template <>
+struct SameSizeTuplePrefixComparator<0, 0> {
+ template <class Tuple1, class Tuple2>
+ static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
+ return true;
+ }
+};
+
+template <int k>
+struct SameSizeTuplePrefixComparator<k, k> {
+ template <class Tuple1, class Tuple2>
+ static bool Eq(const Tuple1& t1, const Tuple2& t2) {
+ return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
+ ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
+ }
+};
+
+} // namespace gtest_internal
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator==(const GTEST_10_TUPLE_(T)& t,
+ const GTEST_10_TUPLE_(U)& u) {
+ return gtest_internal::SameSizeTuplePrefixComparator<
+ tuple_size<GTEST_10_TUPLE_(T) >::value,
+ tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
+}
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
+ const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
+
+// 6.1.4 Pairs.
+// Unimplemented.
+
+} // namespace tr1
+} // namespace std
+
+#undef GTEST_0_TUPLE_
+#undef GTEST_1_TUPLE_
+#undef GTEST_2_TUPLE_
+#undef GTEST_3_TUPLE_
+#undef GTEST_4_TUPLE_
+#undef GTEST_5_TUPLE_
+#undef GTEST_6_TUPLE_
+#undef GTEST_7_TUPLE_
+#undef GTEST_8_TUPLE_
+#undef GTEST_9_TUPLE_
+#undef GTEST_10_TUPLE_
+
+#undef GTEST_0_TYPENAMES_
+#undef GTEST_1_TYPENAMES_
+#undef GTEST_2_TYPENAMES_
+#undef GTEST_3_TYPENAMES_
+#undef GTEST_4_TYPENAMES_
+#undef GTEST_5_TYPENAMES_
+#undef GTEST_6_TYPENAMES_
+#undef GTEST_7_TYPENAMES_
+#undef GTEST_8_TYPENAMES_
+#undef GTEST_9_TYPENAMES_
+#undef GTEST_10_TYPENAMES_
+
+#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
+#undef GTEST_BY_REF_
+#undef GTEST_ADD_REF_
+#undef GTEST_TUPLE_ELEMENT_
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+# elif GTEST_ENV_HAS_STD_TUPLE_
+# include <tuple>
+// C++11 puts its tuple into the ::std namespace rather than
+// ::std::tr1. gtest expects tuple to live in ::std::tr1, so put it there.
+// This causes undefined behavior, but supported compilers react in
+// the way we intend.
+namespace std {
+namespace tr1 {
+using ::std::get;
+using ::std::make_tuple;
+using ::std::tuple;
+using ::std::tuple_element;
+using ::std::tuple_size;
+}
+}
+
+# elif GTEST_OS_SYMBIAN
+
+// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
+// use STLport's tuple implementation, which unfortunately doesn't
+// work as the copy of STLport distributed with Symbian is incomplete.
+// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
+// use its own tuple implementation.
+# ifdef BOOST_HAS_TR1_TUPLE
+# undef BOOST_HAS_TR1_TUPLE
+# endif // BOOST_HAS_TR1_TUPLE
+
+// This prevents <boost/tr1/detail/config.hpp>, which defines
+// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
+# define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
+# include <tuple>
+
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
+// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does
+// not conform to the TR1 spec, which requires the header to be <tuple>.
+
+# if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
+// which is #included by <tr1/tuple>, to not compile when RTTI is
+// disabled. _TR1_FUNCTIONAL is the header guard for
+// <tr1/functional>. Hence the following #define is a hack to prevent
+// <tr1/functional> from being included.
+# define _TR1_FUNCTIONAL 1
+# include <tr1/tuple>
+# undef _TR1_FUNCTIONAL // Allows the user to #include
+ // <tr1/functional> if he chooses to.
+# else
+# include <tr1/tuple> // NOLINT
+# endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+
+# else
+// If the compiler is not GCC 4.0+, we assume the user is using a
+// spec-conforming TR1 implementation.
+# include <tuple> // NOLINT
+# endif // GTEST_USE_OWN_TR1_TUPLE
+
+#endif // GTEST_HAS_TR1_TUPLE
+
+// Determines whether clone(2) is supported.
+// Usually it will only be available on Linux, excluding
+// Linux on the Itanium architecture.
+// Also see http://linux.die.net/man/2/clone.
+#ifndef GTEST_HAS_CLONE
+// The user didn't tell us, so we need to figure it out.
+
+# if GTEST_OS_LINUX && !defined(__ia64__)
+# if GTEST_OS_LINUX_ANDROID
+// On Android, clone() is only available on ARM starting with Gingerbread.
+# if defined(__arm__) && __ANDROID_API__ >= 9
+# define GTEST_HAS_CLONE 1
+# else
+# define GTEST_HAS_CLONE 0
+# endif
+# else
+# define GTEST_HAS_CLONE 1
+# endif
+# else
+# define GTEST_HAS_CLONE 0
+# endif // GTEST_OS_LINUX && !defined(__ia64__)
+
+#endif // GTEST_HAS_CLONE
+
+// Determines whether to support stream redirection. This is used to test
+// output correctness and to implement death tests.
+#ifndef GTEST_HAS_STREAM_REDIRECTION
+// By default, we assume that stream redirection is supported on all
+// platforms except known mobile ones.
+# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
+# define GTEST_HAS_STREAM_REDIRECTION 0
+# else
+# define GTEST_HAS_STREAM_REDIRECTION 1
+# endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
+#endif // GTEST_HAS_STREAM_REDIRECTION
+
+// Determines whether to support death tests.
+// Google Test does not support death tests for VC 7.1 and earlier as
+// abort() in a VC 7.1 application compiled as GUI in debug config
+// pops up a dialog window that cannot be suppressed programmatically.
+#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
+ (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
+ (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
+ GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
+ GTEST_OS_OPENBSD || GTEST_OS_QNX)
+# define GTEST_HAS_DEATH_TEST 1
+# include <vector> // NOLINT
+#endif
+
+// We don't support MSVC 7.1 with exceptions disabled now. Therefore
+// all the compilers we care about are adequate for supporting
+// value-parameterized tests.
+#define GTEST_HAS_PARAM_TEST 1
+
+// Determines whether to support type-driven tests.
+
+// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
+// Sun Pro CC, IBM Visual Age, and HP aCC support.
+#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
+ defined(__IBMCPP__) || defined(__HP_aCC)
+# define GTEST_HAS_TYPED_TEST 1
+# define GTEST_HAS_TYPED_TEST_P 1
+#endif
+
+// Determines whether to support Combine(). This only makes sense when
+// value-parameterized tests are enabled. The implementation doesn't
+// work on Sun Studio since it doesn't understand templated conversion
+// operators.
+#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
+# define GTEST_HAS_COMBINE 1
+#endif
+
+// Determines whether the system compiler uses UTF-16 for encoding wide strings.
+#define GTEST_WIDE_STRING_USES_UTF16_ \
+ (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
+
+// Determines whether test results can be streamed to a socket.
+#if GTEST_OS_LINUX
+# define GTEST_CAN_STREAM_RESULTS_ 1
+#endif
+
+// Defines some utility macros.
+
+// The GNU compiler emits a warning if nested "if" statements are followed by
+// an "else" statement and braces are not used to explicitly disambiguate the
+// "else" binding. This leads to problems with code like:
+//
+// if (gate)
+// ASSERT_*(condition) << "Some message";
+//
+// The "switch (0) case 0:" idiom is used to suppress this.
+#ifdef __INTEL_COMPILER
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
+#else
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT
+#endif
+
+// Use this annotation at the end of a struct/class definition to
+// prevent the compiler from optimizing away instances that are never
+// used. This is useful when all interesting logic happens inside the
+// c'tor and / or d'tor. Example:
+//
+// struct Foo {
+// Foo() { ... }
+// } GTEST_ATTRIBUTE_UNUSED_;
+//
+// Also use it after a variable or parameter declaration to tell the
+// compiler the variable/parameter does not have to be used.
+#if defined(__GNUC__) && !defined(COMPILER_ICC)
+# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
+#else
+# define GTEST_ATTRIBUTE_UNUSED_
+#endif
+
+// A macro to disallow operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_ASSIGN_(type)\
+ void operator=(type const &)
+
+// A macro to disallow copy constructor and operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
+ type(type const &);\
+ GTEST_DISALLOW_ASSIGN_(type)
+
+// Tell the compiler to warn about unused return values for functions declared
+// with this macro. The macro should be used on function declarations
+// following the argument list:
+//
+// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
+#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
+# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
+#else
+# define GTEST_MUST_USE_RESULT_
+#endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
+
+// Determine whether the compiler supports Microsoft's Structured Exception
+// Handling. This is supported by several Windows compilers but generally
+// does not exist on any other system.
+#ifndef GTEST_HAS_SEH
+// The user didn't tell us, so we need to figure it out.
+
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// These two compilers are known to support SEH.
+# define GTEST_HAS_SEH 1
+# else
+// Assume no SEH.
+# define GTEST_HAS_SEH 0
+# endif
+
+#endif // GTEST_HAS_SEH
+
+#ifdef _MSC_VER
+
+# if GTEST_LINKED_AS_SHARED_LIBRARY
+# define GTEST_API_ __declspec(dllimport)
+# elif GTEST_CREATE_SHARED_LIBRARY
+# define GTEST_API_ __declspec(dllexport)
+# endif
+
+#endif // _MSC_VER
+
+#ifndef GTEST_API_
+# define GTEST_API_
+#endif
+
+#ifdef __GNUC__
+// Ask the compiler to never inline a given function.
+# define GTEST_NO_INLINE_ __attribute__((noinline))
+#else
+# define GTEST_NO_INLINE_
+#endif
+
+// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
+#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
+# define GTEST_HAS_CXXABI_H_ 1
+#else
+# define GTEST_HAS_CXXABI_H_ 0
+#endif
+
+namespace testing {
+
+class Message;
+
+namespace internal {
+
+// A secret type that Google Test users don't know about. It has no
+// definition on purpose. Therefore it's impossible to create a
+// Secret object, which is what we want.
+class Secret;
+
+// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
+// expression is true. For example, you could use it to verify the
+// size of a static array:
+//
+// GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
+// content_type_names_incorrect_size);
+//
+// or to make sure a struct is smaller than a certain size:
+//
+// GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
+//
+// The second argument to the macro is the name of the variable. If
+// the expression is false, most compilers will issue a warning/error
+// containing the name of the variable.
+
+template <bool>
+struct CompileAssert {
+};
+
+#define GTEST_COMPILE_ASSERT_(expr, msg) \
+ typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
+ msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
+
+// Implementation details of GTEST_COMPILE_ASSERT_:
+//
+// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
+// elements (and thus is invalid) when the expression is false.
+//
+// - The simpler definition
+//
+// #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
+//
+// does not work, as gcc supports variable-length arrays whose sizes
+// are determined at run-time (this is gcc's extension and not part
+// of the C++ standard). As a result, gcc fails to reject the
+// following code with the simple definition:
+//
+// int foo;
+// GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
+// // not a compile-time constant.
+//
+// - By using the type CompileAssert<(bool(expr))>, we ensures that
+// expr is a compile-time constant. (Template arguments must be
+// determined at compile-time.)
+//
+// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
+// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written
+//
+// CompileAssert<bool(expr)>
+//
+// instead, these compilers will refuse to compile
+//
+// GTEST_COMPILE_ASSERT_(5 > 0, some_message);
+//
+// (They seem to think the ">" in "5 > 0" marks the end of the
+// template argument list.)
+//
+// - The array size is (bool(expr) ? 1 : -1), instead of simply
+//
+// ((expr) ? 1 : -1).
+//
+// This is to avoid running into a bug in MS VC 7.1, which
+// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
+
+// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
+//
+// This template is declared, but intentionally undefined.
+template <typename T1, typename T2>
+struct StaticAssertTypeEqHelper;
+
+template <typename T>
+struct StaticAssertTypeEqHelper<T, T> {};
+
+#if GTEST_HAS_GLOBAL_STRING
+typedef ::string string;
+#else
+typedef ::std::string string;
+#endif // GTEST_HAS_GLOBAL_STRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+typedef ::wstring wstring;
+#elif GTEST_HAS_STD_WSTRING
+typedef ::std::wstring wstring;
+#endif // GTEST_HAS_GLOBAL_WSTRING
+
+// A helper for suppressing warnings on constant condition. It just
+// returns 'condition'.
+GTEST_API_ bool IsTrue(bool condition);
+
+// Defines scoped_ptr.
+
+// This implementation of scoped_ptr is PARTIAL - it only contains
+// enough stuff to satisfy Google Test's need.
+template <typename T>
+class scoped_ptr {
+ public:
+ typedef T element_type;
+
+ explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
+ ~scoped_ptr() { reset(); }
+
+ T& operator*() const { return *ptr_; }
+ T* operator->() const { return ptr_; }
+ T* get() const { return ptr_; }
+
+ T* release() {
+ T* const ptr = ptr_;
+ ptr_ = NULL;
+ return ptr;
+ }
+
+ void reset(T* p = NULL) {
+ if (p != ptr_) {
+ if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type.
+ delete ptr_;
+ }
+ ptr_ = p;
+ }
+ }
+
+ private:
+ T* ptr_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
+};
+
+// Defines RE.
+
+// A simple C++ wrapper for <regex.h>. It uses the POSIX Extended
+// Regular Expression syntax.
+class GTEST_API_ RE {
+ public:
+ // A copy constructor is required by the Standard to initialize object
+ // references from r-values.
+ RE(const RE& other) { Init(other.pattern()); }
+
+ // Constructs an RE from a string.
+ RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT
+
+#if GTEST_HAS_GLOBAL_STRING
+
+ RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT
+
+#endif // GTEST_HAS_GLOBAL_STRING
+
+ RE(const char* regex) { Init(regex); } // NOLINT
+ ~RE();
+
+ // Returns the string representation of the regex.
+ const char* pattern() const { return pattern_; }
+
+ // FullMatch(str, re) returns true iff regular expression re matches
+ // the entire str.
+ // PartialMatch(str, re) returns true iff regular expression re
+ // matches a substring of str (including str itself).
+ //
+ // TODO(wan at google.com): make FullMatch() and PartialMatch() work
+ // when str contains NUL characters.
+ static bool FullMatch(const ::std::string& str, const RE& re) {
+ return FullMatch(str.c_str(), re);
+ }
+ static bool PartialMatch(const ::std::string& str, const RE& re) {
+ return PartialMatch(str.c_str(), re);
+ }
+
+#if GTEST_HAS_GLOBAL_STRING
+
+ static bool FullMatch(const ::string& str, const RE& re) {
+ return FullMatch(str.c_str(), re);
+ }
+ static bool PartialMatch(const ::string& str, const RE& re) {
+ return PartialMatch(str.c_str(), re);
+ }
+
+#endif // GTEST_HAS_GLOBAL_STRING
+
+ static bool FullMatch(const char* str, const RE& re);
+ static bool PartialMatch(const char* str, const RE& re);
+
+ private:
+ void Init(const char* regex);
+
+ // We use a const char* instead of an std::string, as Google Test used to be
+ // used where std::string is not available. TODO(wan at google.com): change to
+ // std::string.
+ const char* pattern_;
+ bool is_valid_;
+
+#if GTEST_USES_POSIX_RE
+
+ regex_t full_regex_; // For FullMatch().
+ regex_t partial_regex_; // For PartialMatch().
+
+#else // GTEST_USES_SIMPLE_RE
+
+ const char* full_pattern_; // For FullMatch();
+
+#endif
+
+ GTEST_DISALLOW_ASSIGN_(RE);
+};
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
+ int line);
+
+// Defines logging utilities:
+// GTEST_LOG_(severity) - logs messages at the specified severity level. The
+// message itself is streamed into the macro.
+// LogToStderr() - directs all log messages to stderr.
+// FlushInfoLog() - flushes informational log messages.
+
+enum GTestLogSeverity {
+ GTEST_INFO,
+ GTEST_WARNING,
+ GTEST_ERROR,
+ GTEST_FATAL
+};
+
+// Formats log entry severity, provides a stream object for streaming the
+// log message, and terminates the message with a newline when going out of
+// scope.
+class GTEST_API_ GTestLog {
+ public:
+ GTestLog(GTestLogSeverity severity, const char* file, int line);
+
+ // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+ ~GTestLog();
+
+ ::std::ostream& GetStream() { return ::std::cerr; }
+
+ private:
+ const GTestLogSeverity severity_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
+};
+
+#define GTEST_LOG_(severity) \
+ ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
+ __FILE__, __LINE__).GetStream()
+
+inline void LogToStderr() {}
+inline void FlushInfoLog() { fflush(NULL); }
+
+// INTERNAL IMPLEMENTATION - DO NOT USE.
+//
+// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
+// is not satisfied.
+// Synopsys:
+// GTEST_CHECK_(boolean_condition);
+// or
+// GTEST_CHECK_(boolean_condition) << "Additional message";
+//
+// This checks the condition and if the condition is not satisfied
+// it prints message about the condition violation, including the
+// condition itself, plus additional message streamed into it, if any,
+// and then it aborts the program. It aborts the program irrespective of
+// whether it is built in the debug mode or not.
+#define GTEST_CHECK_(condition) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::IsTrue(condition)) \
+ ; \
+ else \
+ GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
+
+// An all-mode assert to verify that the given POSIX-style function
+// call returns 0 (indicating success). Known limitation: this
+// doesn't expand to a balanced 'if' statement, so enclose the macro
+// in {} if you need to use it as the only statement in an 'if'
+// branch.
+#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
+ if (const int gtest_error = (posix_call)) \
+ GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
+ << gtest_error
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Use ImplicitCast_ as a safe version of static_cast for upcasting in
+// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
+// const Foo*). When you use ImplicitCast_, the compiler checks that
+// the cast is safe. Such explicit ImplicitCast_s are necessary in
+// surprisingly many situations where C++ demands an exact type match
+// instead of an argument type convertable to a target type.
+//
+// The syntax for using ImplicitCast_ is the same as for static_cast:
+//
+// ImplicitCast_<ToType>(expr)
+//
+// ImplicitCast_ would have been part of the C++ standard library,
+// but the proposal was submitted too late. It will probably make
+// its way into the language in the future.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., implicit_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To>
+inline To ImplicitCast_(To x) { return x; }
+
+// When you upcast (that is, cast a pointer from type Foo to type
+// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
+// always succeed. When you downcast (that is, cast a pointer from
+// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
+// how do you know the pointer is really of type SubclassOfFoo? It
+// could be a bare Foo, or of type DifferentSubclassOfFoo. Thus,
+// when you downcast, you should use this macro. In debug mode, we
+// use dynamic_cast<> to double-check the downcast is legal (we die
+// if it's not). In normal mode, we do the efficient static_cast<>
+// instead. Thus, it's important to test in debug mode to make sure
+// the cast is legal!
+// This is the only place in the code we should use dynamic_cast<>.
+// In particular, you SHOULDN'T be using dynamic_cast<> in order to
+// do RTTI (eg code like this:
+// if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
+// if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
+// You should design the code some other way not to need this.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., down_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To, typename From> // use like this: DownCast_<T*>(foo);
+inline To DownCast_(From* f) { // so we only accept pointers
+ // Ensures that To is a sub-type of From *. This test is here only
+ // for compile-time type checking, and has no overhead in an
+ // optimized build at run-time, as it will be optimized away
+ // completely.
+ if (false) {
+ const To to = NULL;
+ ::testing::internal::ImplicitCast_<From*>(to);
+ }
+
+#if GTEST_HAS_RTTI
+ // RTTI: debug mode only!
+ GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
+#endif
+ return static_cast<To>(f);
+}
+
+// Downcasts the pointer of type Base to Derived.
+// Derived must be a subclass of Base. The parameter MUST
+// point to a class of type Derived, not any subclass of it.
+// When RTTI is available, the function performs a runtime
+// check to enforce this.
+template <class Derived, class Base>
+Derived* CheckedDowncastToActualType(Base* base) {
+#if GTEST_HAS_RTTI
+ GTEST_CHECK_(typeid(*base) == typeid(Derived));
+ return dynamic_cast<Derived*>(base); // NOLINT
+#else
+ return static_cast<Derived*>(base); // Poor man's downcast.
+#endif
+}
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Defines the stderr capturer:
+// CaptureStdout - starts capturing stdout.
+// GetCapturedStdout - stops capturing stdout and returns the captured string.
+// CaptureStderr - starts capturing stderr.
+// GetCapturedStderr - stops capturing stderr and returns the captured string.
+//
+GTEST_API_ void CaptureStdout();
+GTEST_API_ std::string GetCapturedStdout();
+GTEST_API_ void CaptureStderr();
+GTEST_API_ std::string GetCapturedStderr();
+
+#endif // GTEST_HAS_STREAM_REDIRECTION
+
+
+#if GTEST_HAS_DEATH_TEST
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs();
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
+ new_argvs);
+
+// A copy of all command line arguments. Set by InitGoogleTest().
+extern ::std::vector<testing::internal::string> g_argvs;
+
+#endif // GTEST_HAS_DEATH_TEST
+
+// Defines synchronization primitives.
+
+#if GTEST_HAS_PTHREAD
+
+// Sleeps for (roughly) n milli-seconds. This function is only for
+// testing Google Test's own constructs. Don't use it in user tests,
+// either directly or indirectly.
+inline void SleepMilliseconds(int n) {
+ const timespec time = {
+ 0, // 0 seconds.
+ n * 1000L * 1000L, // And n ms.
+ };
+ nanosleep(&time, NULL);
+}
+
+// Allows a controller thread to pause execution of newly created
+// threads until notified. Instances of this class must be created
+// and destroyed in the controller thread.
+//
+// This class is only for testing Google Test's own constructs. Do not
+// use it in user tests, either directly or indirectly.
+class Notification {
+ public:
+ Notification() : notified_(false) {
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+ }
+ ~Notification() {
+ pthread_mutex_destroy(&mutex_);
+ }
+
+ // Notifies all threads created with this notification to start. Must
+ // be called from the controller thread.
+ void Notify() {
+ pthread_mutex_lock(&mutex_);
+ notified_ = true;
+ pthread_mutex_unlock(&mutex_);
+ }
+
+ // Blocks until the controller thread notifies. Must be called from a test
+ // thread.
+ void WaitForNotification() {
+ for (;;) {
+ pthread_mutex_lock(&mutex_);
+ const bool notified = notified_;
+ pthread_mutex_unlock(&mutex_);
+ if (notified)
+ break;
+ SleepMilliseconds(10);
+ }
+ }
+
+ private:
+ pthread_mutex_t mutex_;
+ bool notified_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
+};
+
+// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
+// Consequently, it cannot select a correct instantiation of ThreadWithParam
+// in order to call its Run(). Introducing ThreadWithParamBase as a
+// non-templated base class for ThreadWithParam allows us to bypass this
+// problem.
+class ThreadWithParamBase {
+ public:
+ virtual ~ThreadWithParamBase() {}
+ virtual void Run() = 0;
+};
+
+// pthread_create() accepts a pointer to a function type with the C linkage.
+// According to the Standard (7.5/1), function types with different linkages
+// are different even if they are otherwise identical. Some compilers (for
+// example, SunStudio) treat them as different types. Since class methods
+// cannot be defined with C-linkage we need to define a free C-function to
+// pass into pthread_create().
+extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
+ static_cast<ThreadWithParamBase*>(thread)->Run();
+ return NULL;
+}
+
+// Helper class for testing Google Test's multi-threading constructs.
+// To use it, write:
+//
+// void ThreadFunc(int param) { /* Do things with param */ }
+// Notification thread_can_start;
+// ...
+// // The thread_can_start parameter is optional; you can supply NULL.
+// ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
+// thread_can_start.Notify();
+//
+// These classes are only for testing Google Test's own constructs. Do
+// not use them in user tests, either directly or indirectly.
+template <typename T>
+class ThreadWithParam : public ThreadWithParamBase {
+ public:
+ typedef void (*UserThreadFunc)(T);
+
+ ThreadWithParam(
+ UserThreadFunc func, T param, Notification* thread_can_start)
+ : func_(func),
+ param_(param),
+ thread_can_start_(thread_can_start),
+ finished_(false) {
+ ThreadWithParamBase* const base = this;
+ // The thread can be created only after all fields except thread_
+ // have been initialized.
+ GTEST_CHECK_POSIX_SUCCESS_(
+ pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
+ }
+ ~ThreadWithParam() { Join(); }
+
+ void Join() {
+ if (!finished_) {
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
+ finished_ = true;
+ }
+ }
+
+ virtual void Run() {
+ if (thread_can_start_ != NULL)
+ thread_can_start_->WaitForNotification();
+ func_(param_);
+ }
+
+ private:
+ const UserThreadFunc func_; // User-supplied thread function.
+ const T param_; // User-supplied parameter to the thread function.
+ // When non-NULL, used to block execution until the controller thread
+ // notifies.
+ Notification* const thread_can_start_;
+ bool finished_; // true iff we know that the thread function has finished.
+ pthread_t thread_; // The native thread object.
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
+};
+
+// MutexBase and Mutex implement mutex on pthreads-based platforms. They
+// are used in conjunction with class MutexLock:
+//
+// Mutex mutex;
+// ...
+// MutexLock lock(&mutex); // Acquires the mutex and releases it at the end
+// // of the current scope.
+//
+// MutexBase implements behavior for both statically and dynamically
+// allocated mutexes. Do not use MutexBase directly. Instead, write
+// the following to define a static mutex:
+//
+// GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
+//
+// You can forward declare a static mutex like this:
+//
+// GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
+//
+// To create a dynamic mutex, just define an object of type Mutex.
+class MutexBase {
+ public:
+ // Acquires this mutex.
+ void Lock() {
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
+ owner_ = pthread_self();
+ has_owner_ = true;
+ }
+
+ // Releases this mutex.
+ void Unlock() {
+ // Since the lock is being released the owner_ field should no longer be
+ // considered valid. We don't protect writing to has_owner_ here, as it's
+ // the caller's responsibility to ensure that the current thread holds the
+ // mutex when this is called.
+ has_owner_ = false;
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
+ }
+
+ // Does nothing if the current thread holds the mutex. Otherwise, crashes
+ // with high probability.
+ void AssertHeld() const {
+ GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
+ << "The current thread is not holding the mutex @" << this;
+ }
+
+ // A static mutex may be used before main() is entered. It may even
+ // be used before the dynamic initialization stage. Therefore we
+ // must be able to initialize a static mutex object at link time.
+ // This means MutexBase has to be a POD and its member variables
+ // have to be public.
+ public:
+ pthread_mutex_t mutex_; // The underlying pthread mutex.
+ // has_owner_ indicates whether the owner_ field below contains a valid thread
+ // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
+ // accesses to the owner_ field should be protected by a check of this field.
+ // An alternative might be to memset() owner_ to all zeros, but there's no
+ // guarantee that a zero'd pthread_t is necessarily invalid or even different
+ // from pthread_self().
+ bool has_owner_;
+ pthread_t owner_; // The thread holding the mutex.
+};
+
+// Forward-declares a static mutex.
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+ extern ::testing::internal::MutexBase mutex
+
+// Defines and statically (i.e. at link time) initializes a static mutex.
+// The initialization list here does not explicitly initialize each field,
+// instead relying on default initialization for the unspecified fields. In
+// particular, the owner_ field (a pthread_t) is not explicitly initialized.
+// This allows initialization to work whether pthread_t is a scalar or struct.
+// The flag -Wmissing-field-initializers must not be specified for this to work.
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
+ ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false }
+
+// The Mutex class can only be used for mutexes created at runtime. It
+// shares its API with MutexBase otherwise.
+class Mutex : public MutexBase {
+ public:
+ Mutex() {
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+ has_owner_ = false;
+ }
+ ~Mutex() {
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
+ }
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
+};
+
+// We cannot name this class MutexLock as the ctor declaration would
+// conflict with a macro named MutexLock, which is defined on some
+// platforms. Hence the typedef trick below.
+class GTestMutexLock {
+ public:
+ explicit GTestMutexLock(MutexBase* mutex)
+ : mutex_(mutex) { mutex_->Lock(); }
+
+ ~GTestMutexLock() { mutex_->Unlock(); }
+
+ private:
+ MutexBase* const mutex_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
+};
+
+typedef GTestMutexLock MutexLock;
+
+// Helpers for ThreadLocal.
+
+// pthread_key_create() requires DeleteThreadLocalValue() to have
+// C-linkage. Therefore it cannot be templatized to access
+// ThreadLocal<T>. Hence the need for class
+// ThreadLocalValueHolderBase.
+class ThreadLocalValueHolderBase {
+ public:
+ virtual ~ThreadLocalValueHolderBase() {}
+};
+
+// Called by pthread to delete thread-local data stored by
+// pthread_setspecific().
+extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
+ delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
+}
+
+// Implements thread-local storage on pthreads-based systems.
+//
+// // Thread 1
+// ThreadLocal<int> tl(100); // 100 is the default value for each thread.
+//
+// // Thread 2
+// tl.set(150); // Changes the value for thread 2 only.
+// EXPECT_EQ(150, tl.get());
+//
+// // Thread 1
+// EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value.
+// tl.set(200);
+// EXPECT_EQ(200, tl.get());
+//
+// The template type argument T must have a public copy constructor.
+// In addition, the default ThreadLocal constructor requires T to have
+// a public default constructor.
+//
+// An object managed for a thread by a ThreadLocal instance is deleted
+// when the thread exits. Or, if the ThreadLocal instance dies in
+// that thread, when the ThreadLocal dies. It's the user's
+// responsibility to ensure that all other threads using a ThreadLocal
+// have exited when it dies, or the per-thread objects for those
+// threads will not be deleted.
+//
+// Google Test only uses global ThreadLocal objects. That means they
+// will die after main() has returned. Therefore, no per-thread
+// object managed by Google Test will be leaked as long as all threads
+// using Google Test have exited when main() returns.
+template <typename T>
+class ThreadLocal {
+ public:
+ ThreadLocal() : key_(CreateKey()),
+ default_() {}
+ explicit ThreadLocal(const T& value) : key_(CreateKey()),
+ default_(value) {}
+
+ ~ThreadLocal() {
+ // Destroys the managed object for the current thread, if any.
+ DeleteThreadLocalValue(pthread_getspecific(key_));
+
+ // Releases resources associated with the key. This will *not*
+ // delete managed objects for other threads.
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
+ }
+
+ T* pointer() { return GetOrCreateValue(); }
+ const T* pointer() const { return GetOrCreateValue(); }
+ const T& get() const { return *pointer(); }
+ void set(const T& value) { *pointer() = value; }
+
+ private:
+ // Holds a value of type T.
+ class ValueHolder : public ThreadLocalValueHolderBase {
+ public:
+ explicit ValueHolder(const T& value) : value_(value) {}
+
+ T* pointer() { return &value_; }
+
+ private:
+ T value_;
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
+ };
+
+ static pthread_key_t CreateKey() {
+ pthread_key_t key;
+ // When a thread exits, DeleteThreadLocalValue() will be called on
+ // the object managed for that thread.
+ GTEST_CHECK_POSIX_SUCCESS_(
+ pthread_key_create(&key, &DeleteThreadLocalValue));
+ return key;
+ }
+
+ T* GetOrCreateValue() const {
+ ThreadLocalValueHolderBase* const holder =
+ static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
+ if (holder != NULL) {
+ return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
+ }
+
+ ValueHolder* const new_holder = new ValueHolder(default_);
+ ThreadLocalValueHolderBase* const holder_base = new_holder;
+ GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
+ return new_holder->pointer();
+ }
+
+ // A key pthreads uses for looking up per-thread values.
+ const pthread_key_t key_;
+ const T default_; // The default value for each thread.
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
+};
+
+# define GTEST_IS_THREADSAFE 1
+
+#else // GTEST_HAS_PTHREAD
+
+// A dummy implementation of synchronization primitives (mutex, lock,
+// and thread-local variable). Necessary for compiling Google Test where
+// mutex is not supported - using Google Test in multiple threads is not
+// supported on such platforms.
+
+class Mutex {
+ public:
+ Mutex() {}
+ void Lock() {}
+ void Unlock() {}
+ void AssertHeld() const {}
+};
+
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+ extern ::testing::internal::Mutex mutex
+
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
+
+class GTestMutexLock {
+ public:
+ explicit GTestMutexLock(Mutex*) {} // NOLINT
+};
+
+typedef GTestMutexLock MutexLock;
+
+template <typename T>
+class ThreadLocal {
+ public:
+ ThreadLocal() : value_() {}
+ explicit ThreadLocal(const T& value) : value_(value) {}
+ T* pointer() { return &value_; }
+ const T* pointer() const { return &value_; }
+ const T& get() const { return value_; }
+ void set(const T& value) { value_ = value; }
+ private:
+ T value_;
+};
+
+// The above synchronization primitives have dummy implementations.
+// Therefore Google Test is not thread-safe.
+# define GTEST_IS_THREADSAFE 0
+
+#endif // GTEST_HAS_PTHREAD
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+GTEST_API_ size_t GetThreadCount();
+
+// Passing non-POD classes through ellipsis (...) crashes the ARM
+// compiler and generates a warning in Sun Studio. The Nokia Symbian
+// and the IBM XL C/C++ compiler try to instantiate a copy constructor
+// for objects passed through ellipsis (...), failing for uncopyable
+// objects. We define this to ensure that only POD is passed through
+// ellipsis on these systems.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_ELLIPSIS_NEEDS_POD_ 1
+#else
+# define GTEST_CAN_COMPARE_NULL 1
+#endif
+
+// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
+// const T& and const T* in a function template. These compilers
+// _can_ decide between class template specializations for T and T*,
+// so a tr1::type_traits-like is_pointer works.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
+# define GTEST_NEEDS_IS_POINTER_ 1
+#endif
+
+template <bool bool_value>
+struct bool_constant {
+ typedef bool_constant<bool_value> type;
+ static const bool value = bool_value;
+};
+template <bool bool_value> const bool bool_constant<bool_value>::value;
+
+typedef bool_constant<false> false_type;
+typedef bool_constant<true> true_type;
+
+template <typename T>
+struct is_pointer : public false_type {};
+
+template <typename T>
+struct is_pointer<T*> : public true_type {};
+
+template <typename Iterator>
+struct IteratorTraits {
+ typedef typename Iterator::value_type value_type;
+};
+
+template <typename T>
+struct IteratorTraits<T*> {
+ typedef T value_type;
+};
+
+template <typename T>
+struct IteratorTraits<const T*> {
+ typedef T value_type;
+};
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_SEP_ "\\"
+# define GTEST_HAS_ALT_PATH_SEP_ 1
+// The biggest signed integer type the compiler supports.
+typedef __int64 BiggestInt;
+#else
+# define GTEST_PATH_SEP_ "/"
+# define GTEST_HAS_ALT_PATH_SEP_ 0
+typedef long long BiggestInt; // NOLINT
+#endif // GTEST_OS_WINDOWS
+
+// Utilities for char.
+
+// isspace(int ch) and friends accept an unsigned char or EOF. char
+// may be signed, depending on the compiler (or compiler flags).
+// Therefore we need to cast a char to unsigned char before calling
+// isspace(), etc.
+
+inline bool IsAlpha(char ch) {
+ return isalpha(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsAlNum(char ch) {
+ return isalnum(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsDigit(char ch) {
+ return isdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsLower(char ch) {
+ return islower(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsSpace(char ch) {
+ return isspace(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsUpper(char ch) {
+ return isupper(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(char ch) {
+ return isxdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(wchar_t ch) {
+ const unsigned char low_byte = static_cast<unsigned char>(ch);
+ return ch == low_byte && isxdigit(low_byte) != 0;
+}
+
+inline char ToLower(char ch) {
+ return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
+}
+inline char ToUpper(char ch) {
+ return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
+}
+
+// The testing::internal::posix namespace holds wrappers for common
+// POSIX functions. These wrappers hide the differences between
+// Windows/MSVC and POSIX systems. Since some compilers define these
+// standard functions as macros, the wrapper cannot have the same name
+// as the wrapped function.
+
+namespace posix {
+
+// Functions with a different name on Windows.
+
+#if GTEST_OS_WINDOWS
+
+typedef struct _stat StatStruct;
+
+# ifdef __BORLANDC__
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+ return stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+# else // !__BORLANDC__
+# if GTEST_OS_WINDOWS_MOBILE
+inline int IsATTY(int /* fd */) { return 0; }
+# else
+inline int IsATTY(int fd) { return _isatty(fd); }
+# endif // GTEST_OS_WINDOWS_MOBILE
+inline int StrCaseCmp(const char* s1, const char* s2) {
+ return _stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return _strdup(src); }
+# endif // __BORLANDC__
+
+# if GTEST_OS_WINDOWS_MOBILE
+inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
+// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
+// time and thus not defined there.
+# else
+inline int FileNo(FILE* file) { return _fileno(file); }
+inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
+inline int RmDir(const char* dir) { return _rmdir(dir); }
+inline bool IsDir(const StatStruct& st) {
+ return (_S_IFDIR & st.st_mode) != 0;
+}
+# endif // GTEST_OS_WINDOWS_MOBILE
+
+#else
+
+typedef struct stat StatStruct;
+
+inline int FileNo(FILE* file) { return fileno(file); }
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+ return strcasecmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+inline int RmDir(const char* dir) { return rmdir(dir); }
+inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
+
+#endif // GTEST_OS_WINDOWS
+
+// Functions deprecated by MSVC 8.0.
+
+#ifdef _MSC_VER
+// Temporarily disable warning 4996 (deprecated function).
+# pragma warning(push)
+# pragma warning(disable:4996)
+#endif
+
+inline const char* StrNCpy(char* dest, const char* src, size_t n) {
+ return strncpy(dest, src, n);
+}
+
+// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
+// StrError() aren't needed on Windows CE at this time and thus not
+// defined there.
+
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int ChDir(const char* dir) { return chdir(dir); }
+#endif
+inline FILE* FOpen(const char* path, const char* mode) {
+ return fopen(path, mode);
+}
+#if !GTEST_OS_WINDOWS_MOBILE
+inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
+ return freopen(path, mode, stream);
+}
+inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
+#endif
+inline int FClose(FILE* fp) { return fclose(fp); }
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int Read(int fd, void* buf, unsigned int count) {
+ return static_cast<int>(read(fd, buf, count));
+}
+inline int Write(int fd, const void* buf, unsigned int count) {
+ return static_cast<int>(write(fd, buf, count));
+}
+inline int Close(int fd) { return close(fd); }
+inline const char* StrError(int errnum) { return strerror(errnum); }
+#endif
+inline const char* GetEnv(const char* name) {
+#if GTEST_OS_WINDOWS_MOBILE
+ // We are on Windows CE, which has no environment variables.
+ return NULL;
+#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
+ // Environment variables which we programmatically clear will be set to the
+ // empty string rather than unset (NULL). Handle that case.
+ const char* const env = getenv(name);
+ return (env != NULL && env[0] != '\0') ? env : NULL;
+#else
+ return getenv(name);
+#endif
+}
+
+#ifdef _MSC_VER
+# pragma warning(pop) // Restores the warning state.
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Windows CE has no C library. The abort() function is used in
+// several places in Google Test. This implementation provides a reasonable
+// imitation of standard behaviour.
+void Abort();
+#else
+inline void Abort() { abort(); }
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+} // namespace posix
+
+// MSVC "deprecates" snprintf and issues warnings wherever it is used. In
+// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
+// MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate
+// function in order to achieve that. We use macro definition here because
+// snprintf is a variadic function.
+#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+// MSVC 2005 and above support variadic macros.
+# define GTEST_SNPRINTF_(buffer, size, format, ...) \
+ _snprintf_s(buffer, size, size, format, __VA_ARGS__)
+#elif defined(_MSC_VER)
+// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
+// complain about _snprintf.
+# define GTEST_SNPRINTF_ _snprintf
+#else
+# define GTEST_SNPRINTF_ snprintf
+#endif
+
+// The maximum number a BiggestInt can represent. This definition
+// works no matter BiggestInt is represented in one's complement or
+// two's complement.
+//
+// We cannot rely on numeric_limits in STL, as __int64 and long long
+// are not part of standard C++ and numeric_limits doesn't need to be
+// defined for them.
+const BiggestInt kMaxBiggestInt =
+ ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
+
+// This template class serves as a compile-time function from size to
+// type. It maps a size in bytes to a primitive type with that
+// size. e.g.
+//
+// TypeWithSize<4>::UInt
+//
+// is typedef-ed to be unsigned int (unsigned integer made up of 4
+// bytes).
+//
+// Such functionality should belong to STL, but I cannot find it
+// there.
+//
+// Google Test uses this class in the implementation of floating-point
+// comparison.
+//
+// For now it only handles UInt (unsigned int) as that's all Google Test
+// needs. Other types can be easily added in the future if need
+// arises.
+template <size_t size>
+class TypeWithSize {
+ public:
+ // This prevents the user from using TypeWithSize<N> with incorrect
+ // values of N.
+ typedef void UInt;
+};
+
+// The specialization for size 4.
+template <>
+class TypeWithSize<4> {
+ public:
+ // unsigned int has size 4 in both gcc and MSVC.
+ //
+ // As base/basictypes.h doesn't compile on Windows, we cannot use
+ // uint32, uint64, and etc here.
+ typedef int Int;
+ typedef unsigned int UInt;
+};
+
+// The specialization for size 8.
+template <>
+class TypeWithSize<8> {
+ public:
+#if GTEST_OS_WINDOWS
+ typedef __int64 Int;
+ typedef unsigned __int64 UInt;
+#else
+ typedef long long Int; // NOLINT
+ typedef unsigned long long UInt; // NOLINT
+#endif // GTEST_OS_WINDOWS
+};
+
+// Integer types of known sizes.
+typedef TypeWithSize<4>::Int Int32;
+typedef TypeWithSize<4>::UInt UInt32;
+typedef TypeWithSize<8>::Int Int64;
+typedef TypeWithSize<8>::UInt UInt64;
+typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds.
+
+// Utilities for command line flags and environment variables.
+
+// Macro for referencing flags.
+#define GTEST_FLAG(name) FLAGS_gtest_##name
+
+// Macros for declaring flags.
+#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
+#define GTEST_DECLARE_int32_(name) \
+ GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
+#define GTEST_DECLARE_string_(name) \
+ GTEST_API_ extern ::std::string GTEST_FLAG(name)
+
+// Macros for defining flags.
+#define GTEST_DEFINE_bool_(name, default_val, doc) \
+ GTEST_API_ bool GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_int32_(name, default_val, doc) \
+ GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_string_(name, default_val, doc) \
+ GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
+
+// Thread annotations
+#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
+#define GTEST_LOCK_EXCLUDED_(locks)
+
+// Parses 'str' for a 32-bit signed integer. If successful, writes the result
+// to *value and returns true; otherwise leaves *value unchanged and returns
+// false.
+// TODO(chandlerc): Find a better way to refactor flag and environment parsing
+// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
+// function.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value);
+
+// Parses a bool/Int32/string from the environment variable
+// corresponding to the given Google Test flag.
+bool BoolFromGTestEnv(const char* flag, bool default_val);
+GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
+const char* StringFromGTestEnv(const char* flag, const char* default_val);
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+#if GTEST_OS_LINUX
+# include <stdlib.h>
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <unistd.h>
+#endif // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#include <ctype.h>
+#include <float.h>
+#include <string.h>
+#include <iomanip>
+#include <limits>
+#include <set>
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the Message class.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
+// program!
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+
+#include <limits>
+
+
+// Ensures that there is at least one operator<< in the global namespace.
+// See Message& operator<<(...) below for why.
+void operator<<(const testing::internal::Secret&, int);
+
+namespace testing {
+
+// The Message class works like an ostream repeater.
+//
+// Typical usage:
+//
+// 1. You stream a bunch of values to a Message object.
+// It will remember the text in a stringstream.
+// 2. Then you stream the Message object to an ostream.
+// This causes the text in the Message to be streamed
+// to the ostream.
+//
+// For example;
+//
+// testing::Message foo;
+// foo << 1 << " != " << 2;
+// std::cout << foo;
+//
+// will print "1 != 2".
+//
+// Message is not intended to be inherited from. In particular, its
+// destructor is not virtual.
+//
+// Note that stringstream behaves differently in gcc and in MSVC. You
+// can stream a NULL char pointer to it in the former, but not in the
+// latter (it causes an access violation if you do). The Message
+// class hides this difference by treating a NULL char pointer as
+// "(null)".
+class GTEST_API_ Message {
+ private:
+ // The type of basic IO manipulators (endl, ends, and flush) for
+ // narrow streams.
+ typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
+
+ public:
+ // Constructs an empty Message.
+ Message();
+
+ // Copy constructor.
+ Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT
+ *ss_ << msg.GetString();
+ }
+
+ // Constructs a Message from a C-string.
+ explicit Message(const char* str) : ss_(new ::std::stringstream) {
+ *ss_ << str;
+ }
+
+#if GTEST_OS_SYMBIAN
+ // Streams a value (either a pointer or not) to this object.
+ template <typename T>
+ inline Message& operator <<(const T& value) {
+ StreamHelper(typename internal::is_pointer<T>::type(), value);
+ return *this;
+ }
+#else
+ // Streams a non-pointer value to this object.
+ template <typename T>
+ inline Message& operator <<(const T& val) {
+ // Some libraries overload << for STL containers. These
+ // overloads are defined in the global namespace instead of ::std.
+ //
+ // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
+ // overloads are visible in either the std namespace or the global
+ // namespace, but not other namespaces, including the testing
+ // namespace which Google Test's Message class is in.
+ //
+ // To allow STL containers (and other types that has a << operator
+ // defined in the global namespace) to be used in Google Test
+ // assertions, testing::Message must access the custom << operator
+ // from the global namespace. With this using declaration,
+ // overloads of << defined in the global namespace and those
+ // visible via Koenig lookup are both exposed in this function.
+ using ::operator <<;
+ *ss_ << val;
+ return *this;
+ }
+
+ // Streams a pointer value to this object.
+ //
+ // This function is an overload of the previous one. When you
+ // stream a pointer to a Message, this definition will be used as it
+ // is more specialized. (The C++ Standard, section
+ // [temp.func.order].) If you stream a non-pointer, then the
+ // previous definition will be used.
+ //
+ // The reason for this overload is that streaming a NULL pointer to
+ // ostream is undefined behavior. Depending on the compiler, you
+ // may get "0", "(nil)", "(null)", or an access violation. To
+ // ensure consistent result across compilers, we always treat NULL
+ // as "(null)".
+ template <typename T>
+ inline Message& operator <<(T* const& pointer) { // NOLINT
+ if (pointer == NULL) {
+ *ss_ << "(null)";
+ } else {
+ *ss_ << pointer;
+ }
+ return *this;
+ }
+#endif // GTEST_OS_SYMBIAN
+
+ // Since the basic IO manipulators are overloaded for both narrow
+ // and wide streams, we have to provide this specialized definition
+ // of operator <<, even though its body is the same as the
+ // templatized version above. Without this definition, streaming
+ // endl or other basic IO manipulators to Message will confuse the
+ // compiler.
+ Message& operator <<(BasicNarrowIoManip val) {
+ *ss_ << val;
+ return *this;
+ }
+
+ // Instead of 1/0, we want to see true/false for bool values.
+ Message& operator <<(bool b) {
+ return *this << (b ? "true" : "false");
+ }
+
+ // These two overloads allow streaming a wide C string to a Message
+ // using the UTF-8 encoding.
+ Message& operator <<(const wchar_t* wide_c_str);
+ Message& operator <<(wchar_t* wide_c_str);
+
+#if GTEST_HAS_STD_WSTRING
+ // Converts the given wide string to a narrow string using the UTF-8
+ // encoding, and streams the result to this Message object.
+ Message& operator <<(const ::std::wstring& wstr);
+#endif // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+ // Converts the given wide string to a narrow string using the UTF-8
+ // encoding, and streams the result to this Message object.
+ Message& operator <<(const ::wstring& wstr);
+#endif // GTEST_HAS_GLOBAL_WSTRING
+
+ // Gets the text streamed to this object so far as an std::string.
+ // Each '\0' character in the buffer is replaced with "\\0".
+ //
+ // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+ std::string GetString() const;
+
+ private:
+
+#if GTEST_OS_SYMBIAN
+ // These are needed as the Nokia Symbian Compiler cannot decide between
+ // const T& and const T* in a function template. The Nokia compiler _can_
+ // decide between class template specializations for T and T*, so a
+ // tr1::type_traits-like is_pointer works, and we can overload on that.
+ template <typename T>
+ inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
+ if (pointer == NULL) {
+ *ss_ << "(null)";
+ } else {
+ *ss_ << pointer;
+ }
+ }
+ template <typename T>
+ inline void StreamHelper(internal::false_type /*is_pointer*/,
+ const T& value) {
+ // See the comments in Message& operator <<(const T&) above for why
+ // we need this using statement.
+ using ::operator <<;
+ *ss_ << value;
+ }
+#endif // GTEST_OS_SYMBIAN
+
+ // We'll hold the text streamed to this object here.
+ const internal::scoped_ptr< ::std::stringstream> ss_;
+
+ // We declare (but don't implement) this to prevent the compiler
+ // from implementing the assignment operator.
+ void operator=(const Message&);
+};
+
+// Streams a Message to an ostream.
+inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
+ return os << sb.GetString();
+}
+
+namespace internal {
+
+// Converts a streamable value to an std::string. A NULL pointer is
+// converted to "(null)". When the input value is a ::string,
+// ::std::string, ::wstring, or ::std::wstring object, each NUL
+// character in it is replaced with "\\0".
+template <typename T>
+std::string StreamableToString(const T& streamable) {
+ return (Message() << streamable).GetString();
+}
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares the String class and functions used internally by
+// Google Test. They are subject to change without notice. They should not used
+// by code external to Google Test.
+//
+// This header file is #included by <gtest/internal/gtest-internal.h>.
+// It should not be #included by other files.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+
+#ifdef __BORLANDC__
+// string.h is not guaranteed to provide strcpy on C++ Builder.
+# include <mem.h>
+#endif
+
+#include <string.h>
+#include <string>
+
+
+namespace testing {
+namespace internal {
+
+// String - an abstract class holding static string utilities.
+class GTEST_API_ String {
+ public:
+ // Static utility methods
+
+ // Clones a 0-terminated C string, allocating memory using new. The
+ // caller is responsible for deleting the return value using
+ // delete[]. Returns the cloned string, or NULL if the input is
+ // NULL.
+ //
+ // This is different from strdup() in string.h, which allocates
+ // memory using malloc().
+ static const char* CloneCString(const char* c_str);
+
+#if GTEST_OS_WINDOWS_MOBILE
+ // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
+ // able to pass strings to Win32 APIs on CE we need to convert them
+ // to 'Unicode', UTF-16.
+
+ // Creates a UTF-16 wide string from the given ANSI string, allocating
+ // memory using new. The caller is responsible for deleting the return
+ // value using delete[]. Returns the wide string, or NULL if the
+ // input is NULL.
+ //
+ // The wide string is created using the ANSI codepage (CP_ACP) to
+ // match the behaviour of the ANSI versions of Win32 calls and the
+ // C runtime.
+ static LPCWSTR AnsiToUtf16(const char* c_str);
+
+ // Creates an ANSI string from the given wide string, allocating
+ // memory using new. The caller is responsible for deleting the return
+ // value using delete[]. Returns the ANSI string, or NULL if the
+ // input is NULL.
+ //
+ // The returned string is created using the ANSI codepage (CP_ACP) to
+ // match the behaviour of the ANSI versions of Win32 calls and the
+ // C runtime.
+ static const char* Utf16ToAnsi(LPCWSTR utf16_str);
+#endif
+
+ // Compares two C strings. Returns true iff they have the same content.
+ //
+ // Unlike strcmp(), this function can handle NULL argument(s). A
+ // NULL C string is considered different to any non-NULL C string,
+ // including the empty string.
+ static bool CStringEquals(const char* lhs, const char* rhs);
+
+ // Converts a wide C string to a String using the UTF-8 encoding.
+ // NULL will be converted to "(null)". If an error occurred during
+ // the conversion, "(failed to convert from wide string)" is
+ // returned.
+ static std::string ShowWideCString(const wchar_t* wide_c_str);
+
+ // Compares two wide C strings. Returns true iff they have the same
+ // content.
+ //
+ // Unlike wcscmp(), this function can handle NULL argument(s). A
+ // NULL C string is considered different to any non-NULL C string,
+ // including the empty string.
+ static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
+
+ // Compares two C strings, ignoring case. Returns true iff they
+ // have the same content.
+ //
+ // Unlike strcasecmp(), this function can handle NULL argument(s).
+ // A NULL C string is considered different to any non-NULL C string,
+ // including the empty string.
+ static bool CaseInsensitiveCStringEquals(const char* lhs,
+ const char* rhs);
+
+ // Compares two wide C strings, ignoring case. Returns true iff they
+ // have the same content.
+ //
+ // Unlike wcscasecmp(), this function can handle NULL argument(s).
+ // A NULL C string is considered different to any non-NULL wide C string,
+ // including the empty string.
+ // NB: The implementations on different platforms slightly differ.
+ // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+ // environment variable. On GNU platform this method uses wcscasecmp
+ // which compares according to LC_CTYPE category of the current locale.
+ // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+ // current locale.
+ static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+ const wchar_t* rhs);
+
+ // Returns true iff the given string ends with the given suffix, ignoring
+ // case. Any string is considered to end with an empty suffix.
+ static bool EndsWithCaseInsensitive(
+ const std::string& str, const std::string& suffix);
+
+ // Formats an int value as "%02d".
+ static std::string FormatIntWidth2(int value); // "%02d" for width == 2
+
+ // Formats an int value as "%X".
+ static std::string FormatHexInt(int value);
+
+ // Formats a byte as "%02X".
+ static std::string FormatByte(unsigned char value);
+
+ private:
+ String(); // Not meant to be instantiated.
+}; // class String
+
+// Gets the content of the stringstream's buffer as an std::string. Each '\0'
+// character in the buffer is replaced with "\\0".
+GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test filepath utilities
+//
+// This header file declares classes and functions used internally by
+// Google Test. They are subject to change without notice.
+//
+// This file is #included in <gtest/internal/gtest-internal.h>.
+// Do not include this header file separately!
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+
+
+namespace testing {
+namespace internal {
+
+// FilePath - a class for file and directory pathname manipulation which
+// handles platform-specific conventions (like the pathname separator).
+// Used for helper functions for naming files in a directory for xml output.
+// Except for Set methods, all methods are const or static, which provides an
+// "immutable value object" -- useful for peace of mind.
+// A FilePath with a value ending in a path separator ("like/this/") represents
+// a directory, otherwise it is assumed to represent a file. In either case,
+// it may or may not represent an actual file or directory in the file system.
+// Names are NOT checked for syntax correctness -- no checking for illegal
+// characters, malformed paths, etc.
+
+class GTEST_API_ FilePath {
+ public:
+ FilePath() : pathname_("") { }
+ FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
+
+ explicit FilePath(const std::string& pathname) : pathname_(pathname) {
+ Normalize();
+ }
+
+ FilePath& operator=(const FilePath& rhs) {
+ Set(rhs);
+ return *this;
+ }
+
+ void Set(const FilePath& rhs) {
+ pathname_ = rhs.pathname_;
+ }
+
+ const std::string& string() const { return pathname_; }
+ const char* c_str() const { return pathname_.c_str(); }
+
+ // Returns the current working directory, or "" if unsuccessful.
+ static FilePath GetCurrentDir();
+
+ // Given directory = "dir", base_name = "test", number = 0,
+ // extension = "xml", returns "dir/test.xml". If number is greater
+ // than zero (e.g., 12), returns "dir/test_12.xml".
+ // On Windows platform, uses \ as the separator rather than /.
+ static FilePath MakeFileName(const FilePath& directory,
+ const FilePath& base_name,
+ int number,
+ const char* extension);
+
+ // Given directory = "dir", relative_path = "test.xml",
+ // returns "dir/test.xml".
+ // On Windows, uses \ as the separator rather than /.
+ static FilePath ConcatPaths(const FilePath& directory,
+ const FilePath& relative_path);
+
+ // Returns a pathname for a file that does not currently exist. The pathname
+ // will be directory/base_name.extension or
+ // directory/base_name_<number>.extension if directory/base_name.extension
+ // already exists. The number will be incremented until a pathname is found
+ // that does not already exist.
+ // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+ // There could be a race condition if two or more processes are calling this
+ // function at the same time -- they could both pick the same filename.
+ static FilePath GenerateUniqueFileName(const FilePath& directory,
+ const FilePath& base_name,
+ const char* extension);
+
+ // Returns true iff the path is "".
+ bool IsEmpty() const { return pathname_.empty(); }
+
+ // If input name has a trailing separator character, removes it and returns
+ // the name, otherwise return the name string unmodified.
+ // On Windows platform, uses \ as the separator, other platforms use /.
+ FilePath RemoveTrailingPathSeparator() const;
+
+ // Returns a copy of the FilePath with the directory part removed.
+ // Example: FilePath("path/to/file").RemoveDirectoryName() returns
+ // FilePath("file"). If there is no directory part ("just_a_file"), it returns
+ // the FilePath unmodified. If there is no file part ("just_a_dir/") it
+ // returns an empty FilePath ("").
+ // On Windows platform, '\' is the path separator, otherwise it is '/'.
+ FilePath RemoveDirectoryName() const;
+
+ // RemoveFileName returns the directory path with the filename removed.
+ // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+ // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+ // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+ // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+ // On Windows platform, '\' is the path separator, otherwise it is '/'.
+ FilePath RemoveFileName() const;
+
+ // Returns a copy of the FilePath with the case-insensitive extension removed.
+ // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+ // FilePath("dir/file"). If a case-insensitive extension is not
+ // found, returns a copy of the original FilePath.
+ FilePath RemoveExtension(const char* extension) const;
+
+ // Creates directories so that path exists. Returns true if successful or if
+ // the directories already exist; returns false if unable to create
+ // directories for any reason. Will also return false if the FilePath does
+ // not represent a directory (that is, it doesn't end with a path separator).
+ bool CreateDirectoriesRecursively() const;
+
+ // Create the directory so that path exists. Returns true if successful or
+ // if the directory already exists; returns false if unable to create the
+ // directory for any reason, including if the parent directory does not
+ // exist. Not named "CreateDirectory" because that's a macro on Windows.
+ bool CreateFolder() const;
+
+ // Returns true if FilePath describes something in the file-system,
+ // either a file, directory, or whatever, and that something exists.
+ bool FileOrDirectoryExists() const;
+
+ // Returns true if pathname describes a directory in the file-system
+ // that exists.
+ bool DirectoryExists() const;
+
+ // Returns true if FilePath ends with a path separator, which indicates that
+ // it is intended to represent a directory. Returns false otherwise.
+ // This does NOT check that a directory (or file) actually exists.
+ bool IsDirectory() const;
+
+ // Returns true if pathname describes a root directory. (Windows has one
+ // root directory per disk drive.)
+ bool IsRootDirectory() const;
+
+ // Returns true if pathname describes an absolute path.
+ bool IsAbsolutePath() const;
+
+ private:
+ // Replaces multiple consecutive separators with a single separator.
+ // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+ // redundancies that might be in a pathname involving "." or "..".
+ //
+ // A pathname with multiple consecutive separators may occur either through
+ // user error or as a result of some scripts or APIs that generate a pathname
+ // with a trailing separator. On other platforms the same API or script
+ // may NOT generate a pathname with a trailing "/". Then elsewhere that
+ // pathname may have another "/" and pathname components added to it,
+ // without checking for the separator already being there.
+ // The script language and operating system may allow paths like "foo//bar"
+ // but some of the functions in FilePath will not handle that correctly. In
+ // particular, RemoveTrailingPathSeparator() only removes one separator, and
+ // it is called in CreateDirectoriesRecursively() assuming that it will change
+ // a pathname from directory syntax (trailing separator) to filename syntax.
+ //
+ // On Windows this method also replaces the alternate path separator '/' with
+ // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
+ // "bar\\foo".
+
+ void Normalize();
+
+ // Returns a pointer to the last occurence of a valid path separator in
+ // the FilePath. On Windows, for example, both '/' and '\' are valid path
+ // separators. Returns NULL if no path separator was found.
+ const char* FindLastPathSeparator() const;
+
+ std::string pathname_;
+}; // class FilePath
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+// This file was GENERATED by command:
+// pump.py gtest-type-util.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Type utilities needed for implementing typed and type-parameterized
+// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
+//
+// Currently we support at most 50 types in a list, and at most 50
+// type-parameterized tests in one type-parameterized test case.
+// Please contact googletestframework at googlegroups.com if you need
+// more.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+
+// #ifdef __GNUC__ is too general here. It is possible to use gcc without using
+// libstdc++ (which is where cxxabi.h comes from).
+# if GTEST_HAS_CXXABI_H_
+# include <cxxabi.h>
+# elif defined(__HP_aCC)
+# include <acxx_demangle.h>
+# endif // GTEST_HASH_CXXABI_H_
+
+namespace testing {
+namespace internal {
+
+// GetTypeName<T>() returns a human-readable name of type T.
+// NB: This function is also used in Google Mock, so don't move it inside of
+// the typed-test-only section below.
+template <typename T>
+std::string GetTypeName() {
+# if GTEST_HAS_RTTI
+
+ const char* const name = typeid(T).name();
+# if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
+ int status = 0;
+ // gcc's implementation of typeid(T).name() mangles the type name,
+ // so we have to demangle it.
+# if GTEST_HAS_CXXABI_H_
+ using abi::__cxa_demangle;
+# endif // GTEST_HAS_CXXABI_H_
+ char* const readable_name = __cxa_demangle(name, 0, 0, &status);
+ const std::string name_str(status == 0 ? readable_name : name);
+ free(readable_name);
+ return name_str;
+# else
+ return name;
+# endif // GTEST_HAS_CXXABI_H_ || __HP_aCC
+
+# else
+
+ return "<type>";
+
+# endif // GTEST_HAS_RTTI
+}
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
+// type. This can be used as a compile-time assertion to ensure that
+// two types are equal.
+
+template <typename T1, typename T2>
+struct AssertTypeEq;
+
+template <typename T>
+struct AssertTypeEq<T, T> {
+ typedef bool type;
+};
+
+// A unique type used as the default value for the arguments of class
+// template Types. This allows us to simulate variadic templates
+// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
+// support directly.
+struct None {};
+
+// The following family of struct and struct templates are used to
+// represent type lists. In particular, TypesN<T1, T2, ..., TN>
+// represents a type list with N types (T1, T2, ..., and TN) in it.
+// Except for Types0, every struct in the family has two member types:
+// Head for the first type in the list, and Tail for the rest of the
+// list.
+
+// The empty type list.
+struct Types0 {};
+
+// Type lists of length 1, 2, 3, and so on.
+
+template <typename T1>
+struct Types1 {
+ typedef T1 Head;
+ typedef Types0 Tail;
+};
+template <typename T1, typename T2>
+struct Types2 {
+ typedef T1 Head;
+ typedef Types1<T2> Tail;
+};
+
+template <typename T1, typename T2, typename T3>
+struct Types3 {
+ typedef T1 Head;
+ typedef Types2<T2, T3> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types4 {
+ typedef T1 Head;
+ typedef Types3<T2, T3, T4> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types5 {
+ typedef T1 Head;
+ typedef Types4<T2, T3, T4, T5> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+struct Types6 {
+ typedef T1 Head;
+ typedef Types5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+struct Types7 {
+ typedef T1 Head;
+ typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+struct Types8 {
+ typedef T1 Head;
+ typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+struct Types9 {
+ typedef T1 Head;
+ typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types10 {
+ typedef T1 Head;
+ typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11>
+struct Types11 {
+ typedef T1 Head;
+ typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12>
+struct Types12 {
+ typedef T1 Head;
+ typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13>
+struct Types13 {
+ typedef T1 Head;
+ typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14>
+struct Types14 {
+ typedef T1 Head;
+ typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types15 {
+ typedef T1 Head;
+ typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16>
+struct Types16 {
+ typedef T1 Head;
+ typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17>
+struct Types17 {
+ typedef T1 Head;
+ typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18>
+struct Types18 {
+ typedef T1 Head;
+ typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19>
+struct Types19 {
+ typedef T1 Head;
+ typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types20 {
+ typedef T1 Head;
+ typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21>
+struct Types21 {
+ typedef T1 Head;
+ typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22>
+struct Types22 {
+ typedef T1 Head;
+ typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23>
+struct Types23 {
+ typedef T1 Head;
+ typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24>
+struct Types24 {
+ typedef T1 Head;
+ typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types25 {
+ typedef T1 Head;
+ typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26>
+struct Types26 {
+ typedef T1 Head;
+ typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27>
+struct Types27 {
+ typedef T1 Head;
+ typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28>
+struct Types28 {
+ typedef T1 Head;
+ typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29>
+struct Types29 {
+ typedef T1 Head;
+ typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types30 {
+ typedef T1 Head;
+ typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31>
+struct Types31 {
+ typedef T1 Head;
+ typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32>
+struct Types32 {
+ typedef T1 Head;
+ typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33>
+struct Types33 {
+ typedef T1 Head;
+ typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34>
+struct Types34 {
+ typedef T1 Head;
+ typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types35 {
+ typedef T1 Head;
+ typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36>
+struct Types36 {
+ typedef T1 Head;
+ typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37>
+struct Types37 {
+ typedef T1 Head;
+ typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38>
+struct Types38 {
+ typedef T1 Head;
+ typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39>
+struct Types39 {
+ typedef T1 Head;
+ typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types40 {
+ typedef T1 Head;
+ typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41>
+struct Types41 {
+ typedef T1 Head;
+ typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42>
+struct Types42 {
+ typedef T1 Head;
+ typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43>
+struct Types43 {
+ typedef T1 Head;
+ typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44>
+struct Types44 {
+ typedef T1 Head;
+ typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types45 {
+ typedef T1 Head;
+ typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46>
+struct Types46 {
+ typedef T1 Head;
+ typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47>
+struct Types47 {
+ typedef T1 Head;
+ typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48>
+struct Types48 {
+ typedef T1 Head;
+ typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49>
+struct Types49 {
+ typedef T1 Head;
+ typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49, typename T50>
+struct Types50 {
+ typedef T1 Head;
+ typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+} // namespace internal
+
+// We don't want to require the users to write TypesN<...> directly,
+// as that would require them to count the length. Types<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Types<int>
+// will appear as Types<int, None, None, ..., None> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Types<T1, ..., TN>, and Google Test will translate
+// that to TypesN<T1, ..., TN> internally to make error messages
+// readable. The translation is done by the 'type' member of the
+// Types template.
+template <typename T1 = internal::None, typename T2 = internal::None,
+ typename T3 = internal::None, typename T4 = internal::None,
+ typename T5 = internal::None, typename T6 = internal::None,
+ typename T7 = internal::None, typename T8 = internal::None,
+ typename T9 = internal::None, typename T10 = internal::None,
+ typename T11 = internal::None, typename T12 = internal::None,
+ typename T13 = internal::None, typename T14 = internal::None,
+ typename T15 = internal::None, typename T16 = internal::None,
+ typename T17 = internal::None, typename T18 = internal::None,
+ typename T19 = internal::None, typename T20 = internal::None,
+ typename T21 = internal::None, typename T22 = internal::None,
+ typename T23 = internal::None, typename T24 = internal::None,
+ typename T25 = internal::None, typename T26 = internal::None,
+ typename T27 = internal::None, typename T28 = internal::None,
+ typename T29 = internal::None, typename T30 = internal::None,
+ typename T31 = internal::None, typename T32 = internal::None,
+ typename T33 = internal::None, typename T34 = internal::None,
+ typename T35 = internal::None, typename T36 = internal::None,
+ typename T37 = internal::None, typename T38 = internal::None,
+ typename T39 = internal::None, typename T40 = internal::None,
+ typename T41 = internal::None, typename T42 = internal::None,
+ typename T43 = internal::None, typename T44 = internal::None,
+ typename T45 = internal::None, typename T46 = internal::None,
+ typename T47 = internal::None, typename T48 = internal::None,
+ typename T49 = internal::None, typename T50 = internal::None>
+struct Types {
+ typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Types<internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types0 type;
+};
+template <typename T1>
+struct Types<T1, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types1<T1> type;
+};
+template <typename T1, typename T2>
+struct Types<T1, T2, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types2<T1, T2> type;
+};
+template <typename T1, typename T2, typename T3>
+struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types3<T1, T2, T3> type;
+};
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types4<T1, T2, T3, T4> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types5<T1, T2, T3, T4, T5> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None, internal::None> {
+ typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None, internal::None> {
+ typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+ internal::None, internal::None, internal::None, internal::None,
+ internal::None> {
+ typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+ T46, internal::None, internal::None, internal::None, internal::None> {
+ typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45, T46> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+ T46, T47, internal::None, internal::None, internal::None> {
+ typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45, T46, T47> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+ T46, T47, T48, internal::None, internal::None> {
+ typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+ T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+ T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+ T46, T47, T48, T49, internal::None> {
+ typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+namespace internal {
+
+# define GTEST_TEMPLATE_ template <typename T> class
+
+// The template "selector" struct TemplateSel<Tmpl> is used to
+// represent Tmpl, which must be a class template with one type
+// parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined
+// as the type Tmpl<T>. This allows us to actually instantiate the
+// template "selected" by TemplateSel<Tmpl>.
+//
+// This trick is necessary for simulating typedef for class templates,
+// which C++ doesn't support directly.
+template <GTEST_TEMPLATE_ Tmpl>
+struct TemplateSel {
+ template <typename T>
+ struct Bind {
+ typedef Tmpl<T> type;
+ };
+};
+
+# define GTEST_BIND_(TmplSel, T) \
+ TmplSel::template Bind<T>::type
+
+// A unique struct template used as the default value for the
+// arguments of class template Templates. This allows us to simulate
+// variadic templates (e.g. Templates<int>, Templates<int, double>,
+// and etc), which C++ doesn't support directly.
+template <typename T>
+struct NoneT {};
+
+// The following family of struct and struct templates are used to
+// represent template lists. In particular, TemplatesN<T1, T2, ...,
+// TN> represents a list of N templates (T1, T2, ..., and TN). Except
+// for Templates0, every struct in the family has two member types:
+// Head for the selector of the first template in the list, and Tail
+// for the rest of the list.
+
+// The empty template list.
+struct Templates0 {};
+
+// Template lists of length 1, 2, 3, and so on.
+
+template <GTEST_TEMPLATE_ T1>
+struct Templates1 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates0 Tail;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates2 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates1<T2> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates3 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates2<T2, T3> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4>
+struct Templates4 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates3<T2, T3, T4> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates5 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates4<T2, T3, T4, T5> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates6 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7>
+struct Templates7 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates8 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates9 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10>
+struct Templates10 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates11 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates12 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13>
+struct Templates13 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates14 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates15 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16>
+struct Templates16 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates17 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates18 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19>
+struct Templates19 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates20 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates21 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22>
+struct Templates22 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates23 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates24 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25>
+struct Templates25 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates26 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates27 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28>
+struct Templates28 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates29 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates30 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31>
+struct Templates31 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates32 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates33 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34>
+struct Templates34 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates35 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates36 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37>
+struct Templates37 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates38 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates39 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40>
+struct Templates40 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates41 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates42 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43>
+struct Templates43 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates44 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates45 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44, T45> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46>
+struct Templates46 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44, T45, T46> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates47 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44, T45, T46, T47> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates48 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44, T45, T46, T47, T48> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+ GTEST_TEMPLATE_ T49>
+struct Templates49 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+ GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
+struct Templates50 {
+ typedef TemplateSel<T1> Head;
+ typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43, T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+// We don't want to require the users to write TemplatesN<...> directly,
+// as that would require them to count the length. Templates<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Templates<list>
+// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Templates<T1, ..., TN>, and Google Test will translate
+// that to TemplatesN<T1, ..., TN> internally to make error messages
+// readable. The translation is done by the 'type' member of the
+// Templates template.
+template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
+ GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
+ GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
+ GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
+ GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
+ GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
+ GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
+ GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
+ GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
+ GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
+ GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
+ GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
+ GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
+ GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
+ GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
+ GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
+ GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
+ GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
+ GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
+ GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
+ GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
+ GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
+ GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
+ GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
+ GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
+struct Templates {
+ typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT> {
+ typedef Templates0 type;
+};
+template <GTEST_TEMPLATE_ T1>
+struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT> {
+ typedef Templates1<T1> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT> {
+ typedef Templates2<T1, T2> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates3<T1, T2, T3> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4>
+struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates4<T1, T2, T3, T4> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates5<T1, T2, T3, T4, T5> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates6<T1, T2, T3, T4, T5, T6> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT> {
+ typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT> {
+ typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT> {
+ typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT> {
+ typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT> {
+ typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT> {
+ typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT> {
+ typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT> {
+ typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44, T45> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ T45, T46, NoneT, NoneT, NoneT, NoneT> {
+ typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44, T45, T46> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ T45, T46, T47, NoneT, NoneT, NoneT> {
+ typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44, T45, T46, T47> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ T45, T46, T47, T48, NoneT, NoneT> {
+ typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+ GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+ GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+ GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+ GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+ GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+ GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+ GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+ GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+ GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+ GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+ GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+ GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+ GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+ GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+ GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+ GTEST_TEMPLATE_ T49>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+ T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+ T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+ T45, T46, T47, T48, T49, NoneT> {
+ typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+// The TypeList template makes it possible to use either a single type
+// or a Types<...> list in TYPED_TEST_CASE() and
+// INSTANTIATE_TYPED_TEST_CASE_P().
+
+template <typename T>
+struct TypeList {
+ typedef Types1<T> type;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49, typename T50>
+struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48, T49, T50> > {
+ typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
+};
+
+#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+// Due to C++ preprocessor weirdness, we need double indirection to
+// concatenate two tokens when one of them is __LINE__. Writing
+//
+// foo ## __LINE__
+//
+// will result in the token foo__LINE__, instead of foo followed by
+// the current line number. For more details, see
+// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
+#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
+#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
+
+class ProtocolMessage;
+namespace proto2 { class Message; }
+
+namespace testing {
+
+// Forward declarations.
+
+class AssertionResult; // Result of an assertion.
+class Message; // Represents a failure message.
+class Test; // Represents a test.
+class TestInfo; // Information about a test.
+class TestPartResult; // Result of a test part.
+class UnitTest; // A collection of test cases.
+
+template <typename T>
+::std::string PrintToString(const T& value);
+
+namespace internal {
+
+struct TraceInfo; // Information about a trace point.
+class ScopedTrace; // Implements scoped trace.
+class TestInfoImpl; // Opaque implementation of TestInfo
+class UnitTestImpl; // Opaque implementation of UnitTest
+
+// How many times InitGoogleTest() has been called.
+GTEST_API_ extern int g_init_gtest_count;
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+GTEST_API_ extern const char kStackTraceMarker[];
+
+// Two overloaded helpers for checking at compile time whether an
+// expression is a null pointer literal (i.e. NULL or any 0-valued
+// compile-time integral constant). Their return values have
+// different sizes, so we can use sizeof() to test which version is
+// picked by the compiler. These helpers have no implementations, as
+// we only need their signatures.
+//
+// Given IsNullLiteralHelper(x), the compiler will pick the first
+// version if x can be implicitly converted to Secret*, and pick the
+// second version otherwise. Since Secret is a secret and incomplete
+// type, the only expression a user can write that has type Secret* is
+// a null pointer literal. Therefore, we know that x is a null
+// pointer literal if and only if the first version is picked by the
+// compiler.
+char IsNullLiteralHelper(Secret* p);
+char (&IsNullLiteralHelper(...))[2]; // NOLINT
+
+// A compile-time bool constant that is true if and only if x is a
+// null pointer literal (i.e. NULL or any 0-valued compile-time
+// integral constant).
+#ifdef GTEST_ELLIPSIS_NEEDS_POD_
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_IS_NULL_LITERAL_(x) false
+#else
+# define GTEST_IS_NULL_LITERAL_(x) \
+ (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
+#endif // GTEST_ELLIPSIS_NEEDS_POD_
+
+// Appends the user-supplied message to the Google-Test-generated message.
+GTEST_API_ std::string AppendUserMessage(
+ const std::string& gtest_msg, const Message& user_msg);
+
+#if GTEST_HAS_EXCEPTIONS
+
+// This exception is thrown by (and only by) a failed Google Test
+// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
+// are enabled). We derive it from std::runtime_error, which is for
+// errors presumably detectable only at run time. Since
+// std::runtime_error inherits from std::exception, many testing
+// frameworks know how to extract and print the message inside it.
+class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
+ public:
+ explicit GoogleTestFailureException(const TestPartResult& failure);
+};
+
+#endif // GTEST_HAS_EXCEPTIONS
+
+// A helper class for creating scoped traces in user programs.
+class GTEST_API_ ScopedTrace {
+ public:
+ // The c'tor pushes the given source file location and message onto
+ // a trace stack maintained by Google Test.
+ ScopedTrace(const char* file, int line, const Message& message);
+
+ // The d'tor pops the info pushed by the c'tor.
+ //
+ // Note that the d'tor is not virtual in order to be efficient.
+ // Don't inherit from ScopedTrace!
+ ~ScopedTrace();
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
+} GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its
+ // c'tor and d'tor. Therefore it doesn't
+ // need to be used otherwise.
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings. For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+// expected_expression: "foo"
+// actual_expression: "bar"
+// expected_value: "5"
+// actual_value: "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
+ const char* actual_expression,
+ const std::string& expected_value,
+ const std::string& actual_value,
+ bool ignoring_case);
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+GTEST_API_ std::string GetBoolAssertionFailureMessage(
+ const AssertionResult& assertion_result,
+ const char* expression_text,
+ const char* actual_predicate_value,
+ const char* expected_predicate_value);
+
+// This template class represents an IEEE floating-point number
+// (either single-precision or double-precision, depending on the
+// template parameters).
+//
+// The purpose of this class is to do more sophisticated number
+// comparison. (Due to round-off error, etc, it's very unlikely that
+// two floating-points will be equal exactly. Hence a naive
+// comparison by the == operation often doesn't work.)
+//
+// Format of IEEE floating-point:
+//
+// The most-significant bit being the leftmost, an IEEE
+// floating-point looks like
+//
+// sign_bit exponent_bits fraction_bits
+//
+// Here, sign_bit is a single bit that designates the sign of the
+// number.
+//
+// For float, there are 8 exponent bits and 23 fraction bits.
+//
+// For double, there are 11 exponent bits and 52 fraction bits.
+//
+// More details can be found at
+// http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
+//
+// Template parameter:
+//
+// RawType: the raw floating-point type (either float or double)
+template <typename RawType>
+class FloatingPoint {
+ public:
+ // Defines the unsigned integer type that has the same size as the
+ // floating point number.
+ typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
+
+ // Constants.
+
+ // # of bits in a number.
+ static const size_t kBitCount = 8*sizeof(RawType);
+
+ // # of fraction bits in a number.
+ static const size_t kFractionBitCount =
+ std::numeric_limits<RawType>::digits - 1;
+
+ // # of exponent bits in a number.
+ static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
+
+ // The mask for the sign bit.
+ static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
+
+ // The mask for the fraction bits.
+ static const Bits kFractionBitMask =
+ ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
+
+ // The mask for the exponent bits.
+ static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
+
+ // How many ULP's (Units in the Last Place) we want to tolerate when
+ // comparing two numbers. The larger the value, the more error we
+ // allow. A 0 value means that two numbers must be exactly the same
+ // to be considered equal.
+ //
+ // The maximum error of a single floating-point operation is 0.5
+ // units in the last place. On Intel CPU's, all floating-point
+ // calculations are done with 80-bit precision, while double has 64
+ // bits. Therefore, 4 should be enough for ordinary use.
+ //
+ // See the following article for more details on ULP:
+ // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
+ static const size_t kMaxUlps = 4;
+
+ // Constructs a FloatingPoint from a raw floating-point number.
+ //
+ // On an Intel CPU, passing a non-normalized NAN (Not a Number)
+ // around may change its bits, although the new value is guaranteed
+ // to be also a NAN. Therefore, don't expect this constructor to
+ // preserve the bits in x when x is a NAN.
+ explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
+
+ // Static methods
+
+ // Reinterprets a bit pattern as a floating-point number.
+ //
+ // This function is needed to test the AlmostEquals() method.
+ static RawType ReinterpretBits(const Bits bits) {
+ FloatingPoint fp(0);
+ fp.u_.bits_ = bits;
+ return fp.u_.value_;
+ }
+
+ // Returns the floating-point number that represent positive infinity.
+ static RawType Infinity() {
+ return ReinterpretBits(kExponentBitMask);
+ }
+
+ // Returns the maximum representable finite floating-point number.
+ static RawType Max();
+
+ // Non-static methods
+
+ // Returns the bits that represents this number.
+ const Bits &bits() const { return u_.bits_; }
+
+ // Returns the exponent bits of this number.
+ Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
+
+ // Returns the fraction bits of this number.
+ Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
+
+ // Returns the sign bit of this number.
+ Bits sign_bit() const { return kSignBitMask & u_.bits_; }
+
+ // Returns true iff this is NAN (not a number).
+ bool is_nan() const {
+ // It's a NAN if the exponent bits are all ones and the fraction
+ // bits are not entirely zeros.
+ return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
+ }
+
+ // Returns true iff this number is at most kMaxUlps ULP's away from
+ // rhs. In particular, this function:
+ //
+ // - returns false if either number is (or both are) NAN.
+ // - treats really large numbers as almost equal to infinity.
+ // - thinks +0.0 and -0.0 are 0 DLP's apart.
+ bool AlmostEquals(const FloatingPoint& rhs) const {
+ // The IEEE standard says that any comparison operation involving
+ // a NAN must return false.
+ if (is_nan() || rhs.is_nan()) return false;
+
+ return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
+ <= kMaxUlps;
+ }
+
+ private:
+ // The data type used to store the actual floating-point number.
+ union FloatingPointUnion {
+ RawType value_; // The raw floating-point number.
+ Bits bits_; // The bits that represent the number.
+ };
+
+ // Converts an integer from the sign-and-magnitude representation to
+ // the biased representation. More precisely, let N be 2 to the
+ // power of (kBitCount - 1), an integer x is represented by the
+ // unsigned number x + N.
+ //
+ // For instance,
+ //
+ // -N + 1 (the most negative number representable using
+ // sign-and-magnitude) is represented by 1;
+ // 0 is represented by N; and
+ // N - 1 (the biggest number representable using
+ // sign-and-magnitude) is represented by 2N - 1.
+ //
+ // Read http://en.wikipedia.org/wiki/Signed_number_representations
+ // for more details on signed number representations.
+ static Bits SignAndMagnitudeToBiased(const Bits &sam) {
+ if (kSignBitMask & sam) {
+ // sam represents a negative number.
+ return ~sam + 1;
+ } else {
+ // sam represents a positive number.
+ return kSignBitMask | sam;
+ }
+ }
+
+ // Given two numbers in the sign-and-magnitude representation,
+ // returns the distance between them as an unsigned number.
+ static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
+ const Bits &sam2) {
+ const Bits biased1 = SignAndMagnitudeToBiased(sam1);
+ const Bits biased2 = SignAndMagnitudeToBiased(sam2);
+ return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
+ }
+
+ FloatingPointUnion u_;
+};
+
+// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
+// macro defined by <windows.h>.
+template <>
+inline float FloatingPoint<float>::Max() { return FLT_MAX; }
+template <>
+inline double FloatingPoint<double>::Max() { return DBL_MAX; }
+
+// Typedefs the instances of the FloatingPoint template class that we
+// care to use.
+typedef FloatingPoint<float> Float;
+typedef FloatingPoint<double> Double;
+
+// In order to catch the mistake of putting tests that use different
+// test fixture classes in the same test case, we need to assign
+// unique IDs to fixture classes and compare them. The TypeId type is
+// used to hold such IDs. The user should treat TypeId as an opaque
+// type: the only operation allowed on TypeId values is to compare
+// them for equality using the == operator.
+typedef const void* TypeId;
+
+template <typename T>
+class TypeIdHelper {
+ public:
+ // dummy_ must not have a const type. Otherwise an overly eager
+ // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
+ // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
+ static bool dummy_;
+};
+
+template <typename T>
+bool TypeIdHelper<T>::dummy_ = false;
+
+// GetTypeId<T>() returns the ID of type T. Different values will be
+// returned for different types. Calling the function twice with the
+// same type argument is guaranteed to return the same ID.
+template <typename T>
+TypeId GetTypeId() {
+ // The compiler is required to allocate a different
+ // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
+ // the template. Therefore, the address of dummy_ is guaranteed to
+ // be unique.
+ return &(TypeIdHelper<T>::dummy_);
+}
+
+// Returns the type ID of ::testing::Test. Always call this instead
+// of GetTypeId< ::testing::Test>() to get the type ID of
+// ::testing::Test, as the latter may give the wrong result due to a
+// suspected linker bug when compiling Google Test as a Mac OS X
+// framework.
+GTEST_API_ TypeId GetTestTypeId();
+
+// Defines the abstract factory interface that creates instances
+// of a Test object.
+class TestFactoryBase {
+ public:
+ virtual ~TestFactoryBase() {}
+
+ // Creates a test instance to run. The instance is both created and destroyed
+ // within TestInfoImpl::Run()
+ virtual Test* CreateTest() = 0;
+
+ protected:
+ TestFactoryBase() {}
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
+};
+
+// This class provides implementation of TeastFactoryBase interface.
+// It is used in TEST and TEST_F macros.
+template <class TestClass>
+class TestFactoryImpl : public TestFactoryBase {
+ public:
+ virtual Test* CreateTest() { return new TestClass; }
+};
+
+#if GTEST_OS_WINDOWS
+
+// Predicate-formatters for implementing the HRESULT checking macros
+// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
+// We pass a long instead of HRESULT to avoid causing an
+// include dependency for the HRESULT type.
+GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
+ long hr); // NOLINT
+GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
+ long hr); // NOLINT
+
+#endif // GTEST_OS_WINDOWS
+
+// Types of SetUpTestCase() and TearDownTestCase() functions.
+typedef void (*SetUpTestCaseFunc)();
+typedef void (*TearDownTestCaseFunc)();
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+// test_case_name: name of the test case
+// name: name of the test
+// type_param the name of the test's type parameter, or NULL if
+// this is not a typed or a type-parameterized test.
+// value_param text representation of the test's value parameter,
+// or NULL if this is not a type-parameterized test.
+// fixture_class_id: ID of the test fixture class
+// set_up_tc: pointer to the function that sets up the test case
+// tear_down_tc: pointer to the function that tears down the test case
+// factory: pointer to the factory that creates a test object.
+// The newly created TestInfo instance will assume
+// ownership of the factory object.
+GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
+ const char* test_case_name,
+ const char* name,
+ const char* type_param,
+ const char* value_param,
+ TypeId fixture_class_id,
+ SetUpTestCaseFunc set_up_tc,
+ TearDownTestCaseFunc tear_down_tc,
+ TestFactoryBase* factory);
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false. None of pstr, *pstr, and prefix can be NULL.
+GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// State of the definition of a type-parameterized test case.
+class GTEST_API_ TypedTestCasePState {
+ public:
+ TypedTestCasePState() : registered_(false) {}
+
+ // Adds the given test name to defined_test_names_ and return true
+ // if the test case hasn't been registered; otherwise aborts the
+ // program.
+ bool AddTestName(const char* file, int line, const char* case_name,
+ const char* test_name) {
+ if (registered_) {
+ fprintf(stderr, "%s Test %s must be defined before "
+ "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
+ FormatFileLocation(file, line).c_str(), test_name, case_name);
+ fflush(stderr);
+ posix::Abort();
+ }
+ defined_test_names_.insert(test_name);
+ return true;
+ }
+
+ // Verifies that registered_tests match the test names in
+ // defined_test_names_; returns registered_tests if successful, or
+ // aborts the program otherwise.
+ const char* VerifyRegisteredTestNames(
+ const char* file, int line, const char* registered_tests);
+
+ private:
+ bool registered_;
+ ::std::set<const char*> defined_test_names_;
+};
+
+// Skips to the first non-space char after the first comma in 'str';
+// returns NULL if no comma is found in 'str'.
+inline const char* SkipComma(const char* str) {
+ const char* comma = strchr(str, ',');
+ if (comma == NULL) {
+ return NULL;
+ }
+ while (IsSpace(*(++comma))) {}
+ return comma;
+}
+
+// Returns the prefix of 'str' before the first comma in it; returns
+// the entire string if it contains no comma.
+inline std::string GetPrefixUntilComma(const char* str) {
+ const char* comma = strchr(str, ',');
+ return comma == NULL ? str : std::string(str, comma);
+}
+
+// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
+// registers a list of type-parameterized tests with Google Test. The
+// return value is insignificant - we just need to return something
+// such that we can call this function in a namespace scope.
+//
+// Implementation note: The GTEST_TEMPLATE_ macro declares a template
+// template parameter. It's defined in gtest-type-util.h.
+template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
+class TypeParameterizedTest {
+ public:
+ // 'index' is the index of the test in the type list 'Types'
+ // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
+ // Types). Valid values for 'index' are [0, N - 1] where N is the
+ // length of Types.
+ static bool Register(const char* prefix, const char* case_name,
+ const char* test_names, int index) {
+ typedef typename Types::Head Type;
+ typedef Fixture<Type> FixtureClass;
+ typedef typename GTEST_BIND_(TestSel, Type) TestClass;
+
+ // First, registers the first type-parameterized test in the type
+ // list.
+ MakeAndRegisterTestInfo(
+ (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
+ + StreamableToString(index)).c_str(),
+ GetPrefixUntilComma(test_names).c_str(),
+ GetTypeName<Type>().c_str(),
+ NULL, // No value parameter.
+ GetTypeId<FixtureClass>(),
+ TestClass::SetUpTestCase,
+ TestClass::TearDownTestCase,
+ new TestFactoryImpl<TestClass>);
+
+ // Next, recurses (at compile time) with the tail of the type list.
+ return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
+ ::Register(prefix, case_name, test_names, index + 1);
+ }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, class TestSel>
+class TypeParameterizedTest<Fixture, TestSel, Types0> {
+ public:
+ static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+ const char* /*test_names*/, int /*index*/) {
+ return true;
+ }
+};
+
+// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
+// registers *all combinations* of 'Tests' and 'Types' with Google
+// Test. The return value is insignificant - we just need to return
+// something such that we can call this function in a namespace scope.
+template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
+class TypeParameterizedTestCase {
+ public:
+ static bool Register(const char* prefix, const char* case_name,
+ const char* test_names) {
+ typedef typename Tests::Head Head;
+
+ // First, register the first test in 'Test' for each type in 'Types'.
+ TypeParameterizedTest<Fixture, Head, Types>::Register(
+ prefix, case_name, test_names, 0);
+
+ // Next, recurses (at compile time) with the tail of the test list.
+ return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
+ ::Register(prefix, case_name, SkipComma(test_names));
+ }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, typename Types>
+class TypeParameterizedTestCase<Fixture, Templates0, Types> {
+ public:
+ static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+ const char* /*test_names*/) {
+ return true;
+ }
+};
+
+#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag. The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
+ UnitTest* unit_test, int skip_count);
+
+// Helpers for suppressing warnings on unreachable code or constant
+// condition.
+
+// Always returns true.
+GTEST_API_ bool AlwaysTrue();
+
+// Always returns false.
+inline bool AlwaysFalse() { return !AlwaysTrue(); }
+
+// Helper for suppressing false warning from Clang on a const char*
+// variable declared in a conditional expression always being NULL in
+// the else branch.
+struct GTEST_API_ ConstCharPtr {
+ ConstCharPtr(const char* str) : value(str) {}
+ operator bool() const { return true; }
+ const char* value;
+};
+
+// A simple Linear Congruential Generator for generating random
+// numbers with a uniform distribution. Unlike rand() and srand(), it
+// doesn't use global state (and therefore can't interfere with user
+// code). Unlike rand_r(), it's portable. An LCG isn't very random,
+// but it's good enough for our purposes.
+class GTEST_API_ Random {
+ public:
+ static const UInt32 kMaxRange = 1u << 31;
+
+ explicit Random(UInt32 seed) : state_(seed) {}
+
+ void Reseed(UInt32 seed) { state_ = seed; }
+
+ // Generates a random number from [0, range). Crashes if 'range' is
+ // 0 or greater than kMaxRange.
+ UInt32 Generate(UInt32 range);
+
+ private:
+ UInt32 state_;
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
+};
+
+// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
+// compiler error iff T1 and T2 are different types.
+template <typename T1, typename T2>
+struct CompileAssertTypesEqual;
+
+template <typename T>
+struct CompileAssertTypesEqual<T, T> {
+};
+
+// Removes the reference from a type if it is a reference type,
+// otherwise leaves it unchanged. This is the same as
+// tr1::remove_reference, which is not widely available yet.
+template <typename T>
+struct RemoveReference { typedef T type; }; // NOLINT
+template <typename T>
+struct RemoveReference<T&> { typedef T type; }; // NOLINT
+
+// A handy wrapper around RemoveReference that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_REFERENCE_(T) \
+ typename ::testing::internal::RemoveReference<T>::type
+
+// Removes const from a type if it is a const type, otherwise leaves
+// it unchanged. This is the same as tr1::remove_const, which is not
+// widely available yet.
+template <typename T>
+struct RemoveConst { typedef T type; }; // NOLINT
+template <typename T>
+struct RemoveConst<const T> { typedef T type; }; // NOLINT
+
+// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
+// definition to fail to remove the const in 'const int[3]' and 'const
+// char[3][4]'. The following specialization works around the bug.
+template <typename T, size_t N>
+struct RemoveConst<const T[N]> {
+ typedef typename RemoveConst<T>::type type[N];
+};
+
+#if defined(_MSC_VER) && _MSC_VER < 1400
+// This is the only specialization that allows VC++ 7.1 to remove const in
+// 'const int[3] and 'const int[3][4]'. However, it causes trouble with GCC
+// and thus needs to be conditionally compiled.
+template <typename T, size_t N>
+struct RemoveConst<T[N]> {
+ typedef typename RemoveConst<T>::type type[N];
+};
+#endif
+
+// A handy wrapper around RemoveConst that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_CONST_(T) \
+ typename ::testing::internal::RemoveConst<T>::type
+
+// Turns const U&, U&, const U, and U all into U.
+#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
+ GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
+
+// Adds reference to a type if it is not a reference type,
+// otherwise leaves it unchanged. This is the same as
+// tr1::add_reference, which is not widely available yet.
+template <typename T>
+struct AddReference { typedef T& type; }; // NOLINT
+template <typename T>
+struct AddReference<T&> { typedef T& type; }; // NOLINT
+
+// A handy wrapper around AddReference that works when the argument T
+// depends on template parameters.
+#define GTEST_ADD_REFERENCE_(T) \
+ typename ::testing::internal::AddReference<T>::type
+
+// Adds a reference to const on top of T as necessary. For example,
+// it transforms
+//
+// char ==> const char&
+// const char ==> const char&
+// char& ==> const char&
+// const char& ==> const char&
+//
+// The argument T must depend on some template parameters.
+#define GTEST_REFERENCE_TO_CONST_(T) \
+ GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
+
+// ImplicitlyConvertible<From, To>::value is a compile-time bool
+// constant that's true iff type From can be implicitly converted to
+// type To.
+template <typename From, typename To>
+class ImplicitlyConvertible {
+ private:
+ // We need the following helper functions only for their types.
+ // They have no implementations.
+
+ // MakeFrom() is an expression whose type is From. We cannot simply
+ // use From(), as the type From may not have a public default
+ // constructor.
+ static From MakeFrom();
+
+ // These two functions are overloaded. Given an expression
+ // Helper(x), the compiler will pick the first version if x can be
+ // implicitly converted to type To; otherwise it will pick the
+ // second version.
+ //
+ // The first version returns a value of size 1, and the second
+ // version returns a value of size 2. Therefore, by checking the
+ // size of Helper(x), which can be done at compile time, we can tell
+ // which version of Helper() is used, and hence whether x can be
+ // implicitly converted to type To.
+ static char Helper(To);
+ static char (&Helper(...))[2]; // NOLINT
+
+ // We have to put the 'public' section after the 'private' section,
+ // or MSVC refuses to compile the code.
+ public:
+ // MSVC warns about implicitly converting from double to int for
+ // possible loss of data, so we need to temporarily disable the
+ // warning.
+#ifdef _MSC_VER
+# pragma warning(push) // Saves the current warning state.
+# pragma warning(disable:4244) // Temporarily disables warning 4244.
+
+ static const bool value =
+ sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+# pragma warning(pop) // Restores the warning state.
+#elif defined(__BORLANDC__)
+ // C++Builder cannot use member overload resolution during template
+ // instantiation. The simplest workaround is to use its C++0x type traits
+ // functions (C++Builder 2009 and above only).
+ static const bool value = __is_convertible(From, To);
+#else
+ static const bool value =
+ sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+#endif // _MSV_VER
+};
+template <typename From, typename To>
+const bool ImplicitlyConvertible<From, To>::value;
+
+// IsAProtocolMessage<T>::value is a compile-time bool constant that's
+// true iff T is type ProtocolMessage, proto2::Message, or a subclass
+// of those.
+template <typename T>
+struct IsAProtocolMessage
+ : public bool_constant<
+ ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
+ ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
+};
+
+// When the compiler sees expression IsContainerTest<C>(0), if C is an
+// STL-style container class, the first overload of IsContainerTest
+// will be viable (since both C::iterator* and C::const_iterator* are
+// valid types and NULL can be implicitly converted to them). It will
+// be picked over the second overload as 'int' is a perfect match for
+// the type of argument 0. If C::iterator or C::const_iterator is not
+// a valid type, the first overload is not viable, and the second
+// overload will be picked. Therefore, we can determine whether C is
+// a container class by checking the type of IsContainerTest<C>(0).
+// The value of the expression is insignificant.
+//
+// Note that we look for both C::iterator and C::const_iterator. The
+// reason is that C++ injects the name of a class as a member of the
+// class itself (e.g. you can refer to class iterator as either
+// 'iterator' or 'iterator::iterator'). If we look for C::iterator
+// only, for example, we would mistakenly think that a class named
+// iterator is an STL container.
+//
+// Also note that the simpler approach of overloading
+// IsContainerTest(typename C::const_iterator*) and
+// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
+typedef int IsContainer;
+template <class C>
+IsContainer IsContainerTest(int /* dummy */,
+ typename C::iterator* /* it */ = NULL,
+ typename C::const_iterator* /* const_it */ = NULL) {
+ return 0;
+}
+
+typedef char IsNotContainer;
+template <class C>
+IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
+
+// EnableIf<condition>::type is void when 'Cond' is true, and
+// undefined when 'Cond' is false. To use SFINAE to make a function
+// overload only apply when a particular expression is true, add
+// "typename EnableIf<expression>::type* = 0" as the last parameter.
+template<bool> struct EnableIf;
+template<> struct EnableIf<true> { typedef void type; }; // NOLINT
+
+// Utilities for native arrays.
+
+// ArrayEq() compares two k-dimensional native arrays using the
+// elements' operator==, where k can be any integer >= 0. When k is
+// 0, ArrayEq() degenerates into comparing a single pair of values.
+
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
+ return internal::ArrayEq(lhs, N, rhs);
+}
+
+// This helper reduces code bloat. If we instead put its logic inside
+// the previous ArrayEq() function, arrays with different sizes would
+// lead to different copies of the template code.
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
+ for (size_t i = 0; i != size; i++) {
+ if (!internal::ArrayEq(lhs[i], rhs[i]))
+ return false;
+ }
+ return true;
+}
+
+// Finds the first element in the iterator range [begin, end) that
+// equals elem. Element may be a native array type itself.
+template <typename Iter, typename Element>
+Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
+ for (Iter it = begin; it != end; ++it) {
+ if (internal::ArrayEq(*it, elem))
+ return it;
+ }
+ return end;
+}
+
+// CopyArray() copies a k-dimensional native array using the elements'
+// operator=, where k can be any integer >= 0. When k is 0,
+// CopyArray() degenerates into copying a single value.
+
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline void CopyArray(const T& from, U* to) { *to = from; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline void CopyArray(const T(&from)[N], U(*to)[N]) {
+ internal::CopyArray(from, N, *to);
+}
+
+// This helper reduces code bloat. If we instead put its logic inside
+// the previous CopyArray() function, arrays with different sizes
+// would lead to different copies of the template code.
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to) {
+ for (size_t i = 0; i != size; i++) {
+ internal::CopyArray(from[i], to + i);
+ }
+}
+
+// The relation between an NativeArray object (see below) and the
+// native array it represents.
+enum RelationToSource {
+ kReference, // The NativeArray references the native array.
+ kCopy // The NativeArray makes a copy of the native array and
+ // owns the copy.
+};
+
+// Adapts a native array to a read-only STL-style container. Instead
+// of the complete STL container concept, this adaptor only implements
+// members useful for Google Mock's container matchers. New members
+// should be added as needed. To simplify the implementation, we only
+// support Element being a raw type (i.e. having no top-level const or
+// reference modifier). It's the client's responsibility to satisfy
+// this requirement. Element can be an array type itself (hence
+// multi-dimensional arrays are supported).
+template <typename Element>
+class NativeArray {
+ public:
+ // STL-style container typedefs.
+ typedef Element value_type;
+ typedef Element* iterator;
+ typedef const Element* const_iterator;
+
+ // Constructs from a native array.
+ NativeArray(const Element* array, size_t count, RelationToSource relation) {
+ Init(array, count, relation);
+ }
+
+ // Copy constructor.
+ NativeArray(const NativeArray& rhs) {
+ Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
+ }
+
+ ~NativeArray() {
+ // Ensures that the user doesn't instantiate NativeArray with a
+ // const or reference type.
+ static_cast<void>(StaticAssertTypeEqHelper<Element,
+ GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
+ if (relation_to_source_ == kCopy)
+ delete[] array_;
+ }
+
+ // STL-style container methods.
+ size_t size() const { return size_; }
+ const_iterator begin() const { return array_; }
+ const_iterator end() const { return array_ + size_; }
+ bool operator==(const NativeArray& rhs) const {
+ return size() == rhs.size() &&
+ ArrayEq(begin(), size(), rhs.begin());
+ }
+
+ private:
+ // Initializes this object; makes a copy of the input array if
+ // 'relation' is kCopy.
+ void Init(const Element* array, size_t a_size, RelationToSource relation) {
+ if (relation == kReference) {
+ array_ = array;
+ } else {
+ Element* const copy = new Element[a_size];
+ CopyArray(array, a_size, copy);
+ array_ = copy;
+ }
+ size_ = a_size;
+ relation_to_source_ = relation;
+ }
+
+ const Element* array_;
+ size_t size_;
+ RelationToSource relation_to_source_;
+
+ GTEST_DISALLOW_ASSIGN_(NativeArray);
+};
+
+} // namespace internal
+} // namespace testing
+
+#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
+ ::testing::internal::AssertHelper(result_type, file, line, message) \
+ = ::testing::Message()
+
+#define GTEST_MESSAGE_(message, result_type) \
+ GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
+
+#define GTEST_FATAL_FAILURE_(message) \
+ return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
+
+#define GTEST_NONFATAL_FAILURE_(message) \
+ GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
+
+#define GTEST_SUCCESS_(message) \
+ GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
+
+// Suppresses MSVC warnings 4072 (unreachable code) for the code following
+// statement if it returns or throws (or doesn't return or throw in some
+// situations).
+#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
+ if (::testing::internal::AlwaysTrue()) { statement; }
+
+#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::ConstCharPtr gtest_msg = "") { \
+ bool gtest_caught_expected = false; \
+ try { \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ } \
+ catch (expected_exception const&) { \
+ gtest_caught_expected = true; \
+ } \
+ catch (...) { \
+ gtest_msg.value = \
+ "Expected: " #statement " throws an exception of type " \
+ #expected_exception ".\n Actual: it throws a different type."; \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+ } \
+ if (!gtest_caught_expected) { \
+ gtest_msg.value = \
+ "Expected: " #statement " throws an exception of type " \
+ #expected_exception ".\n Actual: it throws nothing."; \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+ } \
+ } else \
+ GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
+ fail(gtest_msg.value)
+
+#define GTEST_TEST_NO_THROW_(statement, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::AlwaysTrue()) { \
+ try { \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ } \
+ catch (...) { \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
+ } \
+ } else \
+ GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
+ fail("Expected: " #statement " doesn't throw an exception.\n" \
+ " Actual: it throws.")
+
+#define GTEST_TEST_ANY_THROW_(statement, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::AlwaysTrue()) { \
+ bool gtest_caught_any = false; \
+ try { \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ } \
+ catch (...) { \
+ gtest_caught_any = true; \
+ } \
+ if (!gtest_caught_any) { \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
+ } \
+ } else \
+ GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
+ fail("Expected: " #statement " throws an exception.\n" \
+ " Actual: it doesn't.")
+
+
+// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
+// either a boolean expression or an AssertionResult. text is a textual
+// represenation of expression as it was passed into the EXPECT_TRUE.
+#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (const ::testing::AssertionResult gtest_ar_ = \
+ ::testing::AssertionResult(expression)) \
+ ; \
+ else \
+ fail(::testing::internal::GetBoolAssertionFailureMessage(\
+ gtest_ar_, text, #actual, #expected).c_str())
+
+#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::AlwaysTrue()) { \
+ ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
+ } \
+ } else \
+ GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
+ fail("Expected: " #statement " doesn't generate new fatal " \
+ "failures in the current thread.\n" \
+ " Actual: it does.")
+
+// Expands to the name of the class that implements the given test.
+#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+ test_case_name##_##test_name##_Test
+
+// Helper macro for defining tests.
+#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
+class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
+ public:\
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
+ private:\
+ virtual void TestBody();\
+ static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
+};\
+\
+::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
+ ::test_info_ =\
+ ::testing::internal::MakeAndRegisterTestInfo(\
+ #test_case_name, #test_name, NULL, NULL, \
+ (parent_id), \
+ parent_class::SetUpTestCase, \
+ parent_class::TearDownTestCase, \
+ new ::testing::internal::TestFactoryImpl<\
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
+void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for death tests. It is
+// #included by gtest.h so a user doesn't need to include this
+// directly.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines internal utilities needed for implementing
+// death tests. They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+
+#include <stdio.h>
+
+namespace testing {
+namespace internal {
+
+GTEST_DECLARE_string_(internal_run_death_test);
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kDeathTestStyleFlag[] = "death_test_style";
+const char kDeathTestUseFork[] = "death_test_use_fork";
+const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
+
+#if GTEST_HAS_DEATH_TEST
+
+// DeathTest is a class that hides much of the complexity of the
+// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method
+// returns a concrete class that depends on the prevailing death test
+// style, as defined by the --gtest_death_test_style and/or
+// --gtest_internal_run_death_test flags.
+
+// In describing the results of death tests, these terms are used with
+// the corresponding definitions:
+//
+// exit status: The integer exit information in the format specified
+// by wait(2)
+// exit code: The integer code passed to exit(3), _exit(2), or
+// returned from main()
+class GTEST_API_ DeathTest {
+ public:
+ // Create returns false if there was an error determining the
+ // appropriate action to take for the current death test; for example,
+ // if the gtest_death_test_style flag is set to an invalid value.
+ // The LastMessage method will return a more detailed message in that
+ // case. Otherwise, the DeathTest pointer pointed to by the "test"
+ // argument is set. If the death test should be skipped, the pointer
+ // is set to NULL; otherwise, it is set to the address of a new concrete
+ // DeathTest object that controls the execution of the current test.
+ static bool Create(const char* statement, const RE* regex,
+ const char* file, int line, DeathTest** test);
+ DeathTest();
+ virtual ~DeathTest() { }
+
+ // A helper class that aborts a death test when it's deleted.
+ class ReturnSentinel {
+ public:
+ explicit ReturnSentinel(DeathTest* test) : test_(test) { }
+ ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
+ private:
+ DeathTest* const test_;
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
+ } GTEST_ATTRIBUTE_UNUSED_;
+
+ // An enumeration of possible roles that may be taken when a death
+ // test is encountered. EXECUTE means that the death test logic should
+ // be executed immediately. OVERSEE means that the program should prepare
+ // the appropriate environment for a child process to execute the death
+ // test, then wait for it to complete.
+ enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
+
+ // An enumeration of the three reasons that a test might be aborted.
+ enum AbortReason {
+ TEST_ENCOUNTERED_RETURN_STATEMENT,
+ TEST_THREW_EXCEPTION,
+ TEST_DID_NOT_DIE
+ };
+
+ // Assumes one of the above roles.
+ virtual TestRole AssumeRole() = 0;
+
+ // Waits for the death test to finish and returns its status.
+ virtual int Wait() = 0;
+
+ // Returns true if the death test passed; that is, the test process
+ // exited during the test, its exit status matches a user-supplied
+ // predicate, and its stderr output matches a user-supplied regular
+ // expression.
+ // The user-supplied predicate may be a macro expression rather
+ // than a function pointer or functor, or else Wait and Passed could
+ // be combined.
+ virtual bool Passed(bool exit_status_ok) = 0;
+
+ // Signals that the death test did not die as expected.
+ virtual void Abort(AbortReason reason) = 0;
+
+ // Returns a human-readable outcome message regarding the outcome of
+ // the last death test.
+ static const char* LastMessage();
+
+ static void set_last_death_test_message(const std::string& message);
+
+ private:
+ // A string containing a description of the outcome of the last death test.
+ static std::string last_death_test_message_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
+};
+
+// Factory interface for death tests. May be mocked out for testing.
+class DeathTestFactory {
+ public:
+ virtual ~DeathTestFactory() { }
+ virtual bool Create(const char* statement, const RE* regex,
+ const char* file, int line, DeathTest** test) = 0;
+};
+
+// A concrete DeathTestFactory implementation for normal use.
+class DefaultDeathTestFactory : public DeathTestFactory {
+ public:
+ virtual bool Create(const char* statement, const RE* regex,
+ const char* file, int line, DeathTest** test);
+};
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
+
+// Traps C++ exceptions escaping statement and reports them as test
+// failures. Note that trapping SEH exceptions is not implemented here.
+# if GTEST_HAS_EXCEPTIONS
+# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+ try { \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ } catch (const ::std::exception& gtest_exception) { \
+ fprintf(\
+ stderr, \
+ "\n%s: Caught std::exception-derived exception escaping the " \
+ "death test statement. Exception message: %s\n", \
+ ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
+ gtest_exception.what()); \
+ fflush(stderr); \
+ death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+ } catch (...) { \
+ death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+ }
+
+# else
+# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+
+# endif
+
+// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
+// ASSERT_EXIT*, and EXPECT_EXIT*.
+# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::AlwaysTrue()) { \
+ const ::testing::internal::RE& gtest_regex = (regex); \
+ ::testing::internal::DeathTest* gtest_dt; \
+ if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \
+ __FILE__, __LINE__, >est_dt)) { \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+ } \
+ if (gtest_dt != NULL) { \
+ ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
+ gtest_dt_ptr(gtest_dt); \
+ switch (gtest_dt->AssumeRole()) { \
+ case ::testing::internal::DeathTest::OVERSEE_TEST: \
+ if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
+ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+ } \
+ break; \
+ case ::testing::internal::DeathTest::EXECUTE_TEST: { \
+ ::testing::internal::DeathTest::ReturnSentinel \
+ gtest_sentinel(gtest_dt); \
+ GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
+ gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
+ break; \
+ } \
+ default: \
+ break; \
+ } \
+ } \
+ } else \
+ GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
+ fail(::testing::internal::DeathTest::LastMessage())
+// The symbol "fail" here expands to something into which a message
+// can be streamed.
+
+// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
+// NDEBUG mode. In this case we need the statements to be executed, the regex is
+// ignored, and the macro must accept a streamed message even though the message
+// is never printed.
+# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::AlwaysTrue()) { \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ } else \
+ ::testing::Message()
+
+// A class representing the parsed contents of the
+// --gtest_internal_run_death_test flag, as it existed when
+// RUN_ALL_TESTS was called.
+class InternalRunDeathTestFlag {
+ public:
+ InternalRunDeathTestFlag(const std::string& a_file,
+ int a_line,
+ int an_index,
+ int a_write_fd)
+ : file_(a_file), line_(a_line), index_(an_index),
+ write_fd_(a_write_fd) {}
+
+ ~InternalRunDeathTestFlag() {
+ if (write_fd_ >= 0)
+ posix::Close(write_fd_);
+ }
+
+ const std::string& file() const { return file_; }
+ int line() const { return line_; }
+ int index() const { return index_; }
+ int write_fd() const { return write_fd_; }
+
+ private:
+ std::string file_;
+ int line_;
+ int index_;
+ int write_fd_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
+};
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
+
+#else // GTEST_HAS_DEATH_TEST
+
+// This macro is used for implementing macros such as
+// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
+// death tests are not supported. Those macros must compile on such systems
+// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
+// systems that support death tests. This allows one to write such a macro
+// on a system that does not support death tests and be sure that it will
+// compile on a death-test supporting system.
+//
+// Parameters:
+// statement - A statement that a macro such as EXPECT_DEATH would test
+// for program termination. This macro has to make sure this
+// statement is compiled but not executed, to ensure that
+// EXPECT_DEATH_IF_SUPPORTED compiles with a certain
+// parameter iff EXPECT_DEATH compiles with it.
+// regex - A regex that a macro such as EXPECT_DEATH would use to test
+// the output of statement. This parameter has to be
+// compiled but not evaluated by this macro, to ensure that
+// this macro only accepts expressions that a macro such as
+// EXPECT_DEATH would accept.
+// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
+// and a return statement for ASSERT_DEATH_IF_SUPPORTED.
+// This ensures that ASSERT_DEATH_IF_SUPPORTED will not
+// compile inside functions where ASSERT_DEATH doesn't
+// compile.
+//
+// The branch that has an always false condition is used to ensure that
+// statement and regex are compiled (and thus syntactically correct) but
+// never executed. The unreachable code macro protects the terminator
+// statement from generating an 'unreachable code' warning in case
+// statement unconditionally returns or throws. The Message constructor at
+// the end allows the syntax of streaming additional messages into the
+// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
+# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (::testing::internal::AlwaysTrue()) { \
+ GTEST_LOG_(WARNING) \
+ << "Death tests are not supported on this platform.\n" \
+ << "Statement '" #statement "' cannot be verified."; \
+ } else if (::testing::internal::AlwaysFalse()) { \
+ ::testing::internal::RE::PartialMatch(".*", (regex)); \
+ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+ terminator; \
+ } else \
+ ::testing::Message()
+
+#endif // GTEST_HAS_DEATH_TEST
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+namespace testing {
+
+// This flag controls the style of death tests. Valid values are "threadsafe",
+// meaning that the death test child process will re-execute the test binary
+// from the start, running only a single death test, or "fast",
+// meaning that the child process will execute the test logic immediately
+// after forking.
+GTEST_DECLARE_string_(death_test_style);
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process. Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests. IMPORTANT: This is an internal utility. Using it may break the
+// implementation of death tests. User code MUST NOT use it.
+GTEST_API_ bool InDeathTestChild();
+
+} // namespace internal
+
+// The following macros are useful for writing death tests.
+
+// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
+// executed:
+//
+// 1. It generates a warning if there is more than one active
+// thread. This is because it's safe to fork() or clone() only
+// when there is a single thread.
+//
+// 2. The parent process clone()s a sub-process and runs the death
+// test in it; the sub-process exits with code 0 at the end of the
+// death test, if it hasn't exited already.
+//
+// 3. The parent process waits for the sub-process to terminate.
+//
+// 4. The parent process checks the exit code and error message of
+// the sub-process.
+//
+// Examples:
+//
+// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
+// for (int i = 0; i < 5; i++) {
+// EXPECT_DEATH(server.ProcessRequest(i),
+// "Invalid request .* in ProcessRequest()")
+// << "Failed to die on request " << i;
+// }
+//
+// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
+//
+// bool KilledBySIGHUP(int exit_code) {
+// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
+// }
+//
+// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
+//
+// On the regular expressions used in death tests:
+//
+// On POSIX-compliant systems (*nix), we use the <regex.h> library,
+// which uses the POSIX extended regex syntax.
+//
+// On other platforms (e.g. Windows), we only support a simple regex
+// syntax implemented as part of Google Test. This limited
+// implementation should be enough most of the time when writing
+// death tests; though it lacks many features you can find in PCRE
+// or POSIX extended regex syntax. For example, we don't support
+// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
+// repetition count ("x{5,7}"), among others.
+//
+// Below is the syntax that we do support. We chose it to be a
+// subset of both PCRE and POSIX extended regex, so it's easy to
+// learn wherever you come from. In the following: 'A' denotes a
+// literal character, period (.), or a single \\ escape sequence;
+// 'x' and 'y' denote regular expressions; 'm' and 'n' are for
+// natural numbers.
+//
+// c matches any literal character c
+// \\d matches any decimal digit
+// \\D matches any character that's not a decimal digit
+// \\f matches \f
+// \\n matches \n
+// \\r matches \r
+// \\s matches any ASCII whitespace, including \n
+// \\S matches any character that's not a whitespace
+// \\t matches \t
+// \\v matches \v
+// \\w matches any letter, _, or decimal digit
+// \\W matches any character that \\w doesn't match
+// \\c matches any literal character c, which must be a punctuation
+// . matches any single character except \n
+// A? matches 0 or 1 occurrences of A
+// A* matches 0 or many occurrences of A
+// A+ matches 1 or many occurrences of A
+// ^ matches the beginning of a string (not that of each line)
+// $ matches the end of a string (not that of each line)
+// xy matches x followed by y
+//
+// If you accidentally use PCRE or POSIX extended regex features
+// not implemented by us, you will get a run-time failure. In that
+// case, please try to rewrite your regular expression within the
+// above syntax.
+//
+// This implementation is *not* meant to be as highly tuned or robust
+// as a compiled regex library, but should perform well enough for a
+// death test, which already incurs significant overhead by launching
+// a child process.
+//
+// Known caveats:
+//
+// A "threadsafe" style death test obtains the path to the test
+// program from argv[0] and re-executes it in the sub-process. For
+// simplicity, the current implementation doesn't search the PATH
+// when launching the sub-process. This means that the user must
+// invoke the test program via a path that contains at least one
+// path separator (e.g. path/to/foo_test and
+// /absolute/path/to/bar_test are fine, but foo_test is not). This
+// is rarely a problem as people usually don't put the test binary
+// directory in PATH.
+//
+// TODO(wan at google.com): make thread-safe death tests search the PATH.
+
+// Asserts that a given statement causes the program to exit, with an
+// integer exit status that satisfies predicate, and emitting error output
+// that matches regex.
+# define ASSERT_EXIT(statement, predicate, regex) \
+ GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
+
+// Like ASSERT_EXIT, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_EXIT(statement, predicate, regex) \
+ GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
+
+// Asserts that a given statement causes the program to exit, either by
+// explicitly exiting with a nonzero exit code or being killed by a
+// signal, and emitting error output that matches regex.
+# define ASSERT_DEATH(statement, regex) \
+ ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Like ASSERT_DEATH, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_DEATH(statement, regex) \
+ EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
+
+// Tests that an exit code describes a normal exit with a given exit code.
+class GTEST_API_ ExitedWithCode {
+ public:
+ explicit ExitedWithCode(int exit_code);
+ bool operator()(int exit_status) const;
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ExitedWithCode& other);
+
+ const int exit_code_;
+};
+
+# if !GTEST_OS_WINDOWS
+// Tests that an exit code describes an exit due to termination by a
+// given signal.
+class GTEST_API_ KilledBySignal {
+ public:
+ explicit KilledBySignal(int signum);
+ bool operator()(int exit_status) const;
+ private:
+ const int signum_;
+};
+# endif // !GTEST_OS_WINDOWS
+
+// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
+// The death testing framework causes this to have interesting semantics,
+// since the sideeffects of the call are only visible in opt mode, and not
+// in debug mode.
+//
+// In practice, this can be used to test functions that utilize the
+// LOG(DFATAL) macro using the following style:
+//
+// int DieInDebugOr12(int* sideeffect) {
+// if (sideeffect) {
+// *sideeffect = 12;
+// }
+// LOG(DFATAL) << "death";
+// return 12;
+// }
+//
+// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
+// int sideeffect = 0;
+// // Only asserts in dbg.
+// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
+//
+// #ifdef NDEBUG
+// // opt-mode has sideeffect visible.
+// EXPECT_EQ(12, sideeffect);
+// #else
+// // dbg-mode no visible sideeffect.
+// EXPECT_EQ(0, sideeffect);
+// #endif
+// }
+//
+// This will assert that DieInDebugReturn12InOpt() crashes in debug
+// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
+// appropriate fallback value (12 in this case) in opt mode. If you
+// need to test that a function has appropriate side-effects in opt
+// mode, include assertions against the side-effects. A general
+// pattern for this is:
+//
+// EXPECT_DEBUG_DEATH({
+// // Side-effects here will have an effect after this statement in
+// // opt mode, but none in debug mode.
+// EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
+// }, "death");
+//
+# ifdef NDEBUG
+
+# define EXPECT_DEBUG_DEATH(statement, regex) \
+ GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+# define ASSERT_DEBUG_DEATH(statement, regex) \
+ GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+# else
+
+# define EXPECT_DEBUG_DEATH(statement, regex) \
+ EXPECT_DEATH(statement, regex)
+
+# define ASSERT_DEBUG_DEATH(statement, regex) \
+ ASSERT_DEATH(statement, regex)
+
+# endif // NDEBUG for EXPECT_DEBUG_DEATH
+#endif // GTEST_HAS_DEATH_TEST
+
+// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
+// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
+// death tests are supported; otherwise they just issue a warning. This is
+// useful when you are combining death test assertions with normal test
+// assertions in one test.
+#if GTEST_HAS_DEATH_TEST
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+ EXPECT_DEATH(statement, regex)
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+ ASSERT_DEATH(statement, regex)
+#else
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+ GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+ GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
+#endif
+
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+// This file was GENERATED by command:
+// pump.py gtest-param-test.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// Macros and functions for implementing parameterized tests
+// in Google C++ Testing Framework (Google Test)
+//
+// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
+//
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+
+
+// Value-parameterized tests allow you to test your code with different
+// parameters without writing multiple copies of the same test.
+//
+// Here is how you use value-parameterized tests:
+
+#if 0
+
+// To write value-parameterized tests, first you should define a fixture
+// class. It is usually derived from testing::TestWithParam<T> (see below for
+// another inheritance scheme that's sometimes useful in more complicated
+// class hierarchies), where the type of your parameter values.
+// TestWithParam<T> is itself derived from testing::Test. T can be any
+// copyable type. If it's a raw pointer, you are responsible for managing the
+// lifespan of the pointed values.
+
+class FooTest : public ::testing::TestWithParam<const char*> {
+ // You can implement all the usual class fixture members here.
+};
+
+// Then, use the TEST_P macro to define as many parameterized tests
+// for this fixture as you want. The _P suffix is for "parameterized"
+// or "pattern", whichever you prefer to think.
+
+TEST_P(FooTest, DoesBlah) {
+ // Inside a test, access the test parameter with the GetParam() method
+ // of the TestWithParam<T> class:
+ EXPECT_TRUE(foo.Blah(GetParam()));
+ ...
+}
+
+TEST_P(FooTest, HasBlahBlah) {
+ ...
+}
+
+// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
+// case with any set of parameters you want. Google Test defines a number
+// of functions for generating test parameters. They return what we call
+// (surprise!) parameter generators. Here is a summary of them, which
+// are all in the testing namespace:
+//
+//
+// Range(begin, end [, step]) - Yields values {begin, begin+step,
+// begin+step+step, ...}. The values do not
+// include end. step defaults to 1.
+// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}.
+// ValuesIn(container) - Yields values from a C-style array, an STL
+// ValuesIn(begin,end) container, or an iterator range [begin, end).
+// Bool() - Yields sequence {false, true}.
+// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product
+// for the math savvy) of the values generated
+// by the N generators.
+//
+// For more details, see comments at the definitions of these functions below
+// in this file.
+//
+// The following statement will instantiate tests from the FooTest test case
+// each with parameter values "meeny", "miny", and "moe".
+
+INSTANTIATE_TEST_CASE_P(InstantiationName,
+ FooTest,
+ Values("meeny", "miny", "moe"));
+
+// To distinguish different instances of the pattern, (yes, you
+// can instantiate it more then once) the first argument to the
+// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
+// actual test case name. Remember to pick unique prefixes for different
+// instantiations. The tests from the instantiation above will have
+// these names:
+//
+// * InstantiationName/FooTest.DoesBlah/0 for "meeny"
+// * InstantiationName/FooTest.DoesBlah/1 for "miny"
+// * InstantiationName/FooTest.DoesBlah/2 for "moe"
+// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
+// * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
+// * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
+//
+// You can use these names in --gtest_filter.
+//
+// This statement will instantiate all tests from FooTest again, each
+// with parameter values "cat" and "dog":
+
+const char* pets[] = {"cat", "dog"};
+INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
+
+// The tests from the instantiation above will have these names:
+//
+// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
+// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
+// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
+// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
+//
+// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
+// in the given test case, whether their definitions come before or
+// AFTER the INSTANTIATE_TEST_CASE_P statement.
+//
+// Please also note that generator expressions (including parameters to the
+// generators) are evaluated in InitGoogleTest(), after main() has started.
+// This allows the user on one hand, to adjust generator parameters in order
+// to dynamically determine a set of tests to run and on the other hand,
+// give the user a chance to inspect the generated tests with Google Test
+// reflection API before RUN_ALL_TESTS() is executed.
+//
+// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
+// for more examples.
+//
+// In the future, we plan to publish the API for defining new parameter
+// generators. But for now this interface remains part of the internal
+// implementation and is subject to change.
+//
+//
+// A parameterized test fixture must be derived from testing::Test and from
+// testing::WithParamInterface<T>, where T is the type of the parameter
+// values. Inheriting from TestWithParam<T> satisfies that requirement because
+// TestWithParam<T> inherits from both Test and WithParamInterface. In more
+// complicated hierarchies, however, it is occasionally useful to inherit
+// separately from Test and WithParamInterface. For example:
+
+class BaseTest : public ::testing::Test {
+ // You can inherit all the usual members for a non-parameterized test
+ // fixture here.
+};
+
+class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
+ // The usual test fixture members go here too.
+};
+
+TEST_F(BaseTest, HasFoo) {
+ // This is an ordinary non-parameterized test.
+}
+
+TEST_P(DerivedTest, DoesBlah) {
+ // GetParam works just the same here as if you inherit from TestWithParam.
+ EXPECT_TRUE(foo.Blah(GetParam()));
+}
+
+#endif // 0
+
+
+#if !GTEST_OS_SYMBIAN
+# include <utility>
+#endif
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*. Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+
+#include <iterator>
+#include <utility>
+#include <vector>
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*. Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+// Copyright 2003 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: Dan Egnor (egnor at google.com)
+//
+// A "smart" pointer type with reference tracking. Every pointer to a
+// particular object is kept on a circular linked list. When the last pointer
+// to an object is destroyed or reassigned, the object is deleted.
+//
+// Used properly, this deletes the object when the last reference goes away.
+// There are several caveats:
+// - Like all reference counting schemes, cycles lead to leaks.
+// - Each smart pointer is actually two pointers (8 bytes instead of 4).
+// - Every time a pointer is assigned, the entire list of pointers to that
+// object is traversed. This class is therefore NOT SUITABLE when there
+// will often be more than two or three pointers to a particular object.
+// - References are only tracked as long as linked_ptr<> objects are copied.
+// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
+// will happen (double deletion).
+//
+// A good use of this class is storing object references in STL containers.
+// You can safely put linked_ptr<> in a vector<>.
+// Other uses may not be as good.
+//
+// Note: If you use an incomplete type with linked_ptr<>, the class
+// *containing* linked_ptr<> must have a constructor and destructor (even
+// if they do nothing!).
+//
+// Bill Gibbons suggested we use something like this.
+//
+// Thread Safety:
+// Unlike other linked_ptr implementations, in this implementation
+// a linked_ptr object is thread-safe in the sense that:
+// - it's safe to copy linked_ptr objects concurrently,
+// - it's safe to copy *from* a linked_ptr and read its underlying
+// raw pointer (e.g. via get()) concurrently, and
+// - it's safe to write to two linked_ptrs that point to the same
+// shared object concurrently.
+// TODO(wan at google.com): rename this to safe_linked_ptr to avoid
+// confusion with normal linked_ptr.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+
+#include <stdlib.h>
+#include <assert.h>
+
+
+namespace testing {
+namespace internal {
+
+// Protects copying of all linked_ptr objects.
+GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// This is used internally by all instances of linked_ptr<>. It needs to be
+// a non-template class because different types of linked_ptr<> can refer to
+// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
+// So, it needs to be possible for different types of linked_ptr to participate
+// in the same circular linked list, so we need a single class type here.
+//
+// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr<T>.
+class linked_ptr_internal {
+ public:
+ // Create a new circle that includes only this instance.
+ void join_new() {
+ next_ = this;
+ }
+
+ // Many linked_ptr operations may change p.link_ for some linked_ptr
+ // variable p in the same circle as this object. Therefore we need
+ // to prevent two such operations from occurring concurrently.
+ //
+ // Note that different types of linked_ptr objects can coexist in a
+ // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
+ // linked_ptr<Derived2>). Therefore we must use a single mutex to
+ // protect all linked_ptr objects. This can create serious
+ // contention in production code, but is acceptable in a testing
+ // framework.
+
+ // Join an existing circle.
+ void join(linked_ptr_internal const* ptr)
+ GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+ MutexLock lock(&g_linked_ptr_mutex);
+
+ linked_ptr_internal const* p = ptr;
+ while (p->next_ != ptr) p = p->next_;
+ p->next_ = this;
+ next_ = ptr;
+ }
+
+ // Leave whatever circle we're part of. Returns true if we were the
+ // last member of the circle. Once this is done, you can join() another.
+ bool depart()
+ GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+ MutexLock lock(&g_linked_ptr_mutex);
+
+ if (next_ == this) return true;
+ linked_ptr_internal const* p = next_;
+ while (p->next_ != this) p = p->next_;
+ p->next_ = next_;
+ return false;
+ }
+
+ private:
+ mutable linked_ptr_internal const* next_;
+};
+
+template <typename T>
+class linked_ptr {
+ public:
+ typedef T element_type;
+
+ // Take over ownership of a raw pointer. This should happen as soon as
+ // possible after the object is created.
+ explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
+ ~linked_ptr() { depart(); }
+
+ // Copy an existing linked_ptr<>, adding ourselves to the list of references.
+ template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
+ linked_ptr(linked_ptr const& ptr) { // NOLINT
+ assert(&ptr != this);
+ copy(&ptr);
+ }
+
+ // Assignment releases the old value and acquires the new.
+ template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
+ depart();
+ copy(&ptr);
+ return *this;
+ }
+
+ linked_ptr& operator=(linked_ptr const& ptr) {
+ if (&ptr != this) {
+ depart();
+ copy(&ptr);
+ }
+ return *this;
+ }
+
+ // Smart pointer members.
+ void reset(T* ptr = NULL) {
+ depart();
+ capture(ptr);
+ }
+ T* get() const { return value_; }
+ T* operator->() const { return value_; }
+ T& operator*() const { return *value_; }
+
+ bool operator==(T* p) const { return value_ == p; }
+ bool operator!=(T* p) const { return value_ != p; }
+ template <typename U>
+ bool operator==(linked_ptr<U> const& ptr) const {
+ return value_ == ptr.get();
+ }
+ template <typename U>
+ bool operator!=(linked_ptr<U> const& ptr) const {
+ return value_ != ptr.get();
+ }
+
+ private:
+ template <typename U>
+ friend class linked_ptr;
+
+ T* value_;
+ linked_ptr_internal link_;
+
+ void depart() {
+ if (link_.depart()) delete value_;
+ }
+
+ void capture(T* ptr) {
+ value_ = ptr;
+ link_.join_new();
+ }
+
+ template <typename U> void copy(linked_ptr<U> const* ptr) {
+ value_ = ptr->get();
+ if (value_)
+ link_.join(&ptr->link_);
+ else
+ link_.join_new();
+ }
+};
+
+template<typename T> inline
+bool operator==(T* ptr, const linked_ptr<T>& x) {
+ return ptr == x.get();
+}
+
+template<typename T> inline
+bool operator!=(T* ptr, const linked_ptr<T>& x) {
+ return ptr != x.get();
+}
+
+// A function to convert T* into linked_ptr<T>
+// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
+// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
+template <typename T>
+linked_ptr<T> make_linked_ptr(T* ptr) {
+ return linked_ptr<T>(ptr);
+}
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// A user can teach this function how to print a class type T by
+// defining either operator<<() or PrintTo() in the namespace that
+// defines T. More specifically, the FIRST defined function in the
+// following list will be used (assuming T is defined in namespace
+// foo):
+//
+// 1. foo::PrintTo(const T&, ostream*)
+// 2. operator<<(ostream&, const T&) defined in either foo or the
+// global namespace.
+//
+// If none of the above is defined, it will print the debug string of
+// the value if it is a protocol buffer, or print the raw bytes in the
+// value otherwise.
+//
+// To aid debugging: when T is a reference type, the address of the
+// value is also printed; when T is a (const) char pointer, both the
+// pointer value and the NUL-terminated string it points to are
+// printed.
+//
+// We also provide some convenient wrappers:
+//
+// // Prints a value to a string. For a (const or not) char
+// // pointer, the NUL-terminated string (but not the pointer) is
+// // printed.
+// std::string ::testing::PrintToString(const T& value);
+//
+// // Prints a value tersely: for a reference type, the referenced
+// // value (but not the address) is printed; for a (const or not) char
+// // pointer, the NUL-terminated string (but not the pointer) is
+// // printed.
+// void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
+//
+// // Prints value using the type inferred by the compiler. The difference
+// // from UniversalTersePrint() is that this function prints both the
+// // pointer and the NUL-terminated string for a (const or not) char pointer.
+// void ::testing::internal::UniversalPrint(const T& value, ostream*);
+//
+// // Prints the fields of a tuple tersely to a string vector, one
+// // element for each field. Tuple support must be enabled in
+// // gtest-port.h.
+// std::vector<string> UniversalTersePrintTupleFieldsToStrings(
+// const Tuple& value);
+//
+// Known limitation:
+//
+// The print primitives print the elements of an STL-style container
+// using the compiler-inferred type of *iter where iter is a
+// const_iterator of the container. When const_iterator is an input
+// iterator but not a forward iterator, this inferred type may not
+// match value_type, and the print output may be incorrect. In
+// practice, this is rarely a problem as for most containers
+// const_iterator is a forward iterator. We'll fix this if there's an
+// actual need for it. Note that this fix cannot rely on value_type
+// being defined as many user-defined container types don't have
+// value_type.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#include <ostream> // NOLINT
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace testing {
+
+// Definitions in the 'internal' and 'internal2' name spaces are
+// subject to change without notice. DO NOT USE THEM IN USER CODE!
+namespace internal2 {
+
+// Prints the given number of bytes in the given object to the given
+// ostream.
+GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
+ size_t count,
+ ::std::ostream* os);
+
+// For selecting which printer to use when a given type has neither <<
+// nor PrintTo().
+enum TypeKind {
+ kProtobuf, // a protobuf type
+ kConvertibleToInteger, // a type implicitly convertible to BiggestInt
+ // (e.g. a named or unnamed enum type)
+ kOtherType // anything else
+};
+
+// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
+// by the universal printer to print a value of type T when neither
+// operator<< nor PrintTo() is defined for T, where kTypeKind is the
+// "kind" of T as defined by enum TypeKind.
+template <typename T, TypeKind kTypeKind>
+class TypeWithoutFormatter {
+ public:
+ // This default version is called when kTypeKind is kOtherType.
+ static void PrintValue(const T& value, ::std::ostream* os) {
+ PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
+ sizeof(value), os);
+ }
+};
+
+// We print a protobuf using its ShortDebugString() when the string
+// doesn't exceed this many characters; otherwise we print it using
+// DebugString() for better readability.
+const size_t kProtobufOneLinerMaxLength = 50;
+
+template <typename T>
+class TypeWithoutFormatter<T, kProtobuf> {
+ public:
+ static void PrintValue(const T& value, ::std::ostream* os) {
+ const ::testing::internal::string short_str = value.ShortDebugString();
+ const ::testing::internal::string pretty_str =
+ short_str.length() <= kProtobufOneLinerMaxLength ?
+ short_str : ("\n" + value.DebugString());
+ *os << ("<" + pretty_str + ">");
+ }
+};
+
+template <typename T>
+class TypeWithoutFormatter<T, kConvertibleToInteger> {
+ public:
+ // Since T has no << operator or PrintTo() but can be implicitly
+ // converted to BiggestInt, we print it as a BiggestInt.
+ //
+ // Most likely T is an enum type (either named or unnamed), in which
+ // case printing it as an integer is the desired behavior. In case
+ // T is not an enum, printing it as an integer is the best we can do
+ // given that it has no user-defined printer.
+ static void PrintValue(const T& value, ::std::ostream* os) {
+ const internal::BiggestInt kBigInt = value;
+ *os << kBigInt;
+ }
+};
+
+// Prints the given value to the given ostream. If the value is a
+// protocol message, its debug string is printed; if it's an enum or
+// of a type implicitly convertible to BiggestInt, it's printed as an
+// integer; otherwise the bytes in the value are printed. This is
+// what UniversalPrinter<T>::Print() does when it knows nothing about
+// type T and T has neither << operator nor PrintTo().
+//
+// A user can override this behavior for a class type Foo by defining
+// a << operator in the namespace where Foo is defined.
+//
+// We put this operator in namespace 'internal2' instead of 'internal'
+// to simplify the implementation, as much code in 'internal' needs to
+// use << in STL, which would conflict with our own << were it defined
+// in 'internal'.
+//
+// Note that this operator<< takes a generic std::basic_ostream<Char,
+// CharTraits> type instead of the more restricted std::ostream. If
+// we define it to take an std::ostream instead, we'll get an
+// "ambiguous overloads" compiler error when trying to print a type
+// Foo that supports streaming to std::basic_ostream<Char,
+// CharTraits>, as the compiler cannot tell whether
+// operator<<(std::ostream&, const T&) or
+// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
+// specific.
+template <typename Char, typename CharTraits, typename T>
+::std::basic_ostream<Char, CharTraits>& operator<<(
+ ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
+ TypeWithoutFormatter<T,
+ (internal::IsAProtocolMessage<T>::value ? kProtobuf :
+ internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
+ kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
+ return os;
+}
+
+} // namespace internal2
+} // namespace testing
+
+// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
+// magic needed for implementing UniversalPrinter won't work.
+namespace testing_internal {
+
+// Used to print a value that is not an STL-style container when the
+// user doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
+ // With the following statement, during unqualified name lookup,
+ // testing::internal2::operator<< appears as if it was declared in
+ // the nearest enclosing namespace that contains both
+ // ::testing_internal and ::testing::internal2, i.e. the global
+ // namespace. For more details, refer to the C++ Standard section
+ // 7.3.4-1 [namespace.udir]. This allows us to fall back onto
+ // testing::internal2::operator<< in case T doesn't come with a <<
+ // operator.
+ //
+ // We cannot write 'using ::testing::internal2::operator<<;', which
+ // gcc 3.3 fails to compile due to a compiler bug.
+ using namespace ::testing::internal2; // NOLINT
+
+ // Assuming T is defined in namespace foo, in the next statement,
+ // the compiler will consider all of:
+ //
+ // 1. foo::operator<< (thanks to Koenig look-up),
+ // 2. ::operator<< (as the current namespace is enclosed in ::),
+ // 3. testing::internal2::operator<< (thanks to the using statement above).
+ //
+ // The operator<< whose type matches T best will be picked.
+ //
+ // We deliberately allow #2 to be a candidate, as sometimes it's
+ // impossible to define #1 (e.g. when foo is ::std, defining
+ // anything in it is undefined behavior unless you are a compiler
+ // vendor.).
+ *os << value;
+}
+
+} // namespace testing_internal
+
+namespace testing {
+namespace internal {
+
+// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
+// value to the given ostream. The caller must ensure that
+// 'ostream_ptr' is not NULL, or the behavior is undefined.
+//
+// We define UniversalPrinter as a class template (as opposed to a
+// function template), as we need to partially specialize it for
+// reference types, which cannot be done with function templates.
+template <typename T>
+class UniversalPrinter;
+
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os);
+
+// Used to print an STL-style container when the user doesn't define
+// a PrintTo() for it.
+template <typename C>
+void DefaultPrintTo(IsContainer /* dummy */,
+ false_type /* is not a pointer */,
+ const C& container, ::std::ostream* os) {
+ const size_t kMaxCount = 32; // The maximum number of elements to print.
+ *os << '{';
+ size_t count = 0;
+ for (typename C::const_iterator it = container.begin();
+ it != container.end(); ++it, ++count) {
+ if (count > 0) {
+ *os << ',';
+ if (count == kMaxCount) { // Enough has been printed.
+ *os << " ...";
+ break;
+ }
+ }
+ *os << ' ';
+ // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
+ // handle *it being a native array.
+ internal::UniversalPrint(*it, os);
+ }
+
+ if (count > 0) {
+ *os << ' ';
+ }
+ *os << '}';
+}
+
+// Used to print a pointer that is neither a char pointer nor a member
+// pointer, when the user doesn't define PrintTo() for it. (A member
+// variable pointer or member function pointer doesn't really point to
+// a location in the address space. Their representation is
+// implementation-defined. Therefore they will be printed as raw
+// bytes.)
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+ true_type /* is a pointer */,
+ T* p, ::std::ostream* os) {
+ if (p == NULL) {
+ *os << "NULL";
+ } else {
+ // C++ doesn't allow casting from a function pointer to any object
+ // pointer.
+ //
+ // IsTrue() silences warnings: "Condition is always true",
+ // "unreachable code".
+ if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
+ // T is not a function type. We just call << to print p,
+ // relying on ADL to pick up user-defined << for their pointer
+ // types, if any.
+ *os << p;
+ } else {
+ // T is a function type, so '*os << p' doesn't do what we want
+ // (it just prints p as bool). We want to print p as a const
+ // void*. However, we cannot cast it to const void* directly,
+ // even using reinterpret_cast, as earlier versions of gcc
+ // (e.g. 3.4.5) cannot compile the cast when p is a function
+ // pointer. Casting to UInt64 first solves the problem.
+ *os << reinterpret_cast<const void*>(
+ reinterpret_cast<internal::UInt64>(p));
+ }
+ }
+}
+
+// Used to print a non-container, non-pointer value when the user
+// doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+ false_type /* is not a pointer */,
+ const T& value, ::std::ostream* os) {
+ ::testing_internal::DefaultPrintNonContainerTo(value, os);
+}
+
+// Prints the given value using the << operator if it has one;
+// otherwise prints the bytes in it. This is what
+// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
+// or overloaded for type T.
+//
+// A user can override this behavior for a class type Foo by defining
+// an overload of PrintTo() in the namespace where Foo is defined. We
+// give the user this option as sometimes defining a << operator for
+// Foo is not desirable (e.g. the coding style may prevent doing it,
+// or there is already a << operator but it doesn't do what the user
+// wants).
+template <typename T>
+void PrintTo(const T& value, ::std::ostream* os) {
+ // DefaultPrintTo() is overloaded. The type of its first two
+ // arguments determine which version will be picked. If T is an
+ // STL-style container, the version for container will be called; if
+ // T is a pointer, the pointer version will be called; otherwise the
+ // generic version will be called.
+ //
+ // Note that we check for container types here, prior to we check
+ // for protocol message types in our operator<<. The rationale is:
+ //
+ // For protocol messages, we want to give people a chance to
+ // override Google Mock's format by defining a PrintTo() or
+ // operator<<. For STL containers, other formats can be
+ // incompatible with Google Mock's format for the container
+ // elements; therefore we check for container types here to ensure
+ // that our format is used.
+ //
+ // The second argument of DefaultPrintTo() is needed to bypass a bug
+ // in Symbian's C++ compiler that prevents it from picking the right
+ // overload between:
+ //
+ // PrintTo(const T& x, ...);
+ // PrintTo(T* x, ...);
+ DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
+}
+
+// The following list of PrintTo() overloads tells
+// UniversalPrinter<T>::Print() how to print standard types (built-in
+// types, strings, plain arrays, and pointers).
+
+// Overloads for various char types.
+GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
+GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
+inline void PrintTo(char c, ::std::ostream* os) {
+ // When printing a plain char, we always treat it as unsigned. This
+ // way, the output won't be affected by whether the compiler thinks
+ // char is signed or not.
+ PrintTo(static_cast<unsigned char>(c), os);
+}
+
+// Overloads for other simple built-in types.
+inline void PrintTo(bool x, ::std::ostream* os) {
+ *os << (x ? "true" : "false");
+}
+
+// Overload for wchar_t type.
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its decimal code (except for L'\0').
+// The L'\0' char is printed as "L'\\0'". The decimal code is printed
+// as signed integer when wchar_t is implemented by the compiler
+// as a signed type and is printed as an unsigned integer when wchar_t
+// is implemented as an unsigned type.
+GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
+
+// Overloads for C strings.
+GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
+inline void PrintTo(char* s, ::std::ostream* os) {
+ PrintTo(ImplicitCast_<const char*>(s), os);
+}
+
+// signed/unsigned char is often used for representing binary data, so
+// we print pointers to it as void* to be safe.
+inline void PrintTo(const signed char* s, ::std::ostream* os) {
+ PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(signed char* s, ::std::ostream* os) {
+ PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
+ PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(unsigned char* s, ::std::ostream* os) {
+ PrintTo(ImplicitCast_<const void*>(s), os);
+}
+
+// MSVC can be configured to define wchar_t as a typedef of unsigned
+// short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
+// type. When wchar_t is a typedef, defining an overload for const
+// wchar_t* would cause unsigned short* be printed as a wide string,
+// possibly causing invalid memory accesses.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Overloads for wide C strings
+GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
+inline void PrintTo(wchar_t* s, ::std::ostream* os) {
+ PrintTo(ImplicitCast_<const wchar_t*>(s), os);
+}
+#endif
+
+// Overload for C arrays. Multi-dimensional arrays are printed
+// properly.
+
+// Prints the given number of elements in an array, without printing
+// the curly braces.
+template <typename T>
+void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
+ UniversalPrint(a[0], os);
+ for (size_t i = 1; i != count; i++) {
+ *os << ", ";
+ UniversalPrint(a[i], os);
+ }
+}
+
+// Overloads for ::string and ::std::string.
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
+inline void PrintTo(const ::string& s, ::std::ostream* os) {
+ PrintStringTo(s, os);
+}
+#endif // GTEST_HAS_GLOBAL_STRING
+
+GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
+inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
+ PrintStringTo(s, os);
+}
+
+// Overloads for ::wstring and ::std::wstring.
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
+ PrintWideStringTo(s, os);
+}
+#endif // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
+ PrintWideStringTo(s, os);
+}
+#endif // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_TR1_TUPLE
+// Overload for ::std::tr1::tuple. Needed for printing function arguments,
+// which are packed as tuples.
+
+// Helper function for printing a tuple. T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os);
+
+// Overloaded PrintTo() for tuples of various arities. We support
+// tuples of up-to 10 fields. The following implementation works
+// regardless of whether tr1::tuple is implemented using the
+// non-standard variadic template feature or not.
+
+inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1>
+void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2>
+void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
+ ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
+ ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
+ ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
+ ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
+ ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+void PrintTo(
+ const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
+ ::std::ostream* os) {
+ PrintTupleTo(t, os);
+}
+#endif // GTEST_HAS_TR1_TUPLE
+
+// Overload for std::pair.
+template <typename T1, typename T2>
+void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
+ *os << '(';
+ // We cannot use UniversalPrint(value.first, os) here, as T1 may be
+ // a reference type. The same for printing value.second.
+ UniversalPrinter<T1>::Print(value.first, os);
+ *os << ", ";
+ UniversalPrinter<T2>::Print(value.second, os);
+ *os << ')';
+}
+
+// Implements printing a non-reference type T by letting the compiler
+// pick the right overload of PrintTo() for T.
+template <typename T>
+class UniversalPrinter {
+ public:
+ // MSVC warns about adding const to a function type, so we want to
+ // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push) // Saves the current warning state.
+# pragma warning(disable:4180) // Temporarily disables warning 4180.
+#endif // _MSC_VER
+
+ // Note: we deliberately don't call this PrintTo(), as that name
+ // conflicts with ::testing::internal::PrintTo in the body of the
+ // function.
+ static void Print(const T& value, ::std::ostream* os) {
+ // By default, ::testing::internal::PrintTo() is used for printing
+ // the value.
+ //
+ // Thanks to Koenig look-up, if T is a class and has its own
+ // PrintTo() function defined in its namespace, that function will
+ // be visible here. Since it is more specific than the generic ones
+ // in ::testing::internal, it will be picked by the compiler in the
+ // following statement - exactly what we want.
+ PrintTo(value, os);
+ }
+
+#ifdef _MSC_VER
+# pragma warning(pop) // Restores the warning state.
+#endif // _MSC_VER
+};
+
+// UniversalPrintArray(begin, len, os) prints an array of 'len'
+// elements, starting at address 'begin'.
+template <typename T>
+void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
+ if (len == 0) {
+ *os << "{}";
+ } else {
+ *os << "{ ";
+ const size_t kThreshold = 18;
+ const size_t kChunkSize = 8;
+ // If the array has more than kThreshold elements, we'll have to
+ // omit some details by printing only the first and the last
+ // kChunkSize elements.
+ // TODO(wan at google.com): let the user control the threshold using a flag.
+ if (len <= kThreshold) {
+ PrintRawArrayTo(begin, len, os);
+ } else {
+ PrintRawArrayTo(begin, kChunkSize, os);
+ *os << ", ..., ";
+ PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
+ }
+ *os << " }";
+ }
+}
+// This overload prints a (const) char array compactly.
+GTEST_API_ void UniversalPrintArray(
+ const char* begin, size_t len, ::std::ostream* os);
+
+// This overload prints a (const) wchar_t array compactly.
+GTEST_API_ void UniversalPrintArray(
+ const wchar_t* begin, size_t len, ::std::ostream* os);
+
+// Implements printing an array type T[N].
+template <typename T, size_t N>
+class UniversalPrinter<T[N]> {
+ public:
+ // Prints the given array, omitting some elements when there are too
+ // many.
+ static void Print(const T (&a)[N], ::std::ostream* os) {
+ UniversalPrintArray(a, N, os);
+ }
+};
+
+// Implements printing a reference type T&.
+template <typename T>
+class UniversalPrinter<T&> {
+ public:
+ // MSVC warns about adding const to a function type, so we want to
+ // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push) // Saves the current warning state.
+# pragma warning(disable:4180) // Temporarily disables warning 4180.
+#endif // _MSC_VER
+
+ static void Print(const T& value, ::std::ostream* os) {
+ // Prints the address of the value. We use reinterpret_cast here
+ // as static_cast doesn't compile when T is a function type.
+ *os << "@" << reinterpret_cast<const void*>(&value) << " ";
+
+ // Then prints the value itself.
+ UniversalPrint(value, os);
+ }
+
+#ifdef _MSC_VER
+# pragma warning(pop) // Restores the warning state.
+#endif // _MSC_VER
+};
+
+// Prints a value tersely: for a reference type, the referenced value
+// (but not the address) is printed; for a (const) char pointer, the
+// NUL-terminated string (but not the pointer) is printed.
+
+template <typename T>
+class UniversalTersePrinter {
+ public:
+ static void Print(const T& value, ::std::ostream* os) {
+ UniversalPrint(value, os);
+ }
+};
+template <typename T>
+class UniversalTersePrinter<T&> {
+ public:
+ static void Print(const T& value, ::std::ostream* os) {
+ UniversalPrint(value, os);
+ }
+};
+template <typename T, size_t N>
+class UniversalTersePrinter<T[N]> {
+ public:
+ static void Print(const T (&value)[N], ::std::ostream* os) {
+ UniversalPrinter<T[N]>::Print(value, os);
+ }
+};
+template <>
+class UniversalTersePrinter<const char*> {
+ public:
+ static void Print(const char* str, ::std::ostream* os) {
+ if (str == NULL) {
+ *os << "NULL";
+ } else {
+ UniversalPrint(string(str), os);
+ }
+ }
+};
+template <>
+class UniversalTersePrinter<char*> {
+ public:
+ static void Print(char* str, ::std::ostream* os) {
+ UniversalTersePrinter<const char*>::Print(str, os);
+ }
+};
+
+#if GTEST_HAS_STD_WSTRING
+template <>
+class UniversalTersePrinter<const wchar_t*> {
+ public:
+ static void Print(const wchar_t* str, ::std::ostream* os) {
+ if (str == NULL) {
+ *os << "NULL";
+ } else {
+ UniversalPrint(::std::wstring(str), os);
+ }
+ }
+};
+#endif
+
+template <>
+class UniversalTersePrinter<wchar_t*> {
+ public:
+ static void Print(wchar_t* str, ::std::ostream* os) {
+ UniversalTersePrinter<const wchar_t*>::Print(str, os);
+ }
+};
+
+template <typename T>
+void UniversalTersePrint(const T& value, ::std::ostream* os) {
+ UniversalTersePrinter<T>::Print(value, os);
+}
+
+// Prints a value using the type inferred by the compiler. The
+// difference between this and UniversalTersePrint() is that for a
+// (const) char pointer, this prints both the pointer and the
+// NUL-terminated string.
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os) {
+ // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
+ // UniversalPrinter with T directly.
+ typedef T T1;
+ UniversalPrinter<T1>::Print(value, os);
+}
+
+#if GTEST_HAS_TR1_TUPLE
+typedef ::std::vector<string> Strings;
+
+// This helper template allows PrintTo() for tuples and
+// UniversalTersePrintTupleFieldsToStrings() to be defined by
+// induction on the number of tuple fields. The idea is that
+// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
+// fields in tuple t, and can be defined in terms of
+// TuplePrefixPrinter<N - 1>.
+
+// The inductive case.
+template <size_t N>
+struct TuplePrefixPrinter {
+ // Prints the first N fields of a tuple.
+ template <typename Tuple>
+ static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+ TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
+ *os << ", ";
+ UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
+ ::Print(::std::tr1::get<N - 1>(t), os);
+ }
+
+ // Tersely prints the first N fields of a tuple to a string vector,
+ // one element for each field.
+ template <typename Tuple>
+ static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+ TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
+ ::std::stringstream ss;
+ UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
+ strings->push_back(ss.str());
+ }
+};
+
+// Base cases.
+template <>
+struct TuplePrefixPrinter<0> {
+ template <typename Tuple>
+ static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
+
+ template <typename Tuple>
+ static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
+};
+// We have to specialize the entire TuplePrefixPrinter<> class
+// template here, even though the definition of
+// TersePrintPrefixToStrings() is the same as the generic version, as
+// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
+// support specializing a method template of a class template.
+template <>
+struct TuplePrefixPrinter<1> {
+ template <typename Tuple>
+ static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+ UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
+ Print(::std::tr1::get<0>(t), os);
+ }
+
+ template <typename Tuple>
+ static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+ ::std::stringstream ss;
+ UniversalTersePrint(::std::tr1::get<0>(t), &ss);
+ strings->push_back(ss.str());
+ }
+};
+
+// Helper function for printing a tuple. T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os) {
+ *os << "(";
+ TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
+ PrintPrefixTo(t, os);
+ *os << ")";
+}
+
+// Prints the fields of a tuple tersely to a string vector, one
+// element for each field. See the comment before
+// UniversalTersePrint() for how we define "tersely".
+template <typename Tuple>
+Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
+ Strings result;
+ TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
+ TersePrintPrefixToStrings(value, &result);
+ return result;
+}
+#endif // GTEST_HAS_TR1_TUPLE
+
+} // namespace internal
+
+template <typename T>
+::std::string PrintToString(const T& value) {
+ ::std::stringstream ss;
+ internal::UniversalTersePrinter<T>::Print(value, &ss);
+ return ss.str();
+}
+
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+namespace internal {
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Outputs a message explaining invalid registration of different
+// fixture class for the same test case. This may happen when
+// TEST_P macro is used to define two tests with the same name
+// but in different namespaces.
+GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
+ const char* file, int line);
+
+template <typename> class ParamGeneratorInterface;
+template <typename> class ParamGenerator;
+
+// Interface for iterating over elements provided by an implementation
+// of ParamGeneratorInterface<T>.
+template <typename T>
+class ParamIteratorInterface {
+ public:
+ virtual ~ParamIteratorInterface() {}
+ // A pointer to the base generator instance.
+ // Used only for the purposes of iterator comparison
+ // to make sure that two iterators belong to the same generator.
+ virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
+ // Advances iterator to point to the next element
+ // provided by the generator. The caller is responsible
+ // for not calling Advance() on an iterator equal to
+ // BaseGenerator()->End().
+ virtual void Advance() = 0;
+ // Clones the iterator object. Used for implementing copy semantics
+ // of ParamIterator<T>.
+ virtual ParamIteratorInterface* Clone() const = 0;
+ // Dereferences the current iterator and provides (read-only) access
+ // to the pointed value. It is the caller's responsibility not to call
+ // Current() on an iterator equal to BaseGenerator()->End().
+ // Used for implementing ParamGenerator<T>::operator*().
+ virtual const T* Current() const = 0;
+ // Determines whether the given iterator and other point to the same
+ // element in the sequence generated by the generator.
+ // Used for implementing ParamGenerator<T>::operator==().
+ virtual bool Equals(const ParamIteratorInterface& other) const = 0;
+};
+
+// Class iterating over elements provided by an implementation of
+// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
+// and implements the const forward iterator concept.
+template <typename T>
+class ParamIterator {
+ public:
+ typedef T value_type;
+ typedef const T& reference;
+ typedef ptrdiff_t difference_type;
+
+ // ParamIterator assumes ownership of the impl_ pointer.
+ ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
+ ParamIterator& operator=(const ParamIterator& other) {
+ if (this != &other)
+ impl_.reset(other.impl_->Clone());
+ return *this;
+ }
+
+ const T& operator*() const { return *impl_->Current(); }
+ const T* operator->() const { return impl_->Current(); }
+ // Prefix version of operator++.
+ ParamIterator& operator++() {
+ impl_->Advance();
+ return *this;
+ }
+ // Postfix version of operator++.
+ ParamIterator operator++(int /*unused*/) {
+ ParamIteratorInterface<T>* clone = impl_->Clone();
+ impl_->Advance();
+ return ParamIterator(clone);
+ }
+ bool operator==(const ParamIterator& other) const {
+ return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
+ }
+ bool operator!=(const ParamIterator& other) const {
+ return !(*this == other);
+ }
+
+ private:
+ friend class ParamGenerator<T>;
+ explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
+ scoped_ptr<ParamIteratorInterface<T> > impl_;
+};
+
+// ParamGeneratorInterface<T> is the binary interface to access generators
+// defined in other translation units.
+template <typename T>
+class ParamGeneratorInterface {
+ public:
+ typedef T ParamType;
+
+ virtual ~ParamGeneratorInterface() {}
+
+ // Generator interface definition
+ virtual ParamIteratorInterface<T>* Begin() const = 0;
+ virtual ParamIteratorInterface<T>* End() const = 0;
+};
+
+// Wraps ParamGeneratorInterface<T> and provides general generator syntax
+// compatible with the STL Container concept.
+// This class implements copy initialization semantics and the contained
+// ParamGeneratorInterface<T> instance is shared among all copies
+// of the original object. This is possible because that instance is immutable.
+template<typename T>
+class ParamGenerator {
+ public:
+ typedef ParamIterator<T> iterator;
+
+ explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
+ ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
+
+ ParamGenerator& operator=(const ParamGenerator& other) {
+ impl_ = other.impl_;
+ return *this;
+ }
+
+ iterator begin() const { return iterator(impl_->Begin()); }
+ iterator end() const { return iterator(impl_->End()); }
+
+ private:
+ linked_ptr<const ParamGeneratorInterface<T> > impl_;
+};
+
+// Generates values from a range of two comparable values. Can be used to
+// generate sequences of user-defined types that implement operator+() and
+// operator<().
+// This class is used in the Range() function.
+template <typename T, typename IncrementT>
+class RangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+ RangeGenerator(T begin, T end, IncrementT step)
+ : begin_(begin), end_(end),
+ step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
+ virtual ~RangeGenerator() {}
+
+ virtual ParamIteratorInterface<T>* Begin() const {
+ return new Iterator(this, begin_, 0, step_);
+ }
+ virtual ParamIteratorInterface<T>* End() const {
+ return new Iterator(this, end_, end_index_, step_);
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<T> {
+ public:
+ Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
+ IncrementT step)
+ : base_(base), value_(value), index_(index), step_(step) {}
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+ return base_;
+ }
+ virtual void Advance() {
+ value_ = value_ + step_;
+ index_++;
+ }
+ virtual ParamIteratorInterface<T>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const T* Current() const { return &value_; }
+ virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const int other_index =
+ CheckedDowncastToActualType<const Iterator>(&other)->index_;
+ return index_ == other_index;
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : ParamIteratorInterface<T>(),
+ base_(other.base_), value_(other.value_), index_(other.index_),
+ step_(other.step_) {}
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<T>* const base_;
+ T value_;
+ int index_;
+ const IncrementT step_;
+ }; // class RangeGenerator::Iterator
+
+ static int CalculateEndIndex(const T& begin,
+ const T& end,
+ const IncrementT& step) {
+ int end_index = 0;
+ for (T i = begin; i < end; i = i + step)
+ end_index++;
+ return end_index;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const RangeGenerator& other);
+
+ const T begin_;
+ const T end_;
+ const IncrementT step_;
+ // The index for the end() iterator. All the elements in the generated
+ // sequence are indexed (0-based) to aid iterator comparison.
+ const int end_index_;
+}; // class RangeGenerator
+
+
+// Generates values from a pair of STL-style iterators. Used in the
+// ValuesIn() function. The elements are copied from the source range
+// since the source can be located on the stack, and the generator
+// is likely to persist beyond that stack frame.
+template <typename T>
+class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+ template <typename ForwardIterator>
+ ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
+ : container_(begin, end) {}
+ virtual ~ValuesInIteratorRangeGenerator() {}
+
+ virtual ParamIteratorInterface<T>* Begin() const {
+ return new Iterator(this, container_.begin());
+ }
+ virtual ParamIteratorInterface<T>* End() const {
+ return new Iterator(this, container_.end());
+ }
+
+ private:
+ typedef typename ::std::vector<T> ContainerType;
+
+ class Iterator : public ParamIteratorInterface<T> {
+ public:
+ Iterator(const ParamGeneratorInterface<T>* base,
+ typename ContainerType::const_iterator iterator)
+ : base_(base), iterator_(iterator) {}
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+ return base_;
+ }
+ virtual void Advance() {
+ ++iterator_;
+ value_.reset();
+ }
+ virtual ParamIteratorInterface<T>* Clone() const {
+ return new Iterator(*this);
+ }
+ // We need to use cached value referenced by iterator_ because *iterator_
+ // can return a temporary object (and of type other then T), so just
+ // having "return &*iterator_;" doesn't work.
+ // value_ is updated here and not in Advance() because Advance()
+ // can advance iterator_ beyond the end of the range, and we cannot
+ // detect that fact. The client code, on the other hand, is
+ // responsible for not calling Current() on an out-of-range iterator.
+ virtual const T* Current() const {
+ if (value_.get() == NULL)
+ value_.reset(new T(*iterator_));
+ return value_.get();
+ }
+ virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ return iterator_ ==
+ CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ // The explicit constructor call suppresses a false warning
+ // emitted by gcc when supplied with the -Wextra option.
+ : ParamIteratorInterface<T>(),
+ base_(other.base_),
+ iterator_(other.iterator_) {}
+
+ const ParamGeneratorInterface<T>* const base_;
+ typename ContainerType::const_iterator iterator_;
+ // A cached value of *iterator_. We keep it here to allow access by
+ // pointer in the wrapping iterator's operator->().
+ // value_ needs to be mutable to be accessed in Current().
+ // Use of scoped_ptr helps manage cached value's lifetime,
+ // which is bound by the lifespan of the iterator itself.
+ mutable scoped_ptr<const T> value_;
+ }; // class ValuesInIteratorRangeGenerator::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const ValuesInIteratorRangeGenerator& other);
+
+ const ContainerType container_;
+}; // class ValuesInIteratorRangeGenerator
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Stores a parameter value and later creates tests parameterized with that
+// value.
+template <class TestClass>
+class ParameterizedTestFactory : public TestFactoryBase {
+ public:
+ typedef typename TestClass::ParamType ParamType;
+ explicit ParameterizedTestFactory(ParamType parameter) :
+ parameter_(parameter) {}
+ virtual Test* CreateTest() {
+ TestClass::SetParam(¶meter_);
+ return new TestClass();
+ }
+
+ private:
+ const ParamType parameter_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactoryBase is a base class for meta-factories that create
+// test factories for passing into MakeAndRegisterTestInfo function.
+template <class ParamType>
+class TestMetaFactoryBase {
+ public:
+ virtual ~TestMetaFactoryBase() {}
+
+ virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactory creates test factories for passing into
+// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
+// ownership of test factory pointer, same factory object cannot be passed
+// into that method twice. But ParameterizedTestCaseInfo is going to call
+// it for each Test/Parameter value combination. Thus it needs meta factory
+// creator class.
+template <class TestCase>
+class TestMetaFactory
+ : public TestMetaFactoryBase<typename TestCase::ParamType> {
+ public:
+ typedef typename TestCase::ParamType ParamType;
+
+ TestMetaFactory() {}
+
+ virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
+ return new ParameterizedTestFactory<TestCase>(parameter);
+ }
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfoBase is a generic interface
+// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
+// accumulates test information provided by TEST_P macro invocations
+// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
+// and uses that information to register all resulting test instances
+// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
+// a collection of pointers to the ParameterizedTestCaseInfo objects
+// and calls RegisterTests() on each of them when asked.
+class ParameterizedTestCaseInfoBase {
+ public:
+ virtual ~ParameterizedTestCaseInfoBase() {}
+
+ // Base part of test case name for display purposes.
+ virtual const string& GetTestCaseName() const = 0;
+ // Test case id to verify identity.
+ virtual TypeId GetTestCaseTypeId() const = 0;
+ // UnitTest class invokes this method to register tests in this
+ // test case right before running them in RUN_ALL_TESTS macro.
+ // This method should not be called more then once on any single
+ // instance of a ParameterizedTestCaseInfoBase derived class.
+ virtual void RegisterTests() = 0;
+
+ protected:
+ ParameterizedTestCaseInfoBase() {}
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
+// macro invocations for a particular test case and generators
+// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
+// test case. It registers tests with all values generated by all
+// generators when asked.
+template <class TestCase>
+class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
+ public:
+ // ParamType and GeneratorCreationFunc are private types but are required
+ // for declarations of public methods AddTestPattern() and
+ // AddTestCaseInstantiation().
+ typedef typename TestCase::ParamType ParamType;
+ // A function that returns an instance of appropriate generator type.
+ typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
+
+ explicit ParameterizedTestCaseInfo(const char* name)
+ : test_case_name_(name) {}
+
+ // Test case base name for display purposes.
+ virtual const string& GetTestCaseName() const { return test_case_name_; }
+ // Test case id to verify identity.
+ virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
+ // TEST_P macro uses AddTestPattern() to record information
+ // about a single test in a LocalTestInfo structure.
+ // test_case_name is the base name of the test case (without invocation
+ // prefix). test_base_name is the name of an individual test without
+ // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
+ // test case base name and DoBar is test base name.
+ void AddTestPattern(const char* test_case_name,
+ const char* test_base_name,
+ TestMetaFactoryBase<ParamType>* meta_factory) {
+ tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
+ test_base_name,
+ meta_factory)));
+ }
+ // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
+ // about a generator.
+ int AddTestCaseInstantiation(const string& instantiation_name,
+ GeneratorCreationFunc* func,
+ const char* /* file */,
+ int /* line */) {
+ instantiations_.push_back(::std::make_pair(instantiation_name, func));
+ return 0; // Return value used only to run this method in namespace scope.
+ }
+ // UnitTest class invokes this method to register tests in this test case
+ // test cases right before running tests in RUN_ALL_TESTS macro.
+ // This method should not be called more then once on any single
+ // instance of a ParameterizedTestCaseInfoBase derived class.
+ // UnitTest has a guard to prevent from calling this method more then once.
+ virtual void RegisterTests() {
+ for (typename TestInfoContainer::iterator test_it = tests_.begin();
+ test_it != tests_.end(); ++test_it) {
+ linked_ptr<TestInfo> test_info = *test_it;
+ for (typename InstantiationContainer::iterator gen_it =
+ instantiations_.begin(); gen_it != instantiations_.end();
+ ++gen_it) {
+ const string& instantiation_name = gen_it->first;
+ ParamGenerator<ParamType> generator((*gen_it->second)());
+
+ string test_case_name;
+ if ( !instantiation_name.empty() )
+ test_case_name = instantiation_name + "/";
+ test_case_name += test_info->test_case_base_name;
+
+ int i = 0;
+ for (typename ParamGenerator<ParamType>::iterator param_it =
+ generator.begin();
+ param_it != generator.end(); ++param_it, ++i) {
+ Message test_name_stream;
+ test_name_stream << test_info->test_base_name << "/" << i;
+ MakeAndRegisterTestInfo(
+ test_case_name.c_str(),
+ test_name_stream.GetString().c_str(),
+ NULL, // No type parameter.
+ PrintToString(*param_it).c_str(),
+ GetTestCaseTypeId(),
+ TestCase::SetUpTestCase,
+ TestCase::TearDownTestCase,
+ test_info->test_meta_factory->CreateTestFactory(*param_it));
+ } // for param_it
+ } // for gen_it
+ } // for test_it
+ } // RegisterTests
+
+ private:
+ // LocalTestInfo structure keeps information about a single test registered
+ // with TEST_P macro.
+ struct TestInfo {
+ TestInfo(const char* a_test_case_base_name,
+ const char* a_test_base_name,
+ TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
+ test_case_base_name(a_test_case_base_name),
+ test_base_name(a_test_base_name),
+ test_meta_factory(a_test_meta_factory) {}
+
+ const string test_case_base_name;
+ const string test_base_name;
+ const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
+ };
+ typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
+ // Keeps pairs of <Instantiation name, Sequence generator creation function>
+ // received from INSTANTIATE_TEST_CASE_P macros.
+ typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
+ InstantiationContainer;
+
+ const string test_case_name_;
+ TestInfoContainer tests_;
+ InstantiationContainer instantiations_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
+}; // class ParameterizedTestCaseInfo
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
+// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
+// macros use it to locate their corresponding ParameterizedTestCaseInfo
+// descriptors.
+class ParameterizedTestCaseRegistry {
+ public:
+ ParameterizedTestCaseRegistry() {}
+ ~ParameterizedTestCaseRegistry() {
+ for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+ it != test_case_infos_.end(); ++it) {
+ delete *it;
+ }
+ }
+
+ // Looks up or creates and returns a structure containing information about
+ // tests and instantiations of a particular test case.
+ template <class TestCase>
+ ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
+ const char* test_case_name,
+ const char* file,
+ int line) {
+ ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
+ for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+ it != test_case_infos_.end(); ++it) {
+ if ((*it)->GetTestCaseName() == test_case_name) {
+ if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
+ // Complain about incorrect usage of Google Test facilities
+ // and terminate the program since we cannot guaranty correct
+ // test case setup and tear-down in this case.
+ ReportInvalidTestCaseType(test_case_name, file, line);
+ posix::Abort();
+ } else {
+ // At this point we are sure that the object we found is of the same
+ // type we are looking for, so we downcast it to that type
+ // without further checks.
+ typed_test_info = CheckedDowncastToActualType<
+ ParameterizedTestCaseInfo<TestCase> >(*it);
+ }
+ break;
+ }
+ }
+ if (typed_test_info == NULL) {
+ typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
+ test_case_infos_.push_back(typed_test_info);
+ }
+ return typed_test_info;
+ }
+ void RegisterTests() {
+ for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+ it != test_case_infos_.end(); ++it) {
+ (*it)->RegisterTests();
+ }
+ }
+
+ private:
+ typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
+
+ TestCaseInfoContainer test_case_infos_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
+};
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_HAS_PARAM_TEST
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+// This file was GENERATED by command:
+// pump.py gtest-param-util-generated.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
+//
+// Currently Google Test supports at most 50 arguments in Values,
+// and at most 10 arguments in Combine. Please contact
+// googletestframework at googlegroups.com if you need more.
+// Please note that the number of arguments to Combine is limited
+// by the maximum arity of the implementation of tr1::tuple which is
+// currently set at 10.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*. Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Forward declarations of ValuesIn(), which is implemented in
+// include/gtest/gtest-param-test.h.
+template <typename ForwardIterator>
+internal::ParamGenerator<
+ typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end);
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+ const Container& container);
+
+namespace internal {
+
+// Used in the Values() function to provide polymorphic capabilities.
+template <typename T1>
+class ValueArray1 {
+ public:
+ explicit ValueArray1(T1 v1) : v1_(v1) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray1& other);
+
+ const T1 v1_;
+};
+
+template <typename T1, typename T2>
+class ValueArray2 {
+ public:
+ ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray2& other);
+
+ const T1 v1_;
+ const T2 v2_;
+};
+
+template <typename T1, typename T2, typename T3>
+class ValueArray3 {
+ public:
+ ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray3& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+class ValueArray4 {
+ public:
+ ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray4& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class ValueArray5 {
+ public:
+ ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4), v5_(v5) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray5& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+class ValueArray6 {
+ public:
+ ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
+ v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray6& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+class ValueArray7 {
+ public:
+ ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
+ v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray7& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+class ValueArray8 {
+ public:
+ ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray8& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+class ValueArray9 {
+ public:
+ ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+ T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray9& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+class ValueArray10 {
+ public:
+ ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray10& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11>
+class ValueArray11 {
+ public:
+ ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+ v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray11& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12>
+class ValueArray12 {
+ public:
+ ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+ v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray12& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13>
+class ValueArray13 {
+ public:
+ ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+ v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+ v12_(v12), v13_(v13) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray13& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14>
+class ValueArray14 {
+ public:
+ ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray14& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15>
+class ValueArray15 {
+ public:
+ ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
+ v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray15& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16>
+class ValueArray16 {
+ public:
+ ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
+ v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+ v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+ v16_(v16) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray16& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17>
+class ValueArray17 {
+ public:
+ ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+ T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray17& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18>
+class ValueArray18 {
+ public:
+ ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray18& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19>
+class ValueArray19 {
+ public:
+ ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+ v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+ v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray19& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20>
+class ValueArray20 {
+ public:
+ ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+ v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+ v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+ v19_(v19), v20_(v20) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray20& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21>
+class ValueArray21 {
+ public:
+ ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+ v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+ v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+ v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray21& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22>
+class ValueArray22 {
+ public:
+ ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray22& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23>
+class ValueArray23 {
+ public:
+ ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
+ v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray23& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24>
+class ValueArray24 {
+ public:
+ ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
+ v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+ v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+ v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+ v22_(v22), v23_(v23), v24_(v24) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray24& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25>
+class ValueArray25 {
+ public:
+ ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+ T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray25& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26>
+class ValueArray26 {
+ public:
+ ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray26& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27>
+class ValueArray27 {
+ public:
+ ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+ v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+ v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+ v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+ v26_(v26), v27_(v27) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray27& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28>
+class ValueArray28 {
+ public:
+ ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+ v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+ v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+ v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+ v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray28& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29>
+class ValueArray29 {
+ public:
+ ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+ v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+ v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+ v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+ v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray29& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30>
+class ValueArray30 {
+ public:
+ ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+ v29_(v29), v30_(v30) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray30& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31>
+class ValueArray31 {
+ public:
+ ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
+ v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+ v29_(v29), v30_(v30), v31_(v31) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray31& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32>
+class ValueArray32 {
+ public:
+ ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
+ v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+ v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+ v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+ v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+ v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray32& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33>
+class ValueArray33 {
+ public:
+ ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+ T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+ v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+ v33_(v33) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray33& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34>
+class ValueArray34 {
+ public:
+ ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+ v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+ v33_(v33), v34_(v34) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray34& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35>
+class ValueArray35 {
+ public:
+ ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+ v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+ v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+ v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+ v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+ v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray35& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36>
+class ValueArray36 {
+ public:
+ ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+ v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+ v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+ v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+ v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+ v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray36& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37>
+class ValueArray37 {
+ public:
+ ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+ v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+ v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+ v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+ v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+ v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+ v36_(v36), v37_(v37) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray37& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38>
+class ValueArray38 {
+ public:
+ ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+ v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+ v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray38& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39>
+class ValueArray39 {
+ public:
+ ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
+ v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+ v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+ v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray39& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40>
+class ValueArray40 {
+ public:
+ ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
+ v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+ v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+ v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+ v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+ v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+ v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+ v40_(v40) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray40& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41>
+class ValueArray41 {
+ public:
+ ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+ T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+ v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+ v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+ v39_(v39), v40_(v40), v41_(v41) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray41& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42>
+class ValueArray42 {
+ public:
+ ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+ v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+ v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+ v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray42& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43>
+class ValueArray43 {
+ public:
+ ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+ v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+ v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+ v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+ v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+ v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
+ v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray43& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44>
+class ValueArray44 {
+ public:
+ ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+ v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+ v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+ v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+ v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+ v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
+ v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
+ v43_(v43), v44_(v44) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray44& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45>
+class ValueArray45 {
+ public:
+ ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+ v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+ v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+ v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+ v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+ v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+ v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
+ v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+ static_cast<T>(v45_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray45& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+ const T45 v45_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46>
+class ValueArray46 {
+ public:
+ ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
+ v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+ v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+ v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+ v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+ static_cast<T>(v45_), static_cast<T>(v46_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray46& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+ const T45 v45_;
+ const T46 v46_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47>
+class ValueArray47 {
+ public:
+ ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
+ v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+ v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+ v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+ v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+ v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+ v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+ v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
+ v47_(v47) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+ static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray47& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+ const T45 v45_;
+ const T46 v46_;
+ const T47 v47_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48>
+class ValueArray48 {
+ public:
+ ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
+ v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+ v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+ v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+ v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+ v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+ v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+ v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
+ v46_(v46), v47_(v47), v48_(v48) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+ static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+ static_cast<T>(v48_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray48& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+ const T45 v45_;
+ const T46 v46_;
+ const T47 v47_;
+ const T48 v48_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49>
+class ValueArray49 {
+ public:
+ ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
+ T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+ v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+ v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+ v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+ v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+ static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+ static_cast<T>(v48_), static_cast<T>(v49_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray49& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+ const T45 v45_;
+ const T46 v46_;
+ const T47 v47_;
+ const T48 v48_;
+ const T49 v49_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49, typename T50>
+class ValueArray50 {
+ public:
+ ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
+ T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+ v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+ v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+ v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+ v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+ v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+ v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+ v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
+
+ template <typename T>
+ operator ParamGenerator<T>() const {
+ const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+ static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+ static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+ static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+ static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+ static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+ static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+ static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+ static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+ static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+ static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+ static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+ static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+ static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+ static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+ static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+ static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
+ return ValuesIn(array);
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const ValueArray50& other);
+
+ const T1 v1_;
+ const T2 v2_;
+ const T3 v3_;
+ const T4 v4_;
+ const T5 v5_;
+ const T6 v6_;
+ const T7 v7_;
+ const T8 v8_;
+ const T9 v9_;
+ const T10 v10_;
+ const T11 v11_;
+ const T12 v12_;
+ const T13 v13_;
+ const T14 v14_;
+ const T15 v15_;
+ const T16 v16_;
+ const T17 v17_;
+ const T18 v18_;
+ const T19 v19_;
+ const T20 v20_;
+ const T21 v21_;
+ const T22 v22_;
+ const T23 v23_;
+ const T24 v24_;
+ const T25 v25_;
+ const T26 v26_;
+ const T27 v27_;
+ const T28 v28_;
+ const T29 v29_;
+ const T30 v30_;
+ const T31 v31_;
+ const T32 v32_;
+ const T33 v33_;
+ const T34 v34_;
+ const T35 v35_;
+ const T36 v36_;
+ const T37 v37_;
+ const T38 v38_;
+ const T39 v39_;
+ const T40 v40_;
+ const T41 v41_;
+ const T42 v42_;
+ const T43 v43_;
+ const T44 v44_;
+ const T45 v45_;
+ const T46 v46_;
+ const T47 v47_;
+ const T48 v48_;
+ const T49 v49_;
+ const T50 v50_;
+};
+
+# if GTEST_HAS_COMBINE
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Generates values from the Cartesian product of values produced
+// by the argument generators.
+//
+template <typename T1, typename T2>
+class CartesianProductGenerator2
+ : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
+ public:
+ typedef ::std::tr1::tuple<T1, T2> ParamType;
+
+ CartesianProductGenerator2(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2)
+ : g1_(g1), g2_(g2) {}
+ virtual ~CartesianProductGenerator2() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current2_;
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return ¤t_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator2::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator2& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+}; // class CartesianProductGenerator2
+
+
+template <typename T1, typename T2, typename T3>
+class CartesianProductGenerator3
+ : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
+ public:
+ typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
+
+ CartesianProductGenerator3(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
+ : g1_(g1), g2_(g2), g3_(g3) {}
+ virtual ~CartesianProductGenerator3() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current3_;
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return ¤t_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator3::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator3& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+}; // class CartesianProductGenerator3
+
+
+template <typename T1, typename T2, typename T3, typename T4>
+class CartesianProductGenerator4
+ : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
+ public:
+ typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
+
+ CartesianProductGenerator4(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+ virtual ~CartesianProductGenerator4() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current4_;
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return ¤t_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator4::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator4& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+}; // class CartesianProductGenerator4
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class CartesianProductGenerator5
+ : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
+ public:
+ typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
+
+ CartesianProductGenerator5(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+ virtual ~CartesianProductGenerator5() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end(), g5_, g5_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4,
+ const ParamGenerator<T5>& g5,
+ const typename ParamGenerator<T5>::iterator& current5)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+ begin5_(g5.begin()), end5_(g5.end()), current5_(current5) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current5_;
+ if (current5_ == end5_) {
+ current5_ = begin5_;
+ ++current4_;
+ }
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return ¤t_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_ &&
+ current5_ == typed_other->current5_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_),
+ begin5_(other.begin5_),
+ end5_(other.end5_),
+ current5_(other.current5_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_, *current5_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_ ||
+ current5_ == end5_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ const typename ParamGenerator<T5>::iterator begin5_;
+ const typename ParamGenerator<T5>::iterator end5_;
+ typename ParamGenerator<T5>::iterator current5_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator5::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator5& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+ const ParamGenerator<T5> g5_;
+}; // class CartesianProductGenerator5
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+class CartesianProductGenerator6
+ : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
+ T6> > {
+ public:
+ typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
+
+ CartesianProductGenerator6(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+ const ParamGenerator<T6>& g6)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+ virtual ~CartesianProductGenerator6() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4,
+ const ParamGenerator<T5>& g5,
+ const typename ParamGenerator<T5>::iterator& current5,
+ const ParamGenerator<T6>& g6,
+ const typename ParamGenerator<T6>::iterator& current6)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+ begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+ begin6_(g6.begin()), end6_(g6.end()), current6_(current6) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current6_;
+ if (current6_ == end6_) {
+ current6_ = begin6_;
+ ++current5_;
+ }
+ if (current5_ == end5_) {
+ current5_ = begin5_;
+ ++current4_;
+ }
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return ¤t_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_ &&
+ current5_ == typed_other->current5_ &&
+ current6_ == typed_other->current6_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_),
+ begin5_(other.begin5_),
+ end5_(other.end5_),
+ current5_(other.current5_),
+ begin6_(other.begin6_),
+ end6_(other.end6_),
+ current6_(other.current6_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_, *current5_, *current6_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_ ||
+ current5_ == end5_ ||
+ current6_ == end6_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ const typename ParamGenerator<T5>::iterator begin5_;
+ const typename ParamGenerator<T5>::iterator end5_;
+ typename ParamGenerator<T5>::iterator current5_;
+ const typename ParamGenerator<T6>::iterator begin6_;
+ const typename ParamGenerator<T6>::iterator end6_;
+ typename ParamGenerator<T6>::iterator current6_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator6::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator6& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+ const ParamGenerator<T5> g5_;
+ const ParamGenerator<T6> g6_;
+}; // class CartesianProductGenerator6
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+class CartesianProductGenerator7
+ : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+ T7> > {
+ public:
+ typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
+
+ CartesianProductGenerator7(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+ const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+ virtual ~CartesianProductGenerator7() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+ g7_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4,
+ const ParamGenerator<T5>& g5,
+ const typename ParamGenerator<T5>::iterator& current5,
+ const ParamGenerator<T6>& g6,
+ const typename ParamGenerator<T6>::iterator& current6,
+ const ParamGenerator<T7>& g7,
+ const typename ParamGenerator<T7>::iterator& current7)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+ begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+ begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+ begin7_(g7.begin()), end7_(g7.end()), current7_(current7) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current7_;
+ if (current7_ == end7_) {
+ current7_ = begin7_;
+ ++current6_;
+ }
+ if (current6_ == end6_) {
+ current6_ = begin6_;
+ ++current5_;
+ }
+ if (current5_ == end5_) {
+ current5_ = begin5_;
+ ++current4_;
+ }
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return ¤t_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_ &&
+ current5_ == typed_other->current5_ &&
+ current6_ == typed_other->current6_ &&
+ current7_ == typed_other->current7_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_),
+ begin5_(other.begin5_),
+ end5_(other.end5_),
+ current5_(other.current5_),
+ begin6_(other.begin6_),
+ end6_(other.end6_),
+ current6_(other.current6_),
+ begin7_(other.begin7_),
+ end7_(other.end7_),
+ current7_(other.current7_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_, *current5_, *current6_, *current7_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_ ||
+ current5_ == end5_ ||
+ current6_ == end6_ ||
+ current7_ == end7_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ const typename ParamGenerator<T5>::iterator begin5_;
+ const typename ParamGenerator<T5>::iterator end5_;
+ typename ParamGenerator<T5>::iterator current5_;
+ const typename ParamGenerator<T6>::iterator begin6_;
+ const typename ParamGenerator<T6>::iterator end6_;
+ typename ParamGenerator<T6>::iterator current6_;
+ const typename ParamGenerator<T7>::iterator begin7_;
+ const typename ParamGenerator<T7>::iterator end7_;
+ typename ParamGenerator<T7>::iterator current7_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator7::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator7& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+ const ParamGenerator<T5> g5_;
+ const ParamGenerator<T6> g6_;
+ const ParamGenerator<T7> g7_;
+}; // class CartesianProductGenerator7
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+class CartesianProductGenerator8
+ : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+ T7, T8> > {
+ public:
+ typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
+
+ CartesianProductGenerator8(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+ const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+ const ParamGenerator<T8>& g8)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+ g8_(g8) {}
+ virtual ~CartesianProductGenerator8() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+ g7_.begin(), g8_, g8_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+ g8_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4,
+ const ParamGenerator<T5>& g5,
+ const typename ParamGenerator<T5>::iterator& current5,
+ const ParamGenerator<T6>& g6,
+ const typename ParamGenerator<T6>::iterator& current6,
+ const ParamGenerator<T7>& g7,
+ const typename ParamGenerator<T7>::iterator& current7,
+ const ParamGenerator<T8>& g8,
+ const typename ParamGenerator<T8>::iterator& current8)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+ begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+ begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+ begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+ begin8_(g8.begin()), end8_(g8.end()), current8_(current8) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current8_;
+ if (current8_ == end8_) {
+ current8_ = begin8_;
+ ++current7_;
+ }
+ if (current7_ == end7_) {
+ current7_ = begin7_;
+ ++current6_;
+ }
+ if (current6_ == end6_) {
+ current6_ = begin6_;
+ ++current5_;
+ }
+ if (current5_ == end5_) {
+ current5_ = begin5_;
+ ++current4_;
+ }
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return ¤t_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_ &&
+ current5_ == typed_other->current5_ &&
+ current6_ == typed_other->current6_ &&
+ current7_ == typed_other->current7_ &&
+ current8_ == typed_other->current8_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_),
+ begin5_(other.begin5_),
+ end5_(other.end5_),
+ current5_(other.current5_),
+ begin6_(other.begin6_),
+ end6_(other.end6_),
+ current6_(other.current6_),
+ begin7_(other.begin7_),
+ end7_(other.end7_),
+ current7_(other.current7_),
+ begin8_(other.begin8_),
+ end8_(other.end8_),
+ current8_(other.current8_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_, *current5_, *current6_, *current7_, *current8_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_ ||
+ current5_ == end5_ ||
+ current6_ == end6_ ||
+ current7_ == end7_ ||
+ current8_ == end8_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ const typename ParamGenerator<T5>::iterator begin5_;
+ const typename ParamGenerator<T5>::iterator end5_;
+ typename ParamGenerator<T5>::iterator current5_;
+ const typename ParamGenerator<T6>::iterator begin6_;
+ const typename ParamGenerator<T6>::iterator end6_;
+ typename ParamGenerator<T6>::iterator current6_;
+ const typename ParamGenerator<T7>::iterator begin7_;
+ const typename ParamGenerator<T7>::iterator end7_;
+ typename ParamGenerator<T7>::iterator current7_;
+ const typename ParamGenerator<T8>::iterator begin8_;
+ const typename ParamGenerator<T8>::iterator end8_;
+ typename ParamGenerator<T8>::iterator current8_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator8::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator8& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+ const ParamGenerator<T5> g5_;
+ const ParamGenerator<T6> g6_;
+ const ParamGenerator<T7> g7_;
+ const ParamGenerator<T8> g8_;
+}; // class CartesianProductGenerator8
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+class CartesianProductGenerator9
+ : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+ T7, T8, T9> > {
+ public:
+ typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
+
+ CartesianProductGenerator9(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+ const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+ const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+ g9_(g9) {}
+ virtual ~CartesianProductGenerator9() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+ g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+ g8_.end(), g9_, g9_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4,
+ const ParamGenerator<T5>& g5,
+ const typename ParamGenerator<T5>::iterator& current5,
+ const ParamGenerator<T6>& g6,
+ const typename ParamGenerator<T6>::iterator& current6,
+ const ParamGenerator<T7>& g7,
+ const typename ParamGenerator<T7>::iterator& current7,
+ const ParamGenerator<T8>& g8,
+ const typename ParamGenerator<T8>::iterator& current8,
+ const ParamGenerator<T9>& g9,
+ const typename ParamGenerator<T9>::iterator& current9)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+ begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+ begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+ begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+ begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+ begin9_(g9.begin()), end9_(g9.end()), current9_(current9) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current9_;
+ if (current9_ == end9_) {
+ current9_ = begin9_;
+ ++current8_;
+ }
+ if (current8_ == end8_) {
+ current8_ = begin8_;
+ ++current7_;
+ }
+ if (current7_ == end7_) {
+ current7_ = begin7_;
+ ++current6_;
+ }
+ if (current6_ == end6_) {
+ current6_ = begin6_;
+ ++current5_;
+ }
+ if (current5_ == end5_) {
+ current5_ = begin5_;
+ ++current4_;
+ }
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return ¤t_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_ &&
+ current5_ == typed_other->current5_ &&
+ current6_ == typed_other->current6_ &&
+ current7_ == typed_other->current7_ &&
+ current8_ == typed_other->current8_ &&
+ current9_ == typed_other->current9_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_),
+ begin5_(other.begin5_),
+ end5_(other.end5_),
+ current5_(other.current5_),
+ begin6_(other.begin6_),
+ end6_(other.end6_),
+ current6_(other.current6_),
+ begin7_(other.begin7_),
+ end7_(other.end7_),
+ current7_(other.current7_),
+ begin8_(other.begin8_),
+ end8_(other.end8_),
+ current8_(other.current8_),
+ begin9_(other.begin9_),
+ end9_(other.end9_),
+ current9_(other.current9_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_, *current5_, *current6_, *current7_, *current8_,
+ *current9_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_ ||
+ current5_ == end5_ ||
+ current6_ == end6_ ||
+ current7_ == end7_ ||
+ current8_ == end8_ ||
+ current9_ == end9_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ const typename ParamGenerator<T5>::iterator begin5_;
+ const typename ParamGenerator<T5>::iterator end5_;
+ typename ParamGenerator<T5>::iterator current5_;
+ const typename ParamGenerator<T6>::iterator begin6_;
+ const typename ParamGenerator<T6>::iterator end6_;
+ typename ParamGenerator<T6>::iterator current6_;
+ const typename ParamGenerator<T7>::iterator begin7_;
+ const typename ParamGenerator<T7>::iterator end7_;
+ typename ParamGenerator<T7>::iterator current7_;
+ const typename ParamGenerator<T8>::iterator begin8_;
+ const typename ParamGenerator<T8>::iterator end8_;
+ typename ParamGenerator<T8>::iterator current8_;
+ const typename ParamGenerator<T9>::iterator begin9_;
+ const typename ParamGenerator<T9>::iterator end9_;
+ typename ParamGenerator<T9>::iterator current9_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator9::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator9& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+ const ParamGenerator<T5> g5_;
+ const ParamGenerator<T6> g6_;
+ const ParamGenerator<T7> g7_;
+ const ParamGenerator<T8> g8_;
+ const ParamGenerator<T9> g9_;
+}; // class CartesianProductGenerator9
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+class CartesianProductGenerator10
+ : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+ T7, T8, T9, T10> > {
+ public:
+ typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
+
+ CartesianProductGenerator10(const ParamGenerator<T1>& g1,
+ const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+ const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+ const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+ const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
+ const ParamGenerator<T10>& g10)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+ g9_(g9), g10_(g10) {}
+ virtual ~CartesianProductGenerator10() {}
+
+ virtual ParamIteratorInterface<ParamType>* Begin() const {
+ return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+ g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+ g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
+ }
+ virtual ParamIteratorInterface<ParamType>* End() const {
+ return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+ g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+ g8_.end(), g9_, g9_.end(), g10_, g10_.end());
+ }
+
+ private:
+ class Iterator : public ParamIteratorInterface<ParamType> {
+ public:
+ Iterator(const ParamGeneratorInterface<ParamType>* base,
+ const ParamGenerator<T1>& g1,
+ const typename ParamGenerator<T1>::iterator& current1,
+ const ParamGenerator<T2>& g2,
+ const typename ParamGenerator<T2>::iterator& current2,
+ const ParamGenerator<T3>& g3,
+ const typename ParamGenerator<T3>::iterator& current3,
+ const ParamGenerator<T4>& g4,
+ const typename ParamGenerator<T4>::iterator& current4,
+ const ParamGenerator<T5>& g5,
+ const typename ParamGenerator<T5>::iterator& current5,
+ const ParamGenerator<T6>& g6,
+ const typename ParamGenerator<T6>::iterator& current6,
+ const ParamGenerator<T7>& g7,
+ const typename ParamGenerator<T7>::iterator& current7,
+ const ParamGenerator<T8>& g8,
+ const typename ParamGenerator<T8>::iterator& current8,
+ const ParamGenerator<T9>& g9,
+ const typename ParamGenerator<T9>::iterator& current9,
+ const ParamGenerator<T10>& g10,
+ const typename ParamGenerator<T10>::iterator& current10)
+ : base_(base),
+ begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+ begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+ begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+ begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+ begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+ begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+ begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+ begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+ begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
+ begin10_(g10.begin()), end10_(g10.end()), current10_(current10) {
+ ComputeCurrentValue();
+ }
+ virtual ~Iterator() {}
+
+ virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+ return base_;
+ }
+ // Advance should not be called on beyond-of-range iterators
+ // so no component iterators must be beyond end of range, either.
+ virtual void Advance() {
+ assert(!AtEnd());
+ ++current10_;
+ if (current10_ == end10_) {
+ current10_ = begin10_;
+ ++current9_;
+ }
+ if (current9_ == end9_) {
+ current9_ = begin9_;
+ ++current8_;
+ }
+ if (current8_ == end8_) {
+ current8_ = begin8_;
+ ++current7_;
+ }
+ if (current7_ == end7_) {
+ current7_ = begin7_;
+ ++current6_;
+ }
+ if (current6_ == end6_) {
+ current6_ = begin6_;
+ ++current5_;
+ }
+ if (current5_ == end5_) {
+ current5_ = begin5_;
+ ++current4_;
+ }
+ if (current4_ == end4_) {
+ current4_ = begin4_;
+ ++current3_;
+ }
+ if (current3_ == end3_) {
+ current3_ = begin3_;
+ ++current2_;
+ }
+ if (current2_ == end2_) {
+ current2_ = begin2_;
+ ++current1_;
+ }
+ ComputeCurrentValue();
+ }
+ virtual ParamIteratorInterface<ParamType>* Clone() const {
+ return new Iterator(*this);
+ }
+ virtual const ParamType* Current() const { return ¤t_value_; }
+ virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+ // Having the same base generator guarantees that the other
+ // iterator is of the same type and we can downcast.
+ GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+ << "The program attempted to compare iterators "
+ << "from different generators." << std::endl;
+ const Iterator* typed_other =
+ CheckedDowncastToActualType<const Iterator>(&other);
+ // We must report iterators equal if they both point beyond their
+ // respective ranges. That can happen in a variety of fashions,
+ // so we have to consult AtEnd().
+ return (AtEnd() && typed_other->AtEnd()) ||
+ (
+ current1_ == typed_other->current1_ &&
+ current2_ == typed_other->current2_ &&
+ current3_ == typed_other->current3_ &&
+ current4_ == typed_other->current4_ &&
+ current5_ == typed_other->current5_ &&
+ current6_ == typed_other->current6_ &&
+ current7_ == typed_other->current7_ &&
+ current8_ == typed_other->current8_ &&
+ current9_ == typed_other->current9_ &&
+ current10_ == typed_other->current10_);
+ }
+
+ private:
+ Iterator(const Iterator& other)
+ : base_(other.base_),
+ begin1_(other.begin1_),
+ end1_(other.end1_),
+ current1_(other.current1_),
+ begin2_(other.begin2_),
+ end2_(other.end2_),
+ current2_(other.current2_),
+ begin3_(other.begin3_),
+ end3_(other.end3_),
+ current3_(other.current3_),
+ begin4_(other.begin4_),
+ end4_(other.end4_),
+ current4_(other.current4_),
+ begin5_(other.begin5_),
+ end5_(other.end5_),
+ current5_(other.current5_),
+ begin6_(other.begin6_),
+ end6_(other.end6_),
+ current6_(other.current6_),
+ begin7_(other.begin7_),
+ end7_(other.end7_),
+ current7_(other.current7_),
+ begin8_(other.begin8_),
+ end8_(other.end8_),
+ current8_(other.current8_),
+ begin9_(other.begin9_),
+ end9_(other.end9_),
+ current9_(other.current9_),
+ begin10_(other.begin10_),
+ end10_(other.end10_),
+ current10_(other.current10_) {
+ ComputeCurrentValue();
+ }
+
+ void ComputeCurrentValue() {
+ if (!AtEnd())
+ current_value_ = ParamType(*current1_, *current2_, *current3_,
+ *current4_, *current5_, *current6_, *current7_, *current8_,
+ *current9_, *current10_);
+ }
+ bool AtEnd() const {
+ // We must report iterator past the end of the range when either of the
+ // component iterators has reached the end of its range.
+ return
+ current1_ == end1_ ||
+ current2_ == end2_ ||
+ current3_ == end3_ ||
+ current4_ == end4_ ||
+ current5_ == end5_ ||
+ current6_ == end6_ ||
+ current7_ == end7_ ||
+ current8_ == end8_ ||
+ current9_ == end9_ ||
+ current10_ == end10_;
+ }
+
+ // No implementation - assignment is unsupported.
+ void operator=(const Iterator& other);
+
+ const ParamGeneratorInterface<ParamType>* const base_;
+ // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+ // current[i]_ is the actual traversing iterator.
+ const typename ParamGenerator<T1>::iterator begin1_;
+ const typename ParamGenerator<T1>::iterator end1_;
+ typename ParamGenerator<T1>::iterator current1_;
+ const typename ParamGenerator<T2>::iterator begin2_;
+ const typename ParamGenerator<T2>::iterator end2_;
+ typename ParamGenerator<T2>::iterator current2_;
+ const typename ParamGenerator<T3>::iterator begin3_;
+ const typename ParamGenerator<T3>::iterator end3_;
+ typename ParamGenerator<T3>::iterator current3_;
+ const typename ParamGenerator<T4>::iterator begin4_;
+ const typename ParamGenerator<T4>::iterator end4_;
+ typename ParamGenerator<T4>::iterator current4_;
+ const typename ParamGenerator<T5>::iterator begin5_;
+ const typename ParamGenerator<T5>::iterator end5_;
+ typename ParamGenerator<T5>::iterator current5_;
+ const typename ParamGenerator<T6>::iterator begin6_;
+ const typename ParamGenerator<T6>::iterator end6_;
+ typename ParamGenerator<T6>::iterator current6_;
+ const typename ParamGenerator<T7>::iterator begin7_;
+ const typename ParamGenerator<T7>::iterator end7_;
+ typename ParamGenerator<T7>::iterator current7_;
+ const typename ParamGenerator<T8>::iterator begin8_;
+ const typename ParamGenerator<T8>::iterator end8_;
+ typename ParamGenerator<T8>::iterator current8_;
+ const typename ParamGenerator<T9>::iterator begin9_;
+ const typename ParamGenerator<T9>::iterator end9_;
+ typename ParamGenerator<T9>::iterator current9_;
+ const typename ParamGenerator<T10>::iterator begin10_;
+ const typename ParamGenerator<T10>::iterator end10_;
+ typename ParamGenerator<T10>::iterator current10_;
+ ParamType current_value_;
+ }; // class CartesianProductGenerator10::Iterator
+
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductGenerator10& other);
+
+ const ParamGenerator<T1> g1_;
+ const ParamGenerator<T2> g2_;
+ const ParamGenerator<T3> g3_;
+ const ParamGenerator<T4> g4_;
+ const ParamGenerator<T5> g5_;
+ const ParamGenerator<T6> g6_;
+ const ParamGenerator<T7> g7_;
+ const ParamGenerator<T8> g8_;
+ const ParamGenerator<T9> g9_;
+ const ParamGenerator<T10> g10_;
+}; // class CartesianProductGenerator10
+
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Helper classes providing Combine() with polymorphic features. They allow
+// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
+// convertible to U.
+//
+template <class Generator1, class Generator2>
+class CartesianProductHolder2 {
+ public:
+CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
+ : g1_(g1), g2_(g2) {}
+ template <typename T1, typename T2>
+ operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
+ return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
+ new CartesianProductGenerator2<T1, T2>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder2& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+}; // class CartesianProductHolder2
+
+template <class Generator1, class Generator2, class Generator3>
+class CartesianProductHolder3 {
+ public:
+CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3)
+ : g1_(g1), g2_(g2), g3_(g3) {}
+ template <typename T1, typename T2, typename T3>
+ operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
+ return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
+ new CartesianProductGenerator3<T1, T2, T3>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder3& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+}; // class CartesianProductHolder3
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4>
+class CartesianProductHolder4 {
+ public:
+CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+ template <typename T1, typename T2, typename T3, typename T4>
+ operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
+ return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
+ new CartesianProductGenerator4<T1, T2, T3, T4>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder4& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+}; // class CartesianProductHolder4
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4, class Generator5>
+class CartesianProductHolder5 {
+ public:
+CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4, const Generator5& g5)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+ template <typename T1, typename T2, typename T3, typename T4, typename T5>
+ operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
+ return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
+ new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_),
+ static_cast<ParamGenerator<T5> >(g5_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder5& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+ const Generator5 g5_;
+}; // class CartesianProductHolder5
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4, class Generator5, class Generator6>
+class CartesianProductHolder6 {
+ public:
+CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4, const Generator5& g5,
+ const Generator6& g6)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+ operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
+ return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
+ new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_),
+ static_cast<ParamGenerator<T5> >(g5_),
+ static_cast<ParamGenerator<T6> >(g6_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder6& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+ const Generator5 g5_;
+ const Generator6 g6_;
+}; // class CartesianProductHolder6
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4, class Generator5, class Generator6, class Generator7>
+class CartesianProductHolder7 {
+ public:
+CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4, const Generator5& g5,
+ const Generator6& g6, const Generator7& g7)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+ operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+ T7> >() const {
+ return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
+ new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_),
+ static_cast<ParamGenerator<T5> >(g5_),
+ static_cast<ParamGenerator<T6> >(g6_),
+ static_cast<ParamGenerator<T7> >(g7_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder7& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+ const Generator5 g5_;
+ const Generator6 g6_;
+ const Generator7 g7_;
+}; // class CartesianProductHolder7
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4, class Generator5, class Generator6, class Generator7,
+ class Generator8>
+class CartesianProductHolder8 {
+ public:
+CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4, const Generator5& g5,
+ const Generator6& g6, const Generator7& g7, const Generator8& g8)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+ g8_(g8) {}
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+ operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
+ T8> >() const {
+ return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
+ new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_),
+ static_cast<ParamGenerator<T5> >(g5_),
+ static_cast<ParamGenerator<T6> >(g6_),
+ static_cast<ParamGenerator<T7> >(g7_),
+ static_cast<ParamGenerator<T8> >(g8_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder8& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+ const Generator5 g5_;
+ const Generator6 g6_;
+ const Generator7 g7_;
+ const Generator8 g8_;
+}; // class CartesianProductHolder8
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4, class Generator5, class Generator6, class Generator7,
+ class Generator8, class Generator9>
+class CartesianProductHolder9 {
+ public:
+CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4, const Generator5& g5,
+ const Generator6& g6, const Generator7& g7, const Generator8& g8,
+ const Generator9& g9)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+ g9_(g9) {}
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+ operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+ T9> >() const {
+ return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+ T9> >(
+ new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_),
+ static_cast<ParamGenerator<T5> >(g5_),
+ static_cast<ParamGenerator<T6> >(g6_),
+ static_cast<ParamGenerator<T7> >(g7_),
+ static_cast<ParamGenerator<T8> >(g8_),
+ static_cast<ParamGenerator<T9> >(g9_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder9& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+ const Generator5 g5_;
+ const Generator6 g6_;
+ const Generator7 g7_;
+ const Generator8 g8_;
+ const Generator9 g9_;
+}; // class CartesianProductHolder9
+
+template <class Generator1, class Generator2, class Generator3,
+ class Generator4, class Generator5, class Generator6, class Generator7,
+ class Generator8, class Generator9, class Generator10>
+class CartesianProductHolder10 {
+ public:
+CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
+ const Generator3& g3, const Generator4& g4, const Generator5& g5,
+ const Generator6& g6, const Generator7& g7, const Generator8& g8,
+ const Generator9& g9, const Generator10& g10)
+ : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+ g9_(g9), g10_(g10) {}
+ template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+ operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+ T9, T10> >() const {
+ return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+ T9, T10> >(
+ new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
+ T10>(
+ static_cast<ParamGenerator<T1> >(g1_),
+ static_cast<ParamGenerator<T2> >(g2_),
+ static_cast<ParamGenerator<T3> >(g3_),
+ static_cast<ParamGenerator<T4> >(g4_),
+ static_cast<ParamGenerator<T5> >(g5_),
+ static_cast<ParamGenerator<T6> >(g6_),
+ static_cast<ParamGenerator<T7> >(g7_),
+ static_cast<ParamGenerator<T8> >(g8_),
+ static_cast<ParamGenerator<T9> >(g9_),
+ static_cast<ParamGenerator<T10> >(g10_)));
+ }
+
+ private:
+ // No implementation - assignment is unsupported.
+ void operator=(const CartesianProductHolder10& other);
+
+ const Generator1 g1_;
+ const Generator2 g2_;
+ const Generator3 g3_;
+ const Generator4 g4_;
+ const Generator5 g5_;
+ const Generator6 g6_;
+ const Generator7 g7_;
+ const Generator8 g8_;
+ const Generator9 g9_;
+ const Generator10 g10_;
+}; // class CartesianProductHolder10
+
+# endif // GTEST_HAS_COMBINE
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_HAS_PARAM_TEST
+
+#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Functions producing parameter generators.
+//
+// Google Test uses these generators to produce parameters for value-
+// parameterized tests. When a parameterized test case is instantiated
+// with a particular generator, Google Test creates and runs tests
+// for each element in the sequence produced by the generator.
+//
+// In the following sample, tests from test case FooTest are instantiated
+// each three times with parameter values 3, 5, and 8:
+//
+// class FooTest : public TestWithParam<int> { ... };
+//
+// TEST_P(FooTest, TestThis) {
+// }
+// TEST_P(FooTest, TestThat) {
+// }
+// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
+//
+
+// Range() returns generators providing sequences of values in a range.
+//
+// Synopsis:
+// Range(start, end)
+// - returns a generator producing a sequence of values {start, start+1,
+// start+2, ..., }.
+// Range(start, end, step)
+// - returns a generator producing a sequence of values {start, start+step,
+// start+step+step, ..., }.
+// Notes:
+// * The generated sequences never include end. For example, Range(1, 5)
+// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
+// returns a generator producing {1, 3, 5, 7}.
+// * start and end must have the same type. That type may be any integral or
+// floating-point type or a user defined type satisfying these conditions:
+// * It must be assignable (have operator=() defined).
+// * It must have operator+() (operator+(int-compatible type) for
+// two-operand version).
+// * It must have operator<() defined.
+// Elements in the resulting sequences will also have that type.
+// * Condition start < end must be satisfied in order for resulting sequences
+// to contain any elements.
+//
+template <typename T, typename IncrementT>
+internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
+ return internal::ParamGenerator<T>(
+ new internal::RangeGenerator<T, IncrementT>(start, end, step));
+}
+
+template <typename T>
+internal::ParamGenerator<T> Range(T start, T end) {
+ return Range(start, end, 1);
+}
+
+// ValuesIn() function allows generation of tests with parameters coming from
+// a container.
+//
+// Synopsis:
+// ValuesIn(const T (&array)[N])
+// - returns a generator producing sequences with elements from
+// a C-style array.
+// ValuesIn(const Container& container)
+// - returns a generator producing sequences with elements from
+// an STL-style container.
+// ValuesIn(Iterator begin, Iterator end)
+// - returns a generator producing sequences with elements from
+// a range [begin, end) defined by a pair of STL-style iterators. These
+// iterators can also be plain C pointers.
+//
+// Please note that ValuesIn copies the values from the containers
+// passed in and keeps them to generate tests in RUN_ALL_TESTS().
+//
+// Examples:
+//
+// This instantiates tests from test case StringTest
+// each with C-string values of "foo", "bar", and "baz":
+//
+// const char* strings[] = {"foo", "bar", "baz"};
+// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
+//
+// This instantiates tests from test case StlStringTest
+// each with STL strings with values "a" and "b":
+//
+// ::std::vector< ::std::string> GetParameterStrings() {
+// ::std::vector< ::std::string> v;
+// v.push_back("a");
+// v.push_back("b");
+// return v;
+// }
+//
+// INSTANTIATE_TEST_CASE_P(CharSequence,
+// StlStringTest,
+// ValuesIn(GetParameterStrings()));
+//
+//
+// This will also instantiate tests from CharTest
+// each with parameter values 'a' and 'b':
+//
+// ::std::list<char> GetParameterChars() {
+// ::std::list<char> list;
+// list.push_back('a');
+// list.push_back('b');
+// return list;
+// }
+// ::std::list<char> l = GetParameterChars();
+// INSTANTIATE_TEST_CASE_P(CharSequence2,
+// CharTest,
+// ValuesIn(l.begin(), l.end()));
+//
+template <typename ForwardIterator>
+internal::ParamGenerator<
+ typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end) {
+ typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
+ ::value_type ParamType;
+ return internal::ParamGenerator<ParamType>(
+ new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
+}
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
+ return ValuesIn(array, array + N);
+}
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+ const Container& container) {
+ return ValuesIn(container.begin(), container.end());
+}
+
+// Values() allows generating tests from explicitly specified list of
+// parameters.
+//
+// Synopsis:
+// Values(T v1, T v2, ..., T vN)
+// - returns a generator producing sequences with elements v1, v2, ..., vN.
+//
+// For example, this instantiates tests from test case BarTest each
+// with values "one", "two", and "three":
+//
+// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
+//
+// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
+// The exact type of values will depend on the type of parameter in BazTest.
+//
+// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
+//
+// Currently, Values() supports from 1 to 50 parameters.
+//
+template <typename T1>
+internal::ValueArray1<T1> Values(T1 v1) {
+ return internal::ValueArray1<T1>(v1);
+}
+
+template <typename T1, typename T2>
+internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
+ return internal::ValueArray2<T1, T2>(v1, v2);
+}
+
+template <typename T1, typename T2, typename T3>
+internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
+ return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
+ return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+ T5 v5) {
+ return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6>
+internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
+ T4 v4, T5 v5, T6 v6) {
+ return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7>
+internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
+ T4 v4, T5 v5, T6 v6, T7 v7) {
+ return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
+ v6, v7);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8>
+internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
+ T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
+ return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
+ v5, v6, v7, v8);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9>
+internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
+ T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
+ return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
+ v4, v5, v6, v7, v8, v9);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10>
+internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
+ T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
+ return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
+ v2, v3, v4, v5, v6, v7, v8, v9, v10);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11>
+internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+ T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11) {
+ return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+ T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12>
+internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12) {
+ return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13>
+internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+ T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13) {
+ return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14>
+internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
+ return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+ v14);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15>
+internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+ T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
+ return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+ v13, v14, v15);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16>
+internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16) {
+ return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+ v12, v13, v14, v15, v16);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17>
+internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17) {
+ return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+ v11, v12, v13, v14, v15, v16, v17);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18>
+internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+ T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18) {
+ return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+ v10, v11, v12, v13, v14, v15, v16, v17, v18);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19>
+internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+ T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+ T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
+ return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
+ v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20>
+internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+ T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+ T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
+ return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
+ v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21>
+internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+ T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+ T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
+ return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
+ v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22>
+internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
+ T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+ T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+ T21 v21, T22 v22) {
+ return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
+ v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+ v20, v21, v22);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23>
+internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
+ T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+ T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+ T21 v21, T22 v22, T23 v23) {
+ return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
+ v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+ v20, v21, v22, v23);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24>
+internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
+ T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+ T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+ T21 v21, T22 v22, T23 v23, T24 v24) {
+ return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
+ v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+ v19, v20, v21, v22, v23, v24);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25>
+internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
+ T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+ T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+ T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
+ return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
+ v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+ v18, v19, v20, v21, v22, v23, v24, v25);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26>
+internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26) {
+ return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+ v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27>
+internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+ T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27) {
+ return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+ v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28>
+internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+ T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28) {
+ return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+ v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+ v28);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29>
+internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29) {
+ return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+ v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+ v27, v28, v29);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30>
+internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+ T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+ T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+ T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
+ return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+ v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+ v26, v27, v28, v29, v30);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31>
+internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+ T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
+ return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+ v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+ v25, v26, v27, v28, v29, v30, v31);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32>
+internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+ T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+ T32 v32) {
+ return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+ v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+ v24, v25, v26, v27, v28, v29, v30, v31, v32);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33>
+internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+ T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+ T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+ T32 v32, T33 v33) {
+ return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
+ v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+ v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34>
+internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+ T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+ T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+ T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+ T31 v31, T32 v32, T33 v33, T34 v34) {
+ return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
+ v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+ v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35>
+internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+ T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+ T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+ T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+ T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
+ return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
+ v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+ v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36>
+internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+ T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+ T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+ T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+ T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
+ return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
+ v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+ v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+ v34, v35, v36);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37>
+internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
+ T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+ T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+ T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+ T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+ T37 v37) {
+ return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
+ v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+ v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+ v34, v35, v36, v37);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38>
+internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
+ T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+ T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+ T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+ T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+ T37 v37, T38 v38) {
+ return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
+ v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+ v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
+ v33, v34, v35, v36, v37, v38);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39>
+internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
+ T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+ T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+ T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+ T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+ T37 v37, T38 v38, T39 v39) {
+ return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
+ v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+ v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
+ v32, v33, v34, v35, v36, v37, v38, v39);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40>
+internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
+ T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+ T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+ T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
+ T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
+ T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
+ return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+ v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
+ v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41>
+internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+ T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
+ return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+ v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
+ v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42>
+internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+ T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42) {
+ return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+ v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+ v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
+ v42);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43>
+internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+ T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43) {
+ return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+ v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+ v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
+ v41, v42, v43);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44>
+internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+ T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+ T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+ T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+ T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+ T42 v42, T43 v43, T44 v44) {
+ return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+ v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+ v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
+ v40, v41, v42, v43, v44);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45>
+internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+ T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+ T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+ T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+ T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+ T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
+ return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+ v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+ v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
+ v39, v40, v41, v42, v43, v44, v45);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46>
+internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+ T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+ T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+ T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
+ return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+ v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+ v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+ v38, v39, v40, v41, v42, v43, v44, v45, v46);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47>
+internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+ T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+ T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+ T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+ T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
+ return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
+ v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+ v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+ v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48>
+internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+ T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+ T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+ T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+ T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+ T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
+ T48 v48) {
+ return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
+ v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+ v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
+ v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49>
+internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+ T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+ T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+ T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+ T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
+ T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
+ T47 v47, T48 v48, T49 v49) {
+ return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
+ v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+ v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
+ v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+ typename T6, typename T7, typename T8, typename T9, typename T10,
+ typename T11, typename T12, typename T13, typename T14, typename T15,
+ typename T16, typename T17, typename T18, typename T19, typename T20,
+ typename T21, typename T22, typename T23, typename T24, typename T25,
+ typename T26, typename T27, typename T28, typename T29, typename T30,
+ typename T31, typename T32, typename T33, typename T34, typename T35,
+ typename T36, typename T37, typename T38, typename T39, typename T40,
+ typename T41, typename T42, typename T43, typename T44, typename T45,
+ typename T46, typename T47, typename T48, typename T49, typename T50>
+internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+ T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+ T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+ T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+ T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+ T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+ T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+ T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
+ T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
+ T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
+ return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+ T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+ T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+ T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
+ v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+ v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+ v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
+ v48, v49, v50);
+}
+
+// Bool() allows generating tests with parameters in a set of (false, true).
+//
+// Synopsis:
+// Bool()
+// - returns a generator producing sequences with elements {false, true}.
+//
+// It is useful when testing code that depends on Boolean flags. Combinations
+// of multiple flags can be tested when several Bool()'s are combined using
+// Combine() function.
+//
+// In the following example all tests in the test case FlagDependentTest
+// will be instantiated twice with parameters false and true.
+//
+// class FlagDependentTest : public testing::TestWithParam<bool> {
+// virtual void SetUp() {
+// external_flag = GetParam();
+// }
+// }
+// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
+//
+inline internal::ParamGenerator<bool> Bool() {
+ return Values(false, true);
+}
+
+# if GTEST_HAS_COMBINE
+// Combine() allows the user to combine two or more sequences to produce
+// values of a Cartesian product of those sequences' elements.
+//
+// Synopsis:
+// Combine(gen1, gen2, ..., genN)
+// - returns a generator producing sequences with elements coming from
+// the Cartesian product of elements from the sequences generated by
+// gen1, gen2, ..., genN. The sequence elements will have a type of
+// tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
+// of elements from sequences produces by gen1, gen2, ..., genN.
+//
+// Combine can have up to 10 arguments. This number is currently limited
+// by the maximum number of elements in the tuple implementation used by Google
+// Test.
+//
+// Example:
+//
+// This will instantiate tests in test case AnimalTest each one with
+// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
+// tuple("dog", BLACK), and tuple("dog", WHITE):
+//
+// enum Color { BLACK, GRAY, WHITE };
+// class AnimalTest
+// : public testing::TestWithParam<tuple<const char*, Color> > {...};
+//
+// TEST_P(AnimalTest, AnimalLooksNice) {...}
+//
+// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
+// Combine(Values("cat", "dog"),
+// Values(BLACK, WHITE)));
+//
+// This will instantiate tests in FlagDependentTest with all variations of two
+// Boolean flags:
+//
+// class FlagDependentTest
+// : public testing::TestWithParam<tuple<bool, bool> > {
+// virtual void SetUp() {
+// // Assigns external_flag_1 and external_flag_2 values from the tuple.
+// tie(external_flag_1, external_flag_2) = GetParam();
+// }
+// };
+//
+// TEST_P(FlagDependentTest, TestFeature1) {
+// // Test your code using external_flag_1 and external_flag_2 here.
+// }
+// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
+// Combine(Bool(), Bool()));
+//
+template <typename Generator1, typename Generator2>
+internal::CartesianProductHolder2<Generator1, Generator2> Combine(
+ const Generator1& g1, const Generator2& g2) {
+ return internal::CartesianProductHolder2<Generator1, Generator2>(
+ g1, g2);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3>
+internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3) {
+ return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
+ g1, g2, g3);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4>
+internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+ Generator4> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4) {
+ return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+ Generator4>(
+ g1, g2, g3, g4);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4, typename Generator5>
+internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+ Generator4, Generator5> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4, const Generator5& g5) {
+ return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+ Generator4, Generator5>(
+ g1, g2, g3, g4, g5);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4, typename Generator5, typename Generator6>
+internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4, const Generator5& g5, const Generator6& g6) {
+ return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6>(
+ g1, g2, g3, g4, g5, g6);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4, typename Generator5, typename Generator6,
+ typename Generator7>
+internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4, const Generator5& g5, const Generator6& g6,
+ const Generator7& g7) {
+ return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7>(
+ g1, g2, g3, g4, g5, g6, g7);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4, typename Generator5, typename Generator6,
+ typename Generator7, typename Generator8>
+internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4, const Generator5& g5, const Generator6& g6,
+ const Generator7& g7, const Generator8& g8) {
+ return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7, Generator8>(
+ g1, g2, g3, g4, g5, g6, g7, g8);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4, typename Generator5, typename Generator6,
+ typename Generator7, typename Generator8, typename Generator9>
+internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7, Generator8,
+ Generator9> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4, const Generator5& g5, const Generator6& g6,
+ const Generator7& g7, const Generator8& g8, const Generator9& g9) {
+ return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
+ g1, g2, g3, g4, g5, g6, g7, g8, g9);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+ typename Generator4, typename Generator5, typename Generator6,
+ typename Generator7, typename Generator8, typename Generator9,
+ typename Generator10>
+internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+ Generator10> Combine(
+ const Generator1& g1, const Generator2& g2, const Generator3& g3,
+ const Generator4& g4, const Generator5& g5, const Generator6& g6,
+ const Generator7& g7, const Generator8& g8, const Generator9& g9,
+ const Generator10& g10) {
+ return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+ Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+ Generator10>(
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
+}
+# endif // GTEST_HAS_COMBINE
+
+
+
+# define TEST_P(test_case_name, test_name) \
+ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+ : public test_case_name { \
+ public: \
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
+ virtual void TestBody(); \
+ private: \
+ static int AddToRegistry() { \
+ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+ GetTestCasePatternHolder<test_case_name>(\
+ #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
+ #test_case_name, \
+ #test_name, \
+ new ::testing::internal::TestMetaFactory< \
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
+ return 0; \
+ } \
+ static int gtest_registering_dummy_; \
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
+ }; \
+ int GTEST_TEST_CLASS_NAME_(test_case_name, \
+ test_name)::gtest_registering_dummy_ = \
+ GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
+ void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
+ ::testing::internal::ParamGenerator<test_case_name::ParamType> \
+ gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
+ int gtest_##prefix##test_case_name##_dummy_ = \
+ ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+ GetTestCasePatternHolder<test_case_name>(\
+ #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
+ #prefix, \
+ >est_##prefix##test_case_name##_EvalGenerator_, \
+ __FILE__, __LINE__)
+
+} // namespace testing
+
+#endif // GTEST_HAS_PARAM_TEST
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Google C++ Testing Framework definitions useful in production code.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+
+// When you need to test the private or protected members of a class,
+// use the FRIEND_TEST macro to declare your tests as friends of the
+// class. For example:
+//
+// class MyClass {
+// private:
+// void MyMethod();
+// FRIEND_TEST(MyClassTest, MyMethod);
+// };
+//
+// class MyClassTest : public testing::Test {
+// // ...
+// };
+//
+// TEST_F(MyClassTest, MyMethod) {
+// // Can call MyClass::MyMethod() here.
+// }
+
+#define FRIEND_TEST(test_case_name, test_name)\
+friend class test_case_name##_##test_name##_Test
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+
+#include <iosfwd>
+#include <vector>
+
+namespace testing {
+
+// A copyable object representing the result of a test part (i.e. an
+// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
+//
+// Don't inherit from TestPartResult as its destructor is not virtual.
+class GTEST_API_ TestPartResult {
+ public:
+ // The possible outcomes of a test part (i.e. an assertion or an
+ // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
+ enum Type {
+ kSuccess, // Succeeded.
+ kNonFatalFailure, // Failed but the test can continue.
+ kFatalFailure // Failed and the test should be terminated.
+ };
+
+ // C'tor. TestPartResult does NOT have a default constructor.
+ // Always use this constructor (with parameters) to create a
+ // TestPartResult object.
+ TestPartResult(Type a_type,
+ const char* a_file_name,
+ int a_line_number,
+ const char* a_message)
+ : type_(a_type),
+ file_name_(a_file_name == NULL ? "" : a_file_name),
+ line_number_(a_line_number),
+ summary_(ExtractSummary(a_message)),
+ message_(a_message) {
+ }
+
+ // Gets the outcome of the test part.
+ Type type() const { return type_; }
+
+ // Gets the name of the source file where the test part took place, or
+ // NULL if it's unknown.
+ const char* file_name() const {
+ return file_name_.empty() ? NULL : file_name_.c_str();
+ }
+
+ // Gets the line in the source file where the test part took place,
+ // or -1 if it's unknown.
+ int line_number() const { return line_number_; }
+
+ // Gets the summary of the failure message.
+ const char* summary() const { return summary_.c_str(); }
+
+ // Gets the message associated with the test part.
+ const char* message() const { return message_.c_str(); }
+
+ // Returns true iff the test part passed.
+ bool passed() const { return type_ == kSuccess; }
+
+ // Returns true iff the test part failed.
+ bool failed() const { return type_ != kSuccess; }
+
+ // Returns true iff the test part non-fatally failed.
+ bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
+
+ // Returns true iff the test part fatally failed.
+ bool fatally_failed() const { return type_ == kFatalFailure; }
+
+ private:
+ Type type_;
+
+ // Gets the summary of the failure message by omitting the stack
+ // trace in it.
+ static std::string ExtractSummary(const char* message);
+
+ // The name of the source file where the test part took place, or
+ // "" if the source file is unknown.
+ std::string file_name_;
+ // The line in the source file where the test part took place, or -1
+ // if the line number is unknown.
+ int line_number_;
+ std::string summary_; // The test failure summary.
+ std::string message_; // The test failure message.
+};
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
+
+// An array of TestPartResult objects.
+//
+// Don't inherit from TestPartResultArray as its destructor is not
+// virtual.
+class GTEST_API_ TestPartResultArray {
+ public:
+ TestPartResultArray() {}
+
+ // Appends the given TestPartResult to the array.
+ void Append(const TestPartResult& result);
+
+ // Returns the TestPartResult at the given index (0-based).
+ const TestPartResult& GetTestPartResult(int index) const;
+
+ // Returns the number of TestPartResult objects in the array.
+ int size() const;
+
+ private:
+ std::vector<TestPartResult> array_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
+};
+
+// This interface knows how to report a test part result.
+class TestPartResultReporterInterface {
+ public:
+ virtual ~TestPartResultReporterInterface() {}
+
+ virtual void ReportTestPartResult(const TestPartResult& result) = 0;
+};
+
+namespace internal {
+
+// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
+// statement generates new fatal failures. To do so it registers itself as the
+// current test part result reporter. Besides checking if fatal failures were
+// reported, it only delegates the reporting to the former result reporter.
+// The original result reporter is restored in the destructor.
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+class GTEST_API_ HasNewFatalFailureHelper
+ : public TestPartResultReporterInterface {
+ public:
+ HasNewFatalFailureHelper();
+ virtual ~HasNewFatalFailureHelper();
+ virtual void ReportTestPartResult(const TestPartResult& result);
+ bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
+ private:
+ bool has_new_fatal_failure_;
+ TestPartResultReporterInterface* original_reporter_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
+};
+
+} // namespace internal
+
+} // namespace testing
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// This header implements typed tests and type-parameterized tests.
+
+// Typed (aka type-driven) tests repeat the same test for types in a
+// list. You must know which types you want to test with when writing
+// typed tests. Here's how you do it:
+
+#if 0
+
+// First, define a fixture class template. It should be parameterized
+// by a type. Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+ public:
+ ...
+ typedef std::list<T> List;
+ static T shared_;
+ T value_;
+};
+
+// Next, associate a list of types with the test case, which will be
+// repeated for each type in the list. The typedef is necessary for
+// the macro to parse correctly.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+TYPED_TEST_CASE(FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+// TYPED_TEST_CASE(FooTest, int);
+
+// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
+// tests for this test case as you want.
+TYPED_TEST(FooTest, DoesBlah) {
+ // Inside a test, refer to TypeParam to get the type parameter.
+ // Since we are inside a derived class template, C++ requires use to
+ // visit the members of FooTest via 'this'.
+ TypeParam n = this->value_;
+
+ // To visit static members of the fixture, add the TestFixture::
+ // prefix.
+ n += TestFixture::shared_;
+
+ // To refer to typedefs in the fixture, add the "typename
+ // TestFixture::" prefix.
+ typename TestFixture::List values;
+ values.push_back(n);
+ ...
+}
+
+TYPED_TEST(FooTest, HasPropertyA) { ... }
+
+#endif // 0
+
+// Type-parameterized tests are abstract test patterns parameterized
+// by a type. Compared with typed tests, type-parameterized tests
+// allow you to define the test pattern without knowing what the type
+// parameters are. The defined pattern can be instantiated with
+// different types any number of times, in any number of translation
+// units.
+//
+// If you are designing an interface or concept, you can define a
+// suite of type-parameterized tests to verify properties that any
+// valid implementation of the interface/concept should have. Then,
+// each implementation can easily instantiate the test suite to verify
+// that it conforms to the requirements, without having to write
+// similar tests repeatedly. Here's an example:
+
+#if 0
+
+// First, define a fixture class template. It should be parameterized
+// by a type. Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+ ...
+};
+
+// Next, declare that you will define a type-parameterized test case
+// (the _P suffix is for "parameterized" or "pattern", whichever you
+// prefer):
+TYPED_TEST_CASE_P(FooTest);
+
+// Then, use TYPED_TEST_P() to define as many type-parameterized tests
+// for this type-parameterized test case as you want.
+TYPED_TEST_P(FooTest, DoesBlah) {
+ // Inside a test, refer to TypeParam to get the type parameter.
+ TypeParam n = 0;
+ ...
+}
+
+TYPED_TEST_P(FooTest, HasPropertyA) { ... }
+
+// Now the tricky part: you need to register all test patterns before
+// you can instantiate them. The first argument of the macro is the
+// test case name; the rest are the names of the tests in this test
+// case.
+REGISTER_TYPED_TEST_CASE_P(FooTest,
+ DoesBlah, HasPropertyA);
+
+// Finally, you are free to instantiate the pattern with the types you
+// want. If you put the above code in a header file, you can #include
+// it in multiple C++ source files and instantiate it multiple times.
+//
+// To distinguish different instances of the pattern, the first
+// argument to the INSTANTIATE_* macro is a prefix that will be added
+// to the actual test case name. Remember to pick unique prefixes for
+// different instances.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+// INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
+
+#endif // 0
+
+
+// Implements typed tests.
+
+#if GTEST_HAS_TYPED_TEST
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the typedef for the type parameters of the
+// given test case.
+# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define TYPED_TEST_CASE(CaseName, Types) \
+ typedef ::testing::internal::TypeList< Types >::type \
+ GTEST_TYPE_PARAMS_(CaseName)
+
+# define TYPED_TEST(CaseName, TestName) \
+ template <typename gtest_TypeParam_> \
+ class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
+ : public CaseName<gtest_TypeParam_> { \
+ private: \
+ typedef CaseName<gtest_TypeParam_> TestFixture; \
+ typedef gtest_TypeParam_ TypeParam; \
+ virtual void TestBody(); \
+ }; \
+ bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
+ ::testing::internal::TypeParameterizedTest< \
+ CaseName, \
+ ::testing::internal::TemplateSel< \
+ GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
+ GTEST_TYPE_PARAMS_(CaseName)>::Register(\
+ "", #CaseName, #TestName, 0); \
+ template <typename gtest_TypeParam_> \
+ void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
+
+#endif // GTEST_HAS_TYPED_TEST
+
+// Implements type-parameterized tests.
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the namespace name that the type-parameterized tests for
+// the given type-parameterized test case are defined in. The exact
+// name of the namespace is subject to change without notice.
+# define GTEST_CASE_NAMESPACE_(TestCaseName) \
+ gtest_case_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the variable used to remember the names of
+// the defined tests in the given test case.
+# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
+ gtest_typed_test_case_p_state_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
+//
+// Expands to the name of the variable used to remember the names of
+// the registered tests in the given test case.
+# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
+ gtest_registered_test_names_##TestCaseName##_
+
+// The variables defined in the type-parameterized test macros are
+// static as typically these macros are used in a .h file that can be
+// #included in multiple translation units linked together.
+# define TYPED_TEST_CASE_P(CaseName) \
+ static ::testing::internal::TypedTestCasePState \
+ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
+
+# define TYPED_TEST_P(CaseName, TestName) \
+ namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+ template <typename gtest_TypeParam_> \
+ class TestName : public CaseName<gtest_TypeParam_> { \
+ private: \
+ typedef CaseName<gtest_TypeParam_> TestFixture; \
+ typedef gtest_TypeParam_ TypeParam; \
+ virtual void TestBody(); \
+ }; \
+ static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
+ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
+ __FILE__, __LINE__, #CaseName, #TestName); \
+ } \
+ template <typename gtest_TypeParam_> \
+ void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
+
+# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
+ namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+ typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
+ } \
+ static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
+ GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
+ __FILE__, __LINE__, #__VA_ARGS__)
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
+ bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
+ ::testing::internal::TypeParameterizedTestCase<CaseName, \
+ GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
+ ::testing::internal::TypeList< Types >::type>::Register(\
+ #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
+
+#endif // GTEST_HAS_TYPED_TEST_P
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// Depending on the platform, different string classes are available.
+// On Linux, in addition to ::std::string, Google also makes use of
+// class ::string, which has the same interface as ::std::string, but
+// has a different implementation.
+//
+// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
+// ::string is available AND is a distinct type to ::std::string, or
+// define it to 0 to indicate otherwise.
+//
+// If the user's ::std::string and ::string are the same class due to
+// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
+//
+// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
+// heuristically.
+
+namespace testing {
+
+// Declares the flags.
+
+// This flag temporary enables the disabled tests.
+GTEST_DECLARE_bool_(also_run_disabled_tests);
+
+// This flag brings the debugger on an assertion failure.
+GTEST_DECLARE_bool_(break_on_failure);
+
+// This flag controls whether Google Test catches all test-thrown exceptions
+// and logs them as failures.
+GTEST_DECLARE_bool_(catch_exceptions);
+
+// This flag enables using colors in terminal output. Available values are
+// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
+// to let Google Test decide.
+GTEST_DECLARE_string_(color);
+
+// This flag sets up the filter to select by name using a glob pattern
+// the tests to run. If the filter is not given all tests are executed.
+GTEST_DECLARE_string_(filter);
+
+// This flag causes the Google Test to list tests. None of the tests listed
+// are actually run if the flag is provided.
+GTEST_DECLARE_bool_(list_tests);
+
+// This flag controls whether Google Test emits a detailed XML report to a file
+// in addition to its normal textual output.
+GTEST_DECLARE_string_(output);
+
+// This flags control whether Google Test prints the elapsed time for each
+// test.
+GTEST_DECLARE_bool_(print_time);
+
+// This flag specifies the random number seed.
+GTEST_DECLARE_int32_(random_seed);
+
+// This flag sets how many times the tests are repeated. The default value
+// is 1. If the value is -1 the tests are repeating forever.
+GTEST_DECLARE_int32_(repeat);
+
+// This flag controls whether Google Test includes Google Test internal
+// stack frames in failure stack traces.
+GTEST_DECLARE_bool_(show_internal_stack_frames);
+
+// When this flag is specified, tests' order is randomized on every iteration.
+GTEST_DECLARE_bool_(shuffle);
+
+// This flag specifies the maximum number of stack frames to be
+// printed in a failure message.
+GTEST_DECLARE_int32_(stack_trace_depth);
+
+// When this flag is specified, a failed assertion will throw an
+// exception if exceptions are enabled, or exit the program with a
+// non-zero code otherwise.
+GTEST_DECLARE_bool_(throw_on_failure);
+
+// When this flag is set with a "host:port" string, on supported
+// platforms test results are streamed to the specified port on
+// the specified host machine.
+GTEST_DECLARE_string_(stream_result_to);
+
+// The upper limit for valid stack trace depths.
+const int kMaxStackTraceDepth = 100;
+
+namespace internal {
+
+class AssertHelper;
+class DefaultGlobalTestPartResultReporter;
+class ExecDeathTest;
+class NoExecDeathTest;
+class FinalSuccessChecker;
+class GTestFlagSaver;
+class StreamingListenerTest;
+class TestResultAccessor;
+class TestEventListenersAccessor;
+class TestEventRepeater;
+class UnitTestRecordPropertyTestHelper;
+class WindowsDeathTest;
+class UnitTestImpl* GetUnitTestImpl();
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+ const std::string& message);
+
+} // namespace internal
+
+// The friend relationship of some of these classes is cyclic.
+// If we don't forward declare them the compiler might confuse the classes
+// in friendship clauses with same named classes on the scope.
+class Test;
+class TestCase;
+class TestInfo;
+class UnitTest;
+
+// A class for indicating whether an assertion was successful. When
+// the assertion wasn't successful, the AssertionResult object
+// remembers a non-empty message that describes how it failed.
+//
+// To create an instance of this class, use one of the factory functions
+// (AssertionSuccess() and AssertionFailure()).
+//
+// This class is useful for two purposes:
+// 1. Defining predicate functions to be used with Boolean test assertions
+// EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
+// 2. Defining predicate-format functions to be
+// used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
+//
+// For example, if you define IsEven predicate:
+//
+// testing::AssertionResult IsEven(int n) {
+// if ((n % 2) == 0)
+// return testing::AssertionSuccess();
+// else
+// return testing::AssertionFailure() << n << " is odd";
+// }
+//
+// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
+// will print the message
+//
+// Value of: IsEven(Fib(5))
+// Actual: false (5 is odd)
+// Expected: true
+//
+// instead of a more opaque
+//
+// Value of: IsEven(Fib(5))
+// Actual: false
+// Expected: true
+//
+// in case IsEven is a simple Boolean predicate.
+//
+// If you expect your predicate to be reused and want to support informative
+// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
+// about half as often as positive ones in our tests), supply messages for
+// both success and failure cases:
+//
+// testing::AssertionResult IsEven(int n) {
+// if ((n % 2) == 0)
+// return testing::AssertionSuccess() << n << " is even";
+// else
+// return testing::AssertionFailure() << n << " is odd";
+// }
+//
+// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
+//
+// Value of: IsEven(Fib(6))
+// Actual: true (8 is even)
+// Expected: false
+//
+// NB: Predicates that support negative Boolean assertions have reduced
+// performance in positive ones so be careful not to use them in tests
+// that have lots (tens of thousands) of positive Boolean assertions.
+//
+// To use this class with EXPECT_PRED_FORMAT assertions such as:
+//
+// // Verifies that Foo() returns an even number.
+// EXPECT_PRED_FORMAT1(IsEven, Foo());
+//
+// you need to define:
+//
+// testing::AssertionResult IsEven(const char* expr, int n) {
+// if ((n % 2) == 0)
+// return testing::AssertionSuccess();
+// else
+// return testing::AssertionFailure()
+// << "Expected: " << expr << " is even\n Actual: it's " << n;
+// }
+//
+// If Foo() returns 5, you will see the following message:
+//
+// Expected: Foo() is even
+// Actual: it's 5
+//
+class GTEST_API_ AssertionResult {
+ public:
+ // Copy constructor.
+ // Used in EXPECT_TRUE/FALSE(assertion_result).
+ AssertionResult(const AssertionResult& other);
+ // Used in the EXPECT_TRUE/FALSE(bool_expression).
+ explicit AssertionResult(bool success) : success_(success) {}
+
+ // Returns true iff the assertion succeeded.
+ operator bool() const { return success_; } // NOLINT
+
+ // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+ AssertionResult operator!() const;
+
+ // Returns the text streamed into this AssertionResult. Test assertions
+ // use it when they fail (i.e., the predicate's outcome doesn't match the
+ // assertion's expectation). When nothing has been streamed into the
+ // object, returns an empty string.
+ const char* message() const {
+ return message_.get() != NULL ? message_->c_str() : "";
+ }
+ // TODO(vladl at google.com): Remove this after making sure no clients use it.
+ // Deprecated; please use message() instead.
+ const char* failure_message() const { return message(); }
+
+ // Streams a custom failure message into this object.
+ template <typename T> AssertionResult& operator<<(const T& value) {
+ AppendMessage(Message() << value);
+ return *this;
+ }
+
+ // Allows streaming basic output manipulators such as endl or flush into
+ // this object.
+ AssertionResult& operator<<(
+ ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
+ AppendMessage(Message() << basic_manipulator);
+ return *this;
+ }
+
+ private:
+ // Appends the contents of message to message_.
+ void AppendMessage(const Message& a_message) {
+ if (message_.get() == NULL)
+ message_.reset(new ::std::string);
+ message_->append(a_message.GetString().c_str());
+ }
+
+ // Stores result of the assertion predicate.
+ bool success_;
+ // Stores the message describing the condition in case the expectation
+ // construct is not satisfied with the predicate's outcome.
+ // Referenced via a pointer to avoid taking too much stack frame space
+ // with test assertions.
+ internal::scoped_ptr< ::std::string> message_;
+
+ GTEST_DISALLOW_ASSIGN_(AssertionResult);
+};
+
+// Makes a successful assertion result.
+GTEST_API_ AssertionResult AssertionSuccess();
+
+// Makes a failed assertion result.
+GTEST_API_ AssertionResult AssertionFailure();
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << msg.
+GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
+
+// The abstract class that all tests inherit from.
+//
+// In Google Test, a unit test program contains one or many TestCases, and
+// each TestCase contains one or many Tests.
+//
+// When you define a test using the TEST macro, you don't need to
+// explicitly derive from Test - the TEST macro automatically does
+// this for you.
+//
+// The only time you derive from Test is when defining a test fixture
+// to be used a TEST_F. For example:
+//
+// class FooTest : public testing::Test {
+// protected:
+// virtual void SetUp() { ... }
+// virtual void TearDown() { ... }
+// ...
+// };
+//
+// TEST_F(FooTest, Bar) { ... }
+// TEST_F(FooTest, Baz) { ... }
+//
+// Test is not copyable.
+class GTEST_API_ Test {
+ public:
+ friend class TestInfo;
+
+ // Defines types for pointers to functions that set up and tear down
+ // a test case.
+ typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
+ typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
+
+ // The d'tor is virtual as we intend to inherit from Test.
+ virtual ~Test();
+
+ // Sets up the stuff shared by all tests in this test case.
+ //
+ // Google Test will call Foo::SetUpTestCase() before running the first
+ // test in test case Foo. Hence a sub-class can define its own
+ // SetUpTestCase() method to shadow the one defined in the super
+ // class.
+ static void SetUpTestCase() {}
+
+ // Tears down the stuff shared by all tests in this test case.
+ //
+ // Google Test will call Foo::TearDownTestCase() after running the last
+ // test in test case Foo. Hence a sub-class can define its own
+ // TearDownTestCase() method to shadow the one defined in the super
+ // class.
+ static void TearDownTestCase() {}
+
+ // Returns true iff the current test has a fatal failure.
+ static bool HasFatalFailure();
+
+ // Returns true iff the current test has a non-fatal failure.
+ static bool HasNonfatalFailure();
+
+ // Returns true iff the current test has a (either fatal or
+ // non-fatal) failure.
+ static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
+
+ // Logs a property for the current test, test case, or for the entire
+ // invocation of the test program when used outside of the context of a
+ // test case. Only the last value for a given key is remembered. These
+ // are public static so they can be called from utility functions that are
+ // not members of the test fixture. Calls to RecordProperty made during
+ // lifespan of the test (from the moment its constructor starts to the
+ // moment its destructor finishes) will be output in XML as attributes of
+ // the <testcase> element. Properties recorded from fixture's
+ // SetUpTestCase or TearDownTestCase are logged as attributes of the
+ // corresponding <testsuite> element. Calls to RecordProperty made in the
+ // global context (before or after invocation of RUN_ALL_TESTS and from
+ // SetUp/TearDown method of Environment objects registered with Google
+ // Test) will be output as attributes of the <testsuites> element.
+ static void RecordProperty(const std::string& key, const std::string& value);
+ static void RecordProperty(const std::string& key, int value);
+
+ protected:
+ // Creates a Test object.
+ Test();
+
+ // Sets up the test fixture.
+ virtual void SetUp();
+
+ // Tears down the test fixture.
+ virtual void TearDown();
+
+ private:
+ // Returns true iff the current test has the same fixture class as
+ // the first test in the current test case.
+ static bool HasSameFixtureClass();
+
+ // Runs the test after the test fixture has been set up.
+ //
+ // A sub-class must implement this to define the test logic.
+ //
+ // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
+ // Instead, use the TEST or TEST_F macro.
+ virtual void TestBody() = 0;
+
+ // Sets up, executes, and tears down the test.
+ void Run();
+
+ // Deletes self. We deliberately pick an unusual name for this
+ // internal method to avoid clashing with names used in user TESTs.
+ void DeleteSelf_() { delete this; }
+
+ // Uses a GTestFlagSaver to save and restore all Google Test flags.
+ const internal::GTestFlagSaver* const gtest_flag_saver_;
+
+ // Often a user mis-spells SetUp() as Setup() and spends a long time
+ // wondering why it is never called by Google Test. The declaration of
+ // the following method is solely for catching such an error at
+ // compile time:
+ //
+ // - The return type is deliberately chosen to be not void, so it
+ // will be a conflict if a user declares void Setup() in his test
+ // fixture.
+ //
+ // - This method is private, so it will be another compiler error
+ // if a user calls it from his test fixture.
+ //
+ // DO NOT OVERRIDE THIS FUNCTION.
+ //
+ // If you see an error about overriding the following function or
+ // about it being private, you have mis-spelled SetUp() as Setup().
+ struct Setup_should_be_spelled_SetUp {};
+ virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+
+ // We disallow copying Tests.
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
+};
+
+typedef internal::TimeInMillis TimeInMillis;
+
+// A copyable object representing a user specified test property which can be
+// output as a key/value string pair.
+//
+// Don't inherit from TestProperty as its destructor is not virtual.
+class TestProperty {
+ public:
+ // C'tor. TestProperty does NOT have a default constructor.
+ // Always use this constructor (with parameters) to create a
+ // TestProperty object.
+ TestProperty(const std::string& a_key, const std::string& a_value) :
+ key_(a_key), value_(a_value) {
+ }
+
+ // Gets the user supplied key.
+ const char* key() const {
+ return key_.c_str();
+ }
+
+ // Gets the user supplied value.
+ const char* value() const {
+ return value_.c_str();
+ }
+
+ // Sets a new value, overriding the one supplied in the constructor.
+ void SetValue(const std::string& new_value) {
+ value_ = new_value;
+ }
+
+ private:
+ // The key supplied by the user.
+ std::string key_;
+ // The value supplied by the user.
+ std::string value_;
+};
+
+// The result of a single Test. This includes a list of
+// TestPartResults, a list of TestProperties, a count of how many
+// death tests there are in the Test, and how much time it took to run
+// the Test.
+//
+// TestResult is not copyable.
+class GTEST_API_ TestResult {
+ public:
+ // Creates an empty TestResult.
+ TestResult();
+
+ // D'tor. Do not inherit from TestResult.
+ ~TestResult();
+
+ // Gets the number of all test parts. This is the sum of the number
+ // of successful test parts and the number of failed test parts.
+ int total_part_count() const;
+
+ // Returns the number of the test properties.
+ int test_property_count() const;
+
+ // Returns true iff the test passed (i.e. no test part failed).
+ bool Passed() const { return !Failed(); }
+
+ // Returns true iff the test failed.
+ bool Failed() const;
+
+ // Returns true iff the test fatally failed.
+ bool HasFatalFailure() const;
+
+ // Returns true iff the test has a non-fatal failure.
+ bool HasNonfatalFailure() const;
+
+ // Returns the elapsed time, in milliseconds.
+ TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+ // Returns the i-th test part result among all the results. i can range
+ // from 0 to test_property_count() - 1. If i is not in that range, aborts
+ // the program.
+ const TestPartResult& GetTestPartResult(int i) const;
+
+ // Returns the i-th test property. i can range from 0 to
+ // test_property_count() - 1. If i is not in that range, aborts the
+ // program.
+ const TestProperty& GetTestProperty(int i) const;
+
+ private:
+ friend class TestInfo;
+ friend class TestCase;
+ friend class UnitTest;
+ friend class internal::DefaultGlobalTestPartResultReporter;
+ friend class internal::ExecDeathTest;
+ friend class internal::TestResultAccessor;
+ friend class internal::UnitTestImpl;
+ friend class internal::WindowsDeathTest;
+
+ // Gets the vector of TestPartResults.
+ const std::vector<TestPartResult>& test_part_results() const {
+ return test_part_results_;
+ }
+
+ // Gets the vector of TestProperties.
+ const std::vector<TestProperty>& test_properties() const {
+ return test_properties_;
+ }
+
+ // Sets the elapsed time.
+ void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
+
+ // Adds a test property to the list. The property is validated and may add
+ // a non-fatal failure if invalid (e.g., if it conflicts with reserved
+ // key names). If a property is already recorded for the same key, the
+ // value will be updated, rather than storing multiple values for the same
+ // key. xml_element specifies the element for which the property is being
+ // recorded and is used for validation.
+ void RecordProperty(const std::string& xml_element,
+ const TestProperty& test_property);
+
+ // Adds a failure if the key is a reserved attribute of Google Test
+ // testcase tags. Returns true if the property is valid.
+ // TODO(russr): Validate attribute names are legal and human readable.
+ static bool ValidateTestProperty(const std::string& xml_element,
+ const TestProperty& test_property);
+
+ // Adds a test part result to the list.
+ void AddTestPartResult(const TestPartResult& test_part_result);
+
+ // Returns the death test count.
+ int death_test_count() const { return death_test_count_; }
+
+ // Increments the death test count, returning the new count.
+ int increment_death_test_count() { return ++death_test_count_; }
+
+ // Clears the test part results.
+ void ClearTestPartResults();
+
+ // Clears the object.
+ void Clear();
+
+ // Protects mutable state of the property vector and of owned
+ // properties, whose values may be updated.
+ internal::Mutex test_properites_mutex_;
+
+ // The vector of TestPartResults
+ std::vector<TestPartResult> test_part_results_;
+ // The vector of TestProperties
+ std::vector<TestProperty> test_properties_;
+ // Running count of death tests.
+ int death_test_count_;
+ // The elapsed time, in milliseconds.
+ TimeInMillis elapsed_time_;
+
+ // We disallow copying TestResult.
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
+}; // class TestResult
+
+// A TestInfo object stores the following information about a test:
+//
+// Test case name
+// Test name
+// Whether the test should be run
+// A function pointer that creates the test object when invoked
+// Test result
+//
+// The constructor of TestInfo registers itself with the UnitTest
+// singleton such that the RUN_ALL_TESTS() macro knows which tests to
+// run.
+class GTEST_API_ TestInfo {
+ public:
+ // Destructs a TestInfo object. This function is not virtual, so
+ // don't inherit from TestInfo.
+ ~TestInfo();
+
+ // Returns the test case name.
+ const char* test_case_name() const { return test_case_name_.c_str(); }
+
+ // Returns the test name.
+ const char* name() const { return name_.c_str(); }
+
+ // Returns the name of the parameter type, or NULL if this is not a typed
+ // or a type-parameterized test.
+ const char* type_param() const {
+ if (type_param_.get() != NULL)
+ return type_param_->c_str();
+ return NULL;
+ }
+
+ // Returns the text representation of the value parameter, or NULL if this
+ // is not a value-parameterized test.
+ const char* value_param() const {
+ if (value_param_.get() != NULL)
+ return value_param_->c_str();
+ return NULL;
+ }
+
+ // Returns true if this test should run, that is if the test is not
+ // disabled (or it is disabled but the also_run_disabled_tests flag has
+ // been specified) and its full name matches the user-specified filter.
+ //
+ // Google Test allows the user to filter the tests by their full names.
+ // The full name of a test Bar in test case Foo is defined as
+ // "Foo.Bar". Only the tests that match the filter will run.
+ //
+ // A filter is a colon-separated list of glob (not regex) patterns,
+ // optionally followed by a '-' and a colon-separated list of
+ // negative patterns (tests to exclude). A test is run if it
+ // matches one of the positive patterns and does not match any of
+ // the negative patterns.
+ //
+ // For example, *A*:Foo.* is a filter that matches any string that
+ // contains the character 'A' or starts with "Foo.".
+ bool should_run() const { return should_run_; }
+
+ // Returns true iff this test will appear in the XML report.
+ bool is_reportable() const {
+ // For now, the XML report includes all tests matching the filter.
+ // In the future, we may trim tests that are excluded because of
+ // sharding.
+ return matches_filter_;
+ }
+
+ // Returns the result of the test.
+ const TestResult* result() const { return &result_; }
+
+ private:
+#if GTEST_HAS_DEATH_TEST
+ friend class internal::DefaultDeathTestFactory;
+#endif // GTEST_HAS_DEATH_TEST
+ friend class Test;
+ friend class TestCase;
+ friend class internal::UnitTestImpl;
+ friend class internal::StreamingListenerTest;
+ friend TestInfo* internal::MakeAndRegisterTestInfo(
+ const char* test_case_name,
+ const char* name,
+ const char* type_param,
+ const char* value_param,
+ internal::TypeId fixture_class_id,
+ Test::SetUpTestCaseFunc set_up_tc,
+ Test::TearDownTestCaseFunc tear_down_tc,
+ internal::TestFactoryBase* factory);
+
+ // Constructs a TestInfo object. The newly constructed instance assumes
+ // ownership of the factory object.
+ TestInfo(const std::string& test_case_name,
+ const std::string& name,
+ const char* a_type_param, // NULL if not a type-parameterized test
+ const char* a_value_param, // NULL if not a value-parameterized test
+ internal::TypeId fixture_class_id,
+ internal::TestFactoryBase* factory);
+
+ // Increments the number of death tests encountered in this test so
+ // far.
+ int increment_death_test_count() {
+ return result_.increment_death_test_count();
+ }
+
+ // Creates the test object, runs it, records its result, and then
+ // deletes it.
+ void Run();
+
+ static void ClearTestResult(TestInfo* test_info) {
+ test_info->result_.Clear();
+ }
+
+ // These fields are immutable properties of the test.
+ const std::string test_case_name_; // Test case name
+ const std::string name_; // Test name
+ // Name of the parameter type, or NULL if this is not a typed or a
+ // type-parameterized test.
+ const internal::scoped_ptr<const ::std::string> type_param_;
+ // Text representation of the value parameter, or NULL if this is not a
+ // value-parameterized test.
+ const internal::scoped_ptr<const ::std::string> value_param_;
+ const internal::TypeId fixture_class_id_; // ID of the test fixture class
+ bool should_run_; // True iff this test should run
+ bool is_disabled_; // True iff this test is disabled
+ bool matches_filter_; // True if this test matches the
+ // user-specified filter.
+ internal::TestFactoryBase* const factory_; // The factory that creates
+ // the test object
+
+ // This field is mutable and needs to be reset before running the
+ // test for the second time.
+ TestResult result_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
+};
+
+// A test case, which consists of a vector of TestInfos.
+//
+// TestCase is not copyable.
+class GTEST_API_ TestCase {
+ public:
+ // Creates a TestCase with the given name.
+ //
+ // TestCase does NOT have a default constructor. Always use this
+ // constructor to create a TestCase object.
+ //
+ // Arguments:
+ //
+ // name: name of the test case
+ // a_type_param: the name of the test's type parameter, or NULL if
+ // this is not a type-parameterized test.
+ // set_up_tc: pointer to the function that sets up the test case
+ // tear_down_tc: pointer to the function that tears down the test case
+ TestCase(const char* name, const char* a_type_param,
+ Test::SetUpTestCaseFunc set_up_tc,
+ Test::TearDownTestCaseFunc tear_down_tc);
+
+ // Destructor of TestCase.
+ virtual ~TestCase();
+
+ // Gets the name of the TestCase.
+ const char* name() const { return name_.c_str(); }
+
+ // Returns the name of the parameter type, or NULL if this is not a
+ // type-parameterized test case.
+ const char* type_param() const {
+ if (type_param_.get() != NULL)
+ return type_param_->c_str();
+ return NULL;
+ }
+
+ // Returns true if any test in this test case should run.
+ bool should_run() const { return should_run_; }
+
+ // Gets the number of successful tests in this test case.
+ int successful_test_count() const;
+
+ // Gets the number of failed tests in this test case.
+ int failed_test_count() const;
+
+ // Gets the number of disabled tests that will be reported in the XML report.
+ int reportable_disabled_test_count() const;
+
+ // Gets the number of disabled tests in this test case.
+ int disabled_test_count() const;
+
+ // Gets the number of tests to be printed in the XML report.
+ int reportable_test_count() const;
+
+ // Get the number of tests in this test case that should run.
+ int test_to_run_count() const;
+
+ // Gets the number of all tests in this test case.
+ int total_test_count() const;
+
+ // Returns true iff the test case passed.
+ bool Passed() const { return !Failed(); }
+
+ // Returns true iff the test case failed.
+ bool Failed() const { return failed_test_count() > 0; }
+
+ // Returns the elapsed time, in milliseconds.
+ TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+ // Returns the i-th test among all the tests. i can range from 0 to
+ // total_test_count() - 1. If i is not in that range, returns NULL.
+ const TestInfo* GetTestInfo(int i) const;
+
+ // Returns the TestResult that holds test properties recorded during
+ // execution of SetUpTestCase and TearDownTestCase.
+ const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
+
+ private:
+ friend class Test;
+ friend class internal::UnitTestImpl;
+
+ // Gets the (mutable) vector of TestInfos in this TestCase.
+ std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
+
+ // Gets the (immutable) vector of TestInfos in this TestCase.
+ const std::vector<TestInfo*>& test_info_list() const {
+ return test_info_list_;
+ }
+
+ // Returns the i-th test among all the tests. i can range from 0 to
+ // total_test_count() - 1. If i is not in that range, returns NULL.
+ TestInfo* GetMutableTestInfo(int i);
+
+ // Sets the should_run member.
+ void set_should_run(bool should) { should_run_ = should; }
+
+ // Adds a TestInfo to this test case. Will delete the TestInfo upon
+ // destruction of the TestCase object.
+ void AddTestInfo(TestInfo * test_info);
+
+ // Clears the results of all tests in this test case.
+ void ClearResult();
+
+ // Clears the results of all tests in the given test case.
+ static void ClearTestCaseResult(TestCase* test_case) {
+ test_case->ClearResult();
+ }
+
+ // Runs every test in this TestCase.
+ void Run();
+
+ // Runs SetUpTestCase() for this TestCase. This wrapper is needed
+ // for catching exceptions thrown from SetUpTestCase().
+ void RunSetUpTestCase() { (*set_up_tc_)(); }
+
+ // Runs TearDownTestCase() for this TestCase. This wrapper is
+ // needed for catching exceptions thrown from TearDownTestCase().
+ void RunTearDownTestCase() { (*tear_down_tc_)(); }
+
+ // Returns true iff test passed.
+ static bool TestPassed(const TestInfo* test_info) {
+ return test_info->should_run() && test_info->result()->Passed();
+ }
+
+ // Returns true iff test failed.
+ static bool TestFailed(const TestInfo* test_info) {
+ return test_info->should_run() && test_info->result()->Failed();
+ }
+
+ // Returns true iff the test is disabled and will be reported in the XML
+ // report.
+ static bool TestReportableDisabled(const TestInfo* test_info) {
+ return test_info->is_reportable() && test_info->is_disabled_;
+ }
+
+ // Returns true iff test is disabled.
+ static bool TestDisabled(const TestInfo* test_info) {
+ return test_info->is_disabled_;
+ }
+
+ // Returns true iff this test will appear in the XML report.
+ static bool TestReportable(const TestInfo* test_info) {
+ return test_info->is_reportable();
+ }
+
+ // Returns true if the given test should run.
+ static bool ShouldRunTest(const TestInfo* test_info) {
+ return test_info->should_run();
+ }
+
+ // Shuffles the tests in this test case.
+ void ShuffleTests(internal::Random* random);
+
+ // Restores the test order to before the first shuffle.
+ void UnshuffleTests();
+
+ // Name of the test case.
+ std::string name_;
+ // Name of the parameter type, or NULL if this is not a typed or a
+ // type-parameterized test.
+ const internal::scoped_ptr<const ::std::string> type_param_;
+ // The vector of TestInfos in their original order. It owns the
+ // elements in the vector.
+ std::vector<TestInfo*> test_info_list_;
+ // Provides a level of indirection for the test list to allow easy
+ // shuffling and restoring the test order. The i-th element in this
+ // vector is the index of the i-th test in the shuffled test list.
+ std::vector<int> test_indices_;
+ // Pointer to the function that sets up the test case.
+ Test::SetUpTestCaseFunc set_up_tc_;
+ // Pointer to the function that tears down the test case.
+ Test::TearDownTestCaseFunc tear_down_tc_;
+ // True iff any test in this test case should run.
+ bool should_run_;
+ // Elapsed time, in milliseconds.
+ TimeInMillis elapsed_time_;
+ // Holds test properties recorded during execution of SetUpTestCase and
+ // TearDownTestCase.
+ TestResult ad_hoc_test_result_;
+
+ // We disallow copying TestCases.
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
+};
+
+// An Environment object is capable of setting up and tearing down an
+// environment. The user should subclass this to define his own
+// environment(s).
+//
+// An Environment object does the set-up and tear-down in virtual
+// methods SetUp() and TearDown() instead of the constructor and the
+// destructor, as:
+//
+// 1. You cannot safely throw from a destructor. This is a problem
+// as in some cases Google Test is used where exceptions are enabled, and
+// we may want to implement ASSERT_* using exceptions where they are
+// available.
+// 2. You cannot use ASSERT_* directly in a constructor or
+// destructor.
+class Environment {
+ public:
+ // The d'tor is virtual as we need to subclass Environment.
+ virtual ~Environment() {}
+
+ // Override this to define how to set up the environment.
+ virtual void SetUp() {}
+
+ // Override this to define how to tear down the environment.
+ virtual void TearDown() {}
+ private:
+ // If you see an error about overriding the following function or
+ // about it being private, you have mis-spelled SetUp() as Setup().
+ struct Setup_should_be_spelled_SetUp {};
+ virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+};
+
+// The interface for tracing execution of tests. The methods are organized in
+// the order the corresponding events are fired.
+class TestEventListener {
+ public:
+ virtual ~TestEventListener() {}
+
+ // Fired before any test activity starts.
+ virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
+
+ // Fired before each iteration of tests starts. There may be more than
+ // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
+ // index, starting from 0.
+ virtual void OnTestIterationStart(const UnitTest& unit_test,
+ int iteration) = 0;
+
+ // Fired before environment set-up for each iteration of tests starts.
+ virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
+
+ // Fired after environment set-up for each iteration of tests ends.
+ virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
+
+ // Fired before the test case starts.
+ virtual void OnTestCaseStart(const TestCase& test_case) = 0;
+
+ // Fired before the test starts.
+ virtual void OnTestStart(const TestInfo& test_info) = 0;
+
+ // Fired after a failed assertion or a SUCCEED() invocation.
+ virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
+
+ // Fired after the test ends.
+ virtual void OnTestEnd(const TestInfo& test_info) = 0;
+
+ // Fired after the test case ends.
+ virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
+
+ // Fired before environment tear-down for each iteration of tests starts.
+ virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
+
+ // Fired after environment tear-down for each iteration of tests ends.
+ virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
+
+ // Fired after each iteration of tests finishes.
+ virtual void OnTestIterationEnd(const UnitTest& unit_test,
+ int iteration) = 0;
+
+ // Fired after all test activities have ended.
+ virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
+};
+
+// The convenience class for users who need to override just one or two
+// methods and are not concerned that a possible change to a signature of
+// the methods they override will not be caught during the build. For
+// comments about each method please see the definition of TestEventListener
+// above.
+class EmptyTestEventListener : public TestEventListener {
+ public:
+ virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+ virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+ int /*iteration*/) {}
+ virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
+ virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+ virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
+ virtual void OnTestStart(const TestInfo& /*test_info*/) {}
+ virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
+ virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
+ virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
+ virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
+ virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+ virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+ int /*iteration*/) {}
+ virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+};
+
+// TestEventListeners lets users add listeners to track events in Google Test.
+class GTEST_API_ TestEventListeners {
+ public:
+ TestEventListeners();
+ ~TestEventListeners();
+
+ // Appends an event listener to the end of the list. Google Test assumes
+ // the ownership of the listener (i.e. it will delete the listener when
+ // the test program finishes).
+ void Append(TestEventListener* listener);
+
+ // Removes the given event listener from the list and returns it. It then
+ // becomes the caller's responsibility to delete the listener. Returns
+ // NULL if the listener is not found in the list.
+ TestEventListener* Release(TestEventListener* listener);
+
+ // Returns the standard listener responsible for the default console
+ // output. Can be removed from the listeners list to shut down default
+ // console output. Note that removing this object from the listener list
+ // with Release transfers its ownership to the caller and makes this
+ // function return NULL the next time.
+ TestEventListener* default_result_printer() const {
+ return default_result_printer_;
+ }
+
+ // Returns the standard listener responsible for the default XML output
+ // controlled by the --gtest_output=xml flag. Can be removed from the
+ // listeners list by users who want to shut down the default XML output
+ // controlled by this flag and substitute it with custom one. Note that
+ // removing this object from the listener list with Release transfers its
+ // ownership to the caller and makes this function return NULL the next
+ // time.
+ TestEventListener* default_xml_generator() const {
+ return default_xml_generator_;
+ }
+
+ private:
+ friend class TestCase;
+ friend class TestInfo;
+ friend class internal::DefaultGlobalTestPartResultReporter;
+ friend class internal::NoExecDeathTest;
+ friend class internal::TestEventListenersAccessor;
+ friend class internal::UnitTestImpl;
+
+ // Returns repeater that broadcasts the TestEventListener events to all
+ // subscribers.
+ TestEventListener* repeater();
+
+ // Sets the default_result_printer attribute to the provided listener.
+ // The listener is also added to the listener list and previous
+ // default_result_printer is removed from it and deleted. The listener can
+ // also be NULL in which case it will not be added to the list. Does
+ // nothing if the previous and the current listener objects are the same.
+ void SetDefaultResultPrinter(TestEventListener* listener);
+
+ // Sets the default_xml_generator attribute to the provided listener. The
+ // listener is also added to the listener list and previous
+ // default_xml_generator is removed from it and deleted. The listener can
+ // also be NULL in which case it will not be added to the list. Does
+ // nothing if the previous and the current listener objects are the same.
+ void SetDefaultXmlGenerator(TestEventListener* listener);
+
+ // Controls whether events will be forwarded by the repeater to the
+ // listeners in the list.
+ bool EventForwardingEnabled() const;
+ void SuppressEventForwarding();
+
+ // The actual list of listeners.
+ internal::TestEventRepeater* repeater_;
+ // Listener responsible for the standard result output.
+ TestEventListener* default_result_printer_;
+ // Listener responsible for the creation of the XML output file.
+ TestEventListener* default_xml_generator_;
+
+ // We disallow copying TestEventListeners.
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
+};
+
+// A UnitTest consists of a vector of TestCases.
+//
+// This is a singleton class. The only instance of UnitTest is
+// created when UnitTest::GetInstance() is first called. This
+// instance is never deleted.
+//
+// UnitTest is not copyable.
+//
+// This class is thread-safe as long as the methods are called
+// according to their specification.
+class GTEST_API_ UnitTest {
+ public:
+ // Gets the singleton UnitTest object. The first time this method
+ // is called, a UnitTest object is constructed and returned.
+ // Consecutive calls will return the same object.
+ static UnitTest* GetInstance();
+
+ // Runs all tests in this UnitTest object and prints the result.
+ // Returns 0 if successful, or 1 otherwise.
+ //
+ // This method can only be called from the main thread.
+ //
+ // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+ int Run() GTEST_MUST_USE_RESULT_;
+
+ // Returns the working directory when the first TEST() or TEST_F()
+ // was executed. The UnitTest object owns the string.
+ const char* original_working_dir() const;
+
+ // Returns the TestCase object for the test that's currently running,
+ // or NULL if no test is running.
+ const TestCase* current_test_case() const
+ GTEST_LOCK_EXCLUDED_(mutex_);
+
+ // Returns the TestInfo object for the test that's currently running,
+ // or NULL if no test is running.
+ const TestInfo* current_test_info() const
+ GTEST_LOCK_EXCLUDED_(mutex_);
+
+ // Returns the random seed used at the start of the current test run.
+ int random_seed() const;
+
+#if GTEST_HAS_PARAM_TEST
+ // Returns the ParameterizedTestCaseRegistry object used to keep track of
+ // value-parameterized tests and instantiate and register them.
+ //
+ // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+ internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
+ GTEST_LOCK_EXCLUDED_(mutex_);
+#endif // GTEST_HAS_PARAM_TEST
+
+ // Gets the number of successful test cases.
+ int successful_test_case_count() const;
+
+ // Gets the number of failed test cases.
+ int failed_test_case_count() const;
+
+ // Gets the number of all test cases.
+ int total_test_case_count() const;
+
+ // Gets the number of all test cases that contain at least one test
+ // that should run.
+ int test_case_to_run_count() const;
+
+ // Gets the number of successful tests.
+ int successful_test_count() const;
+
+ // Gets the number of failed tests.
+ int failed_test_count() const;
+
+ // Gets the number of disabled tests that will be reported in the XML report.
+ int reportable_disabled_test_count() const;
+
+ // Gets the number of disabled tests.
+ int disabled_test_count() const;
+
+ // Gets the number of tests to be printed in the XML report.
+ int reportable_test_count() const;
+
+ // Gets the number of all tests.
+ int total_test_count() const;
+
+ // Gets the number of tests that should run.
+ int test_to_run_count() const;
+
+ // Gets the time of the test program start, in ms from the start of the
+ // UNIX epoch.
+ TimeInMillis start_timestamp() const;
+
+ // Gets the elapsed time, in milliseconds.
+ TimeInMillis elapsed_time() const;
+
+ // Returns true iff the unit test passed (i.e. all test cases passed).
+ bool Passed() const;
+
+ // Returns true iff the unit test failed (i.e. some test case failed
+ // or something outside of all tests failed).
+ bool Failed() const;
+
+ // Gets the i-th test case among all the test cases. i can range from 0 to
+ // total_test_case_count() - 1. If i is not in that range, returns NULL.
+ const TestCase* GetTestCase(int i) const;
+
+ // Returns the TestResult containing information on test failures and
+ // properties logged outside of individual test cases.
+ const TestResult& ad_hoc_test_result() const;
+
+ // Returns the list of event listeners that can be used to track events
+ // inside Google Test.
+ TestEventListeners& listeners();
+
+ private:
+ // Registers and returns a global test environment. When a test
+ // program is run, all global test environments will be set-up in
+ // the order they were registered. After all tests in the program
+ // have finished, all global test environments will be torn-down in
+ // the *reverse* order they were registered.
+ //
+ // The UnitTest object takes ownership of the given environment.
+ //
+ // This method can only be called from the main thread.
+ Environment* AddEnvironment(Environment* env);
+
+ // Adds a TestPartResult to the current TestResult object. All
+ // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
+ // eventually call this to report their results. The user code
+ // should use the assertion macros instead of calling this directly.
+ void AddTestPartResult(TestPartResult::Type result_type,
+ const char* file_name,
+ int line_number,
+ const std::string& message,
+ const std::string& os_stack_trace)
+ GTEST_LOCK_EXCLUDED_(mutex_);
+
+ // Adds a TestProperty to the current TestResult object when invoked from
+ // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+ // from SetUpTestCase or TearDownTestCase, or to the global property set
+ // when invoked elsewhere. If the result already contains a property with
+ // the same key, the value will be updated.
+ void RecordProperty(const std::string& key, const std::string& value);
+
+ // Gets the i-th test case among all the test cases. i can range from 0 to
+ // total_test_case_count() - 1. If i is not in that range, returns NULL.
+ TestCase* GetMutableTestCase(int i);
+
+ // Accessors for the implementation object.
+ internal::UnitTestImpl* impl() { return impl_; }
+ const internal::UnitTestImpl* impl() const { return impl_; }
+
+ // These classes and funcions are friends as they need to access private
+ // members of UnitTest.
+ friend class Test;
+ friend class internal::AssertHelper;
+ friend class internal::ScopedTrace;
+ friend class internal::StreamingListenerTest;
+ friend class internal::UnitTestRecordPropertyTestHelper;
+ friend Environment* AddGlobalTestEnvironment(Environment* env);
+ friend internal::UnitTestImpl* internal::GetUnitTestImpl();
+ friend void internal::ReportFailureInUnknownLocation(
+ TestPartResult::Type result_type,
+ const std::string& message);
+
+ // Creates an empty UnitTest.
+ UnitTest();
+
+ // D'tor
+ virtual ~UnitTest();
+
+ // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+ // Google Test trace stack.
+ void PushGTestTrace(const internal::TraceInfo& trace)
+ GTEST_LOCK_EXCLUDED_(mutex_);
+
+ // Pops a trace from the per-thread Google Test trace stack.
+ void PopGTestTrace()
+ GTEST_LOCK_EXCLUDED_(mutex_);
+
+ // Protects mutable state in *impl_. This is mutable as some const
+ // methods need to lock it too.
+ mutable internal::Mutex mutex_;
+
+ // Opaque implementation object. This field is never changed once
+ // the object is constructed. We don't mark it as const here, as
+ // doing so will cause a warning in the constructor of UnitTest.
+ // Mutable state in *impl_ is protected by mutex_.
+ internal::UnitTestImpl* impl_;
+
+ // We disallow copying UnitTest.
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
+};
+
+// A convenient wrapper for adding an environment for the test
+// program.
+//
+// You should call this before RUN_ALL_TESTS() is called, probably in
+// main(). If you use gtest_main, you need to call this before main()
+// starts for it to take effect. For example, you can define a global
+// variable like this:
+//
+// testing::Environment* const foo_env =
+// testing::AddGlobalTestEnvironment(new FooEnvironment);
+//
+// However, we strongly recommend you to write your own main() and
+// call AddGlobalTestEnvironment() there, as relying on initialization
+// of global variables makes the code harder to read and may cause
+// problems when you register multiple environments from different
+// translation units and the environments have dependencies among them
+// (remember that the compiler doesn't guarantee the order in which
+// global variables from different translation units are initialized).
+inline Environment* AddGlobalTestEnvironment(Environment* env) {
+ return UnitTest::GetInstance()->AddEnvironment(env);
+}
+
+// Initializes Google Test. This must be called before calling
+// RUN_ALL_TESTS(). In particular, it parses a command line for the
+// flags that Google Test recognizes. Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned. Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+GTEST_API_ void InitGoogleTest(int* argc, char** argv);
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
+
+namespace internal {
+
+// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
+// value of type ToPrint that is an operand of a comparison assertion
+// (e.g. ASSERT_EQ). OtherOperand is the type of the other operand in
+// the comparison, and is used to help determine the best way to
+// format the value. In particular, when the value is a C string
+// (char pointer) and the other operand is an STL string object, we
+// want to format the C string as a string, since we know it is
+// compared by value with the string object. If the value is a char
+// pointer but the other operand is not an STL string object, we don't
+// know whether the pointer is supposed to point to a NUL-terminated
+// string, and thus want to print it as a pointer to be safe.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// The default case.
+template <typename ToPrint, typename OtherOperand>
+class FormatForComparison {
+ public:
+ static ::std::string Format(const ToPrint& value) {
+ return ::testing::PrintToString(value);
+ }
+};
+
+// Array.
+template <typename ToPrint, size_t N, typename OtherOperand>
+class FormatForComparison<ToPrint[N], OtherOperand> {
+ public:
+ static ::std::string Format(const ToPrint* value) {
+ return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
+ }
+};
+
+// By default, print C string as pointers to be safe, as we don't know
+// whether they actually point to a NUL-terminated string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \
+ template <typename OtherOperand> \
+ class FormatForComparison<CharType*, OtherOperand> { \
+ public: \
+ static ::std::string Format(CharType* value) { \
+ return ::testing::PrintToString(static_cast<const void*>(value)); \
+ } \
+ }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
+
+// If a C string is compared with an STL string object, we know it's meant
+// to point to a NUL-terminated string, and thus can print it as a string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
+ template <> \
+ class FormatForComparison<CharType*, OtherStringType> { \
+ public: \
+ static ::std::string Format(CharType* value) { \
+ return ::testing::PrintToString(value); \
+ } \
+ }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
+
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
+#endif
+
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
+#endif
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
+
+// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
+// operand to be used in a failure message. The type (but not value)
+// of the other operand may affect the format. This allows us to
+// print a char* as a raw pointer when it is compared against another
+// char* or void*, and print it as a C string when it is compared
+// against an std::string object, for example.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename T1, typename T2>
+std::string FormatForComparisonFailureMessage(
+ const T1& value, const T2& /* other_operand */) {
+ return FormatForComparison<T1, T2>::Format(value);
+}
+
+// The helper function for {ASSERT|EXPECT}_EQ.
+template <typename T1, typename T2>
+AssertionResult CmpHelperEQ(const char* expected_expression,
+ const char* actual_expression,
+ const T1& expected,
+ const T2& actual) {
+#ifdef _MSC_VER
+# pragma warning(push) // Saves the current warning state.
+# pragma warning(disable:4389) // Temporarily disables warning on
+ // signed/unsigned mismatch.
+#endif
+
+ if (expected == actual) {
+ return AssertionSuccess();
+ }
+
+#ifdef _MSC_VER
+# pragma warning(pop) // Restores the warning state.
+#endif
+
+ return EqFailure(expected_expression,
+ actual_expression,
+ FormatForComparisonFailureMessage(expected, actual),
+ FormatForComparisonFailureMessage(actual, expected),
+ false);
+}
+
+// With this overloaded version, we allow anonymous enums to be used
+// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
+// can be implicitly cast to BiggestInt.
+GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
+ const char* actual_expression,
+ BiggestInt expected,
+ BiggestInt actual);
+
+// The helper class for {ASSERT|EXPECT}_EQ. The template argument
+// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
+// is a null pointer literal. The following default implementation is
+// for lhs_is_null_literal being false.
+template <bool lhs_is_null_literal>
+class EqHelper {
+ public:
+ // This templatized version is for the general case.
+ template <typename T1, typename T2>
+ static AssertionResult Compare(const char* expected_expression,
+ const char* actual_expression,
+ const T1& expected,
+ const T2& actual) {
+ return CmpHelperEQ(expected_expression, actual_expression, expected,
+ actual);
+ }
+
+ // With this overloaded version, we allow anonymous enums to be used
+ // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
+ // enums can be implicitly cast to BiggestInt.
+ //
+ // Even though its body looks the same as the above version, we
+ // cannot merge the two, as it will make anonymous enums unhappy.
+ static AssertionResult Compare(const char* expected_expression,
+ const char* actual_expression,
+ BiggestInt expected,
+ BiggestInt actual) {
+ return CmpHelperEQ(expected_expression, actual_expression, expected,
+ actual);
+ }
+};
+
+// This specialization is used when the first argument to ASSERT_EQ()
+// is a null pointer literal, like NULL, false, or 0.
+template <>
+class EqHelper<true> {
+ public:
+ // We define two overloaded versions of Compare(). The first
+ // version will be picked when the second argument to ASSERT_EQ() is
+ // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
+ // EXPECT_EQ(false, a_bool).
+ template <typename T1, typename T2>
+ static AssertionResult Compare(
+ const char* expected_expression,
+ const char* actual_expression,
+ const T1& expected,
+ const T2& actual,
+ // The following line prevents this overload from being considered if T2
+ // is not a pointer type. We need this because ASSERT_EQ(NULL, my_ptr)
+ // expands to Compare("", "", NULL, my_ptr), which requires a conversion
+ // to match the Secret* in the other overload, which would otherwise make
+ // this template match better.
+ typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
+ return CmpHelperEQ(expected_expression, actual_expression, expected,
+ actual);
+ }
+
+ // This version will be picked when the second argument to ASSERT_EQ() is a
+ // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
+ template <typename T>
+ static AssertionResult Compare(
+ const char* expected_expression,
+ const char* actual_expression,
+ // We used to have a second template parameter instead of Secret*. That
+ // template parameter would deduce to 'long', making this a better match
+ // than the first overload even without the first overload's EnableIf.
+ // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
+ // non-pointer argument" (even a deduced integral argument), so the old
+ // implementation caused warnings in user code.
+ Secret* /* expected (NULL) */,
+ T* actual) {
+ // We already know that 'expected' is a null pointer.
+ return CmpHelperEQ(expected_expression, actual_expression,
+ static_cast<T*>(NULL), actual);
+ }
+};
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste
+// of similar code.
+//
+// For each templatized helper function, we also define an overloaded
+// version for BiggestInt in order to reduce code bloat and allow
+// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
+// with gcc 4.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+template <typename T1, typename T2>\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+ const T1& val1, const T2& val2) {\
+ if (val1 op val2) {\
+ return AssertionSuccess();\
+ } else {\
+ return AssertionFailure() \
+ << "Expected: (" << expr1 << ") " #op " (" << expr2\
+ << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+ << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+ }\
+}\
+GTEST_API_ AssertionResult CmpHelper##op_name(\
+ const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// Implements the helper function for {ASSERT|EXPECT}_NE
+GTEST_IMPL_CMP_HELPER_(NE, !=);
+// Implements the helper function for {ASSERT|EXPECT}_LE
+GTEST_IMPL_CMP_HELPER_(LE, <=);
+// Implements the helper function for {ASSERT|EXPECT}_LT
+GTEST_IMPL_CMP_HELPER_(LT, <);
+// Implements the helper function for {ASSERT|EXPECT}_GE
+GTEST_IMPL_CMP_HELPER_(GE, >=);
+// Implements the helper function for {ASSERT|EXPECT}_GT
+GTEST_IMPL_CMP_HELPER_(GT, >);
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+ const char* actual_expression,
+ const char* expected,
+ const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+ const char* actual_expression,
+ const char* expected,
+ const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+ const char* s2_expression,
+ const char* s1,
+ const char* s2);
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+ const char* s2_expression,
+ const char* s1,
+ const char* s2);
+
+
+// Helper function for *_STREQ on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+ const char* actual_expression,
+ const wchar_t* expected,
+ const wchar_t* actual);
+
+// Helper function for *_STRNE on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+ const char* s2_expression,
+ const wchar_t* s1,
+ const wchar_t* s2);
+
+} // namespace internal
+
+// IsSubstring() and IsNotSubstring() are intended to be used as the
+// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
+// themselves. They check whether needle is a substring of haystack
+// (NULL is considered a substring of itself only), and return an
+// appropriate error message when they fail.
+//
+// The {needle,haystack}_expr arguments are the stringified
+// expressions that generated the two real arguments.
+GTEST_API_ AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::string& needle, const ::std::string& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::string& needle, const ::std::string& haystack);
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::wstring& needle, const ::std::wstring& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::wstring& needle, const ::std::wstring& haystack);
+#endif // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+// Helper template function for comparing floating-points.
+//
+// Template parameter:
+//
+// RawType: the raw floating-point type (either float or double)
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename RawType>
+AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
+ const char* actual_expression,
+ RawType expected,
+ RawType actual) {
+ const FloatingPoint<RawType> lhs(expected), rhs(actual);
+
+ if (lhs.AlmostEquals(rhs)) {
+ return AssertionSuccess();
+ }
+
+ ::std::stringstream expected_ss;
+ expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+ << expected;
+
+ ::std::stringstream actual_ss;
+ actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+ << actual;
+
+ return EqFailure(expected_expression,
+ actual_expression,
+ StringStreamToString(&expected_ss),
+ StringStreamToString(&actual_ss),
+ false);
+}
+
+// Helper function for implementing ASSERT_NEAR.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
+ const char* expr2,
+ const char* abs_error_expr,
+ double val1,
+ double val2,
+ double abs_error);
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+// A class that enables one to stream messages to assertion macros
+class GTEST_API_ AssertHelper {
+ public:
+ // Constructor.
+ AssertHelper(TestPartResult::Type type,
+ const char* file,
+ int line,
+ const char* message);
+ ~AssertHelper();
+
+ // Message assignment is a semantic trick to enable assertion
+ // streaming; see the GTEST_MESSAGE_ macro below.
+ void operator=(const Message& message) const;
+
+ private:
+ // We put our data in a struct so that the size of the AssertHelper class can
+ // be as small as possible. This is important because gcc is incapable of
+ // re-using stack space even for temporary variables, so every EXPECT_EQ
+ // reserves stack space for another AssertHelper.
+ struct AssertHelperData {
+ AssertHelperData(TestPartResult::Type t,
+ const char* srcfile,
+ int line_num,
+ const char* msg)
+ : type(t), file(srcfile), line(line_num), message(msg) { }
+
+ TestPartResult::Type const type;
+ const char* const file;
+ int const line;
+ std::string const message;
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
+ };
+
+ AssertHelperData* const data_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
+};
+
+} // namespace internal
+
+#if GTEST_HAS_PARAM_TEST
+// The pure interface class that all value-parameterized tests inherit from.
+// A value-parameterized class must inherit from both ::testing::Test and
+// ::testing::WithParamInterface. In most cases that just means inheriting
+// from ::testing::TestWithParam, but more complicated test hierarchies
+// may need to inherit from Test and WithParamInterface at different levels.
+//
+// This interface has support for accessing the test parameter value via
+// the GetParam() method.
+//
+// Use it with one of the parameter generator defining functions, like Range(),
+// Values(), ValuesIn(), Bool(), and Combine().
+//
+// class FooTest : public ::testing::TestWithParam<int> {
+// protected:
+// FooTest() {
+// // Can use GetParam() here.
+// }
+// virtual ~FooTest() {
+// // Can use GetParam() here.
+// }
+// virtual void SetUp() {
+// // Can use GetParam() here.
+// }
+// virtual void TearDown {
+// // Can use GetParam() here.
+// }
+// };
+// TEST_P(FooTest, DoesBar) {
+// // Can use GetParam() method here.
+// Foo foo;
+// ASSERT_TRUE(foo.DoesBar(GetParam()));
+// }
+// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
+
+template <typename T>
+class WithParamInterface {
+ public:
+ typedef T ParamType;
+ virtual ~WithParamInterface() {}
+
+ // The current parameter value. Is also available in the test fixture's
+ // constructor. This member function is non-static, even though it only
+ // references static data, to reduce the opportunity for incorrect uses
+ // like writing 'WithParamInterface<bool>::GetParam()' for a test that
+ // uses a fixture whose parameter type is int.
+ const ParamType& GetParam() const {
+ GTEST_CHECK_(parameter_ != NULL)
+ << "GetParam() can only be called inside a value-parameterized test "
+ << "-- did you intend to write TEST_P instead of TEST_F?";
+ return *parameter_;
+ }
+
+ private:
+ // Sets parameter value. The caller is responsible for making sure the value
+ // remains alive and unchanged throughout the current test.
+ static void SetParam(const ParamType* parameter) {
+ parameter_ = parameter;
+ }
+
+ // Static value used for accessing parameter during a test lifetime.
+ static const ParamType* parameter_;
+
+ // TestClass must be a subclass of WithParamInterface<T> and Test.
+ template <class TestClass> friend class internal::ParameterizedTestFactory;
+};
+
+template <typename T>
+const T* WithParamInterface<T>::parameter_ = NULL;
+
+// Most value-parameterized classes can ignore the existence of
+// WithParamInterface, and can just inherit from ::testing::TestWithParam.
+
+template <typename T>
+class TestWithParam : public Test, public WithParamInterface<T> {
+};
+
+#endif // GTEST_HAS_PARAM_TEST
+
+// Macros for indicating success/failure in test code.
+
+// ADD_FAILURE unconditionally adds a failure to the current test.
+// SUCCEED generates a success - it doesn't automatically make the
+// current test successful, as a test is only successful when it has
+// no failure.
+//
+// EXPECT_* verifies that a certain condition is satisfied. If not,
+// it behaves like ADD_FAILURE. In particular:
+//
+// EXPECT_TRUE verifies that a Boolean condition is true.
+// EXPECT_FALSE verifies that a Boolean condition is false.
+//
+// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
+// that they will also abort the current function on failure. People
+// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
+// writing data-driven tests often find themselves using ADD_FAILURE
+// and EXPECT_* more.
+
+// Generates a nonfatal failure with a generic message.
+#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
+
+// Generates a nonfatal failure at the given source file location with
+// a generic message.
+#define ADD_FAILURE_AT(file, line) \
+ GTEST_MESSAGE_AT_(file, line, "Failed", \
+ ::testing::TestPartResult::kNonFatalFailure)
+
+// Generates a fatal failure with a generic message.
+#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
+
+// Define this macro to 1 to omit the definition of FAIL(), which is a
+// generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_FAIL
+# define FAIL() GTEST_FAIL()
+#endif
+
+// Generates a success with a generic message.
+#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
+
+// Define this macro to 1 to omit the definition of SUCCEED(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_SUCCEED
+# define SUCCEED() GTEST_SUCCEED()
+#endif
+
+// Macros for testing exceptions.
+//
+// * {ASSERT|EXPECT}_THROW(statement, expected_exception):
+// Tests that the statement throws the expected exception.
+// * {ASSERT|EXPECT}_NO_THROW(statement):
+// Tests that the statement doesn't throw any exception.
+// * {ASSERT|EXPECT}_ANY_THROW(statement):
+// Tests that the statement throws an exception.
+
+#define EXPECT_THROW(statement, expected_exception) \
+ GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_NO_THROW(statement) \
+ GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_ANY_THROW(statement) \
+ GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_THROW(statement, expected_exception) \
+ GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
+#define ASSERT_NO_THROW(statement) \
+ GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
+#define ASSERT_ANY_THROW(statement) \
+ GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
+
+// Boolean assertions. Condition can be either a Boolean expression or an
+// AssertionResult. For more information on how to use AssertionResult with
+// these macros see comments on that class.
+#define EXPECT_TRUE(condition) \
+ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+ GTEST_NONFATAL_FAILURE_)
+#define EXPECT_FALSE(condition) \
+ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+ GTEST_NONFATAL_FAILURE_)
+#define ASSERT_TRUE(condition) \
+ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+ GTEST_FATAL_FAILURE_)
+#define ASSERT_FALSE(condition) \
+ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+ GTEST_FATAL_FAILURE_)
+
+// Includes the auto-generated header that implements a family of
+// generic predicate assertion macros.
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
+// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND!
+//
+// Implements a family of generic predicate assertion macros.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Makes sure this header is not included before gtest.h.
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+# error Do not include gtest_pred_impl.h directly. Include gtest.h instead.
+#endif // GTEST_INCLUDE_GTEST_GTEST_H_
+
+// This header implements a family of generic predicate assertion
+// macros:
+//
+// ASSERT_PRED_FORMAT1(pred_format, v1)
+// ASSERT_PRED_FORMAT2(pred_format, v1, v2)
+// ...
+//
+// where pred_format is a function or functor that takes n (in the
+// case of ASSERT_PRED_FORMATn) values and their source expression
+// text, and returns a testing::AssertionResult. See the definition
+// of ASSERT_EQ in gtest.h for an example.
+//
+// If you don't care about formatting, you can use the more
+// restrictive version:
+//
+// ASSERT_PRED1(pred, v1)
+// ASSERT_PRED2(pred, v1, v2)
+// ...
+//
+// where pred is an n-ary function or functor that returns bool,
+// and the values v1, v2, ..., must support the << operator for
+// streaming to std::ostream.
+//
+// We also define the EXPECT_* variations.
+//
+// For now we only support predicates whose arity is at most 5.
+// Please email googletestframework at googlegroups.com if you need
+// support for higher arities.
+
+// GTEST_ASSERT_ is the basic statement to which all of the assertions
+// in this file reduce. Don't use this in your code.
+
+#define GTEST_ASSERT_(expression, on_failure) \
+ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+ if (const ::testing::AssertionResult gtest_ar = (expression)) \
+ ; \
+ else \
+ on_failure(gtest_ar.failure_message())
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use
+// this in your code.
+template <typename Pred,
+ typename T1>
+AssertionResult AssertPred1Helper(const char* pred_text,
+ const char* e1,
+ Pred pred,
+ const T1& v1) {
+ if (pred(v1)) return AssertionSuccess();
+
+ return AssertionFailure() << pred_text << "("
+ << e1 << ") evaluates to false, where"
+ << "\n" << e1 << " evaluates to " << v1;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
+ GTEST_ASSERT_(pred_format(#v1, v1), \
+ on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use
+// this in your code.
+#define GTEST_PRED1_(pred, v1, on_failure)\
+ GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
+ #v1, \
+ pred, \
+ v1), on_failure)
+
+// Unary predicate assertion macros.
+#define EXPECT_PRED_FORMAT1(pred_format, v1) \
+ GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED1(pred, v1) \
+ GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT1(pred_format, v1) \
+ GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED1(pred, v1) \
+ GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use
+// this in your code.
+template <typename Pred,
+ typename T1,
+ typename T2>
+AssertionResult AssertPred2Helper(const char* pred_text,
+ const char* e1,
+ const char* e2,
+ Pred pred,
+ const T1& v1,
+ const T2& v2) {
+ if (pred(v1, v2)) return AssertionSuccess();
+
+ return AssertionFailure() << pred_text << "("
+ << e1 << ", "
+ << e2 << ") evaluates to false, where"
+ << "\n" << e1 << " evaluates to " << v1
+ << "\n" << e2 << " evaluates to " << v2;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
+ GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
+ on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use
+// this in your code.
+#define GTEST_PRED2_(pred, v1, v2, on_failure)\
+ GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
+ #v1, \
+ #v2, \
+ pred, \
+ v1, \
+ v2), on_failure)
+
+// Binary predicate assertion macros.
+#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
+ GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED2(pred, v1, v2) \
+ GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
+ GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED2(pred, v1, v2) \
+ GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use
+// this in your code.
+template <typename Pred,
+ typename T1,
+ typename T2,
+ typename T3>
+AssertionResult AssertPred3Helper(const char* pred_text,
+ const char* e1,
+ const char* e2,
+ const char* e3,
+ Pred pred,
+ const T1& v1,
+ const T2& v2,
+ const T3& v3) {
+ if (pred(v1, v2, v3)) return AssertionSuccess();
+
+ return AssertionFailure() << pred_text << "("
+ << e1 << ", "
+ << e2 << ", "
+ << e3 << ") evaluates to false, where"
+ << "\n" << e1 << " evaluates to " << v1
+ << "\n" << e2 << " evaluates to " << v2
+ << "\n" << e3 << " evaluates to " << v3;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
+ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
+ on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use
+// this in your code.
+#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
+ GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
+ #v1, \
+ #v2, \
+ #v3, \
+ pred, \
+ v1, \
+ v2, \
+ v3), on_failure)
+
+// Ternary predicate assertion macros.
+#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+ GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED3(pred, v1, v2, v3) \
+ GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+ GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED3(pred, v1, v2, v3) \
+ GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use
+// this in your code.
+template <typename Pred,
+ typename T1,
+ typename T2,
+ typename T3,
+ typename T4>
+AssertionResult AssertPred4Helper(const char* pred_text,
+ const char* e1,
+ const char* e2,
+ const char* e3,
+ const char* e4,
+ Pred pred,
+ const T1& v1,
+ const T2& v2,
+ const T3& v3,
+ const T4& v4) {
+ if (pred(v1, v2, v3, v4)) return AssertionSuccess();
+
+ return AssertionFailure() << pred_text << "("
+ << e1 << ", "
+ << e2 << ", "
+ << e3 << ", "
+ << e4 << ") evaluates to false, where"
+ << "\n" << e1 << " evaluates to " << v1
+ << "\n" << e2 << " evaluates to " << v2
+ << "\n" << e3 << " evaluates to " << v3
+ << "\n" << e4 << " evaluates to " << v4;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
+ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
+ on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use
+// this in your code.
+#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
+ GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
+ #v1, \
+ #v2, \
+ #v3, \
+ #v4, \
+ pred, \
+ v1, \
+ v2, \
+ v3, \
+ v4), on_failure)
+
+// 4-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+ GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
+ GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+ GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
+ GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use
+// this in your code.
+template <typename Pred,
+ typename T1,
+ typename T2,
+ typename T3,
+ typename T4,
+ typename T5>
+AssertionResult AssertPred5Helper(const char* pred_text,
+ const char* e1,
+ const char* e2,
+ const char* e3,
+ const char* e4,
+ const char* e5,
+ Pred pred,
+ const T1& v1,
+ const T2& v2,
+ const T3& v3,
+ const T4& v4,
+ const T5& v5) {
+ if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
+
+ return AssertionFailure() << pred_text << "("
+ << e1 << ", "
+ << e2 << ", "
+ << e3 << ", "
+ << e4 << ", "
+ << e5 << ") evaluates to false, where"
+ << "\n" << e1 << " evaluates to " << v1
+ << "\n" << e2 << " evaluates to " << v2
+ << "\n" << e3 << " evaluates to " << v3
+ << "\n" << e4 << " evaluates to " << v4
+ << "\n" << e5 << " evaluates to " << v5;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
+ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
+ on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use
+// this in your code.
+#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
+ GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
+ #v1, \
+ #v2, \
+ #v3, \
+ #v4, \
+ #v5, \
+ pred, \
+ v1, \
+ v2, \
+ v3, \
+ v4, \
+ v5), on_failure)
+
+// 5-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+ GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
+ GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+ GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
+ GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+
+
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Macros for testing equalities and inequalities.
+//
+// * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
+// * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2
+// * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2
+// * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2
+// * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2
+// * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2
+//
+// When they are not, Google Test prints both the tested expressions and
+// their actual values. The values must be compatible built-in types,
+// or you will get a compiler error. By "compatible" we mean that the
+// values can be compared by the respective operator.
+//
+// Note:
+//
+// 1. It is possible to make a user-defined type work with
+// {ASSERT|EXPECT}_??(), but that requires overloading the
+// comparison operators and is thus discouraged by the Google C++
+// Usage Guide. Therefore, you are advised to use the
+// {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
+// equal.
+//
+// 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
+// pointers (in particular, C strings). Therefore, if you use it
+// with two C strings, you are testing how their locations in memory
+// are related, not how their content is related. To compare two C
+// strings by content, use {ASSERT|EXPECT}_STR*().
+//
+// 3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
+// {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
+// what the actual value is when it fails, and similarly for the
+// other comparisons.
+//
+// 4. Do not depend on the order in which {ASSERT|EXPECT}_??()
+// evaluate their arguments, which is undefined.
+//
+// 5. These macros evaluate their arguments exactly once.
+//
+// Examples:
+//
+// EXPECT_NE(5, Foo());
+// EXPECT_EQ(NULL, a_pointer);
+// ASSERT_LT(i, array_size);
+// ASSERT_GT(records.size(), 0) << "There is no record left.";
+
+#define EXPECT_EQ(expected, actual) \
+ EXPECT_PRED_FORMAT2(::testing::internal:: \
+ EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+ expected, actual)
+#define EXPECT_NE(expected, actual) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
+#define EXPECT_LE(val1, val2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define EXPECT_LT(val1, val2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define EXPECT_GE(val1, val2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define EXPECT_GT(val1, val2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+#define GTEST_ASSERT_EQ(expected, actual) \
+ ASSERT_PRED_FORMAT2(::testing::internal:: \
+ EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+ expected, actual)
+#define GTEST_ASSERT_NE(val1, val2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
+#define GTEST_ASSERT_LE(val1, val2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define GTEST_ASSERT_LT(val1, val2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define GTEST_ASSERT_GE(val1, val2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define GTEST_ASSERT_GT(val1, val2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
+// ASSERT_XY(), which clashes with some users' own code.
+
+#if !GTEST_DONT_DEFINE_ASSERT_EQ
+# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_NE
+# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LE
+# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LT
+# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GE
+# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GT
+# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
+#endif
+
+// C-string Comparisons. All tests treat NULL and any non-NULL string
+// as different. Two NULLs are equal.
+//
+// * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2
+// * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2
+// * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
+// * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
+//
+// For wide or narrow string objects, you can use the
+// {ASSERT|EXPECT}_??() macros.
+//
+// Don't depend on the order in which the arguments are evaluated,
+// which is undefined.
+//
+// These macros evaluate their arguments exactly once.
+
+#define EXPECT_STREQ(expected, actual) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define EXPECT_STRNE(s1, s2) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define EXPECT_STRCASEEQ(expected, actual) \
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define EXPECT_STRCASENE(s1, s2)\
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+#define ASSERT_STREQ(expected, actual) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define ASSERT_STRNE(s1, s2) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define ASSERT_STRCASEEQ(expected, actual) \
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define ASSERT_STRCASENE(s1, s2)\
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+// Macros for comparing floating-point numbers.
+//
+// * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
+// Tests that two float values are almost equal.
+// * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
+// Tests that two double values are almost equal.
+// * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
+// Tests that v1 and v2 are within the given distance to each other.
+//
+// Google Test uses ULP-based comparison to automatically pick a default
+// error bound that is appropriate for the operands. See the
+// FloatingPoint template class in gtest-internal.h if you are
+// interested in the implementation details.
+
+#define EXPECT_FLOAT_EQ(expected, actual)\
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+ expected, actual)
+
+#define EXPECT_DOUBLE_EQ(expected, actual)\
+ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+ expected, actual)
+
+#define ASSERT_FLOAT_EQ(expected, actual)\
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+ expected, actual)
+
+#define ASSERT_DOUBLE_EQ(expected, actual)\
+ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+ expected, actual)
+
+#define EXPECT_NEAR(val1, val2, abs_error)\
+ EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+ val1, val2, abs_error)
+
+#define ASSERT_NEAR(val1, val2, abs_error)\
+ ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+ val1, val2, abs_error)
+
+// These predicate format functions work on floating-point values, and
+// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
+//
+// EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
+
+// Asserts that val1 is less than, or almost equal to, val2. Fails
+// otherwise. In particular, it fails if either val1 or val2 is NaN.
+GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
+ float val1, float val2);
+GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
+ double val1, double val2);
+
+
+#if GTEST_OS_WINDOWS
+
+// Macros that test for HRESULT failure and success, these are only useful
+// on Windows, and rely on Windows SDK macros and APIs to compile.
+//
+// * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
+//
+// When expr unexpectedly fails or succeeds, Google Test prints the
+// expected result and the actual result with both a human-readable
+// string representation of the error, if available, as well as the
+// hex result code.
+# define EXPECT_HRESULT_SUCCEEDED(expr) \
+ EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define ASSERT_HRESULT_SUCCEEDED(expr) \
+ ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define EXPECT_HRESULT_FAILED(expr) \
+ EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+# define ASSERT_HRESULT_FAILED(expr) \
+ ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+#endif // GTEST_OS_WINDOWS
+
+// Macros that execute statement and check that it doesn't generate new fatal
+// failures in the current thread.
+//
+// * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
+//
+// Examples:
+//
+// EXPECT_NO_FATAL_FAILURE(Process());
+// ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
+//
+#define ASSERT_NO_FATAL_FAILURE(statement) \
+ GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
+#define EXPECT_NO_FATAL_FAILURE(statement) \
+ GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
+
+// Causes a trace (including the source file path, the current line
+// number, and the given message) to be included in every test failure
+// message generated by code in the current scope. The effect is
+// undone when the control leaves the current scope.
+//
+// The message argument can be anything streamable to std::ostream.
+//
+// In the implementation, we include the current line number as part
+// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
+// to appear in the same block - as long as they are on different
+// lines.
+#define SCOPED_TRACE(message) \
+ ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
+ __FILE__, __LINE__, ::testing::Message() << (message))
+
+// Compile-time assertion for type equality.
+// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
+// the same type. The value it returns is not interesting.
+//
+// Instead of making StaticAssertTypeEq a class template, we make it a
+// function template that invokes a helper class template. This
+// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
+// defining objects of that type.
+//
+// CAVEAT:
+//
+// When used inside a method of a class template,
+// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
+// instantiated. For example, given:
+//
+// template <typename T> class Foo {
+// public:
+// void Bar() { testing::StaticAssertTypeEq<int, T>(); }
+// };
+//
+// the code:
+//
+// void Test1() { Foo<bool> foo; }
+//
+// will NOT generate a compiler error, as Foo<bool>::Bar() is never
+// actually instantiated. Instead, you need:
+//
+// void Test2() { Foo<bool> foo; foo.Bar(); }
+//
+// to cause a compiler error.
+template <typename T1, typename T2>
+bool StaticAssertTypeEq() {
+ (void)internal::StaticAssertTypeEqHelper<T1, T2>();
+ return true;
+}
+
+// Defines a test.
+//
+// The first parameter is the name of the test case, and the second
+// parameter is the name of the test within the test case.
+//
+// The convention is to end the test case name with "Test". For
+// example, a test case for the Foo class can be named FooTest.
+//
+// The user should put his test code between braces after using this
+// macro. Example:
+//
+// TEST(FooTest, InitializesCorrectly) {
+// Foo foo;
+// EXPECT_TRUE(foo.StatusIsOK());
+// }
+
+// Note that we call GetTestTypeId() instead of GetTypeId<
+// ::testing::Test>() here to get the type ID of testing::Test. This
+// is to work around a suspected linker bug when using Google Test as
+// a framework on Mac OS X. The bug causes GetTypeId<
+// ::testing::Test>() to return different values depending on whether
+// the call is from the Google Test framework itself or from user test
+// code. GetTestTypeId() is guaranteed to always return the same
+// value, as it always calls GetTypeId<>() from the Google Test
+// framework.
+#define GTEST_TEST(test_case_name, test_name)\
+ GTEST_TEST_(test_case_name, test_name, \
+ ::testing::Test, ::testing::internal::GetTestTypeId())
+
+// Define this macro to 1 to omit the definition of TEST(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_TEST
+# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
+#endif
+
+// Defines a test that uses a test fixture.
+//
+// The first parameter is the name of the test fixture class, which
+// also doubles as the test case name. The second parameter is the
+// name of the test within the test case.
+//
+// A test fixture class must be declared earlier. The user should put
+// his test code between braces after using this macro. Example:
+//
+// class FooTest : public testing::Test {
+// protected:
+// virtual void SetUp() { b_.AddElement(3); }
+//
+// Foo a_;
+// Foo b_;
+// };
+//
+// TEST_F(FooTest, InitializesCorrectly) {
+// EXPECT_TRUE(a_.StatusIsOK());
+// }
+//
+// TEST_F(FooTest, ReturnsElementCountCorrectly) {
+// EXPECT_EQ(0, a_.size());
+// EXPECT_EQ(1, b_.size());
+// }
+
+#define TEST_F(test_fixture, test_name)\
+ GTEST_TEST_(test_fixture, test_name, test_fixture, \
+ ::testing::internal::GetTypeId<test_fixture>())
+
+} // namespace testing
+
+// Use this function in main() to run all tests. It returns 0 if all
+// tests are successful, or 1 otherwise.
+//
+// RUN_ALL_TESTS() should be invoked after the command line has been
+// parsed by InitGoogleTest().
+//
+// This function was formerly a macro; thus, it is in the global
+// namespace and has an all-caps name.
+int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
+
+inline int RUN_ALL_TESTS() {
+ return ::testing::UnitTest::GetInstance()->Run();
+}
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-death-test.h b/unit_tests/gtest/include/gtest/gtest-death-test.h
deleted file mode 100644
index a27883f..0000000
--- a/unit_tests/gtest/include/gtest/gtest-death-test.h
+++ /dev/null
@@ -1,283 +0,0 @@
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file defines the public API for death tests. It is
-// #included by gtest.h so a user doesn't need to include this
-// directly.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
-#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
-
-#include "gtest/internal/gtest-death-test-internal.h"
-
-namespace testing {
-
-// This flag controls the style of death tests. Valid values are "threadsafe",
-// meaning that the death test child process will re-execute the test binary
-// from the start, running only a single death test, or "fast",
-// meaning that the child process will execute the test logic immediately
-// after forking.
-GTEST_DECLARE_string_(death_test_style);
-
-#if GTEST_HAS_DEATH_TEST
-
-// The following macros are useful for writing death tests.
-
-// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
-// executed:
-//
-// 1. It generates a warning if there is more than one active
-// thread. This is because it's safe to fork() or clone() only
-// when there is a single thread.
-//
-// 2. The parent process clone()s a sub-process and runs the death
-// test in it; the sub-process exits with code 0 at the end of the
-// death test, if it hasn't exited already.
-//
-// 3. The parent process waits for the sub-process to terminate.
-//
-// 4. The parent process checks the exit code and error message of
-// the sub-process.
-//
-// Examples:
-//
-// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
-// for (int i = 0; i < 5; i++) {
-// EXPECT_DEATH(server.ProcessRequest(i),
-// "Invalid request .* in ProcessRequest()")
-// << "Failed to die on request " << i);
-// }
-//
-// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
-//
-// bool KilledBySIGHUP(int exit_code) {
-// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
-// }
-//
-// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
-//
-// On the regular expressions used in death tests:
-//
-// On POSIX-compliant systems (*nix), we use the <regex.h> library,
-// which uses the POSIX extended regex syntax.
-//
-// On other platforms (e.g. Windows), we only support a simple regex
-// syntax implemented as part of Google Test. This limited
-// implementation should be enough most of the time when writing
-// death tests; though it lacks many features you can find in PCRE
-// or POSIX extended regex syntax. For example, we don't support
-// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
-// repetition count ("x{5,7}"), among others.
-//
-// Below is the syntax that we do support. We chose it to be a
-// subset of both PCRE and POSIX extended regex, so it's easy to
-// learn wherever you come from. In the following: 'A' denotes a
-// literal character, period (.), or a single \\ escape sequence;
-// 'x' and 'y' denote regular expressions; 'm' and 'n' are for
-// natural numbers.
-//
-// c matches any literal character c
-// \\d matches any decimal digit
-// \\D matches any character that's not a decimal digit
-// \\f matches \f
-// \\n matches \n
-// \\r matches \r
-// \\s matches any ASCII whitespace, including \n
-// \\S matches any character that's not a whitespace
-// \\t matches \t
-// \\v matches \v
-// \\w matches any letter, _, or decimal digit
-// \\W matches any character that \\w doesn't match
-// \\c matches any literal character c, which must be a punctuation
-// . matches any single character except \n
-// A? matches 0 or 1 occurrences of A
-// A* matches 0 or many occurrences of A
-// A+ matches 1 or many occurrences of A
-// ^ matches the beginning of a string (not that of each line)
-// $ matches the end of a string (not that of each line)
-// xy matches x followed by y
-//
-// If you accidentally use PCRE or POSIX extended regex features
-// not implemented by us, you will get a run-time failure. In that
-// case, please try to rewrite your regular expression within the
-// above syntax.
-//
-// This implementation is *not* meant to be as highly tuned or robust
-// as a compiled regex library, but should perform well enough for a
-// death test, which already incurs significant overhead by launching
-// a child process.
-//
-// Known caveats:
-//
-// A "threadsafe" style death test obtains the path to the test
-// program from argv[0] and re-executes it in the sub-process. For
-// simplicity, the current implementation doesn't search the PATH
-// when launching the sub-process. This means that the user must
-// invoke the test program via a path that contains at least one
-// path separator (e.g. path/to/foo_test and
-// /absolute/path/to/bar_test are fine, but foo_test is not). This
-// is rarely a problem as people usually don't put the test binary
-// directory in PATH.
-//
-// TODO(wan at google.com): make thread-safe death tests search the PATH.
-
-// Asserts that a given statement causes the program to exit, with an
-// integer exit status that satisfies predicate, and emitting error output
-// that matches regex.
-# define ASSERT_EXIT(statement, predicate, regex) \
- GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
-
-// Like ASSERT_EXIT, but continues on to successive tests in the
-// test case, if any:
-# define EXPECT_EXIT(statement, predicate, regex) \
- GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
-
-// Asserts that a given statement causes the program to exit, either by
-// explicitly exiting with a nonzero exit code or being killed by a
-// signal, and emitting error output that matches regex.
-# define ASSERT_DEATH(statement, regex) \
- ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
-
-// Like ASSERT_DEATH, but continues on to successive tests in the
-// test case, if any:
-# define EXPECT_DEATH(statement, regex) \
- EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
-
-// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
-
-// Tests that an exit code describes a normal exit with a given exit code.
-class GTEST_API_ ExitedWithCode {
- public:
- explicit ExitedWithCode(int exit_code);
- bool operator()(int exit_status) const;
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ExitedWithCode& other);
-
- const int exit_code_;
-};
-
-# if !GTEST_OS_WINDOWS
-// Tests that an exit code describes an exit due to termination by a
-// given signal.
-class GTEST_API_ KilledBySignal {
- public:
- explicit KilledBySignal(int signum);
- bool operator()(int exit_status) const;
- private:
- const int signum_;
-};
-# endif // !GTEST_OS_WINDOWS
-
-// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
-// The death testing framework causes this to have interesting semantics,
-// since the sideeffects of the call are only visible in opt mode, and not
-// in debug mode.
-//
-// In practice, this can be used to test functions that utilize the
-// LOG(DFATAL) macro using the following style:
-//
-// int DieInDebugOr12(int* sideeffect) {
-// if (sideeffect) {
-// *sideeffect = 12;
-// }
-// LOG(DFATAL) << "death";
-// return 12;
-// }
-//
-// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
-// int sideeffect = 0;
-// // Only asserts in dbg.
-// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
-//
-// #ifdef NDEBUG
-// // opt-mode has sideeffect visible.
-// EXPECT_EQ(12, sideeffect);
-// #else
-// // dbg-mode no visible sideeffect.
-// EXPECT_EQ(0, sideeffect);
-// #endif
-// }
-//
-// This will assert that DieInDebugReturn12InOpt() crashes in debug
-// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
-// appropriate fallback value (12 in this case) in opt mode. If you
-// need to test that a function has appropriate side-effects in opt
-// mode, include assertions against the side-effects. A general
-// pattern for this is:
-//
-// EXPECT_DEBUG_DEATH({
-// // Side-effects here will have an effect after this statement in
-// // opt mode, but none in debug mode.
-// EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
-// }, "death");
-//
-# ifdef NDEBUG
-
-# define EXPECT_DEBUG_DEATH(statement, regex) \
- do { statement; } while (::testing::internal::AlwaysFalse())
-
-# define ASSERT_DEBUG_DEATH(statement, regex) \
- do { statement; } while (::testing::internal::AlwaysFalse())
-
-# else
-
-# define EXPECT_DEBUG_DEATH(statement, regex) \
- EXPECT_DEATH(statement, regex)
-
-# define ASSERT_DEBUG_DEATH(statement, regex) \
- ASSERT_DEATH(statement, regex)
-
-# endif // NDEBUG for EXPECT_DEBUG_DEATH
-#endif // GTEST_HAS_DEATH_TEST
-
-// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
-// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
-// death tests are supported; otherwise they just issue a warning. This is
-// useful when you are combining death test assertions with normal test
-// assertions in one test.
-#if GTEST_HAS_DEATH_TEST
-# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
- EXPECT_DEATH(statement, regex)
-# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
- ASSERT_DEATH(statement, regex)
-#else
-# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
- GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
-# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
- GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
-#endif
-
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-message.h b/unit_tests/gtest/include/gtest/gtest-message.h
deleted file mode 100644
index 9b7142f..0000000
--- a/unit_tests/gtest/include/gtest/gtest-message.h
+++ /dev/null
@@ -1,230 +0,0 @@
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file defines the Message class.
-//
-// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
-// leave some internal implementation details in this header file.
-// They are clearly marked by comments like this:
-//
-// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-//
-// Such code is NOT meant to be used by a user directly, and is subject
-// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
-// program!
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
-#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
-
-#include <limits>
-
-#include "gtest/internal/gtest-string.h"
-#include "gtest/internal/gtest-internal.h"
-
-namespace testing {
-
-// The Message class works like an ostream repeater.
-//
-// Typical usage:
-//
-// 1. You stream a bunch of values to a Message object.
-// It will remember the text in a stringstream.
-// 2. Then you stream the Message object to an ostream.
-// This causes the text in the Message to be streamed
-// to the ostream.
-//
-// For example;
-//
-// testing::Message foo;
-// foo << 1 << " != " << 2;
-// std::cout << foo;
-//
-// will print "1 != 2".
-//
-// Message is not intended to be inherited from. In particular, its
-// destructor is not virtual.
-//
-// Note that stringstream behaves differently in gcc and in MSVC. You
-// can stream a NULL char pointer to it in the former, but not in the
-// latter (it causes an access violation if you do). The Message
-// class hides this difference by treating a NULL char pointer as
-// "(null)".
-class GTEST_API_ Message {
- private:
- // The type of basic IO manipulators (endl, ends, and flush) for
- // narrow streams.
- typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
-
- public:
- // Constructs an empty Message.
- // We allocate the stringstream separately because otherwise each use of
- // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
- // stack frame leading to huge stack frames in some cases; gcc does not reuse
- // the stack space.
- Message() : ss_(new ::std::stringstream) {
- // By default, we want there to be enough precision when printing
- // a double to a Message.
- *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
- }
-
- // Copy constructor.
- Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT
- *ss_ << msg.GetString();
- }
-
- // Constructs a Message from a C-string.
- explicit Message(const char* str) : ss_(new ::std::stringstream) {
- *ss_ << str;
- }
-
-#if GTEST_OS_SYMBIAN
- // Streams a value (either a pointer or not) to this object.
- template <typename T>
- inline Message& operator <<(const T& value) {
- StreamHelper(typename internal::is_pointer<T>::type(), value);
- return *this;
- }
-#else
- // Streams a non-pointer value to this object.
- template <typename T>
- inline Message& operator <<(const T& val) {
- ::GTestStreamToHelper(ss_.get(), val);
- return *this;
- }
-
- // Streams a pointer value to this object.
- //
- // This function is an overload of the previous one. When you
- // stream a pointer to a Message, this definition will be used as it
- // is more specialized. (The C++ Standard, section
- // [temp.func.order].) If you stream a non-pointer, then the
- // previous definition will be used.
- //
- // The reason for this overload is that streaming a NULL pointer to
- // ostream is undefined behavior. Depending on the compiler, you
- // may get "0", "(nil)", "(null)", or an access violation. To
- // ensure consistent result across compilers, we always treat NULL
- // as "(null)".
- template <typename T>
- inline Message& operator <<(T* const& pointer) { // NOLINT
- if (pointer == NULL) {
- *ss_ << "(null)";
- } else {
- ::GTestStreamToHelper(ss_.get(), pointer);
- }
- return *this;
- }
-#endif // GTEST_OS_SYMBIAN
-
- // Since the basic IO manipulators are overloaded for both narrow
- // and wide streams, we have to provide this specialized definition
- // of operator <<, even though its body is the same as the
- // templatized version above. Without this definition, streaming
- // endl or other basic IO manipulators to Message will confuse the
- // compiler.
- Message& operator <<(BasicNarrowIoManip val) {
- *ss_ << val;
- return *this;
- }
-
- // Instead of 1/0, we want to see true/false for bool values.
- Message& operator <<(bool b) {
- return *this << (b ? "true" : "false");
- }
-
- // These two overloads allow streaming a wide C string to a Message
- // using the UTF-8 encoding.
- Message& operator <<(const wchar_t* wide_c_str) {
- return *this << internal::String::ShowWideCString(wide_c_str);
- }
- Message& operator <<(wchar_t* wide_c_str) {
- return *this << internal::String::ShowWideCString(wide_c_str);
- }
-
-#if GTEST_HAS_STD_WSTRING
- // Converts the given wide string to a narrow string using the UTF-8
- // encoding, and streams the result to this Message object.
- Message& operator <<(const ::std::wstring& wstr);
-#endif // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_GLOBAL_WSTRING
- // Converts the given wide string to a narrow string using the UTF-8
- // encoding, and streams the result to this Message object.
- Message& operator <<(const ::wstring& wstr);
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
- // Gets the text streamed to this object so far as a String.
- // Each '\0' character in the buffer is replaced with "\\0".
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- internal::String GetString() const {
- return internal::StringStreamToString(ss_.get());
- }
-
- private:
-
-#if GTEST_OS_SYMBIAN
- // These are needed as the Nokia Symbian Compiler cannot decide between
- // const T& and const T* in a function template. The Nokia compiler _can_
- // decide between class template specializations for T and T*, so a
- // tr1::type_traits-like is_pointer works, and we can overload on that.
- template <typename T>
- inline void StreamHelper(internal::true_type /*dummy*/, T* pointer) {
- if (pointer == NULL) {
- *ss_ << "(null)";
- } else {
- ::GTestStreamToHelper(ss_.get(), pointer);
- }
- }
- template <typename T>
- inline void StreamHelper(internal::false_type /*dummy*/, const T& value) {
- ::GTestStreamToHelper(ss_.get(), value);
- }
-#endif // GTEST_OS_SYMBIAN
-
- // We'll hold the text streamed to this object here.
- const internal::scoped_ptr< ::std::stringstream> ss_;
-
- // We declare (but don't implement) this to prevent the compiler
- // from implementing the assignment operator.
- void operator=(const Message&);
-};
-
-// Streams a Message to an ostream.
-inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
- return os << sb.GetString();
-}
-
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-param-test.h b/unit_tests/gtest/include/gtest/gtest-param-test.h
deleted file mode 100644
index 6407cfd..0000000
--- a/unit_tests/gtest/include/gtest/gtest-param-test.h
+++ /dev/null
@@ -1,1421 +0,0 @@
-// This file was GENERATED by command:
-// pump.py gtest-param-test.h.pump
-// DO NOT EDIT BY HAND!!!
-
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: vladl at google.com (Vlad Losev)
-//
-// Macros and functions for implementing parameterized tests
-// in Google C++ Testing Framework (Google Test)
-//
-// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
-//
-#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
-#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
-
-
-// Value-parameterized tests allow you to test your code with different
-// parameters without writing multiple copies of the same test.
-//
-// Here is how you use value-parameterized tests:
-
-#if 0
-
-// To write value-parameterized tests, first you should define a fixture
-// class. It is usually derived from testing::TestWithParam<T> (see below for
-// another inheritance scheme that's sometimes useful in more complicated
-// class hierarchies), where the type of your parameter values.
-// TestWithParam<T> is itself derived from testing::Test. T can be any
-// copyable type. If it's a raw pointer, you are responsible for managing the
-// lifespan of the pointed values.
-
-class FooTest : public ::testing::TestWithParam<const char*> {
- // You can implement all the usual class fixture members here.
-};
-
-// Then, use the TEST_P macro to define as many parameterized tests
-// for this fixture as you want. The _P suffix is for "parameterized"
-// or "pattern", whichever you prefer to think.
-
-TEST_P(FooTest, DoesBlah) {
- // Inside a test, access the test parameter with the GetParam() method
- // of the TestWithParam<T> class:
- EXPECT_TRUE(foo.Blah(GetParam()));
- ...
-}
-
-TEST_P(FooTest, HasBlahBlah) {
- ...
-}
-
-// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
-// case with any set of parameters you want. Google Test defines a number
-// of functions for generating test parameters. They return what we call
-// (surprise!) parameter generators. Here is a summary of them, which
-// are all in the testing namespace:
-//
-//
-// Range(begin, end [, step]) - Yields values {begin, begin+step,
-// begin+step+step, ...}. The values do not
-// include end. step defaults to 1.
-// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}.
-// ValuesIn(container) - Yields values from a C-style array, an STL
-// ValuesIn(begin,end) container, or an iterator range [begin, end).
-// Bool() - Yields sequence {false, true}.
-// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product
-// for the math savvy) of the values generated
-// by the N generators.
-//
-// For more details, see comments at the definitions of these functions below
-// in this file.
-//
-// The following statement will instantiate tests from the FooTest test case
-// each with parameter values "meeny", "miny", and "moe".
-
-INSTANTIATE_TEST_CASE_P(InstantiationName,
- FooTest,
- Values("meeny", "miny", "moe"));
-
-// To distinguish different instances of the pattern, (yes, you
-// can instantiate it more then once) the first argument to the
-// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
-// actual test case name. Remember to pick unique prefixes for different
-// instantiations. The tests from the instantiation above will have
-// these names:
-//
-// * InstantiationName/FooTest.DoesBlah/0 for "meeny"
-// * InstantiationName/FooTest.DoesBlah/1 for "miny"
-// * InstantiationName/FooTest.DoesBlah/2 for "moe"
-// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
-// * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
-// * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
-//
-// You can use these names in --gtest_filter.
-//
-// This statement will instantiate all tests from FooTest again, each
-// with parameter values "cat" and "dog":
-
-const char* pets[] = {"cat", "dog"};
-INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
-
-// The tests from the instantiation above will have these names:
-//
-// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
-// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
-// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
-// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
-//
-// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
-// in the given test case, whether their definitions come before or
-// AFTER the INSTANTIATE_TEST_CASE_P statement.
-//
-// Please also note that generator expressions (including parameters to the
-// generators) are evaluated in InitGoogleTest(), after main() has started.
-// This allows the user on one hand, to adjust generator parameters in order
-// to dynamically determine a set of tests to run and on the other hand,
-// give the user a chance to inspect the generated tests with Google Test
-// reflection API before RUN_ALL_TESTS() is executed.
-//
-// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
-// for more examples.
-//
-// In the future, we plan to publish the API for defining new parameter
-// generators. But for now this interface remains part of the internal
-// implementation and is subject to change.
-//
-//
-// A parameterized test fixture must be derived from testing::Test and from
-// testing::WithParamInterface<T>, where T is the type of the parameter
-// values. Inheriting from TestWithParam<T> satisfies that requirement because
-// TestWithParam<T> inherits from both Test and WithParamInterface. In more
-// complicated hierarchies, however, it is occasionally useful to inherit
-// separately from Test and WithParamInterface. For example:
-
-class BaseTest : public ::testing::Test {
- // You can inherit all the usual members for a non-parameterized test
- // fixture here.
-};
-
-class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
- // The usual test fixture members go here too.
-};
-
-TEST_F(BaseTest, HasFoo) {
- // This is an ordinary non-parameterized test.
-}
-
-TEST_P(DerivedTest, DoesBlah) {
- // GetParam works just the same here as if you inherit from TestWithParam.
- EXPECT_TRUE(foo.Blah(GetParam()));
-}
-
-#endif // 0
-
-#include "gtest/internal/gtest-port.h"
-
-#if !GTEST_OS_SYMBIAN
-# include <utility>
-#endif
-
-// scripts/fuse_gtest.py depends on gtest's own header being #included
-// *unconditionally*. Therefore these #includes cannot be moved
-// inside #if GTEST_HAS_PARAM_TEST.
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-param-util.h"
-#include "gtest/internal/gtest-param-util-generated.h"
-
-#if GTEST_HAS_PARAM_TEST
-
-namespace testing {
-
-// Functions producing parameter generators.
-//
-// Google Test uses these generators to produce parameters for value-
-// parameterized tests. When a parameterized test case is instantiated
-// with a particular generator, Google Test creates and runs tests
-// for each element in the sequence produced by the generator.
-//
-// In the following sample, tests from test case FooTest are instantiated
-// each three times with parameter values 3, 5, and 8:
-//
-// class FooTest : public TestWithParam<int> { ... };
-//
-// TEST_P(FooTest, TestThis) {
-// }
-// TEST_P(FooTest, TestThat) {
-// }
-// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
-//
-
-// Range() returns generators providing sequences of values in a range.
-//
-// Synopsis:
-// Range(start, end)
-// - returns a generator producing a sequence of values {start, start+1,
-// start+2, ..., }.
-// Range(start, end, step)
-// - returns a generator producing a sequence of values {start, start+step,
-// start+step+step, ..., }.
-// Notes:
-// * The generated sequences never include end. For example, Range(1, 5)
-// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
-// returns a generator producing {1, 3, 5, 7}.
-// * start and end must have the same type. That type may be any integral or
-// floating-point type or a user defined type satisfying these conditions:
-// * It must be assignable (have operator=() defined).
-// * It must have operator+() (operator+(int-compatible type) for
-// two-operand version).
-// * It must have operator<() defined.
-// Elements in the resulting sequences will also have that type.
-// * Condition start < end must be satisfied in order for resulting sequences
-// to contain any elements.
-//
-template <typename T, typename IncrementT>
-internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
- return internal::ParamGenerator<T>(
- new internal::RangeGenerator<T, IncrementT>(start, end, step));
-}
-
-template <typename T>
-internal::ParamGenerator<T> Range(T start, T end) {
- return Range(start, end, 1);
-}
-
-// ValuesIn() function allows generation of tests with parameters coming from
-// a container.
-//
-// Synopsis:
-// ValuesIn(const T (&array)[N])
-// - returns a generator producing sequences with elements from
-// a C-style array.
-// ValuesIn(const Container& container)
-// - returns a generator producing sequences with elements from
-// an STL-style container.
-// ValuesIn(Iterator begin, Iterator end)
-// - returns a generator producing sequences with elements from
-// a range [begin, end) defined by a pair of STL-style iterators. These
-// iterators can also be plain C pointers.
-//
-// Please note that ValuesIn copies the values from the containers
-// passed in and keeps them to generate tests in RUN_ALL_TESTS().
-//
-// Examples:
-//
-// This instantiates tests from test case StringTest
-// each with C-string values of "foo", "bar", and "baz":
-//
-// const char* strings[] = {"foo", "bar", "baz"};
-// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
-//
-// This instantiates tests from test case StlStringTest
-// each with STL strings with values "a" and "b":
-//
-// ::std::vector< ::std::string> GetParameterStrings() {
-// ::std::vector< ::std::string> v;
-// v.push_back("a");
-// v.push_back("b");
-// return v;
-// }
-//
-// INSTANTIATE_TEST_CASE_P(CharSequence,
-// StlStringTest,
-// ValuesIn(GetParameterStrings()));
-//
-//
-// This will also instantiate tests from CharTest
-// each with parameter values 'a' and 'b':
-//
-// ::std::list<char> GetParameterChars() {
-// ::std::list<char> list;
-// list.push_back('a');
-// list.push_back('b');
-// return list;
-// }
-// ::std::list<char> l = GetParameterChars();
-// INSTANTIATE_TEST_CASE_P(CharSequence2,
-// CharTest,
-// ValuesIn(l.begin(), l.end()));
-//
-template <typename ForwardIterator>
-internal::ParamGenerator<
- typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
-ValuesIn(ForwardIterator begin, ForwardIterator end) {
- typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
- ::value_type ParamType;
- return internal::ParamGenerator<ParamType>(
- new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
-}
-
-template <typename T, size_t N>
-internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
- return ValuesIn(array, array + N);
-}
-
-template <class Container>
-internal::ParamGenerator<typename Container::value_type> ValuesIn(
- const Container& container) {
- return ValuesIn(container.begin(), container.end());
-}
-
-// Values() allows generating tests from explicitly specified list of
-// parameters.
-//
-// Synopsis:
-// Values(T v1, T v2, ..., T vN)
-// - returns a generator producing sequences with elements v1, v2, ..., vN.
-//
-// For example, this instantiates tests from test case BarTest each
-// with values "one", "two", and "three":
-//
-// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
-//
-// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
-// The exact type of values will depend on the type of parameter in BazTest.
-//
-// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
-//
-// Currently, Values() supports from 1 to 50 parameters.
-//
-template <typename T1>
-internal::ValueArray1<T1> Values(T1 v1) {
- return internal::ValueArray1<T1>(v1);
-}
-
-template <typename T1, typename T2>
-internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
- return internal::ValueArray2<T1, T2>(v1, v2);
-}
-
-template <typename T1, typename T2, typename T3>
-internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
- return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
-}
-
-template <typename T1, typename T2, typename T3, typename T4>
-internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
- return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
- T5 v5) {
- return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
-internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
- T4 v4, T5 v5, T6 v6) {
- return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
-internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
- T4 v4, T5 v5, T6 v6, T7 v7) {
- return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
- v6, v7);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
-internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
- return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
- v5, v6, v7, v8);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
-internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
- return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
- v4, v5, v6, v7, v8, v9);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
-internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
- T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
- return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
- v2, v3, v4, v5, v6, v7, v8, v9, v10);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11>
-internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
- T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11) {
- return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
- T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12>
-internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12) {
- return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13>
-internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13) {
- return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14>
-internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
- return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
- v14);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15>
-internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
- T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
- return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
- v13, v14, v15);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16>
-internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16) {
- return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
- v12, v13, v14, v15, v16);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17>
-internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17) {
- return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
- v11, v12, v13, v14, v15, v16, v17);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18>
-internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
- T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18) {
- return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
- v10, v11, v12, v13, v14, v15, v16, v17, v18);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19>
-internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
- T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
- T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
- return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
- v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20>
-internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
- return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
- v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21>
-internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
- return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
- v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22>
-internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
- T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
- T21 v21, T22 v22) {
- return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
- v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
- v20, v21, v22);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23>
-internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
- T21 v21, T22 v22, T23 v23) {
- return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
- v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
- v20, v21, v22, v23);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24>
-internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
- T21 v21, T22 v22, T23 v23, T24 v24) {
- return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
- v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
- v19, v20, v21, v22, v23, v24);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25>
-internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
- T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
- T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
- T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
- return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
- v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
- v18, v19, v20, v21, v22, v23, v24, v25);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26>
-internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26) {
- return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
- v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27>
-internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27) {
- return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
- v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28>
-internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28) {
- return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
- v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
- v28);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29>
-internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29) {
- return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
- v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
- v27, v28, v29);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30>
-internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
- T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
- T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
- T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
- return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
- v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
- v26, v27, v28, v29, v30);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31>
-internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
- return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
- v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
- v25, v26, v27, v28, v29, v30, v31);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32>
-internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
- T32 v32) {
- return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
- v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
- v24, v25, v26, v27, v28, v29, v30, v31, v32);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33>
-internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
- T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
- T32 v32, T33 v33) {
- return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
- v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
- v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34>
-internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
- T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
- T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
- T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
- T31 v31, T32 v32, T33 v33, T34 v34) {
- return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
- v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
- v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35>
-internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
- T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
- T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
- return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
- v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
- v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36>
-internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
- T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
- T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
- return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
- v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
- v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
- v34, v35, v36);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37>
-internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
- T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
- T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
- T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
- T37 v37) {
- return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
- v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
- v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
- v34, v35, v36, v37);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38>
-internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
- T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
- T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
- T37 v37, T38 v38) {
- return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
- v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
- v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
- v33, v34, v35, v36, v37, v38);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39>
-internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
- T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
- T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
- T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
- T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
- T37 v37, T38 v38, T39 v39) {
- return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
- v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
- v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
- v32, v33, v34, v35, v36, v37, v38, v39);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40>
-internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
- T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
- T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
- T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
- T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
- T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
- return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
- v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
- v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41>
-internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
- return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
- v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
- v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42>
-internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42) {
- return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
- v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
- v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
- v42);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43>
-internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43) {
- return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
- v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
- v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
- v41, v42, v43);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44>
-internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44) {
- return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
- v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
- v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
- v40, v41, v42, v43, v44);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45>
-internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
- T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
- T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
- T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
- T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
- T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
- return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
- v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
- v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
- v39, v40, v41, v42, v43, v44, v45);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46>
-internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
- T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
- T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
- return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
- v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
- v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
- v38, v39, v40, v41, v42, v43, v44, v45, v46);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47>
-internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
- T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
- T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
- return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
- v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
- v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
- v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48>
-internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
- T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
- T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
- T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
- T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
- T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
- T48 v48) {
- return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
- v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
- v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
- v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49>
-internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
- T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
- T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
- T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
- T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
- T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
- T47 v47, T48 v48, T49 v49) {
- return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
- v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
- v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
- v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49, typename T50>
-internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
- T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
- T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
- T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
- T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
- T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
- T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
- return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
- v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
- v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
- v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
- v48, v49, v50);
-}
-
-// Bool() allows generating tests with parameters in a set of (false, true).
-//
-// Synopsis:
-// Bool()
-// - returns a generator producing sequences with elements {false, true}.
-//
-// It is useful when testing code that depends on Boolean flags. Combinations
-// of multiple flags can be tested when several Bool()'s are combined using
-// Combine() function.
-//
-// In the following example all tests in the test case FlagDependentTest
-// will be instantiated twice with parameters false and true.
-//
-// class FlagDependentTest : public testing::TestWithParam<bool> {
-// virtual void SetUp() {
-// external_flag = GetParam();
-// }
-// }
-// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
-//
-inline internal::ParamGenerator<bool> Bool() {
- return Values(false, true);
-}
-
-# if GTEST_HAS_COMBINE
-// Combine() allows the user to combine two or more sequences to produce
-// values of a Cartesian product of those sequences' elements.
-//
-// Synopsis:
-// Combine(gen1, gen2, ..., genN)
-// - returns a generator producing sequences with elements coming from
-// the Cartesian product of elements from the sequences generated by
-// gen1, gen2, ..., genN. The sequence elements will have a type of
-// tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
-// of elements from sequences produces by gen1, gen2, ..., genN.
-//
-// Combine can have up to 10 arguments. This number is currently limited
-// by the maximum number of elements in the tuple implementation used by Google
-// Test.
-//
-// Example:
-//
-// This will instantiate tests in test case AnimalTest each one with
-// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
-// tuple("dog", BLACK), and tuple("dog", WHITE):
-//
-// enum Color { BLACK, GRAY, WHITE };
-// class AnimalTest
-// : public testing::TestWithParam<tuple<const char*, Color> > {...};
-//
-// TEST_P(AnimalTest, AnimalLooksNice) {...}
-//
-// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
-// Combine(Values("cat", "dog"),
-// Values(BLACK, WHITE)));
-//
-// This will instantiate tests in FlagDependentTest with all variations of two
-// Boolean flags:
-//
-// class FlagDependentTest
-// : public testing::TestWithParam<tuple(bool, bool)> > {
-// virtual void SetUp() {
-// // Assigns external_flag_1 and external_flag_2 values from the tuple.
-// tie(external_flag_1, external_flag_2) = GetParam();
-// }
-// };
-//
-// TEST_P(FlagDependentTest, TestFeature1) {
-// // Test your code using external_flag_1 and external_flag_2 here.
-// }
-// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
-// Combine(Bool(), Bool()));
-//
-template <typename Generator1, typename Generator2>
-internal::CartesianProductHolder2<Generator1, Generator2> Combine(
- const Generator1& g1, const Generator2& g2) {
- return internal::CartesianProductHolder2<Generator1, Generator2>(
- g1, g2);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3>
-internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3) {
- return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
- g1, g2, g3);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4>
-internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
- Generator4> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4) {
- return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
- Generator4>(
- g1, g2, g3, g4);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4, typename Generator5>
-internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
- Generator4, Generator5> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4, const Generator5& g5) {
- return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
- Generator4, Generator5>(
- g1, g2, g3, g4, g5);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4, typename Generator5, typename Generator6>
-internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4, const Generator5& g5, const Generator6& g6) {
- return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6>(
- g1, g2, g3, g4, g5, g6);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4, typename Generator5, typename Generator6,
- typename Generator7>
-internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4, const Generator5& g5, const Generator6& g6,
- const Generator7& g7) {
- return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7>(
- g1, g2, g3, g4, g5, g6, g7);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4, typename Generator5, typename Generator6,
- typename Generator7, typename Generator8>
-internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4, const Generator5& g5, const Generator6& g6,
- const Generator7& g7, const Generator8& g8) {
- return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7, Generator8>(
- g1, g2, g3, g4, g5, g6, g7, g8);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4, typename Generator5, typename Generator6,
- typename Generator7, typename Generator8, typename Generator9>
-internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7, Generator8,
- Generator9> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4, const Generator5& g5, const Generator6& g6,
- const Generator7& g7, const Generator8& g8, const Generator9& g9) {
- return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
- g1, g2, g3, g4, g5, g6, g7, g8, g9);
-}
-
-template <typename Generator1, typename Generator2, typename Generator3,
- typename Generator4, typename Generator5, typename Generator6,
- typename Generator7, typename Generator8, typename Generator9,
- typename Generator10>
-internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
- Generator10> Combine(
- const Generator1& g1, const Generator2& g2, const Generator3& g3,
- const Generator4& g4, const Generator5& g5, const Generator6& g6,
- const Generator7& g7, const Generator8& g8, const Generator9& g9,
- const Generator10& g10) {
- return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
- Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
- Generator10>(
- g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
-}
-# endif // GTEST_HAS_COMBINE
-
-
-
-# define TEST_P(test_case_name, test_name) \
- class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
- : public test_case_name { \
- public: \
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
- virtual void TestBody(); \
- private: \
- static int AddToRegistry() { \
- ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
- GetTestCasePatternHolder<test_case_name>(\
- #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
- #test_case_name, \
- #test_name, \
- new ::testing::internal::TestMetaFactory< \
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
- return 0; \
- } \
- static int gtest_registering_dummy_; \
- GTEST_DISALLOW_COPY_AND_ASSIGN_(\
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
- }; \
- int GTEST_TEST_CLASS_NAME_(test_case_name, \
- test_name)::gtest_registering_dummy_ = \
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
- void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
-
-# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
- ::testing::internal::ParamGenerator<test_case_name::ParamType> \
- gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
- int gtest_##prefix##test_case_name##_dummy_ = \
- ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
- GetTestCasePatternHolder<test_case_name>(\
- #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
- #prefix, \
- >est_##prefix##test_case_name##_EvalGenerator_, \
- __FILE__, __LINE__)
-
-} // namespace testing
-
-#endif // GTEST_HAS_PARAM_TEST
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-printers.h b/unit_tests/gtest/include/gtest/gtest-printers.h
deleted file mode 100644
index 9cbab3f..0000000
--- a/unit_tests/gtest/include/gtest/gtest-printers.h
+++ /dev/null
@@ -1,796 +0,0 @@
-// Copyright 2007, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-// Google Test - The Google C++ Testing Framework
-//
-// This file implements a universal value printer that can print a
-// value of any type T:
-//
-// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
-//
-// A user can teach this function how to print a class type T by
-// defining either operator<<() or PrintTo() in the namespace that
-// defines T. More specifically, the FIRST defined function in the
-// following list will be used (assuming T is defined in namespace
-// foo):
-//
-// 1. foo::PrintTo(const T&, ostream*)
-// 2. operator<<(ostream&, const T&) defined in either foo or the
-// global namespace.
-//
-// If none of the above is defined, it will print the debug string of
-// the value if it is a protocol buffer, or print the raw bytes in the
-// value otherwise.
-//
-// To aid debugging: when T is a reference type, the address of the
-// value is also printed; when T is a (const) char pointer, both the
-// pointer value and the NUL-terminated string it points to are
-// printed.
-//
-// We also provide some convenient wrappers:
-//
-// // Prints a value to a string. For a (const or not) char
-// // pointer, the NUL-terminated string (but not the pointer) is
-// // printed.
-// std::string ::testing::PrintToString(const T& value);
-//
-// // Prints a value tersely: for a reference type, the referenced
-// // value (but not the address) is printed; for a (const or not) char
-// // pointer, the NUL-terminated string (but not the pointer) is
-// // printed.
-// void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
-//
-// // Prints value using the type inferred by the compiler. The difference
-// // from UniversalTersePrint() is that this function prints both the
-// // pointer and the NUL-terminated string for a (const or not) char pointer.
-// void ::testing::internal::UniversalPrint(const T& value, ostream*);
-//
-// // Prints the fields of a tuple tersely to a string vector, one
-// // element for each field. Tuple support must be enabled in
-// // gtest-port.h.
-// std::vector<string> UniversalTersePrintTupleFieldsToStrings(
-// const Tuple& value);
-//
-// Known limitation:
-//
-// The print primitives print the elements of an STL-style container
-// using the compiler-inferred type of *iter where iter is a
-// const_iterator of the container. When const_iterator is an input
-// iterator but not a forward iterator, this inferred type may not
-// match value_type, and the print output may be incorrect. In
-// practice, this is rarely a problem as for most containers
-// const_iterator is a forward iterator. We'll fix this if there's an
-// actual need for it. Note that this fix cannot rely on value_type
-// being defined as many user-defined container types don't have
-// value_type.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
-#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
-
-#include <ostream> // NOLINT
-#include <sstream>
-#include <string>
-#include <utility>
-#include <vector>
-#include "gtest/internal/gtest-port.h"
-#include "gtest/internal/gtest-internal.h"
-
-namespace testing {
-
-// Definitions in the 'internal' and 'internal2' name spaces are
-// subject to change without notice. DO NOT USE THEM IN USER CODE!
-namespace internal2 {
-
-// Prints the given number of bytes in the given object to the given
-// ostream.
-GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
- size_t count,
- ::std::ostream* os);
-
-// For selecting which printer to use when a given type has neither <<
-// nor PrintTo().
-enum TypeKind {
- kProtobuf, // a protobuf type
- kConvertibleToInteger, // a type implicitly convertible to BiggestInt
- // (e.g. a named or unnamed enum type)
- kOtherType // anything else
-};
-
-// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
-// by the universal printer to print a value of type T when neither
-// operator<< nor PrintTo() is defined for T, where kTypeKind is the
-// "kind" of T as defined by enum TypeKind.
-template <typename T, TypeKind kTypeKind>
-class TypeWithoutFormatter {
- public:
- // This default version is called when kTypeKind is kOtherType.
- static void PrintValue(const T& value, ::std::ostream* os) {
- PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
- sizeof(value), os);
- }
-};
-
-// We print a protobuf using its ShortDebugString() when the string
-// doesn't exceed this many characters; otherwise we print it using
-// DebugString() for better readability.
-const size_t kProtobufOneLinerMaxLength = 50;
-
-template <typename T>
-class TypeWithoutFormatter<T, kProtobuf> {
- public:
- static void PrintValue(const T& value, ::std::ostream* os) {
- const ::testing::internal::string short_str = value.ShortDebugString();
- const ::testing::internal::string pretty_str =
- short_str.length() <= kProtobufOneLinerMaxLength ?
- short_str : ("\n" + value.DebugString());
- *os << ("<" + pretty_str + ">");
- }
-};
-
-template <typename T>
-class TypeWithoutFormatter<T, kConvertibleToInteger> {
- public:
- // Since T has no << operator or PrintTo() but can be implicitly
- // converted to BiggestInt, we print it as a BiggestInt.
- //
- // Most likely T is an enum type (either named or unnamed), in which
- // case printing it as an integer is the desired behavior. In case
- // T is not an enum, printing it as an integer is the best we can do
- // given that it has no user-defined printer.
- static void PrintValue(const T& value, ::std::ostream* os) {
- const internal::BiggestInt kBigInt = value;
- *os << kBigInt;
- }
-};
-
-// Prints the given value to the given ostream. If the value is a
-// protocol message, its debug string is printed; if it's an enum or
-// of a type implicitly convertible to BiggestInt, it's printed as an
-// integer; otherwise the bytes in the value are printed. This is
-// what UniversalPrinter<T>::Print() does when it knows nothing about
-// type T and T has neither << operator nor PrintTo().
-//
-// A user can override this behavior for a class type Foo by defining
-// a << operator in the namespace where Foo is defined.
-//
-// We put this operator in namespace 'internal2' instead of 'internal'
-// to simplify the implementation, as much code in 'internal' needs to
-// use << in STL, which would conflict with our own << were it defined
-// in 'internal'.
-//
-// Note that this operator<< takes a generic std::basic_ostream<Char,
-// CharTraits> type instead of the more restricted std::ostream. If
-// we define it to take an std::ostream instead, we'll get an
-// "ambiguous overloads" compiler error when trying to print a type
-// Foo that supports streaming to std::basic_ostream<Char,
-// CharTraits>, as the compiler cannot tell whether
-// operator<<(std::ostream&, const T&) or
-// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
-// specific.
-template <typename Char, typename CharTraits, typename T>
-::std::basic_ostream<Char, CharTraits>& operator<<(
- ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
- TypeWithoutFormatter<T,
- (internal::IsAProtocolMessage<T>::value ? kProtobuf :
- internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
- kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
- return os;
-}
-
-} // namespace internal2
-} // namespace testing
-
-// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
-// magic needed for implementing UniversalPrinter won't work.
-namespace testing_internal {
-
-// Used to print a value that is not an STL-style container when the
-// user doesn't define PrintTo() for it.
-template <typename T>
-void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
- // With the following statement, during unqualified name lookup,
- // testing::internal2::operator<< appears as if it was declared in
- // the nearest enclosing namespace that contains both
- // ::testing_internal and ::testing::internal2, i.e. the global
- // namespace. For more details, refer to the C++ Standard section
- // 7.3.4-1 [namespace.udir]. This allows us to fall back onto
- // testing::internal2::operator<< in case T doesn't come with a <<
- // operator.
- //
- // We cannot write 'using ::testing::internal2::operator<<;', which
- // gcc 3.3 fails to compile due to a compiler bug.
- using namespace ::testing::internal2; // NOLINT
-
- // Assuming T is defined in namespace foo, in the next statement,
- // the compiler will consider all of:
- //
- // 1. foo::operator<< (thanks to Koenig look-up),
- // 2. ::operator<< (as the current namespace is enclosed in ::),
- // 3. testing::internal2::operator<< (thanks to the using statement above).
- //
- // The operator<< whose type matches T best will be picked.
- //
- // We deliberately allow #2 to be a candidate, as sometimes it's
- // impossible to define #1 (e.g. when foo is ::std, defining
- // anything in it is undefined behavior unless you are a compiler
- // vendor.).
- *os << value;
-}
-
-} // namespace testing_internal
-
-namespace testing {
-namespace internal {
-
-// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
-// value to the given ostream. The caller must ensure that
-// 'ostream_ptr' is not NULL, or the behavior is undefined.
-//
-// We define UniversalPrinter as a class template (as opposed to a
-// function template), as we need to partially specialize it for
-// reference types, which cannot be done with function templates.
-template <typename T>
-class UniversalPrinter;
-
-template <typename T>
-void UniversalPrint(const T& value, ::std::ostream* os);
-
-// Used to print an STL-style container when the user doesn't define
-// a PrintTo() for it.
-template <typename C>
-void DefaultPrintTo(IsContainer /* dummy */,
- false_type /* is not a pointer */,
- const C& container, ::std::ostream* os) {
- const size_t kMaxCount = 32; // The maximum number of elements to print.
- *os << '{';
- size_t count = 0;
- for (typename C::const_iterator it = container.begin();
- it != container.end(); ++it, ++count) {
- if (count > 0) {
- *os << ',';
- if (count == kMaxCount) { // Enough has been printed.
- *os << " ...";
- break;
- }
- }
- *os << ' ';
- // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
- // handle *it being a native array.
- internal::UniversalPrint(*it, os);
- }
-
- if (count > 0) {
- *os << ' ';
- }
- *os << '}';
-}
-
-// Used to print a pointer that is neither a char pointer nor a member
-// pointer, when the user doesn't define PrintTo() for it. (A member
-// variable pointer or member function pointer doesn't really point to
-// a location in the address space. Their representation is
-// implementation-defined. Therefore they will be printed as raw
-// bytes.)
-template <typename T>
-void DefaultPrintTo(IsNotContainer /* dummy */,
- true_type /* is a pointer */,
- T* p, ::std::ostream* os) {
- if (p == NULL) {
- *os << "NULL";
- } else {
- // C++ doesn't allow casting from a function pointer to any object
- // pointer.
- //
- // IsTrue() silences warnings: "Condition is always true",
- // "unreachable code".
- if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
- // T is not a function type. We just call << to print p,
- // relying on ADL to pick up user-defined << for their pointer
- // types, if any.
- *os << p;
- } else {
- // T is a function type, so '*os << p' doesn't do what we want
- // (it just prints p as bool). We want to print p as a const
- // void*. However, we cannot cast it to const void* directly,
- // even using reinterpret_cast, as earlier versions of gcc
- // (e.g. 3.4.5) cannot compile the cast when p is a function
- // pointer. Casting to UInt64 first solves the problem.
- *os << reinterpret_cast<const void*>(
- reinterpret_cast<internal::UInt64>(p));
- }
- }
-}
-
-// Used to print a non-container, non-pointer value when the user
-// doesn't define PrintTo() for it.
-template <typename T>
-void DefaultPrintTo(IsNotContainer /* dummy */,
- false_type /* is not a pointer */,
- const T& value, ::std::ostream* os) {
- ::testing_internal::DefaultPrintNonContainerTo(value, os);
-}
-
-// Prints the given value using the << operator if it has one;
-// otherwise prints the bytes in it. This is what
-// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
-// or overloaded for type T.
-//
-// A user can override this behavior for a class type Foo by defining
-// an overload of PrintTo() in the namespace where Foo is defined. We
-// give the user this option as sometimes defining a << operator for
-// Foo is not desirable (e.g. the coding style may prevent doing it,
-// or there is already a << operator but it doesn't do what the user
-// wants).
-template <typename T>
-void PrintTo(const T& value, ::std::ostream* os) {
- // DefaultPrintTo() is overloaded. The type of its first two
- // arguments determine which version will be picked. If T is an
- // STL-style container, the version for container will be called; if
- // T is a pointer, the pointer version will be called; otherwise the
- // generic version will be called.
- //
- // Note that we check for container types here, prior to we check
- // for protocol message types in our operator<<. The rationale is:
- //
- // For protocol messages, we want to give people a chance to
- // override Google Mock's format by defining a PrintTo() or
- // operator<<. For STL containers, other formats can be
- // incompatible with Google Mock's format for the container
- // elements; therefore we check for container types here to ensure
- // that our format is used.
- //
- // The second argument of DefaultPrintTo() is needed to bypass a bug
- // in Symbian's C++ compiler that prevents it from picking the right
- // overload between:
- //
- // PrintTo(const T& x, ...);
- // PrintTo(T* x, ...);
- DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
-}
-
-// The following list of PrintTo() overloads tells
-// UniversalPrinter<T>::Print() how to print standard types (built-in
-// types, strings, plain arrays, and pointers).
-
-// Overloads for various char types.
-GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
-GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
-inline void PrintTo(char c, ::std::ostream* os) {
- // When printing a plain char, we always treat it as unsigned. This
- // way, the output won't be affected by whether the compiler thinks
- // char is signed or not.
- PrintTo(static_cast<unsigned char>(c), os);
-}
-
-// Overloads for other simple built-in types.
-inline void PrintTo(bool x, ::std::ostream* os) {
- *os << (x ? "true" : "false");
-}
-
-// Overload for wchar_t type.
-// Prints a wchar_t as a symbol if it is printable or as its internal
-// code otherwise and also as its decimal code (except for L'\0').
-// The L'\0' char is printed as "L'\\0'". The decimal code is printed
-// as signed integer when wchar_t is implemented by the compiler
-// as a signed type and is printed as an unsigned integer when wchar_t
-// is implemented as an unsigned type.
-GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
-
-// Overloads for C strings.
-GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
-inline void PrintTo(char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const char*>(s), os);
-}
-
-// signed/unsigned char is often used for representing binary data, so
-// we print pointers to it as void* to be safe.
-inline void PrintTo(const signed char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const void*>(s), os);
-}
-inline void PrintTo(signed char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const void*>(s), os);
-}
-inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const void*>(s), os);
-}
-inline void PrintTo(unsigned char* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const void*>(s), os);
-}
-
-// MSVC can be configured to define wchar_t as a typedef of unsigned
-// short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
-// type. When wchar_t is a typedef, defining an overload for const
-// wchar_t* would cause unsigned short* be printed as a wide string,
-// possibly causing invalid memory accesses.
-#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
-// Overloads for wide C strings
-GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
-inline void PrintTo(wchar_t* s, ::std::ostream* os) {
- PrintTo(ImplicitCast_<const wchar_t*>(s), os);
-}
-#endif
-
-// Overload for C arrays. Multi-dimensional arrays are printed
-// properly.
-
-// Prints the given number of elements in an array, without printing
-// the curly braces.
-template <typename T>
-void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
- UniversalPrint(a[0], os);
- for (size_t i = 1; i != count; i++) {
- *os << ", ";
- UniversalPrint(a[i], os);
- }
-}
-
-// Overloads for ::string and ::std::string.
-#if GTEST_HAS_GLOBAL_STRING
-GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
-inline void PrintTo(const ::string& s, ::std::ostream* os) {
- PrintStringTo(s, os);
-}
-#endif // GTEST_HAS_GLOBAL_STRING
-
-GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
-inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
- PrintStringTo(s, os);
-}
-
-// Overloads for ::wstring and ::std::wstring.
-#if GTEST_HAS_GLOBAL_WSTRING
-GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
-inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
- PrintWideStringTo(s, os);
-}
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
-#if GTEST_HAS_STD_WSTRING
-GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
-inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
- PrintWideStringTo(s, os);
-}
-#endif // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_TR1_TUPLE
-// Overload for ::std::tr1::tuple. Needed for printing function arguments,
-// which are packed as tuples.
-
-// Helper function for printing a tuple. T must be instantiated with
-// a tuple type.
-template <typename T>
-void PrintTupleTo(const T& t, ::std::ostream* os);
-
-// Overloaded PrintTo() for tuples of various arities. We support
-// tuples of up-to 10 fields. The following implementation works
-// regardless of whether tr1::tuple is implemented using the
-// non-standard variadic template feature or not.
-
-inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1>
-void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2>
-void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
- ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
- ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
- ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
- ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
- ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
-void PrintTo(
- const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
- ::std::ostream* os) {
- PrintTupleTo(t, os);
-}
-#endif // GTEST_HAS_TR1_TUPLE
-
-// Overload for std::pair.
-template <typename T1, typename T2>
-void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
- *os << '(';
- // We cannot use UniversalPrint(value.first, os) here, as T1 may be
- // a reference type. The same for printing value.second.
- UniversalPrinter<T1>::Print(value.first, os);
- *os << ", ";
- UniversalPrinter<T2>::Print(value.second, os);
- *os << ')';
-}
-
-// Implements printing a non-reference type T by letting the compiler
-// pick the right overload of PrintTo() for T.
-template <typename T>
-class UniversalPrinter {
- public:
- // MSVC warns about adding const to a function type, so we want to
- // disable the warning.
-#ifdef _MSC_VER
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4180) // Temporarily disables warning 4180.
-#endif // _MSC_VER
-
- // Note: we deliberately don't call this PrintTo(), as that name
- // conflicts with ::testing::internal::PrintTo in the body of the
- // function.
- static void Print(const T& value, ::std::ostream* os) {
- // By default, ::testing::internal::PrintTo() is used for printing
- // the value.
- //
- // Thanks to Koenig look-up, if T is a class and has its own
- // PrintTo() function defined in its namespace, that function will
- // be visible here. Since it is more specific than the generic ones
- // in ::testing::internal, it will be picked by the compiler in the
- // following statement - exactly what we want.
- PrintTo(value, os);
- }
-
-#ifdef _MSC_VER
-# pragma warning(pop) // Restores the warning state.
-#endif // _MSC_VER
-};
-
-// UniversalPrintArray(begin, len, os) prints an array of 'len'
-// elements, starting at address 'begin'.
-template <typename T>
-void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
- if (len == 0) {
- *os << "{}";
- } else {
- *os << "{ ";
- const size_t kThreshold = 18;
- const size_t kChunkSize = 8;
- // If the array has more than kThreshold elements, we'll have to
- // omit some details by printing only the first and the last
- // kChunkSize elements.
- // TODO(wan at google.com): let the user control the threshold using a flag.
- if (len <= kThreshold) {
- PrintRawArrayTo(begin, len, os);
- } else {
- PrintRawArrayTo(begin, kChunkSize, os);
- *os << ", ..., ";
- PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
- }
- *os << " }";
- }
-}
-// This overload prints a (const) char array compactly.
-GTEST_API_ void UniversalPrintArray(const char* begin,
- size_t len,
- ::std::ostream* os);
-
-// Implements printing an array type T[N].
-template <typename T, size_t N>
-class UniversalPrinter<T[N]> {
- public:
- // Prints the given array, omitting some elements when there are too
- // many.
- static void Print(const T (&a)[N], ::std::ostream* os) {
- UniversalPrintArray(a, N, os);
- }
-};
-
-// Implements printing a reference type T&.
-template <typename T>
-class UniversalPrinter<T&> {
- public:
- // MSVC warns about adding const to a function type, so we want to
- // disable the warning.
-#ifdef _MSC_VER
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4180) // Temporarily disables warning 4180.
-#endif // _MSC_VER
-
- static void Print(const T& value, ::std::ostream* os) {
- // Prints the address of the value. We use reinterpret_cast here
- // as static_cast doesn't compile when T is a function type.
- *os << "@" << reinterpret_cast<const void*>(&value) << " ";
-
- // Then prints the value itself.
- UniversalPrint(value, os);
- }
-
-#ifdef _MSC_VER
-# pragma warning(pop) // Restores the warning state.
-#endif // _MSC_VER
-};
-
-// Prints a value tersely: for a reference type, the referenced value
-// (but not the address) is printed; for a (const) char pointer, the
-// NUL-terminated string (but not the pointer) is printed.
-template <typename T>
-void UniversalTersePrint(const T& value, ::std::ostream* os) {
- UniversalPrint(value, os);
-}
-inline void UniversalTersePrint(const char* str, ::std::ostream* os) {
- if (str == NULL) {
- *os << "NULL";
- } else {
- UniversalPrint(string(str), os);
- }
-}
-inline void UniversalTersePrint(char* str, ::std::ostream* os) {
- UniversalTersePrint(static_cast<const char*>(str), os);
-}
-
-// Prints a value using the type inferred by the compiler. The
-// difference between this and UniversalTersePrint() is that for a
-// (const) char pointer, this prints both the pointer and the
-// NUL-terminated string.
-template <typename T>
-void UniversalPrint(const T& value, ::std::ostream* os) {
- UniversalPrinter<T>::Print(value, os);
-}
-
-#if GTEST_HAS_TR1_TUPLE
-typedef ::std::vector<string> Strings;
-
-// This helper template allows PrintTo() for tuples and
-// UniversalTersePrintTupleFieldsToStrings() to be defined by
-// induction on the number of tuple fields. The idea is that
-// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
-// fields in tuple t, and can be defined in terms of
-// TuplePrefixPrinter<N - 1>.
-
-// The inductive case.
-template <size_t N>
-struct TuplePrefixPrinter {
- // Prints the first N fields of a tuple.
- template <typename Tuple>
- static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
- TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
- *os << ", ";
- UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
- ::Print(::std::tr1::get<N - 1>(t), os);
- }
-
- // Tersely prints the first N fields of a tuple to a string vector,
- // one element for each field.
- template <typename Tuple>
- static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
- TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
- ::std::stringstream ss;
- UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
- strings->push_back(ss.str());
- }
-};
-
-// Base cases.
-template <>
-struct TuplePrefixPrinter<0> {
- template <typename Tuple>
- static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
-
- template <typename Tuple>
- static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
-};
-// We have to specialize the entire TuplePrefixPrinter<> class
-// template here, even though the definition of
-// TersePrintPrefixToStrings() is the same as the generic version, as
-// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
-// support specializing a method template of a class template.
-template <>
-struct TuplePrefixPrinter<1> {
- template <typename Tuple>
- static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
- UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
- Print(::std::tr1::get<0>(t), os);
- }
-
- template <typename Tuple>
- static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
- ::std::stringstream ss;
- UniversalTersePrint(::std::tr1::get<0>(t), &ss);
- strings->push_back(ss.str());
- }
-};
-
-// Helper function for printing a tuple. T must be instantiated with
-// a tuple type.
-template <typename T>
-void PrintTupleTo(const T& t, ::std::ostream* os) {
- *os << "(";
- TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
- PrintPrefixTo(t, os);
- *os << ")";
-}
-
-// Prints the fields of a tuple tersely to a string vector, one
-// element for each field. See the comment before
-// UniversalTersePrint() for how we define "tersely".
-template <typename Tuple>
-Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
- Strings result;
- TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
- TersePrintPrefixToStrings(value, &result);
- return result;
-}
-#endif // GTEST_HAS_TR1_TUPLE
-
-} // namespace internal
-
-template <typename T>
-::std::string PrintToString(const T& value) {
- ::std::stringstream ss;
- internal::UniversalTersePrint(value, &ss);
- return ss.str();
-}
-
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-spi.h b/unit_tests/gtest/include/gtest/gtest-spi.h
deleted file mode 100644
index b226e55..0000000
--- a/unit_tests/gtest/include/gtest/gtest-spi.h
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2007, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// Utilities for testing Google Test itself and code that uses Google Test
-// (e.g. frameworks built on top of Google Test).
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
-#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
-
-#include "gtest/gtest.h"
-
-namespace testing {
-
-// This helper class can be used to mock out Google Test failure reporting
-// so that we can test Google Test or code that builds on Google Test.
-//
-// An object of this class appends a TestPartResult object to the
-// TestPartResultArray object given in the constructor whenever a Google Test
-// failure is reported. It can either intercept only failures that are
-// generated in the same thread that created this object or it can intercept
-// all generated failures. The scope of this mock object can be controlled with
-// the second argument to the two arguments constructor.
-class GTEST_API_ ScopedFakeTestPartResultReporter
- : public TestPartResultReporterInterface {
- public:
- // The two possible mocking modes of this object.
- enum InterceptMode {
- INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures.
- INTERCEPT_ALL_THREADS // Intercepts all failures.
- };
-
- // The c'tor sets this object as the test part result reporter used
- // by Google Test. The 'result' parameter specifies where to report the
- // results. This reporter will only catch failures generated in the current
- // thread. DEPRECATED
- explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
-
- // Same as above, but you can choose the interception scope of this object.
- ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
- TestPartResultArray* result);
-
- // The d'tor restores the previous test part result reporter.
- virtual ~ScopedFakeTestPartResultReporter();
-
- // Appends the TestPartResult object to the TestPartResultArray
- // received in the constructor.
- //
- // This method is from the TestPartResultReporterInterface
- // interface.
- virtual void ReportTestPartResult(const TestPartResult& result);
- private:
- void Init();
-
- const InterceptMode intercept_mode_;
- TestPartResultReporterInterface* old_reporter_;
- TestPartResultArray* const result_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
-};
-
-namespace internal {
-
-// A helper class for implementing EXPECT_FATAL_FAILURE() and
-// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given
-// TestPartResultArray contains exactly one failure that has the given
-// type and contains the given substring. If that's not the case, a
-// non-fatal failure will be generated.
-class GTEST_API_ SingleFailureChecker {
- public:
- // The constructor remembers the arguments.
- SingleFailureChecker(const TestPartResultArray* results,
- TestPartResult::Type type,
- const string& substr);
- ~SingleFailureChecker();
- private:
- const TestPartResultArray* const results_;
- const TestPartResult::Type type_;
- const string substr_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
-};
-
-} // namespace internal
-
-} // namespace testing
-
-// A set of macros for testing Google Test assertions or code that's expected
-// to generate Google Test fatal failures. It verifies that the given
-// statement will cause exactly one fatal Google Test failure with 'substr'
-// being part of the failure message.
-//
-// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
-// affects and considers failures generated in the current thread and
-// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
-//
-// The verification of the assertion is done correctly even when the statement
-// throws an exception or aborts the current function.
-//
-// Known restrictions:
-// - 'statement' cannot reference local non-static variables or
-// non-static members of the current object.
-// - 'statement' cannot return a value.
-// - You cannot stream a failure message to this macro.
-//
-// Note that even though the implementations of the following two
-// macros are much alike, we cannot refactor them to use a common
-// helper macro, due to some peculiarity in how the preprocessor
-// works. The AcceptsMacroThatExpandsToUnprotectedComma test in
-// gtest_unittest.cc will fail to compile if we do that.
-#define EXPECT_FATAL_FAILURE(statement, substr) \
- do { \
- class GTestExpectFatalFailureHelper {\
- public:\
- static void Execute() { statement; }\
- };\
- ::testing::TestPartResultArray gtest_failures;\
- ::testing::internal::SingleFailureChecker gtest_checker(\
- >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
- {\
- ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
- ::testing::ScopedFakeTestPartResultReporter:: \
- INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
- GTestExpectFatalFailureHelper::Execute();\
- }\
- } while (::testing::internal::AlwaysFalse())
-
-#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
- do { \
- class GTestExpectFatalFailureHelper {\
- public:\
- static void Execute() { statement; }\
- };\
- ::testing::TestPartResultArray gtest_failures;\
- ::testing::internal::SingleFailureChecker gtest_checker(\
- >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
- {\
- ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
- ::testing::ScopedFakeTestPartResultReporter:: \
- INTERCEPT_ALL_THREADS, >est_failures);\
- GTestExpectFatalFailureHelper::Execute();\
- }\
- } while (::testing::internal::AlwaysFalse())
-
-// A macro for testing Google Test assertions or code that's expected to
-// generate Google Test non-fatal failures. It asserts that the given
-// statement will cause exactly one non-fatal Google Test failure with 'substr'
-// being part of the failure message.
-//
-// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
-// affects and considers failures generated in the current thread and
-// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
-//
-// 'statement' is allowed to reference local variables and members of
-// the current object.
-//
-// The verification of the assertion is done correctly even when the statement
-// throws an exception or aborts the current function.
-//
-// Known restrictions:
-// - You cannot stream a failure message to this macro.
-//
-// Note that even though the implementations of the following two
-// macros are much alike, we cannot refactor them to use a common
-// helper macro, due to some peculiarity in how the preprocessor
-// works. If we do that, the code won't compile when the user gives
-// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
-// expands to code containing an unprotected comma. The
-// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
-// catches that.
-//
-// For the same reason, we have to write
-// if (::testing::internal::AlwaysTrue()) { statement; }
-// instead of
-// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
-// to avoid an MSVC warning on unreachable code.
-#define EXPECT_NONFATAL_FAILURE(statement, substr) \
- do {\
- ::testing::TestPartResultArray gtest_failures;\
- ::testing::internal::SingleFailureChecker gtest_checker(\
- >est_failures, ::testing::TestPartResult::kNonFatalFailure, \
- (substr));\
- {\
- ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
- ::testing::ScopedFakeTestPartResultReporter:: \
- INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
- if (::testing::internal::AlwaysTrue()) { statement; }\
- }\
- } while (::testing::internal::AlwaysFalse())
-
-#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
- do {\
- ::testing::TestPartResultArray gtest_failures;\
- ::testing::internal::SingleFailureChecker gtest_checker(\
- >est_failures, ::testing::TestPartResult::kNonFatalFailure, \
- (substr));\
- {\
- ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
- ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\
- >est_failures);\
- if (::testing::internal::AlwaysTrue()) { statement; }\
- }\
- } while (::testing::internal::AlwaysFalse())
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-test-part.h b/unit_tests/gtest/include/gtest/gtest-test-part.h
deleted file mode 100644
index 8aeea14..0000000
--- a/unit_tests/gtest/include/gtest/gtest-test-part.h
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: mheule at google.com (Markus Heule)
-//
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
-#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
-
-#include <iosfwd>
-#include <vector>
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-string.h"
-
-namespace testing {
-
-// A copyable object representing the result of a test part (i.e. an
-// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
-//
-// Don't inherit from TestPartResult as its destructor is not virtual.
-class GTEST_API_ TestPartResult {
- public:
- // The possible outcomes of a test part (i.e. an assertion or an
- // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
- enum Type {
- kSuccess, // Succeeded.
- kNonFatalFailure, // Failed but the test can continue.
- kFatalFailure // Failed and the test should be terminated.
- };
-
- // C'tor. TestPartResult does NOT have a default constructor.
- // Always use this constructor (with parameters) to create a
- // TestPartResult object.
- TestPartResult(Type a_type,
- const char* a_file_name,
- int a_line_number,
- const char* a_message)
- : type_(a_type),
- file_name_(a_file_name),
- line_number_(a_line_number),
- summary_(ExtractSummary(a_message)),
- message_(a_message) {
- }
-
- // Gets the outcome of the test part.
- Type type() const { return type_; }
-
- // Gets the name of the source file where the test part took place, or
- // NULL if it's unknown.
- const char* file_name() const { return file_name_.c_str(); }
-
- // Gets the line in the source file where the test part took place,
- // or -1 if it's unknown.
- int line_number() const { return line_number_; }
-
- // Gets the summary of the failure message.
- const char* summary() const { return summary_.c_str(); }
-
- // Gets the message associated with the test part.
- const char* message() const { return message_.c_str(); }
-
- // Returns true iff the test part passed.
- bool passed() const { return type_ == kSuccess; }
-
- // Returns true iff the test part failed.
- bool failed() const { return type_ != kSuccess; }
-
- // Returns true iff the test part non-fatally failed.
- bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
-
- // Returns true iff the test part fatally failed.
- bool fatally_failed() const { return type_ == kFatalFailure; }
- private:
- Type type_;
-
- // Gets the summary of the failure message by omitting the stack
- // trace in it.
- static internal::String ExtractSummary(const char* message);
-
- // The name of the source file where the test part took place, or
- // NULL if the source file is unknown.
- internal::String file_name_;
- // The line in the source file where the test part took place, or -1
- // if the line number is unknown.
- int line_number_;
- internal::String summary_; // The test failure summary.
- internal::String message_; // The test failure message.
-};
-
-// Prints a TestPartResult object.
-std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
-
-// An array of TestPartResult objects.
-//
-// Don't inherit from TestPartResultArray as its destructor is not
-// virtual.
-class GTEST_API_ TestPartResultArray {
- public:
- TestPartResultArray() {}
-
- // Appends the given TestPartResult to the array.
- void Append(const TestPartResult& result);
-
- // Returns the TestPartResult at the given index (0-based).
- const TestPartResult& GetTestPartResult(int index) const;
-
- // Returns the number of TestPartResult objects in the array.
- int size() const;
-
- private:
- std::vector<TestPartResult> array_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
-};
-
-// This interface knows how to report a test part result.
-class TestPartResultReporterInterface {
- public:
- virtual ~TestPartResultReporterInterface() {}
-
- virtual void ReportTestPartResult(const TestPartResult& result) = 0;
-};
-
-namespace internal {
-
-// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
-// statement generates new fatal failures. To do so it registers itself as the
-// current test part result reporter. Besides checking if fatal failures were
-// reported, it only delegates the reporting to the former result reporter.
-// The original result reporter is restored in the destructor.
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-class GTEST_API_ HasNewFatalFailureHelper
- : public TestPartResultReporterInterface {
- public:
- HasNewFatalFailureHelper();
- virtual ~HasNewFatalFailureHelper();
- virtual void ReportTestPartResult(const TestPartResult& result);
- bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
- private:
- bool has_new_fatal_failure_;
- TestPartResultReporterInterface* original_reporter_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
-};
-
-} // namespace internal
-
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
diff --git a/unit_tests/gtest/include/gtest/gtest-typed-test.h b/unit_tests/gtest/include/gtest/gtest-typed-test.h
deleted file mode 100644
index fe1e83b..0000000
--- a/unit_tests/gtest/include/gtest/gtest-typed-test.h
+++ /dev/null
@@ -1,259 +0,0 @@
-// Copyright 2008 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
-#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
-
-// This header implements typed tests and type-parameterized tests.
-
-// Typed (aka type-driven) tests repeat the same test for types in a
-// list. You must know which types you want to test with when writing
-// typed tests. Here's how you do it:
-
-#if 0
-
-// First, define a fixture class template. It should be parameterized
-// by a type. Remember to derive it from testing::Test.
-template <typename T>
-class FooTest : public testing::Test {
- public:
- ...
- typedef std::list<T> List;
- static T shared_;
- T value_;
-};
-
-// Next, associate a list of types with the test case, which will be
-// repeated for each type in the list. The typedef is necessary for
-// the macro to parse correctly.
-typedef testing::Types<char, int, unsigned int> MyTypes;
-TYPED_TEST_CASE(FooTest, MyTypes);
-
-// If the type list contains only one type, you can write that type
-// directly without Types<...>:
-// TYPED_TEST_CASE(FooTest, int);
-
-// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
-// tests for this test case as you want.
-TYPED_TEST(FooTest, DoesBlah) {
- // Inside a test, refer to TypeParam to get the type parameter.
- // Since we are inside a derived class template, C++ requires use to
- // visit the members of FooTest via 'this'.
- TypeParam n = this->value_;
-
- // To visit static members of the fixture, add the TestFixture::
- // prefix.
- n += TestFixture::shared_;
-
- // To refer to typedefs in the fixture, add the "typename
- // TestFixture::" prefix.
- typename TestFixture::List values;
- values.push_back(n);
- ...
-}
-
-TYPED_TEST(FooTest, HasPropertyA) { ... }
-
-#endif // 0
-
-// Type-parameterized tests are abstract test patterns parameterized
-// by a type. Compared with typed tests, type-parameterized tests
-// allow you to define the test pattern without knowing what the type
-// parameters are. The defined pattern can be instantiated with
-// different types any number of times, in any number of translation
-// units.
-//
-// If you are designing an interface or concept, you can define a
-// suite of type-parameterized tests to verify properties that any
-// valid implementation of the interface/concept should have. Then,
-// each implementation can easily instantiate the test suite to verify
-// that it conforms to the requirements, without having to write
-// similar tests repeatedly. Here's an example:
-
-#if 0
-
-// First, define a fixture class template. It should be parameterized
-// by a type. Remember to derive it from testing::Test.
-template <typename T>
-class FooTest : public testing::Test {
- ...
-};
-
-// Next, declare that you will define a type-parameterized test case
-// (the _P suffix is for "parameterized" or "pattern", whichever you
-// prefer):
-TYPED_TEST_CASE_P(FooTest);
-
-// Then, use TYPED_TEST_P() to define as many type-parameterized tests
-// for this type-parameterized test case as you want.
-TYPED_TEST_P(FooTest, DoesBlah) {
- // Inside a test, refer to TypeParam to get the type parameter.
- TypeParam n = 0;
- ...
-}
-
-TYPED_TEST_P(FooTest, HasPropertyA) { ... }
-
-// Now the tricky part: you need to register all test patterns before
-// you can instantiate them. The first argument of the macro is the
-// test case name; the rest are the names of the tests in this test
-// case.
-REGISTER_TYPED_TEST_CASE_P(FooTest,
- DoesBlah, HasPropertyA);
-
-// Finally, you are free to instantiate the pattern with the types you
-// want. If you put the above code in a header file, you can #include
-// it in multiple C++ source files and instantiate it multiple times.
-//
-// To distinguish different instances of the pattern, the first
-// argument to the INSTANTIATE_* macro is a prefix that will be added
-// to the actual test case name. Remember to pick unique prefixes for
-// different instances.
-typedef testing::Types<char, int, unsigned int> MyTypes;
-INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
-
-// If the type list contains only one type, you can write that type
-// directly without Types<...>:
-// INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
-
-#endif // 0
-
-#include "gtest/internal/gtest-port.h"
-#include "gtest/internal/gtest-type-util.h"
-
-// Implements typed tests.
-
-#if GTEST_HAS_TYPED_TEST
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Expands to the name of the typedef for the type parameters of the
-// given test case.
-# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
-
-// The 'Types' template argument below must have spaces around it
-// since some compilers may choke on '>>' when passing a template
-// instance (e.g. Types<int>)
-# define TYPED_TEST_CASE(CaseName, Types) \
- typedef ::testing::internal::TypeList< Types >::type \
- GTEST_TYPE_PARAMS_(CaseName)
-
-# define TYPED_TEST(CaseName, TestName) \
- template <typename gtest_TypeParam_> \
- class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
- : public CaseName<gtest_TypeParam_> { \
- private: \
- typedef CaseName<gtest_TypeParam_> TestFixture; \
- typedef gtest_TypeParam_ TypeParam; \
- virtual void TestBody(); \
- }; \
- bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
- ::testing::internal::TypeParameterizedTest< \
- CaseName, \
- ::testing::internal::TemplateSel< \
- GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
- GTEST_TYPE_PARAMS_(CaseName)>::Register(\
- "", #CaseName, #TestName, 0); \
- template <typename gtest_TypeParam_> \
- void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
-
-#endif // GTEST_HAS_TYPED_TEST
-
-// Implements type-parameterized tests.
-
-#if GTEST_HAS_TYPED_TEST_P
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Expands to the namespace name that the type-parameterized tests for
-// the given type-parameterized test case are defined in. The exact
-// name of the namespace is subject to change without notice.
-# define GTEST_CASE_NAMESPACE_(TestCaseName) \
- gtest_case_##TestCaseName##_
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Expands to the name of the variable used to remember the names of
-// the defined tests in the given test case.
-# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
- gtest_typed_test_case_p_state_##TestCaseName##_
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
-//
-// Expands to the name of the variable used to remember the names of
-// the registered tests in the given test case.
-# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
- gtest_registered_test_names_##TestCaseName##_
-
-// The variables defined in the type-parameterized test macros are
-// static as typically these macros are used in a .h file that can be
-// #included in multiple translation units linked together.
-# define TYPED_TEST_CASE_P(CaseName) \
- static ::testing::internal::TypedTestCasePState \
- GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
-
-# define TYPED_TEST_P(CaseName, TestName) \
- namespace GTEST_CASE_NAMESPACE_(CaseName) { \
- template <typename gtest_TypeParam_> \
- class TestName : public CaseName<gtest_TypeParam_> { \
- private: \
- typedef CaseName<gtest_TypeParam_> TestFixture; \
- typedef gtest_TypeParam_ TypeParam; \
- virtual void TestBody(); \
- }; \
- static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
- GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
- __FILE__, __LINE__, #CaseName, #TestName); \
- } \
- template <typename gtest_TypeParam_> \
- void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
-
-# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
- namespace GTEST_CASE_NAMESPACE_(CaseName) { \
- typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
- } \
- static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
- GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
- __FILE__, __LINE__, #__VA_ARGS__)
-
-// The 'Types' template argument below must have spaces around it
-// since some compilers may choke on '>>' when passing a template
-// instance (e.g. Types<int>)
-# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
- bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
- ::testing::internal::TypeParameterizedTestCase<CaseName, \
- GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
- ::testing::internal::TypeList< Types >::type>::Register(\
- #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
-
-#endif // GTEST_HAS_TYPED_TEST_P
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
diff --git a/unit_tests/gtest/include/gtest/gtest.h b/unit_tests/gtest/include/gtest/gtest.h
deleted file mode 100644
index cd01c7b..0000000
--- a/unit_tests/gtest/include/gtest/gtest.h
+++ /dev/null
@@ -1,2155 +0,0 @@
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file defines the public API for Google Test. It should be
-// included by any test program that uses Google Test.
-//
-// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
-// leave some internal implementation details in this header file.
-// They are clearly marked by comments like this:
-//
-// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-//
-// Such code is NOT meant to be used by a user directly, and is subject
-// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user
-// program!
-//
-// Acknowledgment: Google Test borrowed the idea of automatic test
-// registration from Barthelemy Dagenais' (barthelemy at prologique.com)
-// easyUnit framework.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
-#define GTEST_INCLUDE_GTEST_GTEST_H_
-
-#include <limits>
-#include <vector>
-
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-string.h"
-#include "gtest/gtest-death-test.h"
-#include "gtest/gtest-message.h"
-#include "gtest/gtest-param-test.h"
-#include "gtest/gtest-printers.h"
-#include "gtest/gtest_prod.h"
-#include "gtest/gtest-test-part.h"
-#include "gtest/gtest-typed-test.h"
-
-// Depending on the platform, different string classes are available.
-// On Linux, in addition to ::std::string, Google also makes use of
-// class ::string, which has the same interface as ::std::string, but
-// has a different implementation.
-//
-// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
-// ::string is available AND is a distinct type to ::std::string, or
-// define it to 0 to indicate otherwise.
-//
-// If the user's ::std::string and ::string are the same class due to
-// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
-//
-// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
-// heuristically.
-
-namespace testing {
-
-// Declares the flags.
-
-// This flag temporary enables the disabled tests.
-GTEST_DECLARE_bool_(also_run_disabled_tests);
-
-// This flag brings the debugger on an assertion failure.
-GTEST_DECLARE_bool_(break_on_failure);
-
-// This flag controls whether Google Test catches all test-thrown exceptions
-// and logs them as failures.
-GTEST_DECLARE_bool_(catch_exceptions);
-
-// This flag enables using colors in terminal output. Available values are
-// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
-// to let Google Test decide.
-GTEST_DECLARE_string_(color);
-
-// This flag sets up the filter to select by name using a glob pattern
-// the tests to run. If the filter is not given all tests are executed.
-GTEST_DECLARE_string_(filter);
-
-// This flag causes the Google Test to list tests. None of the tests listed
-// are actually run if the flag is provided.
-GTEST_DECLARE_bool_(list_tests);
-
-// This flag controls whether Google Test emits a detailed XML report to a file
-// in addition to its normal textual output.
-GTEST_DECLARE_string_(output);
-
-// This flags control whether Google Test prints the elapsed time for each
-// test.
-GTEST_DECLARE_bool_(print_time);
-
-// This flag specifies the random number seed.
-GTEST_DECLARE_int32_(random_seed);
-
-// This flag sets how many times the tests are repeated. The default value
-// is 1. If the value is -1 the tests are repeating forever.
-GTEST_DECLARE_int32_(repeat);
-
-// This flag controls whether Google Test includes Google Test internal
-// stack frames in failure stack traces.
-GTEST_DECLARE_bool_(show_internal_stack_frames);
-
-// When this flag is specified, tests' order is randomized on every iteration.
-GTEST_DECLARE_bool_(shuffle);
-
-// This flag specifies the maximum number of stack frames to be
-// printed in a failure message.
-GTEST_DECLARE_int32_(stack_trace_depth);
-
-// When this flag is specified, a failed assertion will throw an
-// exception if exceptions are enabled, or exit the program with a
-// non-zero code otherwise.
-GTEST_DECLARE_bool_(throw_on_failure);
-
-// When this flag is set with a "host:port" string, on supported
-// platforms test results are streamed to the specified port on
-// the specified host machine.
-GTEST_DECLARE_string_(stream_result_to);
-
-// The upper limit for valid stack trace depths.
-const int kMaxStackTraceDepth = 100;
-
-namespace internal {
-
-class AssertHelper;
-class DefaultGlobalTestPartResultReporter;
-class ExecDeathTest;
-class NoExecDeathTest;
-class FinalSuccessChecker;
-class GTestFlagSaver;
-class TestResultAccessor;
-class TestEventListenersAccessor;
-class TestEventRepeater;
-class WindowsDeathTest;
-class UnitTestImpl* GetUnitTestImpl();
-void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
- const String& message);
-
-// Converts a streamable value to a String. A NULL pointer is
-// converted to "(null)". When the input value is a ::string,
-// ::std::string, ::wstring, or ::std::wstring object, each NUL
-// character in it is replaced with "\\0".
-// Declared in gtest-internal.h but defined here, so that it has access
-// to the definition of the Message class, required by the ARM
-// compiler.
-template <typename T>
-String StreamableToString(const T& streamable) {
- return (Message() << streamable).GetString();
-}
-
-} // namespace internal
-
-// The friend relationship of some of these classes is cyclic.
-// If we don't forward declare them the compiler might confuse the classes
-// in friendship clauses with same named classes on the scope.
-class Test;
-class TestCase;
-class TestInfo;
-class UnitTest;
-
-// A class for indicating whether an assertion was successful. When
-// the assertion wasn't successful, the AssertionResult object
-// remembers a non-empty message that describes how it failed.
-//
-// To create an instance of this class, use one of the factory functions
-// (AssertionSuccess() and AssertionFailure()).
-//
-// This class is useful for two purposes:
-// 1. Defining predicate functions to be used with Boolean test assertions
-// EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
-// 2. Defining predicate-format functions to be
-// used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
-//
-// For example, if you define IsEven predicate:
-//
-// testing::AssertionResult IsEven(int n) {
-// if ((n % 2) == 0)
-// return testing::AssertionSuccess();
-// else
-// return testing::AssertionFailure() << n << " is odd";
-// }
-//
-// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
-// will print the message
-//
-// Value of: IsEven(Fib(5))
-// Actual: false (5 is odd)
-// Expected: true
-//
-// instead of a more opaque
-//
-// Value of: IsEven(Fib(5))
-// Actual: false
-// Expected: true
-//
-// in case IsEven is a simple Boolean predicate.
-//
-// If you expect your predicate to be reused and want to support informative
-// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
-// about half as often as positive ones in our tests), supply messages for
-// both success and failure cases:
-//
-// testing::AssertionResult IsEven(int n) {
-// if ((n % 2) == 0)
-// return testing::AssertionSuccess() << n << " is even";
-// else
-// return testing::AssertionFailure() << n << " is odd";
-// }
-//
-// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
-//
-// Value of: IsEven(Fib(6))
-// Actual: true (8 is even)
-// Expected: false
-//
-// NB: Predicates that support negative Boolean assertions have reduced
-// performance in positive ones so be careful not to use them in tests
-// that have lots (tens of thousands) of positive Boolean assertions.
-//
-// To use this class with EXPECT_PRED_FORMAT assertions such as:
-//
-// // Verifies that Foo() returns an even number.
-// EXPECT_PRED_FORMAT1(IsEven, Foo());
-//
-// you need to define:
-//
-// testing::AssertionResult IsEven(const char* expr, int n) {
-// if ((n % 2) == 0)
-// return testing::AssertionSuccess();
-// else
-// return testing::AssertionFailure()
-// << "Expected: " << expr << " is even\n Actual: it's " << n;
-// }
-//
-// If Foo() returns 5, you will see the following message:
-//
-// Expected: Foo() is even
-// Actual: it's 5
-//
-class GTEST_API_ AssertionResult {
- public:
- // Copy constructor.
- // Used in EXPECT_TRUE/FALSE(assertion_result).
- AssertionResult(const AssertionResult& other);
- // Used in the EXPECT_TRUE/FALSE(bool_expression).
- explicit AssertionResult(bool success) : success_(success) {}
-
- // Returns true iff the assertion succeeded.
- operator bool() const { return success_; } // NOLINT
-
- // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
- AssertionResult operator!() const;
-
- // Returns the text streamed into this AssertionResult. Test assertions
- // use it when they fail (i.e., the predicate's outcome doesn't match the
- // assertion's expectation). When nothing has been streamed into the
- // object, returns an empty string.
- const char* message() const {
- return message_.get() != NULL ? message_->c_str() : "";
- }
- // TODO(vladl at google.com): Remove this after making sure no clients use it.
- // Deprecated; please use message() instead.
- const char* failure_message() const { return message(); }
-
- // Streams a custom failure message into this object.
- template <typename T> AssertionResult& operator<<(const T& value) {
- AppendMessage(Message() << value);
- return *this;
- }
-
- // Allows streaming basic output manipulators such as endl or flush into
- // this object.
- AssertionResult& operator<<(
- ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
- AppendMessage(Message() << basic_manipulator);
- return *this;
- }
-
- private:
- // Appends the contents of message to message_.
- void AppendMessage(const Message& a_message) {
- if (message_.get() == NULL)
- message_.reset(new ::std::string);
- message_->append(a_message.GetString().c_str());
- }
-
- // Stores result of the assertion predicate.
- bool success_;
- // Stores the message describing the condition in case the expectation
- // construct is not satisfied with the predicate's outcome.
- // Referenced via a pointer to avoid taking too much stack frame space
- // with test assertions.
- internal::scoped_ptr< ::std::string> message_;
-
- GTEST_DISALLOW_ASSIGN_(AssertionResult);
-};
-
-// Makes a successful assertion result.
-GTEST_API_ AssertionResult AssertionSuccess();
-
-// Makes a failed assertion result.
-GTEST_API_ AssertionResult AssertionFailure();
-
-// Makes a failed assertion result with the given failure message.
-// Deprecated; use AssertionFailure() << msg.
-GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
-
-// The abstract class that all tests inherit from.
-//
-// In Google Test, a unit test program contains one or many TestCases, and
-// each TestCase contains one or many Tests.
-//
-// When you define a test using the TEST macro, you don't need to
-// explicitly derive from Test - the TEST macro automatically does
-// this for you.
-//
-// The only time you derive from Test is when defining a test fixture
-// to be used a TEST_F. For example:
-//
-// class FooTest : public testing::Test {
-// protected:
-// virtual void SetUp() { ... }
-// virtual void TearDown() { ... }
-// ...
-// };
-//
-// TEST_F(FooTest, Bar) { ... }
-// TEST_F(FooTest, Baz) { ... }
-//
-// Test is not copyable.
-class GTEST_API_ Test {
- public:
- friend class TestInfo;
-
- // Defines types for pointers to functions that set up and tear down
- // a test case.
- typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
- typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
-
- // The d'tor is virtual as we intend to inherit from Test.
- virtual ~Test();
-
- // Sets up the stuff shared by all tests in this test case.
- //
- // Google Test will call Foo::SetUpTestCase() before running the first
- // test in test case Foo. Hence a sub-class can define its own
- // SetUpTestCase() method to shadow the one defined in the super
- // class.
- static void SetUpTestCase() {}
-
- // Tears down the stuff shared by all tests in this test case.
- //
- // Google Test will call Foo::TearDownTestCase() after running the last
- // test in test case Foo. Hence a sub-class can define its own
- // TearDownTestCase() method to shadow the one defined in the super
- // class.
- static void TearDownTestCase() {}
-
- // Returns true iff the current test has a fatal failure.
- static bool HasFatalFailure();
-
- // Returns true iff the current test has a non-fatal failure.
- static bool HasNonfatalFailure();
-
- // Returns true iff the current test has a (either fatal or
- // non-fatal) failure.
- static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
-
- // Logs a property for the current test. Only the last value for a given
- // key is remembered.
- // These are public static so they can be called from utility functions
- // that are not members of the test fixture.
- // The arguments are const char* instead strings, as Google Test is used
- // on platforms where string doesn't compile.
- //
- // Note that a driving consideration for these RecordProperty methods
- // was to produce xml output suited to the Greenspan charting utility,
- // which at present will only chart values that fit in a 32-bit int. It
- // is the user's responsibility to restrict their values to 32-bit ints
- // if they intend them to be used with Greenspan.
- static void RecordProperty(const char* key, const char* value);
- static void RecordProperty(const char* key, int value);
-
- protected:
- // Creates a Test object.
- Test();
-
- // Sets up the test fixture.
- virtual void SetUp();
-
- // Tears down the test fixture.
- virtual void TearDown();
-
- private:
- // Returns true iff the current test has the same fixture class as
- // the first test in the current test case.
- static bool HasSameFixtureClass();
-
- // Runs the test after the test fixture has been set up.
- //
- // A sub-class must implement this to define the test logic.
- //
- // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
- // Instead, use the TEST or TEST_F macro.
- virtual void TestBody() = 0;
-
- // Sets up, executes, and tears down the test.
- void Run();
-
- // Deletes self. We deliberately pick an unusual name for this
- // internal method to avoid clashing with names used in user TESTs.
- void DeleteSelf_() { delete this; }
-
- // Uses a GTestFlagSaver to save and restore all Google Test flags.
- const internal::GTestFlagSaver* const gtest_flag_saver_;
-
- // Often a user mis-spells SetUp() as Setup() and spends a long time
- // wondering why it is never called by Google Test. The declaration of
- // the following method is solely for catching such an error at
- // compile time:
- //
- // - The return type is deliberately chosen to be not void, so it
- // will be a conflict if a user declares void Setup() in his test
- // fixture.
- //
- // - This method is private, so it will be another compiler error
- // if a user calls it from his test fixture.
- //
- // DO NOT OVERRIDE THIS FUNCTION.
- //
- // If you see an error about overriding the following function or
- // about it being private, you have mis-spelled SetUp() as Setup().
- struct Setup_should_be_spelled_SetUp {};
- virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
-
- // We disallow copying Tests.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
-};
-
-typedef internal::TimeInMillis TimeInMillis;
-
-// A copyable object representing a user specified test property which can be
-// output as a key/value string pair.
-//
-// Don't inherit from TestProperty as its destructor is not virtual.
-class TestProperty {
- public:
- // C'tor. TestProperty does NOT have a default constructor.
- // Always use this constructor (with parameters) to create a
- // TestProperty object.
- TestProperty(const char* a_key, const char* a_value) :
- key_(a_key), value_(a_value) {
- }
-
- // Gets the user supplied key.
- const char* key() const {
- return key_.c_str();
- }
-
- // Gets the user supplied value.
- const char* value() const {
- return value_.c_str();
- }
-
- // Sets a new value, overriding the one supplied in the constructor.
- void SetValue(const char* new_value) {
- value_ = new_value;
- }
-
- private:
- // The key supplied by the user.
- internal::String key_;
- // The value supplied by the user.
- internal::String value_;
-};
-
-// The result of a single Test. This includes a list of
-// TestPartResults, a list of TestProperties, a count of how many
-// death tests there are in the Test, and how much time it took to run
-// the Test.
-//
-// TestResult is not copyable.
-class GTEST_API_ TestResult {
- public:
- // Creates an empty TestResult.
- TestResult();
-
- // D'tor. Do not inherit from TestResult.
- ~TestResult();
-
- // Gets the number of all test parts. This is the sum of the number
- // of successful test parts and the number of failed test parts.
- int total_part_count() const;
-
- // Returns the number of the test properties.
- int test_property_count() const;
-
- // Returns true iff the test passed (i.e. no test part failed).
- bool Passed() const { return !Failed(); }
-
- // Returns true iff the test failed.
- bool Failed() const;
-
- // Returns true iff the test fatally failed.
- bool HasFatalFailure() const;
-
- // Returns true iff the test has a non-fatal failure.
- bool HasNonfatalFailure() const;
-
- // Returns the elapsed time, in milliseconds.
- TimeInMillis elapsed_time() const { return elapsed_time_; }
-
- // Returns the i-th test part result among all the results. i can range
- // from 0 to test_property_count() - 1. If i is not in that range, aborts
- // the program.
- const TestPartResult& GetTestPartResult(int i) const;
-
- // Returns the i-th test property. i can range from 0 to
- // test_property_count() - 1. If i is not in that range, aborts the
- // program.
- const TestProperty& GetTestProperty(int i) const;
-
- private:
- friend class TestInfo;
- friend class UnitTest;
- friend class internal::DefaultGlobalTestPartResultReporter;
- friend class internal::ExecDeathTest;
- friend class internal::TestResultAccessor;
- friend class internal::UnitTestImpl;
- friend class internal::WindowsDeathTest;
-
- // Gets the vector of TestPartResults.
- const std::vector<TestPartResult>& test_part_results() const {
- return test_part_results_;
- }
-
- // Gets the vector of TestProperties.
- const std::vector<TestProperty>& test_properties() const {
- return test_properties_;
- }
-
- // Sets the elapsed time.
- void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
-
- // Adds a test property to the list. The property is validated and may add
- // a non-fatal failure if invalid (e.g., if it conflicts with reserved
- // key names). If a property is already recorded for the same key, the
- // value will be updated, rather than storing multiple values for the same
- // key.
- void RecordProperty(const TestProperty& test_property);
-
- // Adds a failure if the key is a reserved attribute of Google Test
- // testcase tags. Returns true if the property is valid.
- // TODO(russr): Validate attribute names are legal and human readable.
- static bool ValidateTestProperty(const TestProperty& test_property);
-
- // Adds a test part result to the list.
- void AddTestPartResult(const TestPartResult& test_part_result);
-
- // Returns the death test count.
- int death_test_count() const { return death_test_count_; }
-
- // Increments the death test count, returning the new count.
- int increment_death_test_count() { return ++death_test_count_; }
-
- // Clears the test part results.
- void ClearTestPartResults();
-
- // Clears the object.
- void Clear();
-
- // Protects mutable state of the property vector and of owned
- // properties, whose values may be updated.
- internal::Mutex test_properites_mutex_;
-
- // The vector of TestPartResults
- std::vector<TestPartResult> test_part_results_;
- // The vector of TestProperties
- std::vector<TestProperty> test_properties_;
- // Running count of death tests.
- int death_test_count_;
- // The elapsed time, in milliseconds.
- TimeInMillis elapsed_time_;
-
- // We disallow copying TestResult.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
-}; // class TestResult
-
-// A TestInfo object stores the following information about a test:
-//
-// Test case name
-// Test name
-// Whether the test should be run
-// A function pointer that creates the test object when invoked
-// Test result
-//
-// The constructor of TestInfo registers itself with the UnitTest
-// singleton such that the RUN_ALL_TESTS() macro knows which tests to
-// run.
-class GTEST_API_ TestInfo {
- public:
- // Destructs a TestInfo object. This function is not virtual, so
- // don't inherit from TestInfo.
- ~TestInfo();
-
- // Returns the test case name.
- const char* test_case_name() const { return test_case_name_.c_str(); }
-
- // Returns the test name.
- const char* name() const { return name_.c_str(); }
-
- // Returns the name of the parameter type, or NULL if this is not a typed
- // or a type-parameterized test.
- const char* type_param() const {
- if (type_param_.get() != NULL)
- return type_param_->c_str();
- return NULL;
- }
-
- // Returns the text representation of the value parameter, or NULL if this
- // is not a value-parameterized test.
- const char* value_param() const {
- if (value_param_.get() != NULL)
- return value_param_->c_str();
- return NULL;
- }
-
- // Returns true if this test should run, that is if the test is not disabled
- // (or it is disabled but the also_run_disabled_tests flag has been specified)
- // and its full name matches the user-specified filter.
- //
- // Google Test allows the user to filter the tests by their full names.
- // The full name of a test Bar in test case Foo is defined as
- // "Foo.Bar". Only the tests that match the filter will run.
- //
- // A filter is a colon-separated list of glob (not regex) patterns,
- // optionally followed by a '-' and a colon-separated list of
- // negative patterns (tests to exclude). A test is run if it
- // matches one of the positive patterns and does not match any of
- // the negative patterns.
- //
- // For example, *A*:Foo.* is a filter that matches any string that
- // contains the character 'A' or starts with "Foo.".
- bool should_run() const { return should_run_; }
-
- // Returns the result of the test.
- const TestResult* result() const { return &result_; }
-
- private:
-
-#if GTEST_HAS_DEATH_TEST
- friend class internal::DefaultDeathTestFactory;
-#endif // GTEST_HAS_DEATH_TEST
- friend class Test;
- friend class TestCase;
- friend class internal::UnitTestImpl;
- friend TestInfo* internal::MakeAndRegisterTestInfo(
- const char* test_case_name, const char* name,
- const char* type_param,
- const char* value_param,
- internal::TypeId fixture_class_id,
- Test::SetUpTestCaseFunc set_up_tc,
- Test::TearDownTestCaseFunc tear_down_tc,
- internal::TestFactoryBase* factory);
-
- // Constructs a TestInfo object. The newly constructed instance assumes
- // ownership of the factory object.
- TestInfo(const char* test_case_name, const char* name,
- const char* a_type_param,
- const char* a_value_param,
- internal::TypeId fixture_class_id,
- internal::TestFactoryBase* factory);
-
- // Increments the number of death tests encountered in this test so
- // far.
- int increment_death_test_count() {
- return result_.increment_death_test_count();
- }
-
- // Creates the test object, runs it, records its result, and then
- // deletes it.
- void Run();
-
- static void ClearTestResult(TestInfo* test_info) {
- test_info->result_.Clear();
- }
-
- // These fields are immutable properties of the test.
- const std::string test_case_name_; // Test case name
- const std::string name_; // Test name
- // Name of the parameter type, or NULL if this is not a typed or a
- // type-parameterized test.
- const internal::scoped_ptr<const ::std::string> type_param_;
- // Text representation of the value parameter, or NULL if this is not a
- // value-parameterized test.
- const internal::scoped_ptr<const ::std::string> value_param_;
- const internal::TypeId fixture_class_id_; // ID of the test fixture class
- bool should_run_; // True iff this test should run
- bool is_disabled_; // True iff this test is disabled
- bool matches_filter_; // True if this test matches the
- // user-specified filter.
- internal::TestFactoryBase* const factory_; // The factory that creates
- // the test object
-
- // This field is mutable and needs to be reset before running the
- // test for the second time.
- TestResult result_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
-};
-
-// A test case, which consists of a vector of TestInfos.
-//
-// TestCase is not copyable.
-class GTEST_API_ TestCase {
- public:
- // Creates a TestCase with the given name.
- //
- // TestCase does NOT have a default constructor. Always use this
- // constructor to create a TestCase object.
- //
- // Arguments:
- //
- // name: name of the test case
- // a_type_param: the name of the test's type parameter, or NULL if
- // this is not a type-parameterized test.
- // set_up_tc: pointer to the function that sets up the test case
- // tear_down_tc: pointer to the function that tears down the test case
- TestCase(const char* name, const char* a_type_param,
- Test::SetUpTestCaseFunc set_up_tc,
- Test::TearDownTestCaseFunc tear_down_tc);
-
- // Destructor of TestCase.
- virtual ~TestCase();
-
- // Gets the name of the TestCase.
- const char* name() const { return name_.c_str(); }
-
- // Returns the name of the parameter type, or NULL if this is not a
- // type-parameterized test case.
- const char* type_param() const {
- if (type_param_.get() != NULL)
- return type_param_->c_str();
- return NULL;
- }
-
- // Returns true if any test in this test case should run.
- bool should_run() const { return should_run_; }
-
- // Gets the number of successful tests in this test case.
- int successful_test_count() const;
-
- // Gets the number of failed tests in this test case.
- int failed_test_count() const;
-
- // Gets the number of disabled tests in this test case.
- int disabled_test_count() const;
-
- // Get the number of tests in this test case that should run.
- int test_to_run_count() const;
-
- // Gets the number of all tests in this test case.
- int total_test_count() const;
-
- // Returns true iff the test case passed.
- bool Passed() const { return !Failed(); }
-
- // Returns true iff the test case failed.
- bool Failed() const { return failed_test_count() > 0; }
-
- // Returns the elapsed time, in milliseconds.
- TimeInMillis elapsed_time() const { return elapsed_time_; }
-
- // Returns the i-th test among all the tests. i can range from 0 to
- // total_test_count() - 1. If i is not in that range, returns NULL.
- const TestInfo* GetTestInfo(int i) const;
-
- private:
- friend class Test;
- friend class internal::UnitTestImpl;
-
- // Gets the (mutable) vector of TestInfos in this TestCase.
- std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
-
- // Gets the (immutable) vector of TestInfos in this TestCase.
- const std::vector<TestInfo*>& test_info_list() const {
- return test_info_list_;
- }
-
- // Returns the i-th test among all the tests. i can range from 0 to
- // total_test_count() - 1. If i is not in that range, returns NULL.
- TestInfo* GetMutableTestInfo(int i);
-
- // Sets the should_run member.
- void set_should_run(bool should) { should_run_ = should; }
-
- // Adds a TestInfo to this test case. Will delete the TestInfo upon
- // destruction of the TestCase object.
- void AddTestInfo(TestInfo * test_info);
-
- // Clears the results of all tests in this test case.
- void ClearResult();
-
- // Clears the results of all tests in the given test case.
- static void ClearTestCaseResult(TestCase* test_case) {
- test_case->ClearResult();
- }
-
- // Runs every test in this TestCase.
- void Run();
-
- // Runs SetUpTestCase() for this TestCase. This wrapper is needed
- // for catching exceptions thrown from SetUpTestCase().
- void RunSetUpTestCase() { (*set_up_tc_)(); }
-
- // Runs TearDownTestCase() for this TestCase. This wrapper is
- // needed for catching exceptions thrown from TearDownTestCase().
- void RunTearDownTestCase() { (*tear_down_tc_)(); }
-
- // Returns true iff test passed.
- static bool TestPassed(const TestInfo* test_info) {
- return test_info->should_run() && test_info->result()->Passed();
- }
-
- // Returns true iff test failed.
- static bool TestFailed(const TestInfo* test_info) {
- return test_info->should_run() && test_info->result()->Failed();
- }
-
- // Returns true iff test is disabled.
- static bool TestDisabled(const TestInfo* test_info) {
- return test_info->is_disabled_;
- }
-
- // Returns true if the given test should run.
- static bool ShouldRunTest(const TestInfo* test_info) {
- return test_info->should_run();
- }
-
- // Shuffles the tests in this test case.
- void ShuffleTests(internal::Random* random);
-
- // Restores the test order to before the first shuffle.
- void UnshuffleTests();
-
- // Name of the test case.
- internal::String name_;
- // Name of the parameter type, or NULL if this is not a typed or a
- // type-parameterized test.
- const internal::scoped_ptr<const ::std::string> type_param_;
- // The vector of TestInfos in their original order. It owns the
- // elements in the vector.
- std::vector<TestInfo*> test_info_list_;
- // Provides a level of indirection for the test list to allow easy
- // shuffling and restoring the test order. The i-th element in this
- // vector is the index of the i-th test in the shuffled test list.
- std::vector<int> test_indices_;
- // Pointer to the function that sets up the test case.
- Test::SetUpTestCaseFunc set_up_tc_;
- // Pointer to the function that tears down the test case.
- Test::TearDownTestCaseFunc tear_down_tc_;
- // True iff any test in this test case should run.
- bool should_run_;
- // Elapsed time, in milliseconds.
- TimeInMillis elapsed_time_;
-
- // We disallow copying TestCases.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
-};
-
-// An Environment object is capable of setting up and tearing down an
-// environment. The user should subclass this to define his own
-// environment(s).
-//
-// An Environment object does the set-up and tear-down in virtual
-// methods SetUp() and TearDown() instead of the constructor and the
-// destructor, as:
-//
-// 1. You cannot safely throw from a destructor. This is a problem
-// as in some cases Google Test is used where exceptions are enabled, and
-// we may want to implement ASSERT_* using exceptions where they are
-// available.
-// 2. You cannot use ASSERT_* directly in a constructor or
-// destructor.
-class Environment {
- public:
- // The d'tor is virtual as we need to subclass Environment.
- virtual ~Environment() {}
-
- // Override this to define how to set up the environment.
- virtual void SetUp() {}
-
- // Override this to define how to tear down the environment.
- virtual void TearDown() {}
- private:
- // If you see an error about overriding the following function or
- // about it being private, you have mis-spelled SetUp() as Setup().
- struct Setup_should_be_spelled_SetUp {};
- virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
-};
-
-// The interface for tracing execution of tests. The methods are organized in
-// the order the corresponding events are fired.
-class TestEventListener {
- public:
- virtual ~TestEventListener() {}
-
- // Fired before any test activity starts.
- virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
-
- // Fired before each iteration of tests starts. There may be more than
- // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
- // index, starting from 0.
- virtual void OnTestIterationStart(const UnitTest& unit_test,
- int iteration) = 0;
-
- // Fired before environment set-up for each iteration of tests starts.
- virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
-
- // Fired after environment set-up for each iteration of tests ends.
- virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
-
- // Fired before the test case starts.
- virtual void OnTestCaseStart(const TestCase& test_case) = 0;
-
- // Fired before the test starts.
- virtual void OnTestStart(const TestInfo& test_info) = 0;
-
- // Fired after a failed assertion or a SUCCEED() invocation.
- virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
-
- // Fired after the test ends.
- virtual void OnTestEnd(const TestInfo& test_info) = 0;
-
- // Fired after the test case ends.
- virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
-
- // Fired before environment tear-down for each iteration of tests starts.
- virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
-
- // Fired after environment tear-down for each iteration of tests ends.
- virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
-
- // Fired after each iteration of tests finishes.
- virtual void OnTestIterationEnd(const UnitTest& unit_test,
- int iteration) = 0;
-
- // Fired after all test activities have ended.
- virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
-};
-
-// The convenience class for users who need to override just one or two
-// methods and are not concerned that a possible change to a signature of
-// the methods they override will not be caught during the build. For
-// comments about each method please see the definition of TestEventListener
-// above.
-class EmptyTestEventListener : public TestEventListener {
- public:
- virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
- virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
- int /*iteration*/) {}
- virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
- virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
- virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
- virtual void OnTestStart(const TestInfo& /*test_info*/) {}
- virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
- virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
- virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
- virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
- virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
- virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
- int /*iteration*/) {}
- virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
-};
-
-// TestEventListeners lets users add listeners to track events in Google Test.
-class GTEST_API_ TestEventListeners {
- public:
- TestEventListeners();
- ~TestEventListeners();
-
- // Appends an event listener to the end of the list. Google Test assumes
- // the ownership of the listener (i.e. it will delete the listener when
- // the test program finishes).
- void Append(TestEventListener* listener);
-
- // Removes the given event listener from the list and returns it. It then
- // becomes the caller's responsibility to delete the listener. Returns
- // NULL if the listener is not found in the list.
- TestEventListener* Release(TestEventListener* listener);
-
- // Returns the standard listener responsible for the default console
- // output. Can be removed from the listeners list to shut down default
- // console output. Note that removing this object from the listener list
- // with Release transfers its ownership to the caller and makes this
- // function return NULL the next time.
- TestEventListener* default_result_printer() const {
- return default_result_printer_;
- }
-
- // Returns the standard listener responsible for the default XML output
- // controlled by the --gtest_output=xml flag. Can be removed from the
- // listeners list by users who want to shut down the default XML output
- // controlled by this flag and substitute it with custom one. Note that
- // removing this object from the listener list with Release transfers its
- // ownership to the caller and makes this function return NULL the next
- // time.
- TestEventListener* default_xml_generator() const {
- return default_xml_generator_;
- }
-
- private:
- friend class TestCase;
- friend class TestInfo;
- friend class internal::DefaultGlobalTestPartResultReporter;
- friend class internal::NoExecDeathTest;
- friend class internal::TestEventListenersAccessor;
- friend class internal::UnitTestImpl;
-
- // Returns repeater that broadcasts the TestEventListener events to all
- // subscribers.
- TestEventListener* repeater();
-
- // Sets the default_result_printer attribute to the provided listener.
- // The listener is also added to the listener list and previous
- // default_result_printer is removed from it and deleted. The listener can
- // also be NULL in which case it will not be added to the list. Does
- // nothing if the previous and the current listener objects are the same.
- void SetDefaultResultPrinter(TestEventListener* listener);
-
- // Sets the default_xml_generator attribute to the provided listener. The
- // listener is also added to the listener list and previous
- // default_xml_generator is removed from it and deleted. The listener can
- // also be NULL in which case it will not be added to the list. Does
- // nothing if the previous and the current listener objects are the same.
- void SetDefaultXmlGenerator(TestEventListener* listener);
-
- // Controls whether events will be forwarded by the repeater to the
- // listeners in the list.
- bool EventForwardingEnabled() const;
- void SuppressEventForwarding();
-
- // The actual list of listeners.
- internal::TestEventRepeater* repeater_;
- // Listener responsible for the standard result output.
- TestEventListener* default_result_printer_;
- // Listener responsible for the creation of the XML output file.
- TestEventListener* default_xml_generator_;
-
- // We disallow copying TestEventListeners.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
-};
-
-// A UnitTest consists of a vector of TestCases.
-//
-// This is a singleton class. The only instance of UnitTest is
-// created when UnitTest::GetInstance() is first called. This
-// instance is never deleted.
-//
-// UnitTest is not copyable.
-//
-// This class is thread-safe as long as the methods are called
-// according to their specification.
-class GTEST_API_ UnitTest {
- public:
- // Gets the singleton UnitTest object. The first time this method
- // is called, a UnitTest object is constructed and returned.
- // Consecutive calls will return the same object.
- static UnitTest* GetInstance();
-
- // Runs all tests in this UnitTest object and prints the result.
- // Returns 0 if successful, or 1 otherwise.
- //
- // This method can only be called from the main thread.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- int Run() GTEST_MUST_USE_RESULT_;
-
- // Returns the working directory when the first TEST() or TEST_F()
- // was executed. The UnitTest object owns the string.
- const char* original_working_dir() const;
-
- // Returns the TestCase object for the test that's currently running,
- // or NULL if no test is running.
- const TestCase* current_test_case() const;
-
- // Returns the TestInfo object for the test that's currently running,
- // or NULL if no test is running.
- const TestInfo* current_test_info() const;
-
- // Returns the random seed used at the start of the current test run.
- int random_seed() const;
-
-#if GTEST_HAS_PARAM_TEST
- // Returns the ParameterizedTestCaseRegistry object used to keep track of
- // value-parameterized tests and instantiate and register them.
- //
- // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
- internal::ParameterizedTestCaseRegistry& parameterized_test_registry();
-#endif // GTEST_HAS_PARAM_TEST
-
- // Gets the number of successful test cases.
- int successful_test_case_count() const;
-
- // Gets the number of failed test cases.
- int failed_test_case_count() const;
-
- // Gets the number of all test cases.
- int total_test_case_count() const;
-
- // Gets the number of all test cases that contain at least one test
- // that should run.
- int test_case_to_run_count() const;
-
- // Gets the number of successful tests.
- int successful_test_count() const;
-
- // Gets the number of failed tests.
- int failed_test_count() const;
-
- // Gets the number of disabled tests.
- int disabled_test_count() const;
-
- // Gets the number of all tests.
- int total_test_count() const;
-
- // Gets the number of tests that should run.
- int test_to_run_count() const;
-
- // Gets the elapsed time, in milliseconds.
- TimeInMillis elapsed_time() const;
-
- // Returns true iff the unit test passed (i.e. all test cases passed).
- bool Passed() const;
-
- // Returns true iff the unit test failed (i.e. some test case failed
- // or something outside of all tests failed).
- bool Failed() const;
-
- // Gets the i-th test case among all the test cases. i can range from 0 to
- // total_test_case_count() - 1. If i is not in that range, returns NULL.
- const TestCase* GetTestCase(int i) const;
-
- // Returns the list of event listeners that can be used to track events
- // inside Google Test.
- TestEventListeners& listeners();
-
- private:
- // Registers and returns a global test environment. When a test
- // program is run, all global test environments will be set-up in
- // the order they were registered. After all tests in the program
- // have finished, all global test environments will be torn-down in
- // the *reverse* order they were registered.
- //
- // The UnitTest object takes ownership of the given environment.
- //
- // This method can only be called from the main thread.
- Environment* AddEnvironment(Environment* env);
-
- // Adds a TestPartResult to the current TestResult object. All
- // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
- // eventually call this to report their results. The user code
- // should use the assertion macros instead of calling this directly.
- void AddTestPartResult(TestPartResult::Type result_type,
- const char* file_name,
- int line_number,
- const internal::String& message,
- const internal::String& os_stack_trace);
-
- // Adds a TestProperty to the current TestResult object. If the result already
- // contains a property with the same key, the value will be updated.
- void RecordPropertyForCurrentTest(const char* key, const char* value);
-
- // Gets the i-th test case among all the test cases. i can range from 0 to
- // total_test_case_count() - 1. If i is not in that range, returns NULL.
- TestCase* GetMutableTestCase(int i);
-
- // Accessors for the implementation object.
- internal::UnitTestImpl* impl() { return impl_; }
- const internal::UnitTestImpl* impl() const { return impl_; }
-
- // These classes and funcions are friends as they need to access private
- // members of UnitTest.
- friend class Test;
- friend class internal::AssertHelper;
- friend class internal::ScopedTrace;
- friend Environment* AddGlobalTestEnvironment(Environment* env);
- friend internal::UnitTestImpl* internal::GetUnitTestImpl();
- friend void internal::ReportFailureInUnknownLocation(
- TestPartResult::Type result_type,
- const internal::String& message);
-
- // Creates an empty UnitTest.
- UnitTest();
-
- // D'tor
- virtual ~UnitTest();
-
- // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
- // Google Test trace stack.
- void PushGTestTrace(const internal::TraceInfo& trace);
-
- // Pops a trace from the per-thread Google Test trace stack.
- void PopGTestTrace();
-
- // Protects mutable state in *impl_. This is mutable as some const
- // methods need to lock it too.
- mutable internal::Mutex mutex_;
-
- // Opaque implementation object. This field is never changed once
- // the object is constructed. We don't mark it as const here, as
- // doing so will cause a warning in the constructor of UnitTest.
- // Mutable state in *impl_ is protected by mutex_.
- internal::UnitTestImpl* impl_;
-
- // We disallow copying UnitTest.
- GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
-};
-
-// A convenient wrapper for adding an environment for the test
-// program.
-//
-// You should call this before RUN_ALL_TESTS() is called, probably in
-// main(). If you use gtest_main, you need to call this before main()
-// starts for it to take effect. For example, you can define a global
-// variable like this:
-//
-// testing::Environment* const foo_env =
-// testing::AddGlobalTestEnvironment(new FooEnvironment);
-//
-// However, we strongly recommend you to write your own main() and
-// call AddGlobalTestEnvironment() there, as relying on initialization
-// of global variables makes the code harder to read and may cause
-// problems when you register multiple environments from different
-// translation units and the environments have dependencies among them
-// (remember that the compiler doesn't guarantee the order in which
-// global variables from different translation units are initialized).
-inline Environment* AddGlobalTestEnvironment(Environment* env) {
- return UnitTest::GetInstance()->AddEnvironment(env);
-}
-
-// Initializes Google Test. This must be called before calling
-// RUN_ALL_TESTS(). In particular, it parses a command line for the
-// flags that Google Test recognizes. Whenever a Google Test flag is
-// seen, it is removed from argv, and *argc is decremented.
-//
-// No value is returned. Instead, the Google Test flag variables are
-// updated.
-//
-// Calling the function for the second time has no user-visible effect.
-GTEST_API_ void InitGoogleTest(int* argc, char** argv);
-
-// This overloaded version can be used in Windows programs compiled in
-// UNICODE mode.
-GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
-
-namespace internal {
-
-// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
-// operand to be used in a failure message. The type (but not value)
-// of the other operand may affect the format. This allows us to
-// print a char* as a raw pointer when it is compared against another
-// char*, and print it as a C string when it is compared against an
-// std::string object, for example.
-//
-// The default implementation ignores the type of the other operand.
-// Some specialized versions are used to handle formatting wide or
-// narrow C strings.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-template <typename T1, typename T2>
-String FormatForComparisonFailureMessage(const T1& value,
- const T2& /* other_operand */) {
- // C++Builder compiles this incorrectly if the namespace isn't explicitly
- // given.
- return ::testing::PrintToString(value);
-}
-
-// The helper function for {ASSERT|EXPECT}_EQ.
-template <typename T1, typename T2>
-AssertionResult CmpHelperEQ(const char* expected_expression,
- const char* actual_expression,
- const T1& expected,
- const T2& actual) {
-#ifdef _MSC_VER
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4389) // Temporarily disables warning on
- // signed/unsigned mismatch.
-#endif
-
- if (expected == actual) {
- return AssertionSuccess();
- }
-
-#ifdef _MSC_VER
-# pragma warning(pop) // Restores the warning state.
-#endif
-
- return EqFailure(expected_expression,
- actual_expression,
- FormatForComparisonFailureMessage(expected, actual),
- FormatForComparisonFailureMessage(actual, expected),
- false);
-}
-
-// With this overloaded version, we allow anonymous enums to be used
-// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
-// can be implicitly cast to BiggestInt.
-GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
- const char* actual_expression,
- BiggestInt expected,
- BiggestInt actual);
-
-// The helper class for {ASSERT|EXPECT}_EQ. The template argument
-// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
-// is a null pointer literal. The following default implementation is
-// for lhs_is_null_literal being false.
-template <bool lhs_is_null_literal>
-class EqHelper {
- public:
- // This templatized version is for the general case.
- template <typename T1, typename T2>
- static AssertionResult Compare(const char* expected_expression,
- const char* actual_expression,
- const T1& expected,
- const T2& actual) {
- return CmpHelperEQ(expected_expression, actual_expression, expected,
- actual);
- }
-
- // With this overloaded version, we allow anonymous enums to be used
- // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
- // enums can be implicitly cast to BiggestInt.
- //
- // Even though its body looks the same as the above version, we
- // cannot merge the two, as it will make anonymous enums unhappy.
- static AssertionResult Compare(const char* expected_expression,
- const char* actual_expression,
- BiggestInt expected,
- BiggestInt actual) {
- return CmpHelperEQ(expected_expression, actual_expression, expected,
- actual);
- }
-};
-
-// This specialization is used when the first argument to ASSERT_EQ()
-// is a null pointer literal, like NULL, false, or 0.
-template <>
-class EqHelper<true> {
- public:
- // We define two overloaded versions of Compare(). The first
- // version will be picked when the second argument to ASSERT_EQ() is
- // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
- // EXPECT_EQ(false, a_bool).
- template <typename T1, typename T2>
- static AssertionResult Compare(
- const char* expected_expression,
- const char* actual_expression,
- const T1& expected,
- const T2& actual,
- // The following line prevents this overload from being considered if T2
- // is not a pointer type. We need this because ASSERT_EQ(NULL, my_ptr)
- // expands to Compare("", "", NULL, my_ptr), which requires a conversion
- // to match the Secret* in the other overload, which would otherwise make
- // this template match better.
- typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
- return CmpHelperEQ(expected_expression, actual_expression, expected,
- actual);
- }
-
- // This version will be picked when the second argument to ASSERT_EQ() is a
- // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
- template <typename T>
- static AssertionResult Compare(
- const char* expected_expression,
- const char* actual_expression,
- // We used to have a second template parameter instead of Secret*. That
- // template parameter would deduce to 'long', making this a better match
- // than the first overload even without the first overload's EnableIf.
- // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
- // non-pointer argument" (even a deduced integral argument), so the old
- // implementation caused warnings in user code.
- Secret* /* expected (NULL) */,
- T* actual) {
- // We already know that 'expected' is a null pointer.
- return CmpHelperEQ(expected_expression, actual_expression,
- static_cast<T*>(NULL), actual);
- }
-};
-
-// A macro for implementing the helper functions needed to implement
-// ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste
-// of similar code.
-//
-// For each templatized helper function, we also define an overloaded
-// version for BiggestInt in order to reduce code bloat and allow
-// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
-// with gcc 4.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
-template <typename T1, typename T2>\
-AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
- const T1& val1, const T2& val2) {\
- if (val1 op val2) {\
- return AssertionSuccess();\
- } else {\
- return AssertionFailure() \
- << "Expected: (" << expr1 << ") " #op " (" << expr2\
- << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
- << " vs " << FormatForComparisonFailureMessage(val2, val1);\
- }\
-}\
-GTEST_API_ AssertionResult CmpHelper##op_name(\
- const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-
-// Implements the helper function for {ASSERT|EXPECT}_NE
-GTEST_IMPL_CMP_HELPER_(NE, !=);
-// Implements the helper function for {ASSERT|EXPECT}_LE
-GTEST_IMPL_CMP_HELPER_(LE, <=);
-// Implements the helper function for {ASSERT|EXPECT}_LT
-GTEST_IMPL_CMP_HELPER_(LT, < );
-// Implements the helper function for {ASSERT|EXPECT}_GE
-GTEST_IMPL_CMP_HELPER_(GE, >=);
-// Implements the helper function for {ASSERT|EXPECT}_GT
-GTEST_IMPL_CMP_HELPER_(GT, > );
-
-#undef GTEST_IMPL_CMP_HELPER_
-
-// The helper function for {ASSERT|EXPECT}_STREQ.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
- const char* actual_expression,
- const char* expected,
- const char* actual);
-
-// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
- const char* actual_expression,
- const char* expected,
- const char* actual);
-
-// The helper function for {ASSERT|EXPECT}_STRNE.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
- const char* s2_expression,
- const char* s1,
- const char* s2);
-
-// The helper function for {ASSERT|EXPECT}_STRCASENE.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
- const char* s2_expression,
- const char* s1,
- const char* s2);
-
-
-// Helper function for *_STREQ on wide strings.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
- const char* actual_expression,
- const wchar_t* expected,
- const wchar_t* actual);
-
-// Helper function for *_STRNE on wide strings.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
- const char* s2_expression,
- const wchar_t* s1,
- const wchar_t* s2);
-
-} // namespace internal
-
-// IsSubstring() and IsNotSubstring() are intended to be used as the
-// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
-// themselves. They check whether needle is a substring of haystack
-// (NULL is considered a substring of itself only), and return an
-// appropriate error message when they fail.
-//
-// The {needle,haystack}_expr arguments are the stringified
-// expressions that generated the two real arguments.
-GTEST_API_ AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const char* needle, const char* haystack);
-GTEST_API_ AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const wchar_t* needle, const wchar_t* haystack);
-GTEST_API_ AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const char* needle, const char* haystack);
-GTEST_API_ AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const wchar_t* needle, const wchar_t* haystack);
-GTEST_API_ AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::string& needle, const ::std::string& haystack);
-GTEST_API_ AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::string& needle, const ::std::string& haystack);
-
-#if GTEST_HAS_STD_WSTRING
-GTEST_API_ AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::wstring& needle, const ::std::wstring& haystack);
-GTEST_API_ AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::wstring& needle, const ::std::wstring& haystack);
-#endif // GTEST_HAS_STD_WSTRING
-
-namespace internal {
-
-// Helper template function for comparing floating-points.
-//
-// Template parameter:
-//
-// RawType: the raw floating-point type (either float or double)
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-template <typename RawType>
-AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
- const char* actual_expression,
- RawType expected,
- RawType actual) {
- const FloatingPoint<RawType> lhs(expected), rhs(actual);
-
- if (lhs.AlmostEquals(rhs)) {
- return AssertionSuccess();
- }
-
- ::std::stringstream expected_ss;
- expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
- << expected;
-
- ::std::stringstream actual_ss;
- actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
- << actual;
-
- return EqFailure(expected_expression,
- actual_expression,
- StringStreamToString(&expected_ss),
- StringStreamToString(&actual_ss),
- false);
-}
-
-// Helper function for implementing ASSERT_NEAR.
-//
-// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
-GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
- const char* expr2,
- const char* abs_error_expr,
- double val1,
- double val2,
- double abs_error);
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-// A class that enables one to stream messages to assertion macros
-class GTEST_API_ AssertHelper {
- public:
- // Constructor.
- AssertHelper(TestPartResult::Type type,
- const char* file,
- int line,
- const char* message);
- ~AssertHelper();
-
- // Message assignment is a semantic trick to enable assertion
- // streaming; see the GTEST_MESSAGE_ macro below.
- void operator=(const Message& message) const;
-
- private:
- // We put our data in a struct so that the size of the AssertHelper class can
- // be as small as possible. This is important because gcc is incapable of
- // re-using stack space even for temporary variables, so every EXPECT_EQ
- // reserves stack space for another AssertHelper.
- struct AssertHelperData {
- AssertHelperData(TestPartResult::Type t,
- const char* srcfile,
- int line_num,
- const char* msg)
- : type(t), file(srcfile), line(line_num), message(msg) { }
-
- TestPartResult::Type const type;
- const char* const file;
- int const line;
- String const message;
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
- };
-
- AssertHelperData* const data_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
-};
-
-} // namespace internal
-
-#if GTEST_HAS_PARAM_TEST
-// The pure interface class that all value-parameterized tests inherit from.
-// A value-parameterized class must inherit from both ::testing::Test and
-// ::testing::WithParamInterface. In most cases that just means inheriting
-// from ::testing::TestWithParam, but more complicated test hierarchies
-// may need to inherit from Test and WithParamInterface at different levels.
-//
-// This interface has support for accessing the test parameter value via
-// the GetParam() method.
-//
-// Use it with one of the parameter generator defining functions, like Range(),
-// Values(), ValuesIn(), Bool(), and Combine().
-//
-// class FooTest : public ::testing::TestWithParam<int> {
-// protected:
-// FooTest() {
-// // Can use GetParam() here.
-// }
-// virtual ~FooTest() {
-// // Can use GetParam() here.
-// }
-// virtual void SetUp() {
-// // Can use GetParam() here.
-// }
-// virtual void TearDown {
-// // Can use GetParam() here.
-// }
-// };
-// TEST_P(FooTest, DoesBar) {
-// // Can use GetParam() method here.
-// Foo foo;
-// ASSERT_TRUE(foo.DoesBar(GetParam()));
-// }
-// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
-
-template <typename T>
-class WithParamInterface {
- public:
- typedef T ParamType;
- virtual ~WithParamInterface() {}
-
- // The current parameter value. Is also available in the test fixture's
- // constructor. This member function is non-static, even though it only
- // references static data, to reduce the opportunity for incorrect uses
- // like writing 'WithParamInterface<bool>::GetParam()' for a test that
- // uses a fixture whose parameter type is int.
- const ParamType& GetParam() const { return *parameter_; }
-
- private:
- // Sets parameter value. The caller is responsible for making sure the value
- // remains alive and unchanged throughout the current test.
- static void SetParam(const ParamType* parameter) {
- parameter_ = parameter;
- }
-
- // Static value used for accessing parameter during a test lifetime.
- static const ParamType* parameter_;
-
- // TestClass must be a subclass of WithParamInterface<T> and Test.
- template <class TestClass> friend class internal::ParameterizedTestFactory;
-};
-
-template <typename T>
-const T* WithParamInterface<T>::parameter_ = NULL;
-
-// Most value-parameterized classes can ignore the existence of
-// WithParamInterface, and can just inherit from ::testing::TestWithParam.
-
-template <typename T>
-class TestWithParam : public Test, public WithParamInterface<T> {
-};
-
-#endif // GTEST_HAS_PARAM_TEST
-
-// Macros for indicating success/failure in test code.
-
-// ADD_FAILURE unconditionally adds a failure to the current test.
-// SUCCEED generates a success - it doesn't automatically make the
-// current test successful, as a test is only successful when it has
-// no failure.
-//
-// EXPECT_* verifies that a certain condition is satisfied. If not,
-// it behaves like ADD_FAILURE. In particular:
-//
-// EXPECT_TRUE verifies that a Boolean condition is true.
-// EXPECT_FALSE verifies that a Boolean condition is false.
-//
-// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
-// that they will also abort the current function on failure. People
-// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
-// writing data-driven tests often find themselves using ADD_FAILURE
-// and EXPECT_* more.
-//
-// Examples:
-//
-// EXPECT_TRUE(server.StatusIsOK());
-// ASSERT_FALSE(server.HasPendingRequest(port))
-// << "There are still pending requests " << "on port " << port;
-
-// Generates a nonfatal failure with a generic message.
-#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
-
-// Generates a nonfatal failure at the given source file location with
-// a generic message.
-#define ADD_FAILURE_AT(file, line) \
- GTEST_MESSAGE_AT_(file, line, "Failed", \
- ::testing::TestPartResult::kNonFatalFailure)
-
-// Generates a fatal failure with a generic message.
-#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
-
-// Define this macro to 1 to omit the definition of FAIL(), which is a
-// generic name and clashes with some other libraries.
-#if !GTEST_DONT_DEFINE_FAIL
-# define FAIL() GTEST_FAIL()
-#endif
-
-// Generates a success with a generic message.
-#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
-
-// Define this macro to 1 to omit the definition of SUCCEED(), which
-// is a generic name and clashes with some other libraries.
-#if !GTEST_DONT_DEFINE_SUCCEED
-# define SUCCEED() GTEST_SUCCEED()
-#endif
-
-// Macros for testing exceptions.
-//
-// * {ASSERT|EXPECT}_THROW(statement, expected_exception):
-// Tests that the statement throws the expected exception.
-// * {ASSERT|EXPECT}_NO_THROW(statement):
-// Tests that the statement doesn't throw any exception.
-// * {ASSERT|EXPECT}_ANY_THROW(statement):
-// Tests that the statement throws an exception.
-
-#define EXPECT_THROW(statement, expected_exception) \
- GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_NO_THROW(statement) \
- GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_ANY_THROW(statement) \
- GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_THROW(statement, expected_exception) \
- GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
-#define ASSERT_NO_THROW(statement) \
- GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
-#define ASSERT_ANY_THROW(statement) \
- GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
-
-// Boolean assertions. Condition can be either a Boolean expression or an
-// AssertionResult. For more information on how to use AssertionResult with
-// these macros see comments on that class.
-#define EXPECT_TRUE(condition) \
- GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
- GTEST_NONFATAL_FAILURE_)
-#define EXPECT_FALSE(condition) \
- GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
- GTEST_NONFATAL_FAILURE_)
-#define ASSERT_TRUE(condition) \
- GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
- GTEST_FATAL_FAILURE_)
-#define ASSERT_FALSE(condition) \
- GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
- GTEST_FATAL_FAILURE_)
-
-// Includes the auto-generated header that implements a family of
-// generic predicate assertion macros.
-#include "gtest/gtest_pred_impl.h"
-
-// Macros for testing equalities and inequalities.
-//
-// * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
-// * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2
-// * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2
-// * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2
-// * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2
-// * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2
-//
-// When they are not, Google Test prints both the tested expressions and
-// their actual values. The values must be compatible built-in types,
-// or you will get a compiler error. By "compatible" we mean that the
-// values can be compared by the respective operator.
-//
-// Note:
-//
-// 1. It is possible to make a user-defined type work with
-// {ASSERT|EXPECT}_??(), but that requires overloading the
-// comparison operators and is thus discouraged by the Google C++
-// Usage Guide. Therefore, you are advised to use the
-// {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
-// equal.
-//
-// 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
-// pointers (in particular, C strings). Therefore, if you use it
-// with two C strings, you are testing how their locations in memory
-// are related, not how their content is related. To compare two C
-// strings by content, use {ASSERT|EXPECT}_STR*().
-//
-// 3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
-// {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
-// what the actual value is when it fails, and similarly for the
-// other comparisons.
-//
-// 4. Do not depend on the order in which {ASSERT|EXPECT}_??()
-// evaluate their arguments, which is undefined.
-//
-// 5. These macros evaluate their arguments exactly once.
-//
-// Examples:
-//
-// EXPECT_NE(5, Foo());
-// EXPECT_EQ(NULL, a_pointer);
-// ASSERT_LT(i, array_size);
-// ASSERT_GT(records.size(), 0) << "There is no record left.";
-
-#define EXPECT_EQ(expected, actual) \
- EXPECT_PRED_FORMAT2(::testing::internal:: \
- EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
- expected, actual)
-#define EXPECT_NE(expected, actual) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
-#define EXPECT_LE(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
-#define EXPECT_LT(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
-#define EXPECT_GE(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
-#define EXPECT_GT(val1, val2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
-
-#define GTEST_ASSERT_EQ(expected, actual) \
- ASSERT_PRED_FORMAT2(::testing::internal:: \
- EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
- expected, actual)
-#define GTEST_ASSERT_NE(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
-#define GTEST_ASSERT_LE(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
-#define GTEST_ASSERT_LT(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
-#define GTEST_ASSERT_GE(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
-#define GTEST_ASSERT_GT(val1, val2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
-
-// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
-// ASSERT_XY(), which clashes with some users' own code.
-
-#if !GTEST_DONT_DEFINE_ASSERT_EQ
-# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_NE
-# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_LE
-# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_LT
-# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_GE
-# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
-#endif
-
-#if !GTEST_DONT_DEFINE_ASSERT_GT
-# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
-#endif
-
-// C String Comparisons. All tests treat NULL and any non-NULL string
-// as different. Two NULLs are equal.
-//
-// * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2
-// * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2
-// * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
-// * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
-//
-// For wide or narrow string objects, you can use the
-// {ASSERT|EXPECT}_??() macros.
-//
-// Don't depend on the order in which the arguments are evaluated,
-// which is undefined.
-//
-// These macros evaluate their arguments exactly once.
-
-#define EXPECT_STREQ(expected, actual) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
-#define EXPECT_STRNE(s1, s2) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
-#define EXPECT_STRCASEEQ(expected, actual) \
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
-#define EXPECT_STRCASENE(s1, s2)\
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
-
-#define ASSERT_STREQ(expected, actual) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
-#define ASSERT_STRNE(s1, s2) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
-#define ASSERT_STRCASEEQ(expected, actual) \
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
-#define ASSERT_STRCASENE(s1, s2)\
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
-
-// Macros for comparing floating-point numbers.
-//
-// * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
-// Tests that two float values are almost equal.
-// * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
-// Tests that two double values are almost equal.
-// * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
-// Tests that v1 and v2 are within the given distance to each other.
-//
-// Google Test uses ULP-based comparison to automatically pick a default
-// error bound that is appropriate for the operands. See the
-// FloatingPoint template class in gtest-internal.h if you are
-// interested in the implementation details.
-
-#define EXPECT_FLOAT_EQ(expected, actual)\
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
- expected, actual)
-
-#define EXPECT_DOUBLE_EQ(expected, actual)\
- EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
- expected, actual)
-
-#define ASSERT_FLOAT_EQ(expected, actual)\
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
- expected, actual)
-
-#define ASSERT_DOUBLE_EQ(expected, actual)\
- ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
- expected, actual)
-
-#define EXPECT_NEAR(val1, val2, abs_error)\
- EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
- val1, val2, abs_error)
-
-#define ASSERT_NEAR(val1, val2, abs_error)\
- ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
- val1, val2, abs_error)
-
-// These predicate format functions work on floating-point values, and
-// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
-//
-// EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
-
-// Asserts that val1 is less than, or almost equal to, val2. Fails
-// otherwise. In particular, it fails if either val1 or val2 is NaN.
-GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
- float val1, float val2);
-GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
- double val1, double val2);
-
-
-#if GTEST_OS_WINDOWS
-
-// Macros that test for HRESULT failure and success, these are only useful
-// on Windows, and rely on Windows SDK macros and APIs to compile.
-//
-// * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
-//
-// When expr unexpectedly fails or succeeds, Google Test prints the
-// expected result and the actual result with both a human-readable
-// string representation of the error, if available, as well as the
-// hex result code.
-# define EXPECT_HRESULT_SUCCEEDED(expr) \
- EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
-
-# define ASSERT_HRESULT_SUCCEEDED(expr) \
- ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
-
-# define EXPECT_HRESULT_FAILED(expr) \
- EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
-
-# define ASSERT_HRESULT_FAILED(expr) \
- ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
-
-#endif // GTEST_OS_WINDOWS
-
-// Macros that execute statement and check that it doesn't generate new fatal
-// failures in the current thread.
-//
-// * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
-//
-// Examples:
-//
-// EXPECT_NO_FATAL_FAILURE(Process());
-// ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
-//
-#define ASSERT_NO_FATAL_FAILURE(statement) \
- GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
-#define EXPECT_NO_FATAL_FAILURE(statement) \
- GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
-
-// Causes a trace (including the source file path, the current line
-// number, and the given message) to be included in every test failure
-// message generated by code in the current scope. The effect is
-// undone when the control leaves the current scope.
-//
-// The message argument can be anything streamable to std::ostream.
-//
-// In the implementation, we include the current line number as part
-// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
-// to appear in the same block - as long as they are on different
-// lines.
-#define SCOPED_TRACE(message) \
- ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
- __FILE__, __LINE__, ::testing::Message() << (message))
-
-// Compile-time assertion for type equality.
-// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
-// the same type. The value it returns is not interesting.
-//
-// Instead of making StaticAssertTypeEq a class template, we make it a
-// function template that invokes a helper class template. This
-// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
-// defining objects of that type.
-//
-// CAVEAT:
-//
-// When used inside a method of a class template,
-// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
-// instantiated. For example, given:
-//
-// template <typename T> class Foo {
-// public:
-// void Bar() { testing::StaticAssertTypeEq<int, T>(); }
-// };
-//
-// the code:
-//
-// void Test1() { Foo<bool> foo; }
-//
-// will NOT generate a compiler error, as Foo<bool>::Bar() is never
-// actually instantiated. Instead, you need:
-//
-// void Test2() { Foo<bool> foo; foo.Bar(); }
-//
-// to cause a compiler error.
-template <typename T1, typename T2>
-bool StaticAssertTypeEq() {
- (void)internal::StaticAssertTypeEqHelper<T1, T2>();
- return true;
-}
-
-// Defines a test.
-//
-// The first parameter is the name of the test case, and the second
-// parameter is the name of the test within the test case.
-//
-// The convention is to end the test case name with "Test". For
-// example, a test case for the Foo class can be named FooTest.
-//
-// The user should put his test code between braces after using this
-// macro. Example:
-//
-// TEST(FooTest, InitializesCorrectly) {
-// Foo foo;
-// EXPECT_TRUE(foo.StatusIsOK());
-// }
-
-// Note that we call GetTestTypeId() instead of GetTypeId<
-// ::testing::Test>() here to get the type ID of testing::Test. This
-// is to work around a suspected linker bug when using Google Test as
-// a framework on Mac OS X. The bug causes GetTypeId<
-// ::testing::Test>() to return different values depending on whether
-// the call is from the Google Test framework itself or from user test
-// code. GetTestTypeId() is guaranteed to always return the same
-// value, as it always calls GetTypeId<>() from the Google Test
-// framework.
-#define GTEST_TEST(test_case_name, test_name)\
- GTEST_TEST_(test_case_name, test_name, \
- ::testing::Test, ::testing::internal::GetTestTypeId())
-
-// Define this macro to 1 to omit the definition of TEST(), which
-// is a generic name and clashes with some other libraries.
-#if !GTEST_DONT_DEFINE_TEST
-# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
-#endif
-
-// Defines a test that uses a test fixture.
-//
-// The first parameter is the name of the test fixture class, which
-// also doubles as the test case name. The second parameter is the
-// name of the test within the test case.
-//
-// A test fixture class must be declared earlier. The user should put
-// his test code between braces after using this macro. Example:
-//
-// class FooTest : public testing::Test {
-// protected:
-// virtual void SetUp() { b_.AddElement(3); }
-//
-// Foo a_;
-// Foo b_;
-// };
-//
-// TEST_F(FooTest, InitializesCorrectly) {
-// EXPECT_TRUE(a_.StatusIsOK());
-// }
-//
-// TEST_F(FooTest, ReturnsElementCountCorrectly) {
-// EXPECT_EQ(0, a_.size());
-// EXPECT_EQ(1, b_.size());
-// }
-
-#define TEST_F(test_fixture, test_name)\
- GTEST_TEST_(test_fixture, test_name, test_fixture, \
- ::testing::internal::GetTypeId<test_fixture>())
-
-// Use this macro in main() to run all tests. It returns 0 if all
-// tests are successful, or 1 otherwise.
-//
-// RUN_ALL_TESTS() should be invoked after the command line has been
-// parsed by InitGoogleTest().
-
-#define RUN_ALL_TESTS()\
- (::testing::UnitTest::GetInstance()->Run())
-
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_H_
diff --git a/unit_tests/gtest/include/gtest/gtest_pred_impl.h b/unit_tests/gtest/include/gtest/gtest_pred_impl.h
deleted file mode 100644
index 3805f85..0000000
--- a/unit_tests/gtest/include/gtest/gtest_pred_impl.h
+++ /dev/null
@@ -1,358 +0,0 @@
-// Copyright 2006, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// This file is AUTOMATICALLY GENERATED on 09/24/2010 by command
-// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND!
-//
-// Implements a family of generic predicate assertion macros.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
-#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
-
-// Makes sure this header is not included before gtest.h.
-#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
-# error Do not include gtest_pred_impl.h directly. Include gtest.h instead.
-#endif // GTEST_INCLUDE_GTEST_GTEST_H_
-
-// This header implements a family of generic predicate assertion
-// macros:
-//
-// ASSERT_PRED_FORMAT1(pred_format, v1)
-// ASSERT_PRED_FORMAT2(pred_format, v1, v2)
-// ...
-//
-// where pred_format is a function or functor that takes n (in the
-// case of ASSERT_PRED_FORMATn) values and their source expression
-// text, and returns a testing::AssertionResult. See the definition
-// of ASSERT_EQ in gtest.h for an example.
-//
-// If you don't care about formatting, you can use the more
-// restrictive version:
-//
-// ASSERT_PRED1(pred, v1)
-// ASSERT_PRED2(pred, v1, v2)
-// ...
-//
-// where pred is an n-ary function or functor that returns bool,
-// and the values v1, v2, ..., must support the << operator for
-// streaming to std::ostream.
-//
-// We also define the EXPECT_* variations.
-//
-// For now we only support predicates whose arity is at most 5.
-// Please email googletestframework at googlegroups.com if you need
-// support for higher arities.
-
-// GTEST_ASSERT_ is the basic statement to which all of the assertions
-// in this file reduce. Don't use this in your code.
-
-#define GTEST_ASSERT_(expression, on_failure) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (const ::testing::AssertionResult gtest_ar = (expression)) \
- ; \
- else \
- on_failure(gtest_ar.failure_message())
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use
-// this in your code.
-template <typename Pred,
- typename T1>
-AssertionResult AssertPred1Helper(const char* pred_text,
- const char* e1,
- Pred pred,
- const T1& v1) {
- if (pred(v1)) return AssertionSuccess();
-
- return AssertionFailure() << pred_text << "("
- << e1 << ") evaluates to false, where"
- << "\n" << e1 << " evaluates to " << v1;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, v1),\
- on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use
-// this in your code.
-#define GTEST_PRED1_(pred, v1, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
- #v1, \
- pred, \
- v1), on_failure)
-
-// Unary predicate assertion macros.
-#define EXPECT_PRED_FORMAT1(pred_format, v1) \
- GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED1(pred, v1) \
- GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT1(pred_format, v1) \
- GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED1(pred, v1) \
- GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
-
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use
-// this in your code.
-template <typename Pred,
- typename T1,
- typename T2>
-AssertionResult AssertPred2Helper(const char* pred_text,
- const char* e1,
- const char* e2,
- Pred pred,
- const T1& v1,
- const T2& v2) {
- if (pred(v1, v2)) return AssertionSuccess();
-
- return AssertionFailure() << pred_text << "("
- << e1 << ", "
- << e2 << ") evaluates to false, where"
- << "\n" << e1 << " evaluates to " << v1
- << "\n" << e2 << " evaluates to " << v2;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2),\
- on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use
-// this in your code.
-#define GTEST_PRED2_(pred, v1, v2, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
- #v1, \
- #v2, \
- pred, \
- v1, \
- v2), on_failure)
-
-// Binary predicate assertion macros.
-#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
- GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED2(pred, v1, v2) \
- GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
- GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED2(pred, v1, v2) \
- GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
-
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use
-// this in your code.
-template <typename Pred,
- typename T1,
- typename T2,
- typename T3>
-AssertionResult AssertPred3Helper(const char* pred_text,
- const char* e1,
- const char* e2,
- const char* e3,
- Pred pred,
- const T1& v1,
- const T2& v2,
- const T3& v3) {
- if (pred(v1, v2, v3)) return AssertionSuccess();
-
- return AssertionFailure() << pred_text << "("
- << e1 << ", "
- << e2 << ", "
- << e3 << ") evaluates to false, where"
- << "\n" << e1 << " evaluates to " << v1
- << "\n" << e2 << " evaluates to " << v2
- << "\n" << e3 << " evaluates to " << v3;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\
- on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use
-// this in your code.
-#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
- #v1, \
- #v2, \
- #v3, \
- pred, \
- v1, \
- v2, \
- v3), on_failure)
-
-// Ternary predicate assertion macros.
-#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
- GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED3(pred, v1, v2, v3) \
- GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
- GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED3(pred, v1, v2, v3) \
- GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
-
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use
-// this in your code.
-template <typename Pred,
- typename T1,
- typename T2,
- typename T3,
- typename T4>
-AssertionResult AssertPred4Helper(const char* pred_text,
- const char* e1,
- const char* e2,
- const char* e3,
- const char* e4,
- Pred pred,
- const T1& v1,
- const T2& v2,
- const T3& v3,
- const T4& v4) {
- if (pred(v1, v2, v3, v4)) return AssertionSuccess();
-
- return AssertionFailure() << pred_text << "("
- << e1 << ", "
- << e2 << ", "
- << e3 << ", "
- << e4 << ") evaluates to false, where"
- << "\n" << e1 << " evaluates to " << v1
- << "\n" << e2 << " evaluates to " << v2
- << "\n" << e3 << " evaluates to " << v3
- << "\n" << e4 << " evaluates to " << v4;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\
- on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use
-// this in your code.
-#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
- #v1, \
- #v2, \
- #v3, \
- #v4, \
- pred, \
- v1, \
- v2, \
- v3, \
- v4), on_failure)
-
-// 4-ary predicate assertion macros.
-#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
- GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
- GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
- GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
- GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
-
-
-
-// Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use
-// this in your code.
-template <typename Pred,
- typename T1,
- typename T2,
- typename T3,
- typename T4,
- typename T5>
-AssertionResult AssertPred5Helper(const char* pred_text,
- const char* e1,
- const char* e2,
- const char* e3,
- const char* e4,
- const char* e5,
- Pred pred,
- const T1& v1,
- const T2& v2,
- const T3& v3,
- const T4& v4,
- const T5& v5) {
- if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
-
- return AssertionFailure() << pred_text << "("
- << e1 << ", "
- << e2 << ", "
- << e3 << ", "
- << e4 << ", "
- << e5 << ") evaluates to false, where"
- << "\n" << e1 << " evaluates to " << v1
- << "\n" << e2 << " evaluates to " << v2
- << "\n" << e3 << " evaluates to " << v3
- << "\n" << e4 << " evaluates to " << v4
- << "\n" << e5 << " evaluates to " << v5;
-}
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
-// Don't use this in your code.
-#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
- GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\
- on_failure)
-
-// Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use
-// this in your code.
-#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
- GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
- #v1, \
- #v2, \
- #v3, \
- #v4, \
- #v5, \
- pred, \
- v1, \
- v2, \
- v3, \
- v4, \
- v5), on_failure)
-
-// 5-ary predicate assertion macros.
-#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
- GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
-#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
- GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
-#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
- GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
-#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
- GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
-
-
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
diff --git a/unit_tests/gtest/include/gtest/gtest_prod.h b/unit_tests/gtest/include/gtest/gtest_prod.h
deleted file mode 100644
index da80ddc..0000000
--- a/unit_tests/gtest/include/gtest/gtest_prod.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2006, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// Google C++ Testing Framework definitions useful in production code.
-
-#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
-#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
-
-// When you need to test the private or protected members of a class,
-// use the FRIEND_TEST macro to declare your tests as friends of the
-// class. For example:
-//
-// class MyClass {
-// private:
-// void MyMethod();
-// FRIEND_TEST(MyClassTest, MyMethod);
-// };
-//
-// class MyClassTest : public testing::Test {
-// // ...
-// };
-//
-// TEST_F(MyClassTest, MyMethod) {
-// // Can call MyClass::MyMethod() here.
-// }
-
-#define FRIEND_TEST(test_case_name, test_name)\
-friend class test_case_name##_##test_name##_Test
-
-#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-death-test-internal.h b/unit_tests/gtest/include/gtest/internal/gtest-death-test-internal.h
deleted file mode 100644
index 1d9f83b..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-death-test-internal.h
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file defines internal utilities needed for implementing
-// death tests. They are subject to change without notice.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
-
-#include "gtest/internal/gtest-internal.h"
-
-#include <stdio.h>
-
-namespace testing {
-namespace internal {
-
-GTEST_DECLARE_string_(internal_run_death_test);
-
-// Names of the flags (needed for parsing Google Test flags).
-const char kDeathTestStyleFlag[] = "death_test_style";
-const char kDeathTestUseFork[] = "death_test_use_fork";
-const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
-
-#if GTEST_HAS_DEATH_TEST
-
-// DeathTest is a class that hides much of the complexity of the
-// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method
-// returns a concrete class that depends on the prevailing death test
-// style, as defined by the --gtest_death_test_style and/or
-// --gtest_internal_run_death_test flags.
-
-// In describing the results of death tests, these terms are used with
-// the corresponding definitions:
-//
-// exit status: The integer exit information in the format specified
-// by wait(2)
-// exit code: The integer code passed to exit(3), _exit(2), or
-// returned from main()
-class GTEST_API_ DeathTest {
- public:
- // Create returns false if there was an error determining the
- // appropriate action to take for the current death test; for example,
- // if the gtest_death_test_style flag is set to an invalid value.
- // The LastMessage method will return a more detailed message in that
- // case. Otherwise, the DeathTest pointer pointed to by the "test"
- // argument is set. If the death test should be skipped, the pointer
- // is set to NULL; otherwise, it is set to the address of a new concrete
- // DeathTest object that controls the execution of the current test.
- static bool Create(const char* statement, const RE* regex,
- const char* file, int line, DeathTest** test);
- DeathTest();
- virtual ~DeathTest() { }
-
- // A helper class that aborts a death test when it's deleted.
- class ReturnSentinel {
- public:
- explicit ReturnSentinel(DeathTest* test) : test_(test) { }
- ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
- private:
- DeathTest* const test_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
- } GTEST_ATTRIBUTE_UNUSED_;
-
- // An enumeration of possible roles that may be taken when a death
- // test is encountered. EXECUTE means that the death test logic should
- // be executed immediately. OVERSEE means that the program should prepare
- // the appropriate environment for a child process to execute the death
- // test, then wait for it to complete.
- enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
-
- // An enumeration of the three reasons that a test might be aborted.
- enum AbortReason {
- TEST_ENCOUNTERED_RETURN_STATEMENT,
- TEST_THREW_EXCEPTION,
- TEST_DID_NOT_DIE
- };
-
- // Assumes one of the above roles.
- virtual TestRole AssumeRole() = 0;
-
- // Waits for the death test to finish and returns its status.
- virtual int Wait() = 0;
-
- // Returns true if the death test passed; that is, the test process
- // exited during the test, its exit status matches a user-supplied
- // predicate, and its stderr output matches a user-supplied regular
- // expression.
- // The user-supplied predicate may be a macro expression rather
- // than a function pointer or functor, or else Wait and Passed could
- // be combined.
- virtual bool Passed(bool exit_status_ok) = 0;
-
- // Signals that the death test did not die as expected.
- virtual void Abort(AbortReason reason) = 0;
-
- // Returns a human-readable outcome message regarding the outcome of
- // the last death test.
- static const char* LastMessage();
-
- static void set_last_death_test_message(const String& message);
-
- private:
- // A string containing a description of the outcome of the last death test.
- static String last_death_test_message_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
-};
-
-// Factory interface for death tests. May be mocked out for testing.
-class DeathTestFactory {
- public:
- virtual ~DeathTestFactory() { }
- virtual bool Create(const char* statement, const RE* regex,
- const char* file, int line, DeathTest** test) = 0;
-};
-
-// A concrete DeathTestFactory implementation for normal use.
-class DefaultDeathTestFactory : public DeathTestFactory {
- public:
- virtual bool Create(const char* statement, const RE* regex,
- const char* file, int line, DeathTest** test);
-};
-
-// Returns true if exit_status describes a process that was terminated
-// by a signal, or exited normally with a nonzero exit code.
-GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
-
-// Traps C++ exceptions escaping statement and reports them as test
-// failures. Note that trapping SEH exceptions is not implemented here.
-# if GTEST_HAS_EXCEPTIONS
-# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
- try { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } catch (const ::std::exception& gtest_exception) { \
- fprintf(\
- stderr, \
- "\n%s: Caught std::exception-derived exception escaping the " \
- "death test statement. Exception message: %s\n", \
- ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
- gtest_exception.what()); \
- fflush(stderr); \
- death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
- } catch (...) { \
- death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
- }
-
-# else
-# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
-
-# endif
-
-// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
-// ASSERT_EXIT*, and EXPECT_EXIT*.
-# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- const ::testing::internal::RE& gtest_regex = (regex); \
- ::testing::internal::DeathTest* gtest_dt; \
- if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \
- __FILE__, __LINE__, >est_dt)) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
- } \
- if (gtest_dt != NULL) { \
- ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
- gtest_dt_ptr(gtest_dt); \
- switch (gtest_dt->AssumeRole()) { \
- case ::testing::internal::DeathTest::OVERSEE_TEST: \
- if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
- } \
- break; \
- case ::testing::internal::DeathTest::EXECUTE_TEST: { \
- ::testing::internal::DeathTest::ReturnSentinel \
- gtest_sentinel(gtest_dt); \
- GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
- gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
- break; \
- } \
- default: \
- break; \
- } \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
- fail(::testing::internal::DeathTest::LastMessage())
-// The symbol "fail" here expands to something into which a message
-// can be streamed.
-
-// A class representing the parsed contents of the
-// --gtest_internal_run_death_test flag, as it existed when
-// RUN_ALL_TESTS was called.
-class InternalRunDeathTestFlag {
- public:
- InternalRunDeathTestFlag(const String& a_file,
- int a_line,
- int an_index,
- int a_write_fd)
- : file_(a_file), line_(a_line), index_(an_index),
- write_fd_(a_write_fd) {}
-
- ~InternalRunDeathTestFlag() {
- if (write_fd_ >= 0)
- posix::Close(write_fd_);
- }
-
- String file() const { return file_; }
- int line() const { return line_; }
- int index() const { return index_; }
- int write_fd() const { return write_fd_; }
-
- private:
- String file_;
- int line_;
- int index_;
- int write_fd_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
-};
-
-// Returns a newly created InternalRunDeathTestFlag object with fields
-// initialized from the GTEST_FLAG(internal_run_death_test) flag if
-// the flag is specified; otherwise returns NULL.
-InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
-
-#else // GTEST_HAS_DEATH_TEST
-
-// This macro is used for implementing macros such as
-// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
-// death tests are not supported. Those macros must compile on such systems
-// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
-// systems that support death tests. This allows one to write such a macro
-// on a system that does not support death tests and be sure that it will
-// compile on a death-test supporting system.
-//
-// Parameters:
-// statement - A statement that a macro such as EXPECT_DEATH would test
-// for program termination. This macro has to make sure this
-// statement is compiled but not executed, to ensure that
-// EXPECT_DEATH_IF_SUPPORTED compiles with a certain
-// parameter iff EXPECT_DEATH compiles with it.
-// regex - A regex that a macro such as EXPECT_DEATH would use to test
-// the output of statement. This parameter has to be
-// compiled but not evaluated by this macro, to ensure that
-// this macro only accepts expressions that a macro such as
-// EXPECT_DEATH would accept.
-// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
-// and a return statement for ASSERT_DEATH_IF_SUPPORTED.
-// This ensures that ASSERT_DEATH_IF_SUPPORTED will not
-// compile inside functions where ASSERT_DEATH doesn't
-// compile.
-//
-// The branch that has an always false condition is used to ensure that
-// statement and regex are compiled (and thus syntactically correct) but
-// never executed. The unreachable code macro protects the terminator
-// statement from generating an 'unreachable code' warning in case
-// statement unconditionally returns or throws. The Message constructor at
-// the end allows the syntax of streaming additional messages into the
-// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
-# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- GTEST_LOG_(WARNING) \
- << "Death tests are not supported on this platform.\n" \
- << "Statement '" #statement "' cannot be verified."; \
- } else if (::testing::internal::AlwaysFalse()) { \
- ::testing::internal::RE::PartialMatch(".*", (regex)); \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- terminator; \
- } else \
- ::testing::Message()
-
-#endif // GTEST_HAS_DEATH_TEST
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-filepath.h b/unit_tests/gtest/include/gtest/internal/gtest-filepath.h
deleted file mode 100644
index b36b3cf..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-filepath.h
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: keith.ray at gmail.com (Keith Ray)
-//
-// Google Test filepath utilities
-//
-// This header file declares classes and functions used internally by
-// Google Test. They are subject to change without notice.
-//
-// This file is #included in <gtest/internal/gtest-internal.h>.
-// Do not include this header file separately!
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
-
-#include "gtest/internal/gtest-string.h"
-
-namespace testing {
-namespace internal {
-
-// FilePath - a class for file and directory pathname manipulation which
-// handles platform-specific conventions (like the pathname separator).
-// Used for helper functions for naming files in a directory for xml output.
-// Except for Set methods, all methods are const or static, which provides an
-// "immutable value object" -- useful for peace of mind.
-// A FilePath with a value ending in a path separator ("like/this/") represents
-// a directory, otherwise it is assumed to represent a file. In either case,
-// it may or may not represent an actual file or directory in the file system.
-// Names are NOT checked for syntax correctness -- no checking for illegal
-// characters, malformed paths, etc.
-
-class GTEST_API_ FilePath {
- public:
- FilePath() : pathname_("") { }
- FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
-
- explicit FilePath(const char* pathname) : pathname_(pathname) {
- Normalize();
- }
-
- explicit FilePath(const String& pathname) : pathname_(pathname) {
- Normalize();
- }
-
- FilePath& operator=(const FilePath& rhs) {
- Set(rhs);
- return *this;
- }
-
- void Set(const FilePath& rhs) {
- pathname_ = rhs.pathname_;
- }
-
- String ToString() const { return pathname_; }
- const char* c_str() const { return pathname_.c_str(); }
-
- // Returns the current working directory, or "" if unsuccessful.
- static FilePath GetCurrentDir();
-
- // Given directory = "dir", base_name = "test", number = 0,
- // extension = "xml", returns "dir/test.xml". If number is greater
- // than zero (e.g., 12), returns "dir/test_12.xml".
- // On Windows platform, uses \ as the separator rather than /.
- static FilePath MakeFileName(const FilePath& directory,
- const FilePath& base_name,
- int number,
- const char* extension);
-
- // Given directory = "dir", relative_path = "test.xml",
- // returns "dir/test.xml".
- // On Windows, uses \ as the separator rather than /.
- static FilePath ConcatPaths(const FilePath& directory,
- const FilePath& relative_path);
-
- // Returns a pathname for a file that does not currently exist. The pathname
- // will be directory/base_name.extension or
- // directory/base_name_<number>.extension if directory/base_name.extension
- // already exists. The number will be incremented until a pathname is found
- // that does not already exist.
- // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
- // There could be a race condition if two or more processes are calling this
- // function at the same time -- they could both pick the same filename.
- static FilePath GenerateUniqueFileName(const FilePath& directory,
- const FilePath& base_name,
- const char* extension);
-
- // Returns true iff the path is NULL or "".
- bool IsEmpty() const { return c_str() == NULL || *c_str() == '\0'; }
-
- // If input name has a trailing separator character, removes it and returns
- // the name, otherwise return the name string unmodified.
- // On Windows platform, uses \ as the separator, other platforms use /.
- FilePath RemoveTrailingPathSeparator() const;
-
- // Returns a copy of the FilePath with the directory part removed.
- // Example: FilePath("path/to/file").RemoveDirectoryName() returns
- // FilePath("file"). If there is no directory part ("just_a_file"), it returns
- // the FilePath unmodified. If there is no file part ("just_a_dir/") it
- // returns an empty FilePath ("").
- // On Windows platform, '\' is the path separator, otherwise it is '/'.
- FilePath RemoveDirectoryName() const;
-
- // RemoveFileName returns the directory path with the filename removed.
- // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
- // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
- // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
- // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
- // On Windows platform, '\' is the path separator, otherwise it is '/'.
- FilePath RemoveFileName() const;
-
- // Returns a copy of the FilePath with the case-insensitive extension removed.
- // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
- // FilePath("dir/file"). If a case-insensitive extension is not
- // found, returns a copy of the original FilePath.
- FilePath RemoveExtension(const char* extension) const;
-
- // Creates directories so that path exists. Returns true if successful or if
- // the directories already exist; returns false if unable to create
- // directories for any reason. Will also return false if the FilePath does
- // not represent a directory (that is, it doesn't end with a path separator).
- bool CreateDirectoriesRecursively() const;
-
- // Create the directory so that path exists. Returns true if successful or
- // if the directory already exists; returns false if unable to create the
- // directory for any reason, including if the parent directory does not
- // exist. Not named "CreateDirectory" because that's a macro on Windows.
- bool CreateFolder() const;
-
- // Returns true if FilePath describes something in the file-system,
- // either a file, directory, or whatever, and that something exists.
- bool FileOrDirectoryExists() const;
-
- // Returns true if pathname describes a directory in the file-system
- // that exists.
- bool DirectoryExists() const;
-
- // Returns true if FilePath ends with a path separator, which indicates that
- // it is intended to represent a directory. Returns false otherwise.
- // This does NOT check that a directory (or file) actually exists.
- bool IsDirectory() const;
-
- // Returns true if pathname describes a root directory. (Windows has one
- // root directory per disk drive.)
- bool IsRootDirectory() const;
-
- // Returns true if pathname describes an absolute path.
- bool IsAbsolutePath() const;
-
- private:
- // Replaces multiple consecutive separators with a single separator.
- // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
- // redundancies that might be in a pathname involving "." or "..".
- //
- // A pathname with multiple consecutive separators may occur either through
- // user error or as a result of some scripts or APIs that generate a pathname
- // with a trailing separator. On other platforms the same API or script
- // may NOT generate a pathname with a trailing "/". Then elsewhere that
- // pathname may have another "/" and pathname components added to it,
- // without checking for the separator already being there.
- // The script language and operating system may allow paths like "foo//bar"
- // but some of the functions in FilePath will not handle that correctly. In
- // particular, RemoveTrailingPathSeparator() only removes one separator, and
- // it is called in CreateDirectoriesRecursively() assuming that it will change
- // a pathname from directory syntax (trailing separator) to filename syntax.
- //
- // On Windows this method also replaces the alternate path separator '/' with
- // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
- // "bar\\foo".
-
- void Normalize();
-
- // Returns a pointer to the last occurence of a valid path separator in
- // the FilePath. On Windows, for example, both '/' and '\' are valid path
- // separators. Returns NULL if no path separator was found.
- const char* FindLastPathSeparator() const;
-
- String pathname_;
-}; // class FilePath
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-internal.h b/unit_tests/gtest/include/gtest/internal/gtest-internal.h
deleted file mode 100644
index 7fb3f51..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-internal.h
+++ /dev/null
@@ -1,1236 +0,0 @@
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file declares functions and macros used internally by
-// Google Test. They are subject to change without notice.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
-
-#include "gtest/internal/gtest-port.h"
-
-#if GTEST_OS_LINUX
-# include <stdlib.h>
-# include <sys/types.h>
-# include <sys/wait.h>
-# include <unistd.h>
-#endif // GTEST_OS_LINUX
-
-#include <ctype.h>
-#include <string.h>
-#include <iomanip>
-#include <limits>
-#include <set>
-
-#include "gtest/internal/gtest-string.h"
-#include "gtest/internal/gtest-filepath.h"
-#include "gtest/internal/gtest-type-util.h"
-
-#ifdef __ICC
-// Disable explicit warning on Intel compiler
-#pragma warning disable 2304
-#endif
-
-// Due to C++ preprocessor weirdness, we need double indirection to
-// concatenate two tokens when one of them is __LINE__. Writing
-//
-// foo ## __LINE__
-//
-// will result in the token foo__LINE__, instead of foo followed by
-// the current line number. For more details, see
-// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
-#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
-#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
-
-// Google Test defines the testing::Message class to allow construction of
-// test messages via the << operator. The idea is that anything
-// streamable to std::ostream can be streamed to a testing::Message.
-// This allows a user to use his own types in Google Test assertions by
-// overloading the << operator.
-//
-// util/gtl/stl_logging-inl.h overloads << for STL containers. These
-// overloads cannot be defined in the std namespace, as that will be
-// undefined behavior. Therefore, they are defined in the global
-// namespace instead.
-//
-// C++'s symbol lookup rule (i.e. Koenig lookup) says that these
-// overloads are visible in either the std namespace or the global
-// namespace, but not other namespaces, including the testing
-// namespace which Google Test's Message class is in.
-//
-// To allow STL containers (and other types that has a << operator
-// defined in the global namespace) to be used in Google Test assertions,
-// testing::Message must access the custom << operator from the global
-// namespace. Hence this helper function.
-//
-// Note: Jeffrey Yasskin suggested an alternative fix by "using
-// ::operator<<;" in the definition of Message's operator<<. That fix
-// doesn't require a helper function, but unfortunately doesn't
-// compile with MSVC.
-template <typename T>
-inline void GTestStreamToHelper(std::ostream* os, const T& val) {
- *os << val;
-}
-
-class ProtocolMessage;
-namespace proto2 { class Message; }
-
-namespace testing {
-
-// Forward declarations.
-
-class AssertionResult; // Result of an assertion.
-class Message; // Represents a failure message.
-class Test; // Represents a test.
-class TestInfo; // Information about a test.
-class TestPartResult; // Result of a test part.
-class UnitTest; // A collection of test cases.
-
-template <typename T>
-::std::string PrintToString(const T& value);
-
-namespace internal {
-
-struct TraceInfo; // Information about a trace point.
-class ScopedTrace; // Implements scoped trace.
-class TestInfoImpl; // Opaque implementation of TestInfo
-class UnitTestImpl; // Opaque implementation of UnitTest
-
-// How many times InitGoogleTest() has been called.
-extern int g_init_gtest_count;
-
-// The text used in failure messages to indicate the start of the
-// stack trace.
-GTEST_API_ extern const char kStackTraceMarker[];
-
-// A secret type that Google Test users don't know about. It has no
-// definition on purpose. Therefore it's impossible to create a
-// Secret object, which is what we want.
-class Secret;
-
-// Two overloaded helpers for checking at compile time whether an
-// expression is a null pointer literal (i.e. NULL or any 0-valued
-// compile-time integral constant). Their return values have
-// different sizes, so we can use sizeof() to test which version is
-// picked by the compiler. These helpers have no implementations, as
-// we only need their signatures.
-//
-// Given IsNullLiteralHelper(x), the compiler will pick the first
-// version if x can be implicitly converted to Secret*, and pick the
-// second version otherwise. Since Secret is a secret and incomplete
-// type, the only expression a user can write that has type Secret* is
-// a null pointer literal. Therefore, we know that x is a null
-// pointer literal if and only if the first version is picked by the
-// compiler.
-char IsNullLiteralHelper(Secret* p);
-char (&IsNullLiteralHelper(...))[2]; // NOLINT
-
-// A compile-time bool constant that is true if and only if x is a
-// null pointer literal (i.e. NULL or any 0-valued compile-time
-// integral constant).
-#ifdef GTEST_ELLIPSIS_NEEDS_POD_
-// We lose support for NULL detection where the compiler doesn't like
-// passing non-POD classes through ellipsis (...).
-# define GTEST_IS_NULL_LITERAL_(x) false
-#else
-# define GTEST_IS_NULL_LITERAL_(x) \
- (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
-#endif // GTEST_ELLIPSIS_NEEDS_POD_
-
-// Appends the user-supplied message to the Google-Test-generated message.
-GTEST_API_ String AppendUserMessage(const String& gtest_msg,
- const Message& user_msg);
-
-// A helper class for creating scoped traces in user programs.
-class GTEST_API_ ScopedTrace {
- public:
- // The c'tor pushes the given source file location and message onto
- // a trace stack maintained by Google Test.
- ScopedTrace(const char* file, int line, const Message& message);
-
- // The d'tor pops the info pushed by the c'tor.
- //
- // Note that the d'tor is not virtual in order to be efficient.
- // Don't inherit from ScopedTrace!
- ~ScopedTrace();
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
-} GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its
- // c'tor and d'tor. Therefore it doesn't
- // need to be used otherwise.
-
-// Converts a streamable value to a String. A NULL pointer is
-// converted to "(null)". When the input value is a ::string,
-// ::std::string, ::wstring, or ::std::wstring object, each NUL
-// character in it is replaced with "\\0".
-// Declared here but defined in gtest.h, so that it has access
-// to the definition of the Message class, required by the ARM
-// compiler.
-template <typename T>
-String StreamableToString(const T& streamable);
-
-// The Symbian compiler has a bug that prevents it from selecting the
-// correct overload of FormatForComparisonFailureMessage (see below)
-// unless we pass the first argument by reference. If we do that,
-// however, Visual Age C++ 10.1 generates a compiler error. Therefore
-// we only apply the work-around for Symbian.
-#if defined(__SYMBIAN32__)
-# define GTEST_CREF_WORKAROUND_ const&
-#else
-# define GTEST_CREF_WORKAROUND_
-#endif
-
-// When this operand is a const char* or char*, if the other operand
-// is a ::std::string or ::string, we print this operand as a C string
-// rather than a pointer (we do the same for wide strings); otherwise
-// we print it as a pointer to be safe.
-
-// This internal macro is used to avoid duplicated code.
-#define GTEST_FORMAT_IMPL_(operand2_type, operand1_printer)\
-inline String FormatForComparisonFailureMessage(\
- operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \
- const operand2_type& /*operand2*/) {\
- return operand1_printer(str);\
-}\
-inline String FormatForComparisonFailureMessage(\
- const operand2_type::value_type* GTEST_CREF_WORKAROUND_ str, \
- const operand2_type& /*operand2*/) {\
- return operand1_printer(str);\
-}
-
-GTEST_FORMAT_IMPL_(::std::string, String::ShowCStringQuoted)
-#if GTEST_HAS_STD_WSTRING
-GTEST_FORMAT_IMPL_(::std::wstring, String::ShowWideCStringQuoted)
-#endif // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_GLOBAL_STRING
-GTEST_FORMAT_IMPL_(::string, String::ShowCStringQuoted)
-#endif // GTEST_HAS_GLOBAL_STRING
-#if GTEST_HAS_GLOBAL_WSTRING
-GTEST_FORMAT_IMPL_(::wstring, String::ShowWideCStringQuoted)
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
-#undef GTEST_FORMAT_IMPL_
-
-// The next four overloads handle the case where the operand being
-// printed is a char/wchar_t pointer and the other operand is not a
-// string/wstring object. In such cases, we just print the operand as
-// a pointer to be safe.
-#define GTEST_FORMAT_CHAR_PTR_IMPL_(CharType) \
- template <typename T> \
- String FormatForComparisonFailureMessage(CharType* GTEST_CREF_WORKAROUND_ p, \
- const T&) { \
- return PrintToString(static_cast<const void*>(p)); \
- }
-
-GTEST_FORMAT_CHAR_PTR_IMPL_(char)
-GTEST_FORMAT_CHAR_PTR_IMPL_(const char)
-GTEST_FORMAT_CHAR_PTR_IMPL_(wchar_t)
-GTEST_FORMAT_CHAR_PTR_IMPL_(const wchar_t)
-
-#undef GTEST_FORMAT_CHAR_PTR_IMPL_
-
-// Constructs and returns the message for an equality assertion
-// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
-//
-// The first four parameters are the expressions used in the assertion
-// and their values, as strings. For example, for ASSERT_EQ(foo, bar)
-// where foo is 5 and bar is 6, we have:
-//
-// expected_expression: "foo"
-// actual_expression: "bar"
-// expected_value: "5"
-// actual_value: "6"
-//
-// The ignoring_case parameter is true iff the assertion is a
-// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will
-// be inserted into the message.
-GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
- const char* actual_expression,
- const String& expected_value,
- const String& actual_value,
- bool ignoring_case);
-
-// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
-GTEST_API_ String GetBoolAssertionFailureMessage(
- const AssertionResult& assertion_result,
- const char* expression_text,
- const char* actual_predicate_value,
- const char* expected_predicate_value);
-
-// This template class represents an IEEE floating-point number
-// (either single-precision or double-precision, depending on the
-// template parameters).
-//
-// The purpose of this class is to do more sophisticated number
-// comparison. (Due to round-off error, etc, it's very unlikely that
-// two floating-points will be equal exactly. Hence a naive
-// comparison by the == operation often doesn't work.)
-//
-// Format of IEEE floating-point:
-//
-// The most-significant bit being the leftmost, an IEEE
-// floating-point looks like
-//
-// sign_bit exponent_bits fraction_bits
-//
-// Here, sign_bit is a single bit that designates the sign of the
-// number.
-//
-// For float, there are 8 exponent bits and 23 fraction bits.
-//
-// For double, there are 11 exponent bits and 52 fraction bits.
-//
-// More details can be found at
-// http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
-//
-// Template parameter:
-//
-// RawType: the raw floating-point type (either float or double)
-template <typename RawType>
-class FloatingPoint {
- public:
- // Defines the unsigned integer type that has the same size as the
- // floating point number.
- typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
-
- // Constants.
-
- // # of bits in a number.
- static const size_t kBitCount = 8*sizeof(RawType);
-
- // # of fraction bits in a number.
- static const size_t kFractionBitCount =
- std::numeric_limits<RawType>::digits - 1;
-
- // # of exponent bits in a number.
- static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
-
- // The mask for the sign bit.
- static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
-
- // The mask for the fraction bits.
- static const Bits kFractionBitMask =
- ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
-
- // The mask for the exponent bits.
- static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
-
- // How many ULP's (Units in the Last Place) we want to tolerate when
- // comparing two numbers. The larger the value, the more error we
- // allow. A 0 value means that two numbers must be exactly the same
- // to be considered equal.
- //
- // The maximum error of a single floating-point operation is 0.5
- // units in the last place. On Intel CPU's, all floating-point
- // calculations are done with 80-bit precision, while double has 64
- // bits. Therefore, 4 should be enough for ordinary use.
- //
- // See the following article for more details on ULP:
- // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm.
- static const size_t kMaxUlps = 4;
-
- // Constructs a FloatingPoint from a raw floating-point number.
- //
- // On an Intel CPU, passing a non-normalized NAN (Not a Number)
- // around may change its bits, although the new value is guaranteed
- // to be also a NAN. Therefore, don't expect this constructor to
- // preserve the bits in x when x is a NAN.
- explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
-
- // Static methods
-
- // Reinterprets a bit pattern as a floating-point number.
- //
- // This function is needed to test the AlmostEquals() method.
- static RawType ReinterpretBits(const Bits bits) {
- FloatingPoint fp(0);
- fp.u_.bits_ = bits;
- return fp.u_.value_;
- }
-
- // Returns the floating-point number that represent positive infinity.
- static RawType Infinity() {
- return ReinterpretBits(kExponentBitMask);
- }
-
- // Non-static methods
-
- // Returns the bits that represents this number.
- const Bits &bits() const { return u_.bits_; }
-
- // Returns the exponent bits of this number.
- Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
-
- // Returns the fraction bits of this number.
- Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
-
- // Returns the sign bit of this number.
- Bits sign_bit() const { return kSignBitMask & u_.bits_; }
-
- // Returns true iff this is NAN (not a number).
- bool is_nan() const {
- // It's a NAN if the exponent bits are all ones and the fraction
- // bits are not entirely zeros.
- return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
- }
-
- // Returns true iff this number is at most kMaxUlps ULP's away from
- // rhs. In particular, this function:
- //
- // - returns false if either number is (or both are) NAN.
- // - treats really large numbers as almost equal to infinity.
- // - thinks +0.0 and -0.0 are 0 DLP's apart.
- bool AlmostEquals(const FloatingPoint& rhs) const {
- // The IEEE standard says that any comparison operation involving
- // a NAN must return false.
- if (is_nan() || rhs.is_nan()) return false;
-
- return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
- <= kMaxUlps;
- }
-
- private:
- // The data type used to store the actual floating-point number.
- union FloatingPointUnion {
- RawType value_; // The raw floating-point number.
- Bits bits_; // The bits that represent the number.
- };
-
- // Converts an integer from the sign-and-magnitude representation to
- // the biased representation. More precisely, let N be 2 to the
- // power of (kBitCount - 1), an integer x is represented by the
- // unsigned number x + N.
- //
- // For instance,
- //
- // -N + 1 (the most negative number representable using
- // sign-and-magnitude) is represented by 1;
- // 0 is represented by N; and
- // N - 1 (the biggest number representable using
- // sign-and-magnitude) is represented by 2N - 1.
- //
- // Read http://en.wikipedia.org/wiki/Signed_number_representations
- // for more details on signed number representations.
- static Bits SignAndMagnitudeToBiased(const Bits &sam) {
- if (kSignBitMask & sam) {
- // sam represents a negative number.
- return ~sam + 1;
- } else {
- // sam represents a positive number.
- return kSignBitMask | sam;
- }
- }
-
- // Given two numbers in the sign-and-magnitude representation,
- // returns the distance between them as an unsigned number.
- static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
- const Bits &sam2) {
- const Bits biased1 = SignAndMagnitudeToBiased(sam1);
- const Bits biased2 = SignAndMagnitudeToBiased(sam2);
- return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
- }
-
- FloatingPointUnion u_;
-};
-
-// Typedefs the instances of the FloatingPoint template class that we
-// care to use.
-typedef FloatingPoint<float> Float;
-typedef FloatingPoint<double> Double;
-
-// In order to catch the mistake of putting tests that use different
-// test fixture classes in the same test case, we need to assign
-// unique IDs to fixture classes and compare them. The TypeId type is
-// used to hold such IDs. The user should treat TypeId as an opaque
-// type: the only operation allowed on TypeId values is to compare
-// them for equality using the == operator.
-typedef const void* TypeId;
-
-template <typename T>
-class TypeIdHelper {
- public:
- // dummy_ must not have a const type. Otherwise an overly eager
- // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
- // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
- static bool dummy_;
-};
-
-template <typename T>
-bool TypeIdHelper<T>::dummy_ = false;
-
-// GetTypeId<T>() returns the ID of type T. Different values will be
-// returned for different types. Calling the function twice with the
-// same type argument is guaranteed to return the same ID.
-template <typename T>
-TypeId GetTypeId() {
- // The compiler is required to allocate a different
- // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
- // the template. Therefore, the address of dummy_ is guaranteed to
- // be unique.
- return &(TypeIdHelper<T>::dummy_);
-}
-
-// Returns the type ID of ::testing::Test. Always call this instead
-// of GetTypeId< ::testing::Test>() to get the type ID of
-// ::testing::Test, as the latter may give the wrong result due to a
-// suspected linker bug when compiling Google Test as a Mac OS X
-// framework.
-GTEST_API_ TypeId GetTestTypeId();
-
-// Defines the abstract factory interface that creates instances
-// of a Test object.
-class TestFactoryBase {
- public:
- virtual ~TestFactoryBase() {}
-
- // Creates a test instance to run. The instance is both created and destroyed
- // within TestInfoImpl::Run()
- virtual Test* CreateTest() = 0;
-
- protected:
- TestFactoryBase() {}
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
-};
-
-// This class provides implementation of TeastFactoryBase interface.
-// It is used in TEST and TEST_F macros.
-template <class TestClass>
-class TestFactoryImpl : public TestFactoryBase {
- public:
- virtual Test* CreateTest() { return new TestClass; }
-};
-
-#if GTEST_OS_WINDOWS
-
-// Predicate-formatters for implementing the HRESULT checking macros
-// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
-// We pass a long instead of HRESULT to avoid causing an
-// include dependency for the HRESULT type.
-GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
- long hr); // NOLINT
-GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
- long hr); // NOLINT
-
-#endif // GTEST_OS_WINDOWS
-
-// Types of SetUpTestCase() and TearDownTestCase() functions.
-typedef void (*SetUpTestCaseFunc)();
-typedef void (*TearDownTestCaseFunc)();
-
-// Creates a new TestInfo object and registers it with Google Test;
-// returns the created object.
-//
-// Arguments:
-//
-// test_case_name: name of the test case
-// name: name of the test
-// type_param the name of the test's type parameter, or NULL if
-// this is not a typed or a type-parameterized test.
-// value_param text representation of the test's value parameter,
-// or NULL if this is not a type-parameterized test.
-// fixture_class_id: ID of the test fixture class
-// set_up_tc: pointer to the function that sets up the test case
-// tear_down_tc: pointer to the function that tears down the test case
-// factory: pointer to the factory that creates a test object.
-// The newly created TestInfo instance will assume
-// ownership of the factory object.
-GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
- const char* test_case_name, const char* name,
- const char* type_param,
- const char* value_param,
- TypeId fixture_class_id,
- SetUpTestCaseFunc set_up_tc,
- TearDownTestCaseFunc tear_down_tc,
- TestFactoryBase* factory);
-
-// If *pstr starts with the given prefix, modifies *pstr to be right
-// past the prefix and returns true; otherwise leaves *pstr unchanged
-// and returns false. None of pstr, *pstr, and prefix can be NULL.
-GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
-
-#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
-
-// State of the definition of a type-parameterized test case.
-class GTEST_API_ TypedTestCasePState {
- public:
- TypedTestCasePState() : registered_(false) {}
-
- // Adds the given test name to defined_test_names_ and return true
- // if the test case hasn't been registered; otherwise aborts the
- // program.
- bool AddTestName(const char* file, int line, const char* case_name,
- const char* test_name) {
- if (registered_) {
- fprintf(stderr, "%s Test %s must be defined before "
- "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
- FormatFileLocation(file, line).c_str(), test_name, case_name);
- fflush(stderr);
- posix::Abort();
- }
- defined_test_names_.insert(test_name);
- return true;
- }
-
- // Verifies that registered_tests match the test names in
- // defined_test_names_; returns registered_tests if successful, or
- // aborts the program otherwise.
- const char* VerifyRegisteredTestNames(
- const char* file, int line, const char* registered_tests);
-
- private:
- bool registered_;
- ::std::set<const char*> defined_test_names_;
-};
-
-// Skips to the first non-space char after the first comma in 'str';
-// returns NULL if no comma is found in 'str'.
-inline const char* SkipComma(const char* str) {
- const char* comma = strchr(str, ',');
- if (comma == NULL) {
- return NULL;
- }
- while (IsSpace(*(++comma))) {}
- return comma;
-}
-
-// Returns the prefix of 'str' before the first comma in it; returns
-// the entire string if it contains no comma.
-inline String GetPrefixUntilComma(const char* str) {
- const char* comma = strchr(str, ',');
- return comma == NULL ? String(str) : String(str, comma - str);
-}
-
-// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
-// registers a list of type-parameterized tests with Google Test. The
-// return value is insignificant - we just need to return something
-// such that we can call this function in a namespace scope.
-//
-// Implementation note: The GTEST_TEMPLATE_ macro declares a template
-// template parameter. It's defined in gtest-type-util.h.
-template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
-class TypeParameterizedTest {
- public:
- // 'index' is the index of the test in the type list 'Types'
- // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
- // Types). Valid values for 'index' are [0, N - 1] where N is the
- // length of Types.
- static bool Register(const char* prefix, const char* case_name,
- const char* test_names, int index) {
- typedef typename Types::Head Type;
- typedef Fixture<Type> FixtureClass;
- typedef typename GTEST_BIND_(TestSel, Type) TestClass;
-
- // First, registers the first type-parameterized test in the type
- // list.
- MakeAndRegisterTestInfo(
- String::Format("%s%s%s/%d", prefix, prefix[0] == '\0' ? "" : "/",
- case_name, index).c_str(),
- GetPrefixUntilComma(test_names).c_str(),
- GetTypeName<Type>().c_str(),
- NULL, // No value parameter.
- GetTypeId<FixtureClass>(),
- TestClass::SetUpTestCase,
- TestClass::TearDownTestCase,
- new TestFactoryImpl<TestClass>);
-
- // Next, recurses (at compile time) with the tail of the type list.
- return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
- ::Register(prefix, case_name, test_names, index + 1);
- }
-};
-
-// The base case for the compile time recursion.
-template <GTEST_TEMPLATE_ Fixture, class TestSel>
-class TypeParameterizedTest<Fixture, TestSel, Types0> {
- public:
- static bool Register(const char* /*prefix*/, const char* /*case_name*/,
- const char* /*test_names*/, int /*index*/) {
- return true;
- }
-};
-
-// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
-// registers *all combinations* of 'Tests' and 'Types' with Google
-// Test. The return value is insignificant - we just need to return
-// something such that we can call this function in a namespace scope.
-template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
-class TypeParameterizedTestCase {
- public:
- static bool Register(const char* prefix, const char* case_name,
- const char* test_names) {
- typedef typename Tests::Head Head;
-
- // First, register the first test in 'Test' for each type in 'Types'.
- TypeParameterizedTest<Fixture, Head, Types>::Register(
- prefix, case_name, test_names, 0);
-
- // Next, recurses (at compile time) with the tail of the test list.
- return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
- ::Register(prefix, case_name, SkipComma(test_names));
- }
-};
-
-// The base case for the compile time recursion.
-template <GTEST_TEMPLATE_ Fixture, typename Types>
-class TypeParameterizedTestCase<Fixture, Templates0, Types> {
- public:
- static bool Register(const char* /*prefix*/, const char* /*case_name*/,
- const char* /*test_names*/) {
- return true;
- }
-};
-
-#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
-
-// Returns the current OS stack trace as a String.
-//
-// The maximum number of stack frames to be included is specified by
-// the gtest_stack_trace_depth flag. The skip_count parameter
-// specifies the number of top frames to be skipped, which doesn't
-// count against the number of frames to be included.
-//
-// For example, if Foo() calls Bar(), which in turn calls
-// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
-// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
-GTEST_API_ String GetCurrentOsStackTraceExceptTop(UnitTest* unit_test,
- int skip_count);
-
-// Helpers for suppressing warnings on unreachable code or constant
-// condition.
-
-// Always returns true.
-GTEST_API_ bool AlwaysTrue();
-
-// Always returns false.
-inline bool AlwaysFalse() { return !AlwaysTrue(); }
-
-// Helper for suppressing false warning from Clang on a const char*
-// variable declared in a conditional expression always being NULL in
-// the else branch.
-struct GTEST_API_ ConstCharPtr {
- ConstCharPtr(const char* str) : value(str) {}
- operator bool() const { return true; }
- const char* value;
-};
-
-// A simple Linear Congruential Generator for generating random
-// numbers with a uniform distribution. Unlike rand() and srand(), it
-// doesn't use global state (and therefore can't interfere with user
-// code). Unlike rand_r(), it's portable. An LCG isn't very random,
-// but it's good enough for our purposes.
-class GTEST_API_ Random {
- public:
- static const UInt32 kMaxRange = 1u << 31;
-
- explicit Random(UInt32 seed) : state_(seed) {}
-
- void Reseed(UInt32 seed) { state_ = seed; }
-
- // Generates a random number from [0, range). Crashes if 'range' is
- // 0 or greater than kMaxRange.
- UInt32 Generate(UInt32 range);
-
- private:
- UInt32 state_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
-};
-
-// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
-// compiler error iff T1 and T2 are different types.
-template <typename T1, typename T2>
-struct CompileAssertTypesEqual;
-
-template <typename T>
-struct CompileAssertTypesEqual<T, T> {
-};
-
-// Removes the reference from a type if it is a reference type,
-// otherwise leaves it unchanged. This is the same as
-// tr1::remove_reference, which is not widely available yet.
-template <typename T>
-struct RemoveReference { typedef T type; }; // NOLINT
-template <typename T>
-struct RemoveReference<T&> { typedef T type; }; // NOLINT
-
-// A handy wrapper around RemoveReference that works when the argument
-// T depends on template parameters.
-#define GTEST_REMOVE_REFERENCE_(T) \
- typename ::testing::internal::RemoveReference<T>::type
-
-// Removes const from a type if it is a const type, otherwise leaves
-// it unchanged. This is the same as tr1::remove_const, which is not
-// widely available yet.
-template <typename T>
-struct RemoveConst { typedef T type; }; // NOLINT
-template <typename T>
-struct RemoveConst<const T> { typedef T type; }; // NOLINT
-
-// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
-// definition to fail to remove the const in 'const int[3]' and 'const
-// char[3][4]'. The following specialization works around the bug.
-// However, it causes trouble with GCC and thus needs to be
-// conditionally compiled.
-#if defined(_MSC_VER) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
-template <typename T, size_t N>
-struct RemoveConst<const T[N]> {
- typedef typename RemoveConst<T>::type type[N];
-};
-#endif
-
-// A handy wrapper around RemoveConst that works when the argument
-// T depends on template parameters.
-#define GTEST_REMOVE_CONST_(T) \
- typename ::testing::internal::RemoveConst<T>::type
-
-// Turns const U&, U&, const U, and U all into U.
-#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
- GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
-
-// Adds reference to a type if it is not a reference type,
-// otherwise leaves it unchanged. This is the same as
-// tr1::add_reference, which is not widely available yet.
-template <typename T>
-struct AddReference { typedef T& type; }; // NOLINT
-template <typename T>
-struct AddReference<T&> { typedef T& type; }; // NOLINT
-
-// A handy wrapper around AddReference that works when the argument T
-// depends on template parameters.
-#define GTEST_ADD_REFERENCE_(T) \
- typename ::testing::internal::AddReference<T>::type
-
-// Adds a reference to const on top of T as necessary. For example,
-// it transforms
-//
-// char ==> const char&
-// const char ==> const char&
-// char& ==> const char&
-// const char& ==> const char&
-//
-// The argument T must depend on some template parameters.
-#define GTEST_REFERENCE_TO_CONST_(T) \
- GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
-
-// ImplicitlyConvertible<From, To>::value is a compile-time bool
-// constant that's true iff type From can be implicitly converted to
-// type To.
-template <typename From, typename To>
-class ImplicitlyConvertible {
- private:
- // We need the following helper functions only for their types.
- // They have no implementations.
-
- // MakeFrom() is an expression whose type is From. We cannot simply
- // use From(), as the type From may not have a public default
- // constructor.
- static From MakeFrom();
-
- // These two functions are overloaded. Given an expression
- // Helper(x), the compiler will pick the first version if x can be
- // implicitly converted to type To; otherwise it will pick the
- // second version.
- //
- // The first version returns a value of size 1, and the second
- // version returns a value of size 2. Therefore, by checking the
- // size of Helper(x), which can be done at compile time, we can tell
- // which version of Helper() is used, and hence whether x can be
- // implicitly converted to type To.
- static char Helper(To);
- static char (&Helper(...))[2]; // NOLINT
-
- // We have to put the 'public' section after the 'private' section,
- // or MSVC refuses to compile the code.
- public:
- // MSVC warns about implicitly converting from double to int for
- // possible loss of data, so we need to temporarily disable the
- // warning.
-#ifdef _MSC_VER
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4244) // Temporarily disables warning 4244.
-
- static const bool value =
- sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
-# pragma warning(pop) // Restores the warning state.
-#elif defined(__BORLANDC__)
- // C++Builder cannot use member overload resolution during template
- // instantiation. The simplest workaround is to use its C++0x type traits
- // functions (C++Builder 2009 and above only).
- static const bool value = __is_convertible(From, To);
-#else
- static const bool value =
- sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
-#endif // _MSV_VER
-};
-template <typename From, typename To>
-const bool ImplicitlyConvertible<From, To>::value;
-
-// IsAProtocolMessage<T>::value is a compile-time bool constant that's
-// true iff T is type ProtocolMessage, proto2::Message, or a subclass
-// of those.
-template <typename T>
-struct IsAProtocolMessage
- : public bool_constant<
- ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
- ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
-};
-
-// When the compiler sees expression IsContainerTest<C>(0), if C is an
-// STL-style container class, the first overload of IsContainerTest
-// will be viable (since both C::iterator* and C::const_iterator* are
-// valid types and NULL can be implicitly converted to them). It will
-// be picked over the second overload as 'int' is a perfect match for
-// the type of argument 0. If C::iterator or C::const_iterator is not
-// a valid type, the first overload is not viable, and the second
-// overload will be picked. Therefore, we can determine whether C is
-// a container class by checking the type of IsContainerTest<C>(0).
-// The value of the expression is insignificant.
-//
-// Note that we look for both C::iterator and C::const_iterator. The
-// reason is that C++ injects the name of a class as a member of the
-// class itself (e.g. you can refer to class iterator as either
-// 'iterator' or 'iterator::iterator'). If we look for C::iterator
-// only, for example, we would mistakenly think that a class named
-// iterator is an STL container.
-//
-// Also note that the simpler approach of overloading
-// IsContainerTest(typename C::const_iterator*) and
-// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
-typedef int IsContainer;
-template <class C>
-IsContainer IsContainerTest(int /* dummy */,
- typename C::iterator* /* it */ = NULL,
- typename C::const_iterator* /* const_it */ = NULL) {
- return 0;
-}
-
-typedef char IsNotContainer;
-template <class C>
-IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
-
-// EnableIf<condition>::type is void when 'Cond' is true, and
-// undefined when 'Cond' is false. To use SFINAE to make a function
-// overload only apply when a particular expression is true, add
-// "typename EnableIf<expression>::type* = 0" as the last parameter.
-template<bool> struct EnableIf;
-template<> struct EnableIf<true> { typedef void type; }; // NOLINT
-
-// Utilities for native arrays.
-
-// ArrayEq() compares two k-dimensional native arrays using the
-// elements' operator==, where k can be any integer >= 0. When k is
-// 0, ArrayEq() degenerates into comparing a single pair of values.
-
-template <typename T, typename U>
-bool ArrayEq(const T* lhs, size_t size, const U* rhs);
-
-// This generic version is used when k is 0.
-template <typename T, typename U>
-inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
-
-// This overload is used when k >= 1.
-template <typename T, typename U, size_t N>
-inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
- return internal::ArrayEq(lhs, N, rhs);
-}
-
-// This helper reduces code bloat. If we instead put its logic inside
-// the previous ArrayEq() function, arrays with different sizes would
-// lead to different copies of the template code.
-template <typename T, typename U>
-bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
- for (size_t i = 0; i != size; i++) {
- if (!internal::ArrayEq(lhs[i], rhs[i]))
- return false;
- }
- return true;
-}
-
-// Finds the first element in the iterator range [begin, end) that
-// equals elem. Element may be a native array type itself.
-template <typename Iter, typename Element>
-Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
- for (Iter it = begin; it != end; ++it) {
- if (internal::ArrayEq(*it, elem))
- return it;
- }
- return end;
-}
-
-// CopyArray() copies a k-dimensional native array using the elements'
-// operator=, where k can be any integer >= 0. When k is 0,
-// CopyArray() degenerates into copying a single value.
-
-template <typename T, typename U>
-void CopyArray(const T* from, size_t size, U* to);
-
-// This generic version is used when k is 0.
-template <typename T, typename U>
-inline void CopyArray(const T& from, U* to) { *to = from; }
-
-// This overload is used when k >= 1.
-template <typename T, typename U, size_t N>
-inline void CopyArray(const T(&from)[N], U(*to)[N]) {
- internal::CopyArray(from, N, *to);
-}
-
-// This helper reduces code bloat. If we instead put its logic inside
-// the previous CopyArray() function, arrays with different sizes
-// would lead to different copies of the template code.
-template <typename T, typename U>
-void CopyArray(const T* from, size_t size, U* to) {
- for (size_t i = 0; i != size; i++) {
- internal::CopyArray(from[i], to + i);
- }
-}
-
-// The relation between an NativeArray object (see below) and the
-// native array it represents.
-enum RelationToSource {
- kReference, // The NativeArray references the native array.
- kCopy // The NativeArray makes a copy of the native array and
- // owns the copy.
-};
-
-// Adapts a native array to a read-only STL-style container. Instead
-// of the complete STL container concept, this adaptor only implements
-// members useful for Google Mock's container matchers. New members
-// should be added as needed. To simplify the implementation, we only
-// support Element being a raw type (i.e. having no top-level const or
-// reference modifier). It's the client's responsibility to satisfy
-// this requirement. Element can be an array type itself (hence
-// multi-dimensional arrays are supported).
-template <typename Element>
-class NativeArray {
- public:
- // STL-style container typedefs.
- typedef Element value_type;
- typedef Element* iterator;
- typedef const Element* const_iterator;
-
- // Constructs from a native array.
- NativeArray(const Element* array, size_t count, RelationToSource relation) {
- Init(array, count, relation);
- }
-
- // Copy constructor.
- NativeArray(const NativeArray& rhs) {
- Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
- }
-
- ~NativeArray() {
- // Ensures that the user doesn't instantiate NativeArray with a
- // const or reference type.
- static_cast<void>(StaticAssertTypeEqHelper<Element,
- GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
- if (relation_to_source_ == kCopy)
- delete[] array_;
- }
-
- // STL-style container methods.
- size_t size() const { return size_; }
- const_iterator begin() const { return array_; }
- const_iterator end() const { return array_ + size_; }
- bool operator==(const NativeArray& rhs) const {
- return size() == rhs.size() &&
- ArrayEq(begin(), size(), rhs.begin());
- }
-
- private:
- // Initializes this object; makes a copy of the input array if
- // 'relation' is kCopy.
- void Init(const Element* array, size_t a_size, RelationToSource relation) {
- if (relation == kReference) {
- array_ = array;
- } else {
- Element* const copy = new Element[a_size];
- CopyArray(array, a_size, copy);
- array_ = copy;
- }
- size_ = a_size;
- relation_to_source_ = relation;
- }
-
- const Element* array_;
- size_t size_;
- RelationToSource relation_to_source_;
-
- GTEST_DISALLOW_ASSIGN_(NativeArray);
-};
-
-} // namespace internal
-} // namespace testing
-
-#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
- ::testing::internal::AssertHelper(result_type, file, line, message) \
- = ::testing::Message()
-
-#define GTEST_MESSAGE_(message, result_type) \
- GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
-
-#define GTEST_FATAL_FAILURE_(message) \
- return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
-
-#define GTEST_NONFATAL_FAILURE_(message) \
- GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
-
-#define GTEST_SUCCESS_(message) \
- GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
-
-// Suppresses MSVC warnings 4072 (unreachable code) for the code following
-// statement if it returns or throws (or doesn't return or throw in some
-// situations).
-#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
- if (::testing::internal::AlwaysTrue()) { statement; }
-
-#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::ConstCharPtr gtest_msg = "") { \
- bool gtest_caught_expected = false; \
- try { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } \
- catch (expected_exception const&) { \
- gtest_caught_expected = true; \
- } \
- catch (...) { \
- gtest_msg.value = \
- "Expected: " #statement " throws an exception of type " \
- #expected_exception ".\n Actual: it throws a different type."; \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
- } \
- if (!gtest_caught_expected) { \
- gtest_msg.value = \
- "Expected: " #statement " throws an exception of type " \
- #expected_exception ".\n Actual: it throws nothing."; \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
- fail(gtest_msg.value)
-
-#define GTEST_TEST_NO_THROW_(statement, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- try { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } \
- catch (...) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
- fail("Expected: " #statement " doesn't throw an exception.\n" \
- " Actual: it throws.")
-
-#define GTEST_TEST_ANY_THROW_(statement, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- bool gtest_caught_any = false; \
- try { \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- } \
- catch (...) { \
- gtest_caught_any = true; \
- } \
- if (!gtest_caught_any) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
- fail("Expected: " #statement " throws an exception.\n" \
- " Actual: it doesn't.")
-
-
-// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
-// either a boolean expression or an AssertionResult. text is a textual
-// represenation of expression as it was passed into the EXPECT_TRUE.
-#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (const ::testing::AssertionResult gtest_ar_ = \
- ::testing::AssertionResult(expression)) \
- ; \
- else \
- fail(::testing::internal::GetBoolAssertionFailureMessage(\
- gtest_ar_, text, #actual, #expected).c_str())
-
-#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::AlwaysTrue()) { \
- ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
- GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
- if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
- goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
- } \
- } else \
- GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
- fail("Expected: " #statement " doesn't generate new fatal " \
- "failures in the current thread.\n" \
- " Actual: it does.")
-
-// Expands to the name of the class that implements the given test.
-#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
- test_case_name##_##test_name##_Test
-
-// Helper macro for defining tests.
-#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
-class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
- public:\
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
- private:\
- virtual void TestBody();\
- static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
- GTEST_DISALLOW_COPY_AND_ASSIGN_(\
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
-};\
-\
-::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
- ::test_info_ =\
- ::testing::internal::MakeAndRegisterTestInfo(\
- #test_case_name, #test_name, NULL, NULL, \
- (parent_id), \
- parent_class::SetUpTestCase, \
- parent_class::TearDownTestCase, \
- new ::testing::internal::TestFactoryImpl<\
- GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
-void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
-
-#ifdef __ICC
-// Disable explicit warning on Intel compiler
-#pragma warning enable 2304
-#endif
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-linked_ptr.h b/unit_tests/gtest/include/gtest/internal/gtest-linked_ptr.h
deleted file mode 100644
index 57147b4..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-linked_ptr.h
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright 2003 Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: Dan Egnor (egnor at google.com)
-//
-// A "smart" pointer type with reference tracking. Every pointer to a
-// particular object is kept on a circular linked list. When the last pointer
-// to an object is destroyed or reassigned, the object is deleted.
-//
-// Used properly, this deletes the object when the last reference goes away.
-// There are several caveats:
-// - Like all reference counting schemes, cycles lead to leaks.
-// - Each smart pointer is actually two pointers (8 bytes instead of 4).
-// - Every time a pointer is assigned, the entire list of pointers to that
-// object is traversed. This class is therefore NOT SUITABLE when there
-// will often be more than two or three pointers to a particular object.
-// - References are only tracked as long as linked_ptr<> objects are copied.
-// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
-// will happen (double deletion).
-//
-// A good use of this class is storing object references in STL containers.
-// You can safely put linked_ptr<> in a vector<>.
-// Other uses may not be as good.
-//
-// Note: If you use an incomplete type with linked_ptr<>, the class
-// *containing* linked_ptr<> must have a constructor and destructor (even
-// if they do nothing!).
-//
-// Bill Gibbons suggested we use something like this.
-//
-// Thread Safety:
-// Unlike other linked_ptr implementations, in this implementation
-// a linked_ptr object is thread-safe in the sense that:
-// - it's safe to copy linked_ptr objects concurrently,
-// - it's safe to copy *from* a linked_ptr and read its underlying
-// raw pointer (e.g. via get()) concurrently, and
-// - it's safe to write to two linked_ptrs that point to the same
-// shared object concurrently.
-// TODO(wan at google.com): rename this to safe_linked_ptr to avoid
-// confusion with normal linked_ptr.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
-
-#include <stdlib.h>
-#include <assert.h>
-
-#include "gtest/internal/gtest-port.h"
-
-namespace testing {
-namespace internal {
-
-// Protects copying of all linked_ptr objects.
-GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
-
-// This is used internally by all instances of linked_ptr<>. It needs to be
-// a non-template class because different types of linked_ptr<> can refer to
-// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
-// So, it needs to be possible for different types of linked_ptr to participate
-// in the same circular linked list, so we need a single class type here.
-//
-// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr<T>.
-class linked_ptr_internal {
- public:
- // Create a new circle that includes only this instance.
- void join_new() {
- next_ = this;
- }
-
- // Many linked_ptr operations may change p.link_ for some linked_ptr
- // variable p in the same circle as this object. Therefore we need
- // to prevent two such operations from occurring concurrently.
- //
- // Note that different types of linked_ptr objects can coexist in a
- // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
- // linked_ptr<Derived2>). Therefore we must use a single mutex to
- // protect all linked_ptr objects. This can create serious
- // contention in production code, but is acceptable in a testing
- // framework.
-
- // Join an existing circle.
- // L < g_linked_ptr_mutex
- void join(linked_ptr_internal const* ptr) {
- MutexLock lock(&g_linked_ptr_mutex);
-
- linked_ptr_internal const* p = ptr;
- while (p->next_ != ptr) p = p->next_;
- p->next_ = this;
- next_ = ptr;
- }
-
- // Leave whatever circle we're part of. Returns true if we were the
- // last member of the circle. Once this is done, you can join() another.
- // L < g_linked_ptr_mutex
- bool depart() {
- MutexLock lock(&g_linked_ptr_mutex);
-
- if (next_ == this) return true;
- linked_ptr_internal const* p = next_;
- while (p->next_ != this) p = p->next_;
- p->next_ = next_;
- return false;
- }
-
- private:
- mutable linked_ptr_internal const* next_;
-};
-
-template <typename T>
-class linked_ptr {
- public:
- typedef T element_type;
-
- // Take over ownership of a raw pointer. This should happen as soon as
- // possible after the object is created.
- explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
- ~linked_ptr() { depart(); }
-
- // Copy an existing linked_ptr<>, adding ourselves to the list of references.
- template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
- linked_ptr(linked_ptr const& ptr) { // NOLINT
- assert(&ptr != this);
- copy(&ptr);
- }
-
- // Assignment releases the old value and acquires the new.
- template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
- depart();
- copy(&ptr);
- return *this;
- }
-
- linked_ptr& operator=(linked_ptr const& ptr) {
- if (&ptr != this) {
- depart();
- copy(&ptr);
- }
- return *this;
- }
-
- // Smart pointer members.
- void reset(T* ptr = NULL) {
- depart();
- capture(ptr);
- }
- T* get() const { return value_; }
- T* operator->() const { return value_; }
- T& operator*() const { return *value_; }
-
- bool operator==(T* p) const { return value_ == p; }
- bool operator!=(T* p) const { return value_ != p; }
- template <typename U>
- bool operator==(linked_ptr<U> const& ptr) const {
- return value_ == ptr.get();
- }
- template <typename U>
- bool operator!=(linked_ptr<U> const& ptr) const {
- return value_ != ptr.get();
- }
-
- private:
- template <typename U>
- friend class linked_ptr;
-
- T* value_;
- linked_ptr_internal link_;
-
- void depart() {
- if (link_.depart()) delete value_;
- }
-
- void capture(T* ptr) {
- value_ = ptr;
- link_.join_new();
- }
-
- template <typename U> void copy(linked_ptr<U> const* ptr) {
- value_ = ptr->get();
- if (value_)
- link_.join(&ptr->link_);
- else
- link_.join_new();
- }
-};
-
-template<typename T> inline
-bool operator==(T* ptr, const linked_ptr<T>& x) {
- return ptr == x.get();
-}
-
-template<typename T> inline
-bool operator!=(T* ptr, const linked_ptr<T>& x) {
- return ptr != x.get();
-}
-
-// A function to convert T* into linked_ptr<T>
-// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
-// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
-template <typename T>
-linked_ptr<T> make_linked_ptr(T* ptr) {
- return linked_ptr<T>(ptr);
-}
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-param-util-generated.h b/unit_tests/gtest/include/gtest/internal/gtest-param-util-generated.h
deleted file mode 100644
index 2582675..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-param-util-generated.h
+++ /dev/null
@@ -1,4822 +0,0 @@
-// This file was GENERATED by command:
-// pump.py gtest-param-util-generated.h.pump
-// DO NOT EDIT BY HAND!!!
-
-// Copyright 2008 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: vladl at google.com (Vlad Losev)
-
-// Type and function utilities for implementing parameterized tests.
-// This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
-//
-// Currently Google Test supports at most 50 arguments in Values,
-// and at most 10 arguments in Combine. Please contact
-// googletestframework at googlegroups.com if you need more.
-// Please note that the number of arguments to Combine is limited
-// by the maximum arity of the implementation of tr1::tuple which is
-// currently set at 10.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
-
-// scripts/fuse_gtest.py depends on gtest's own header being #included
-// *unconditionally*. Therefore these #includes cannot be moved
-// inside #if GTEST_HAS_PARAM_TEST.
-#include "gtest/internal/gtest-param-util.h"
-#include "gtest/internal/gtest-port.h"
-
-#if GTEST_HAS_PARAM_TEST
-
-namespace testing {
-
-// Forward declarations of ValuesIn(), which is implemented in
-// include/gtest/gtest-param-test.h.
-template <typename ForwardIterator>
-internal::ParamGenerator<
- typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
-ValuesIn(ForwardIterator begin, ForwardIterator end);
-
-template <typename T, size_t N>
-internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
-
-template <class Container>
-internal::ParamGenerator<typename Container::value_type> ValuesIn(
- const Container& container);
-
-namespace internal {
-
-// Used in the Values() function to provide polymorphic capabilities.
-template <typename T1>
-class ValueArray1 {
- public:
- explicit ValueArray1(T1 v1) : v1_(v1) {}
-
- template <typename T>
- operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray1& other);
-
- const T1 v1_;
-};
-
-template <typename T1, typename T2>
-class ValueArray2 {
- public:
- ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray2& other);
-
- const T1 v1_;
- const T2 v2_;
-};
-
-template <typename T1, typename T2, typename T3>
-class ValueArray3 {
- public:
- ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray3& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4>
-class ValueArray4 {
- public:
- ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray4& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-class ValueArray5 {
- public:
- ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4), v5_(v5) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray5& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
-class ValueArray6 {
- public:
- ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
- v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray6& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
-class ValueArray7 {
- public:
- ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray7& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
-class ValueArray8 {
- public:
- ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
- T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray8& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
-class ValueArray9 {
- public:
- ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
- T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray9& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
-class ValueArray10 {
- public:
- ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray10& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11>
-class ValueArray11 {
- public:
- ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray11& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12>
-class ValueArray12 {
- public:
- ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray12& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13>
-class ValueArray13 {
- public:
- ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
- v12_(v12), v13_(v13) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray13& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14>
-class ValueArray14 {
- public:
- ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray14& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15>
-class ValueArray15 {
- public:
- ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray15& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16>
-class ValueArray16 {
- public:
- ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
- v16_(v16) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray16& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17>
-class ValueArray17 {
- public:
- ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
- T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray17& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18>
-class ValueArray18 {
- public:
- ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray18& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19>
-class ValueArray19 {
- public:
- ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
- v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray19& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20>
-class ValueArray20 {
- public:
- ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
- v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
- v19_(v19), v20_(v20) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray20& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21>
-class ValueArray21 {
- public:
- ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
- v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
- v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray21& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22>
-class ValueArray22 {
- public:
- ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray22& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23>
-class ValueArray23 {
- public:
- ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,
- v23_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray23& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24>
-class ValueArray24 {
- public:
- ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
- v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
- v22_(v22), v23_(v23), v24_(v24) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray24& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25>
-class ValueArray25 {
- public:
- ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
- T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray25& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26>
-class ValueArray26 {
- public:
- ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray26& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27>
-class ValueArray27 {
- public:
- ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
- v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
- v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
- v26_(v26), v27_(v27) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray27& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28>
-class ValueArray28 {
- public:
- ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
- v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
- v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
- v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray28& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29>
-class ValueArray29 {
- public:
- ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
- v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
- v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
- v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray29& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30>
-class ValueArray30 {
- public:
- ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
- v29_(v29), v30_(v30) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray30& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31>
-class ValueArray31 {
- public:
- ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
- v29_(v29), v30_(v30), v31_(v31) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray31& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32>
-class ValueArray32 {
- public:
- ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
- v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
- v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
- v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray32& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33>
-class ValueArray33 {
- public:
- ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
- T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
- v33_(v33) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray33& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34>
-class ValueArray34 {
- public:
- ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
- v33_(v33), v34_(v34) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray34& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35>
-class ValueArray35 {
- public:
- ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
- v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
- v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
- v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
- v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,
- v35_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray35& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36>
-class ValueArray36 {
- public:
- ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
- v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
- v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
- v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
- v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray36& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37>
-class ValueArray37 {
- public:
- ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
- v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
- v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
- v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
- v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
- v36_(v36), v37_(v37) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray37& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38>
-class ValueArray38 {
- public:
- ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
- v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
- v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray38& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39>
-class ValueArray39 {
- public:
- ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
- v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
- v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray39& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40>
-class ValueArray40 {
- public:
- ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
- v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
- v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
- v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
- v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
- v40_(v40) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray40& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41>
-class ValueArray41 {
- public:
- ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
- T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
- v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
- v39_(v39), v40_(v40), v41_(v41) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray41& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42>
-class ValueArray42 {
- public:
- ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
- v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
- v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray42& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43>
-class ValueArray43 {
- public:
- ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
- v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
- v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
- v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
- v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
- v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
- v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray43& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44>
-class ValueArray44 {
- public:
- ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
- v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
- v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
- v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
- v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
- v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
- v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
- v43_(v43), v44_(v44) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray44& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45>
-class ValueArray45 {
- public:
- ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
- v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
- v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
- v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
- v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
- v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
- v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
- v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray45& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
- const T45 v45_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46>
-class ValueArray46 {
- public:
- ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
- v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
- v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
- v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
- v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray46& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
- const T45 v45_;
- const T46 v46_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47>
-class ValueArray47 {
- public:
- ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
- v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
- v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
- v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
- v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
- v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
- v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
- v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
- v47_(v47) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,
- v47_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray47& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
- const T45 v45_;
- const T46 v46_;
- const T47 v47_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48>
-class ValueArray48 {
- public:
- ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
- v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
- v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
- v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
- v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
- v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
- v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
- v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
- v46_(v46), v47_(v47), v48_(v48) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
- v48_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray48& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
- const T45 v45_;
- const T46 v46_;
- const T47 v47_;
- const T48 v48_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49>
-class ValueArray49 {
- public:
- ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
- T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
- v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
- v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
- v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
- v48_, v49_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray49& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
- const T45 v45_;
- const T46 v46_;
- const T47 v47_;
- const T48 v48_;
- const T49 v49_;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49, typename T50>
-class ValueArray50 {
- public:
- ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
- T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
- T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
- T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
- T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
- T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
- T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
- v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
- v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
- v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
- v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
- v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
- v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
- v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
-
- template <typename T>
- operator ParamGenerator<T>() const {
- const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
- v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
- v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
- v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
- v48_, v49_, v50_};
- return ValuesIn(array);
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const ValueArray50& other);
-
- const T1 v1_;
- const T2 v2_;
- const T3 v3_;
- const T4 v4_;
- const T5 v5_;
- const T6 v6_;
- const T7 v7_;
- const T8 v8_;
- const T9 v9_;
- const T10 v10_;
- const T11 v11_;
- const T12 v12_;
- const T13 v13_;
- const T14 v14_;
- const T15 v15_;
- const T16 v16_;
- const T17 v17_;
- const T18 v18_;
- const T19 v19_;
- const T20 v20_;
- const T21 v21_;
- const T22 v22_;
- const T23 v23_;
- const T24 v24_;
- const T25 v25_;
- const T26 v26_;
- const T27 v27_;
- const T28 v28_;
- const T29 v29_;
- const T30 v30_;
- const T31 v31_;
- const T32 v32_;
- const T33 v33_;
- const T34 v34_;
- const T35 v35_;
- const T36 v36_;
- const T37 v37_;
- const T38 v38_;
- const T39 v39_;
- const T40 v40_;
- const T41 v41_;
- const T42 v42_;
- const T43 v43_;
- const T44 v44_;
- const T45 v45_;
- const T46 v46_;
- const T47 v47_;
- const T48 v48_;
- const T49 v49_;
- const T50 v50_;
-};
-
-# if GTEST_HAS_COMBINE
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Generates values from the Cartesian product of values produced
-// by the argument generators.
-//
-template <typename T1, typename T2>
-class CartesianProductGenerator2
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
- public:
- typedef ::std::tr1::tuple<T1, T2> ParamType;
-
- CartesianProductGenerator2(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2)
- : g1_(g1), g2_(g2) {}
- virtual ~CartesianProductGenerator2() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current2_;
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- ParamType current_value_;
- }; // class CartesianProductGenerator2::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator2& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
-}; // class CartesianProductGenerator2
-
-
-template <typename T1, typename T2, typename T3>
-class CartesianProductGenerator3
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
-
- CartesianProductGenerator3(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
- : g1_(g1), g2_(g2), g3_(g3) {}
- virtual ~CartesianProductGenerator3() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current3_;
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- ParamType current_value_;
- }; // class CartesianProductGenerator3::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator3& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
-}; // class CartesianProductGenerator3
-
-
-template <typename T1, typename T2, typename T3, typename T4>
-class CartesianProductGenerator4
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
-
- CartesianProductGenerator4(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
- virtual ~CartesianProductGenerator4() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current4_;
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- ParamType current_value_;
- }; // class CartesianProductGenerator4::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator4& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
-}; // class CartesianProductGenerator4
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-class CartesianProductGenerator5
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
-
- CartesianProductGenerator5(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
- virtual ~CartesianProductGenerator5() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end(), g5_, g5_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4,
- const ParamGenerator<T5>& g5,
- const typename ParamGenerator<T5>::iterator& current5)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current5_;
- if (current5_ == end5_) {
- current5_ = begin5_;
- ++current4_;
- }
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_ &&
- current5_ == typed_other->current5_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_),
- begin5_(other.begin5_),
- end5_(other.end5_),
- current5_(other.current5_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_, *current5_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_ ||
- current5_ == end5_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- const typename ParamGenerator<T5>::iterator begin5_;
- const typename ParamGenerator<T5>::iterator end5_;
- typename ParamGenerator<T5>::iterator current5_;
- ParamType current_value_;
- }; // class CartesianProductGenerator5::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator5& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
- const ParamGenerator<T5> g5_;
-}; // class CartesianProductGenerator5
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
-class CartesianProductGenerator6
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
- T6> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
-
- CartesianProductGenerator6(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
- const ParamGenerator<T6>& g6)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
- virtual ~CartesianProductGenerator6() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4,
- const ParamGenerator<T5>& g5,
- const typename ParamGenerator<T5>::iterator& current5,
- const ParamGenerator<T6>& g6,
- const typename ParamGenerator<T6>::iterator& current6)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current6_;
- if (current6_ == end6_) {
- current6_ = begin6_;
- ++current5_;
- }
- if (current5_ == end5_) {
- current5_ = begin5_;
- ++current4_;
- }
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_ &&
- current5_ == typed_other->current5_ &&
- current6_ == typed_other->current6_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_),
- begin5_(other.begin5_),
- end5_(other.end5_),
- current5_(other.current5_),
- begin6_(other.begin6_),
- end6_(other.end6_),
- current6_(other.current6_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_, *current5_, *current6_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_ ||
- current5_ == end5_ ||
- current6_ == end6_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- const typename ParamGenerator<T5>::iterator begin5_;
- const typename ParamGenerator<T5>::iterator end5_;
- typename ParamGenerator<T5>::iterator current5_;
- const typename ParamGenerator<T6>::iterator begin6_;
- const typename ParamGenerator<T6>::iterator end6_;
- typename ParamGenerator<T6>::iterator current6_;
- ParamType current_value_;
- }; // class CartesianProductGenerator6::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator6& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
- const ParamGenerator<T5> g5_;
- const ParamGenerator<T6> g6_;
-}; // class CartesianProductGenerator6
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
-class CartesianProductGenerator7
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
- T7> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
-
- CartesianProductGenerator7(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
- const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
- virtual ~CartesianProductGenerator7() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
- g7_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4,
- const ParamGenerator<T5>& g5,
- const typename ParamGenerator<T5>::iterator& current5,
- const ParamGenerator<T6>& g6,
- const typename ParamGenerator<T6>::iterator& current6,
- const ParamGenerator<T7>& g7,
- const typename ParamGenerator<T7>::iterator& current7)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
- begin7_(g7.begin()), end7_(g7.end()), current7_(current7) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current7_;
- if (current7_ == end7_) {
- current7_ = begin7_;
- ++current6_;
- }
- if (current6_ == end6_) {
- current6_ = begin6_;
- ++current5_;
- }
- if (current5_ == end5_) {
- current5_ = begin5_;
- ++current4_;
- }
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_ &&
- current5_ == typed_other->current5_ &&
- current6_ == typed_other->current6_ &&
- current7_ == typed_other->current7_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_),
- begin5_(other.begin5_),
- end5_(other.end5_),
- current5_(other.current5_),
- begin6_(other.begin6_),
- end6_(other.end6_),
- current6_(other.current6_),
- begin7_(other.begin7_),
- end7_(other.end7_),
- current7_(other.current7_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_, *current5_, *current6_, *current7_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_ ||
- current5_ == end5_ ||
- current6_ == end6_ ||
- current7_ == end7_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- const typename ParamGenerator<T5>::iterator begin5_;
- const typename ParamGenerator<T5>::iterator end5_;
- typename ParamGenerator<T5>::iterator current5_;
- const typename ParamGenerator<T6>::iterator begin6_;
- const typename ParamGenerator<T6>::iterator end6_;
- typename ParamGenerator<T6>::iterator current6_;
- const typename ParamGenerator<T7>::iterator begin7_;
- const typename ParamGenerator<T7>::iterator end7_;
- typename ParamGenerator<T7>::iterator current7_;
- ParamType current_value_;
- }; // class CartesianProductGenerator7::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator7& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
- const ParamGenerator<T5> g5_;
- const ParamGenerator<T6> g6_;
- const ParamGenerator<T7> g7_;
-}; // class CartesianProductGenerator7
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
-class CartesianProductGenerator8
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
- T7, T8> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
-
- CartesianProductGenerator8(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
- const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
- const ParamGenerator<T8>& g8)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
- g8_(g8) {}
- virtual ~CartesianProductGenerator8() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
- g7_.begin(), g8_, g8_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
- g8_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4,
- const ParamGenerator<T5>& g5,
- const typename ParamGenerator<T5>::iterator& current5,
- const ParamGenerator<T6>& g6,
- const typename ParamGenerator<T6>::iterator& current6,
- const ParamGenerator<T7>& g7,
- const typename ParamGenerator<T7>::iterator& current7,
- const ParamGenerator<T8>& g8,
- const typename ParamGenerator<T8>::iterator& current8)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
- begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
- begin8_(g8.begin()), end8_(g8.end()), current8_(current8) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current8_;
- if (current8_ == end8_) {
- current8_ = begin8_;
- ++current7_;
- }
- if (current7_ == end7_) {
- current7_ = begin7_;
- ++current6_;
- }
- if (current6_ == end6_) {
- current6_ = begin6_;
- ++current5_;
- }
- if (current5_ == end5_) {
- current5_ = begin5_;
- ++current4_;
- }
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_ &&
- current5_ == typed_other->current5_ &&
- current6_ == typed_other->current6_ &&
- current7_ == typed_other->current7_ &&
- current8_ == typed_other->current8_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_),
- begin5_(other.begin5_),
- end5_(other.end5_),
- current5_(other.current5_),
- begin6_(other.begin6_),
- end6_(other.end6_),
- current6_(other.current6_),
- begin7_(other.begin7_),
- end7_(other.end7_),
- current7_(other.current7_),
- begin8_(other.begin8_),
- end8_(other.end8_),
- current8_(other.current8_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_, *current5_, *current6_, *current7_, *current8_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_ ||
- current5_ == end5_ ||
- current6_ == end6_ ||
- current7_ == end7_ ||
- current8_ == end8_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- const typename ParamGenerator<T5>::iterator begin5_;
- const typename ParamGenerator<T5>::iterator end5_;
- typename ParamGenerator<T5>::iterator current5_;
- const typename ParamGenerator<T6>::iterator begin6_;
- const typename ParamGenerator<T6>::iterator end6_;
- typename ParamGenerator<T6>::iterator current6_;
- const typename ParamGenerator<T7>::iterator begin7_;
- const typename ParamGenerator<T7>::iterator end7_;
- typename ParamGenerator<T7>::iterator current7_;
- const typename ParamGenerator<T8>::iterator begin8_;
- const typename ParamGenerator<T8>::iterator end8_;
- typename ParamGenerator<T8>::iterator current8_;
- ParamType current_value_;
- }; // class CartesianProductGenerator8::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator8& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
- const ParamGenerator<T5> g5_;
- const ParamGenerator<T6> g6_;
- const ParamGenerator<T7> g7_;
- const ParamGenerator<T8> g8_;
-}; // class CartesianProductGenerator8
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
-class CartesianProductGenerator9
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
- T7, T8, T9> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
-
- CartesianProductGenerator9(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
- const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
- const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
- g9_(g9) {}
- virtual ~CartesianProductGenerator9() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
- g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
- g8_.end(), g9_, g9_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4,
- const ParamGenerator<T5>& g5,
- const typename ParamGenerator<T5>::iterator& current5,
- const ParamGenerator<T6>& g6,
- const typename ParamGenerator<T6>::iterator& current6,
- const ParamGenerator<T7>& g7,
- const typename ParamGenerator<T7>::iterator& current7,
- const ParamGenerator<T8>& g8,
- const typename ParamGenerator<T8>::iterator& current8,
- const ParamGenerator<T9>& g9,
- const typename ParamGenerator<T9>::iterator& current9)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
- begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
- begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
- begin9_(g9.begin()), end9_(g9.end()), current9_(current9) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current9_;
- if (current9_ == end9_) {
- current9_ = begin9_;
- ++current8_;
- }
- if (current8_ == end8_) {
- current8_ = begin8_;
- ++current7_;
- }
- if (current7_ == end7_) {
- current7_ = begin7_;
- ++current6_;
- }
- if (current6_ == end6_) {
- current6_ = begin6_;
- ++current5_;
- }
- if (current5_ == end5_) {
- current5_ = begin5_;
- ++current4_;
- }
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_ &&
- current5_ == typed_other->current5_ &&
- current6_ == typed_other->current6_ &&
- current7_ == typed_other->current7_ &&
- current8_ == typed_other->current8_ &&
- current9_ == typed_other->current9_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_),
- begin5_(other.begin5_),
- end5_(other.end5_),
- current5_(other.current5_),
- begin6_(other.begin6_),
- end6_(other.end6_),
- current6_(other.current6_),
- begin7_(other.begin7_),
- end7_(other.end7_),
- current7_(other.current7_),
- begin8_(other.begin8_),
- end8_(other.end8_),
- current8_(other.current8_),
- begin9_(other.begin9_),
- end9_(other.end9_),
- current9_(other.current9_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_, *current5_, *current6_, *current7_, *current8_,
- *current9_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_ ||
- current5_ == end5_ ||
- current6_ == end6_ ||
- current7_ == end7_ ||
- current8_ == end8_ ||
- current9_ == end9_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- const typename ParamGenerator<T5>::iterator begin5_;
- const typename ParamGenerator<T5>::iterator end5_;
- typename ParamGenerator<T5>::iterator current5_;
- const typename ParamGenerator<T6>::iterator begin6_;
- const typename ParamGenerator<T6>::iterator end6_;
- typename ParamGenerator<T6>::iterator current6_;
- const typename ParamGenerator<T7>::iterator begin7_;
- const typename ParamGenerator<T7>::iterator end7_;
- typename ParamGenerator<T7>::iterator current7_;
- const typename ParamGenerator<T8>::iterator begin8_;
- const typename ParamGenerator<T8>::iterator end8_;
- typename ParamGenerator<T8>::iterator current8_;
- const typename ParamGenerator<T9>::iterator begin9_;
- const typename ParamGenerator<T9>::iterator end9_;
- typename ParamGenerator<T9>::iterator current9_;
- ParamType current_value_;
- }; // class CartesianProductGenerator9::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator9& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
- const ParamGenerator<T5> g5_;
- const ParamGenerator<T6> g6_;
- const ParamGenerator<T7> g7_;
- const ParamGenerator<T8> g8_;
- const ParamGenerator<T9> g9_;
-}; // class CartesianProductGenerator9
-
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
-class CartesianProductGenerator10
- : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
- T7, T8, T9, T10> > {
- public:
- typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
-
- CartesianProductGenerator10(const ParamGenerator<T1>& g1,
- const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
- const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
- const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
- const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
- const ParamGenerator<T10>& g10)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
- g9_(g9), g10_(g10) {}
- virtual ~CartesianProductGenerator10() {}
-
- virtual ParamIteratorInterface<ParamType>* Begin() const {
- return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
- g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
- g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
- }
- virtual ParamIteratorInterface<ParamType>* End() const {
- return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
- g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
- g8_.end(), g9_, g9_.end(), g10_, g10_.end());
- }
-
- private:
- class Iterator : public ParamIteratorInterface<ParamType> {
- public:
- Iterator(const ParamGeneratorInterface<ParamType>* base,
- const ParamGenerator<T1>& g1,
- const typename ParamGenerator<T1>::iterator& current1,
- const ParamGenerator<T2>& g2,
- const typename ParamGenerator<T2>::iterator& current2,
- const ParamGenerator<T3>& g3,
- const typename ParamGenerator<T3>::iterator& current3,
- const ParamGenerator<T4>& g4,
- const typename ParamGenerator<T4>::iterator& current4,
- const ParamGenerator<T5>& g5,
- const typename ParamGenerator<T5>::iterator& current5,
- const ParamGenerator<T6>& g6,
- const typename ParamGenerator<T6>::iterator& current6,
- const ParamGenerator<T7>& g7,
- const typename ParamGenerator<T7>::iterator& current7,
- const ParamGenerator<T8>& g8,
- const typename ParamGenerator<T8>::iterator& current8,
- const ParamGenerator<T9>& g9,
- const typename ParamGenerator<T9>::iterator& current9,
- const ParamGenerator<T10>& g10,
- const typename ParamGenerator<T10>::iterator& current10)
- : base_(base),
- begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
- begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
- begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
- begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
- begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
- begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
- begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
- begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
- begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
- begin10_(g10.begin()), end10_(g10.end()), current10_(current10) {
- ComputeCurrentValue();
- }
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
- return base_;
- }
- // Advance should not be called on beyond-of-range iterators
- // so no component iterators must be beyond end of range, either.
- virtual void Advance() {
- assert(!AtEnd());
- ++current10_;
- if (current10_ == end10_) {
- current10_ = begin10_;
- ++current9_;
- }
- if (current9_ == end9_) {
- current9_ = begin9_;
- ++current8_;
- }
- if (current8_ == end8_) {
- current8_ = begin8_;
- ++current7_;
- }
- if (current7_ == end7_) {
- current7_ = begin7_;
- ++current6_;
- }
- if (current6_ == end6_) {
- current6_ = begin6_;
- ++current5_;
- }
- if (current5_ == end5_) {
- current5_ = begin5_;
- ++current4_;
- }
- if (current4_ == end4_) {
- current4_ = begin4_;
- ++current3_;
- }
- if (current3_ == end3_) {
- current3_ = begin3_;
- ++current2_;
- }
- if (current2_ == end2_) {
- current2_ = begin2_;
- ++current1_;
- }
- ComputeCurrentValue();
- }
- virtual ParamIteratorInterface<ParamType>* Clone() const {
- return new Iterator(*this);
- }
- virtual const ParamType* Current() const { return ¤t_value_; }
- virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const Iterator* typed_other =
- CheckedDowncastToActualType<const Iterator>(&other);
- // We must report iterators equal if they both point beyond their
- // respective ranges. That can happen in a variety of fashions,
- // so we have to consult AtEnd().
- return (AtEnd() && typed_other->AtEnd()) ||
- (
- current1_ == typed_other->current1_ &&
- current2_ == typed_other->current2_ &&
- current3_ == typed_other->current3_ &&
- current4_ == typed_other->current4_ &&
- current5_ == typed_other->current5_ &&
- current6_ == typed_other->current6_ &&
- current7_ == typed_other->current7_ &&
- current8_ == typed_other->current8_ &&
- current9_ == typed_other->current9_ &&
- current10_ == typed_other->current10_);
- }
-
- private:
- Iterator(const Iterator& other)
- : base_(other.base_),
- begin1_(other.begin1_),
- end1_(other.end1_),
- current1_(other.current1_),
- begin2_(other.begin2_),
- end2_(other.end2_),
- current2_(other.current2_),
- begin3_(other.begin3_),
- end3_(other.end3_),
- current3_(other.current3_),
- begin4_(other.begin4_),
- end4_(other.end4_),
- current4_(other.current4_),
- begin5_(other.begin5_),
- end5_(other.end5_),
- current5_(other.current5_),
- begin6_(other.begin6_),
- end6_(other.end6_),
- current6_(other.current6_),
- begin7_(other.begin7_),
- end7_(other.end7_),
- current7_(other.current7_),
- begin8_(other.begin8_),
- end8_(other.end8_),
- current8_(other.current8_),
- begin9_(other.begin9_),
- end9_(other.end9_),
- current9_(other.current9_),
- begin10_(other.begin10_),
- end10_(other.end10_),
- current10_(other.current10_) {
- ComputeCurrentValue();
- }
-
- void ComputeCurrentValue() {
- if (!AtEnd())
- current_value_ = ParamType(*current1_, *current2_, *current3_,
- *current4_, *current5_, *current6_, *current7_, *current8_,
- *current9_, *current10_);
- }
- bool AtEnd() const {
- // We must report iterator past the end of the range when either of the
- // component iterators has reached the end of its range.
- return
- current1_ == end1_ ||
- current2_ == end2_ ||
- current3_ == end3_ ||
- current4_ == end4_ ||
- current5_ == end5_ ||
- current6_ == end6_ ||
- current7_ == end7_ ||
- current8_ == end8_ ||
- current9_ == end9_ ||
- current10_ == end10_;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<ParamType>* const base_;
- // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
- // current[i]_ is the actual traversing iterator.
- const typename ParamGenerator<T1>::iterator begin1_;
- const typename ParamGenerator<T1>::iterator end1_;
- typename ParamGenerator<T1>::iterator current1_;
- const typename ParamGenerator<T2>::iterator begin2_;
- const typename ParamGenerator<T2>::iterator end2_;
- typename ParamGenerator<T2>::iterator current2_;
- const typename ParamGenerator<T3>::iterator begin3_;
- const typename ParamGenerator<T3>::iterator end3_;
- typename ParamGenerator<T3>::iterator current3_;
- const typename ParamGenerator<T4>::iterator begin4_;
- const typename ParamGenerator<T4>::iterator end4_;
- typename ParamGenerator<T4>::iterator current4_;
- const typename ParamGenerator<T5>::iterator begin5_;
- const typename ParamGenerator<T5>::iterator end5_;
- typename ParamGenerator<T5>::iterator current5_;
- const typename ParamGenerator<T6>::iterator begin6_;
- const typename ParamGenerator<T6>::iterator end6_;
- typename ParamGenerator<T6>::iterator current6_;
- const typename ParamGenerator<T7>::iterator begin7_;
- const typename ParamGenerator<T7>::iterator end7_;
- typename ParamGenerator<T7>::iterator current7_;
- const typename ParamGenerator<T8>::iterator begin8_;
- const typename ParamGenerator<T8>::iterator end8_;
- typename ParamGenerator<T8>::iterator current8_;
- const typename ParamGenerator<T9>::iterator begin9_;
- const typename ParamGenerator<T9>::iterator end9_;
- typename ParamGenerator<T9>::iterator current9_;
- const typename ParamGenerator<T10>::iterator begin10_;
- const typename ParamGenerator<T10>::iterator end10_;
- typename ParamGenerator<T10>::iterator current10_;
- ParamType current_value_;
- }; // class CartesianProductGenerator10::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductGenerator10& other);
-
- const ParamGenerator<T1> g1_;
- const ParamGenerator<T2> g2_;
- const ParamGenerator<T3> g3_;
- const ParamGenerator<T4> g4_;
- const ParamGenerator<T5> g5_;
- const ParamGenerator<T6> g6_;
- const ParamGenerator<T7> g7_;
- const ParamGenerator<T8> g8_;
- const ParamGenerator<T9> g9_;
- const ParamGenerator<T10> g10_;
-}; // class CartesianProductGenerator10
-
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Helper classes providing Combine() with polymorphic features. They allow
-// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
-// convertible to U.
-//
-template <class Generator1, class Generator2>
-class CartesianProductHolder2 {
- public:
-CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
- : g1_(g1), g2_(g2) {}
- template <typename T1, typename T2>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
- new CartesianProductGenerator2<T1, T2>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder2& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
-}; // class CartesianProductHolder2
-
-template <class Generator1, class Generator2, class Generator3>
-class CartesianProductHolder3 {
- public:
-CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
- const Generator3& g3)
- : g1_(g1), g2_(g2), g3_(g3) {}
- template <typename T1, typename T2, typename T3>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
- new CartesianProductGenerator3<T1, T2, T3>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder3& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
-}; // class CartesianProductHolder3
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4>
-class CartesianProductHolder4 {
- public:
-CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
- template <typename T1, typename T2, typename T3, typename T4>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
- new CartesianProductGenerator4<T1, T2, T3, T4>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder4& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
-}; // class CartesianProductHolder4
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4, class Generator5>
-class CartesianProductHolder5 {
- public:
-CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4, const Generator5& g5)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
- template <typename T1, typename T2, typename T3, typename T4, typename T5>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
- new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_),
- static_cast<ParamGenerator<T5> >(g5_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder5& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
- const Generator5 g5_;
-}; // class CartesianProductHolder5
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4, class Generator5, class Generator6>
-class CartesianProductHolder6 {
- public:
-CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4, const Generator5& g5,
- const Generator6& g6)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
- new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_),
- static_cast<ParamGenerator<T5> >(g5_),
- static_cast<ParamGenerator<T6> >(g6_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder6& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
- const Generator5 g5_;
- const Generator6 g6_;
-}; // class CartesianProductHolder6
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4, class Generator5, class Generator6, class Generator7>
-class CartesianProductHolder7 {
- public:
-CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4, const Generator5& g5,
- const Generator6& g6, const Generator7& g7)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
- T7> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
- new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_),
- static_cast<ParamGenerator<T5> >(g5_),
- static_cast<ParamGenerator<T6> >(g6_),
- static_cast<ParamGenerator<T7> >(g7_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder7& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
- const Generator5 g5_;
- const Generator6 g6_;
- const Generator7 g7_;
-}; // class CartesianProductHolder7
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4, class Generator5, class Generator6, class Generator7,
- class Generator8>
-class CartesianProductHolder8 {
- public:
-CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4, const Generator5& g5,
- const Generator6& g6, const Generator7& g7, const Generator8& g8)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
- g8_(g8) {}
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
- T8> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
- new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_),
- static_cast<ParamGenerator<T5> >(g5_),
- static_cast<ParamGenerator<T6> >(g6_),
- static_cast<ParamGenerator<T7> >(g7_),
- static_cast<ParamGenerator<T8> >(g8_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder8& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
- const Generator5 g5_;
- const Generator6 g6_;
- const Generator7 g7_;
- const Generator8 g8_;
-}; // class CartesianProductHolder8
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4, class Generator5, class Generator6, class Generator7,
- class Generator8, class Generator9>
-class CartesianProductHolder9 {
- public:
-CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4, const Generator5& g5,
- const Generator6& g6, const Generator7& g7, const Generator8& g8,
- const Generator9& g9)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
- g9_(g9) {}
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
- T9> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
- T9> >(
- new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_),
- static_cast<ParamGenerator<T5> >(g5_),
- static_cast<ParamGenerator<T6> >(g6_),
- static_cast<ParamGenerator<T7> >(g7_),
- static_cast<ParamGenerator<T8> >(g8_),
- static_cast<ParamGenerator<T9> >(g9_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder9& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
- const Generator5 g5_;
- const Generator6 g6_;
- const Generator7 g7_;
- const Generator8 g8_;
- const Generator9 g9_;
-}; // class CartesianProductHolder9
-
-template <class Generator1, class Generator2, class Generator3,
- class Generator4, class Generator5, class Generator6, class Generator7,
- class Generator8, class Generator9, class Generator10>
-class CartesianProductHolder10 {
- public:
-CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
- const Generator3& g3, const Generator4& g4, const Generator5& g5,
- const Generator6& g6, const Generator7& g7, const Generator8& g8,
- const Generator9& g9, const Generator10& g10)
- : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
- g9_(g9), g10_(g10) {}
- template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
- operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
- T9, T10> >() const {
- return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
- T9, T10> >(
- new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
- T10>(
- static_cast<ParamGenerator<T1> >(g1_),
- static_cast<ParamGenerator<T2> >(g2_),
- static_cast<ParamGenerator<T3> >(g3_),
- static_cast<ParamGenerator<T4> >(g4_),
- static_cast<ParamGenerator<T5> >(g5_),
- static_cast<ParamGenerator<T6> >(g6_),
- static_cast<ParamGenerator<T7> >(g7_),
- static_cast<ParamGenerator<T8> >(g8_),
- static_cast<ParamGenerator<T9> >(g9_),
- static_cast<ParamGenerator<T10> >(g10_)));
- }
-
- private:
- // No implementation - assignment is unsupported.
- void operator=(const CartesianProductHolder10& other);
-
- const Generator1 g1_;
- const Generator2 g2_;
- const Generator3 g3_;
- const Generator4 g4_;
- const Generator5 g5_;
- const Generator6 g6_;
- const Generator7 g7_;
- const Generator8 g8_;
- const Generator9 g9_;
- const Generator10 g10_;
-}; // class CartesianProductHolder10
-
-# endif // GTEST_HAS_COMBINE
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_HAS_PARAM_TEST
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-param-util.h b/unit_tests/gtest/include/gtest/internal/gtest-param-util.h
deleted file mode 100644
index 0ef9718..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-param-util.h
+++ /dev/null
@@ -1,619 +0,0 @@
-// Copyright 2008 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: vladl at google.com (Vlad Losev)
-
-// Type and function utilities for implementing parameterized tests.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
-
-#include <iterator>
-#include <utility>
-#include <vector>
-
-// scripts/fuse_gtest.py depends on gtest's own header being #included
-// *unconditionally*. Therefore these #includes cannot be moved
-// inside #if GTEST_HAS_PARAM_TEST.
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-linked_ptr.h"
-#include "gtest/internal/gtest-port.h"
-#include "gtest/gtest-printers.h"
-
-#if GTEST_HAS_PARAM_TEST
-
-namespace testing {
-namespace internal {
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Outputs a message explaining invalid registration of different
-// fixture class for the same test case. This may happen when
-// TEST_P macro is used to define two tests with the same name
-// but in different namespaces.
-GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
- const char* file, int line);
-
-template <typename> class ParamGeneratorInterface;
-template <typename> class ParamGenerator;
-
-// Interface for iterating over elements provided by an implementation
-// of ParamGeneratorInterface<T>.
-template <typename T>
-class ParamIteratorInterface {
- public:
- virtual ~ParamIteratorInterface() {}
- // A pointer to the base generator instance.
- // Used only for the purposes of iterator comparison
- // to make sure that two iterators belong to the same generator.
- virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
- // Advances iterator to point to the next element
- // provided by the generator. The caller is responsible
- // for not calling Advance() on an iterator equal to
- // BaseGenerator()->End().
- virtual void Advance() = 0;
- // Clones the iterator object. Used for implementing copy semantics
- // of ParamIterator<T>.
- virtual ParamIteratorInterface* Clone() const = 0;
- // Dereferences the current iterator and provides (read-only) access
- // to the pointed value. It is the caller's responsibility not to call
- // Current() on an iterator equal to BaseGenerator()->End().
- // Used for implementing ParamGenerator<T>::operator*().
- virtual const T* Current() const = 0;
- // Determines whether the given iterator and other point to the same
- // element in the sequence generated by the generator.
- // Used for implementing ParamGenerator<T>::operator==().
- virtual bool Equals(const ParamIteratorInterface& other) const = 0;
-};
-
-// Class iterating over elements provided by an implementation of
-// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
-// and implements the const forward iterator concept.
-template <typename T>
-class ParamIterator {
- public:
- typedef T value_type;
- typedef const T& reference;
- typedef ptrdiff_t difference_type;
-
- // ParamIterator assumes ownership of the impl_ pointer.
- ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
- ParamIterator& operator=(const ParamIterator& other) {
- if (this != &other)
- impl_.reset(other.impl_->Clone());
- return *this;
- }
-
- const T& operator*() const { return *impl_->Current(); }
- const T* operator->() const { return impl_->Current(); }
- // Prefix version of operator++.
- ParamIterator& operator++() {
- impl_->Advance();
- return *this;
- }
- // Postfix version of operator++.
- ParamIterator operator++(int /*unused*/) {
- ParamIteratorInterface<T>* clone = impl_->Clone();
- impl_->Advance();
- return ParamIterator(clone);
- }
- bool operator==(const ParamIterator& other) const {
- return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
- }
- bool operator!=(const ParamIterator& other) const {
- return !(*this == other);
- }
-
- private:
- friend class ParamGenerator<T>;
- explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
- scoped_ptr<ParamIteratorInterface<T> > impl_;
-};
-
-// ParamGeneratorInterface<T> is the binary interface to access generators
-// defined in other translation units.
-template <typename T>
-class ParamGeneratorInterface {
- public:
- typedef T ParamType;
-
- virtual ~ParamGeneratorInterface() {}
-
- // Generator interface definition
- virtual ParamIteratorInterface<T>* Begin() const = 0;
- virtual ParamIteratorInterface<T>* End() const = 0;
-};
-
-// Wraps ParamGeneratorInterface<T> and provides general generator syntax
-// compatible with the STL Container concept.
-// This class implements copy initialization semantics and the contained
-// ParamGeneratorInterface<T> instance is shared among all copies
-// of the original object. This is possible because that instance is immutable.
-template<typename T>
-class ParamGenerator {
- public:
- typedef ParamIterator<T> iterator;
-
- explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
- ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
-
- ParamGenerator& operator=(const ParamGenerator& other) {
- impl_ = other.impl_;
- return *this;
- }
-
- iterator begin() const { return iterator(impl_->Begin()); }
- iterator end() const { return iterator(impl_->End()); }
-
- private:
- linked_ptr<const ParamGeneratorInterface<T> > impl_;
-};
-
-// Generates values from a range of two comparable values. Can be used to
-// generate sequences of user-defined types that implement operator+() and
-// operator<().
-// This class is used in the Range() function.
-template <typename T, typename IncrementT>
-class RangeGenerator : public ParamGeneratorInterface<T> {
- public:
- RangeGenerator(T begin, T end, IncrementT step)
- : begin_(begin), end_(end),
- step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
- virtual ~RangeGenerator() {}
-
- virtual ParamIteratorInterface<T>* Begin() const {
- return new Iterator(this, begin_, 0, step_);
- }
- virtual ParamIteratorInterface<T>* End() const {
- return new Iterator(this, end_, end_index_, step_);
- }
-
- private:
- class Iterator : public ParamIteratorInterface<T> {
- public:
- Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
- IncrementT step)
- : base_(base), value_(value), index_(index), step_(step) {}
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
- return base_;
- }
- virtual void Advance() {
- value_ = value_ + step_;
- index_++;
- }
- virtual ParamIteratorInterface<T>* Clone() const {
- return new Iterator(*this);
- }
- virtual const T* Current() const { return &value_; }
- virtual bool Equals(const ParamIteratorInterface<T>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- const int other_index =
- CheckedDowncastToActualType<const Iterator>(&other)->index_;
- return index_ == other_index;
- }
-
- private:
- Iterator(const Iterator& other)
- : ParamIteratorInterface<T>(),
- base_(other.base_), value_(other.value_), index_(other.index_),
- step_(other.step_) {}
-
- // No implementation - assignment is unsupported.
- void operator=(const Iterator& other);
-
- const ParamGeneratorInterface<T>* const base_;
- T value_;
- int index_;
- const IncrementT step_;
- }; // class RangeGenerator::Iterator
-
- static int CalculateEndIndex(const T& begin,
- const T& end,
- const IncrementT& step) {
- int end_index = 0;
- for (T i = begin; i < end; i = i + step)
- end_index++;
- return end_index;
- }
-
- // No implementation - assignment is unsupported.
- void operator=(const RangeGenerator& other);
-
- const T begin_;
- const T end_;
- const IncrementT step_;
- // The index for the end() iterator. All the elements in the generated
- // sequence are indexed (0-based) to aid iterator comparison.
- const int end_index_;
-}; // class RangeGenerator
-
-
-// Generates values from a pair of STL-style iterators. Used in the
-// ValuesIn() function. The elements are copied from the source range
-// since the source can be located on the stack, and the generator
-// is likely to persist beyond that stack frame.
-template <typename T>
-class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
- public:
- template <typename ForwardIterator>
- ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
- : container_(begin, end) {}
- virtual ~ValuesInIteratorRangeGenerator() {}
-
- virtual ParamIteratorInterface<T>* Begin() const {
- return new Iterator(this, container_.begin());
- }
- virtual ParamIteratorInterface<T>* End() const {
- return new Iterator(this, container_.end());
- }
-
- private:
- typedef typename ::std::vector<T> ContainerType;
-
- class Iterator : public ParamIteratorInterface<T> {
- public:
- Iterator(const ParamGeneratorInterface<T>* base,
- typename ContainerType::const_iterator iterator)
- : base_(base), iterator_(iterator) {}
- virtual ~Iterator() {}
-
- virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
- return base_;
- }
- virtual void Advance() {
- ++iterator_;
- value_.reset();
- }
- virtual ParamIteratorInterface<T>* Clone() const {
- return new Iterator(*this);
- }
- // We need to use cached value referenced by iterator_ because *iterator_
- // can return a temporary object (and of type other then T), so just
- // having "return &*iterator_;" doesn't work.
- // value_ is updated here and not in Advance() because Advance()
- // can advance iterator_ beyond the end of the range, and we cannot
- // detect that fact. The client code, on the other hand, is
- // responsible for not calling Current() on an out-of-range iterator.
- virtual const T* Current() const {
- if (value_.get() == NULL)
- value_.reset(new T(*iterator_));
- return value_.get();
- }
- virtual bool Equals(const ParamIteratorInterface<T>& other) const {
- // Having the same base generator guarantees that the other
- // iterator is of the same type and we can downcast.
- GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
- << "The program attempted to compare iterators "
- << "from different generators." << std::endl;
- return iterator_ ==
- CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
- }
-
- private:
- Iterator(const Iterator& other)
- // The explicit constructor call suppresses a false warning
- // emitted by gcc when supplied with the -Wextra option.
- : ParamIteratorInterface<T>(),
- base_(other.base_),
- iterator_(other.iterator_) {}
-
- const ParamGeneratorInterface<T>* const base_;
- typename ContainerType::const_iterator iterator_;
- // A cached value of *iterator_. We keep it here to allow access by
- // pointer in the wrapping iterator's operator->().
- // value_ needs to be mutable to be accessed in Current().
- // Use of scoped_ptr helps manage cached value's lifetime,
- // which is bound by the lifespan of the iterator itself.
- mutable scoped_ptr<const T> value_;
- }; // class ValuesInIteratorRangeGenerator::Iterator
-
- // No implementation - assignment is unsupported.
- void operator=(const ValuesInIteratorRangeGenerator& other);
-
- const ContainerType container_;
-}; // class ValuesInIteratorRangeGenerator
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Stores a parameter value and later creates tests parameterized with that
-// value.
-template <class TestClass>
-class ParameterizedTestFactory : public TestFactoryBase {
- public:
- typedef typename TestClass::ParamType ParamType;
- explicit ParameterizedTestFactory(ParamType parameter) :
- parameter_(parameter) {}
- virtual Test* CreateTest() {
- TestClass::SetParam(¶meter_);
- return new TestClass();
- }
-
- private:
- const ParamType parameter_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
-};
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// TestMetaFactoryBase is a base class for meta-factories that create
-// test factories for passing into MakeAndRegisterTestInfo function.
-template <class ParamType>
-class TestMetaFactoryBase {
- public:
- virtual ~TestMetaFactoryBase() {}
-
- virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
-};
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// TestMetaFactory creates test factories for passing into
-// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
-// ownership of test factory pointer, same factory object cannot be passed
-// into that method twice. But ParameterizedTestCaseInfo is going to call
-// it for each Test/Parameter value combination. Thus it needs meta factory
-// creator class.
-template <class TestCase>
-class TestMetaFactory
- : public TestMetaFactoryBase<typename TestCase::ParamType> {
- public:
- typedef typename TestCase::ParamType ParamType;
-
- TestMetaFactory() {}
-
- virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
- return new ParameterizedTestFactory<TestCase>(parameter);
- }
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
-};
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// ParameterizedTestCaseInfoBase is a generic interface
-// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
-// accumulates test information provided by TEST_P macro invocations
-// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
-// and uses that information to register all resulting test instances
-// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
-// a collection of pointers to the ParameterizedTestCaseInfo objects
-// and calls RegisterTests() on each of them when asked.
-class ParameterizedTestCaseInfoBase {
- public:
- virtual ~ParameterizedTestCaseInfoBase() {}
-
- // Base part of test case name for display purposes.
- virtual const string& GetTestCaseName() const = 0;
- // Test case id to verify identity.
- virtual TypeId GetTestCaseTypeId() const = 0;
- // UnitTest class invokes this method to register tests in this
- // test case right before running them in RUN_ALL_TESTS macro.
- // This method should not be called more then once on any single
- // instance of a ParameterizedTestCaseInfoBase derived class.
- virtual void RegisterTests() = 0;
-
- protected:
- ParameterizedTestCaseInfoBase() {}
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
-};
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
-// macro invocations for a particular test case and generators
-// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
-// test case. It registers tests with all values generated by all
-// generators when asked.
-template <class TestCase>
-class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
- public:
- // ParamType and GeneratorCreationFunc are private types but are required
- // for declarations of public methods AddTestPattern() and
- // AddTestCaseInstantiation().
- typedef typename TestCase::ParamType ParamType;
- // A function that returns an instance of appropriate generator type.
- typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
-
- explicit ParameterizedTestCaseInfo(const char* name)
- : test_case_name_(name) {}
-
- // Test case base name for display purposes.
- virtual const string& GetTestCaseName() const { return test_case_name_; }
- // Test case id to verify identity.
- virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
- // TEST_P macro uses AddTestPattern() to record information
- // about a single test in a LocalTestInfo structure.
- // test_case_name is the base name of the test case (without invocation
- // prefix). test_base_name is the name of an individual test without
- // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
- // test case base name and DoBar is test base name.
- void AddTestPattern(const char* test_case_name,
- const char* test_base_name,
- TestMetaFactoryBase<ParamType>* meta_factory) {
- tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
- test_base_name,
- meta_factory)));
- }
- // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
- // about a generator.
- int AddTestCaseInstantiation(const string& instantiation_name,
- GeneratorCreationFunc* func,
- const char* /* file */,
- int /* line */) {
- instantiations_.push_back(::std::make_pair(instantiation_name, func));
- return 0; // Return value used only to run this method in namespace scope.
- }
- // UnitTest class invokes this method to register tests in this test case
- // test cases right before running tests in RUN_ALL_TESTS macro.
- // This method should not be called more then once on any single
- // instance of a ParameterizedTestCaseInfoBase derived class.
- // UnitTest has a guard to prevent from calling this method more then once.
- virtual void RegisterTests() {
- for (typename TestInfoContainer::iterator test_it = tests_.begin();
- test_it != tests_.end(); ++test_it) {
- linked_ptr<TestInfo> test_info = *test_it;
- for (typename InstantiationContainer::iterator gen_it =
- instantiations_.begin(); gen_it != instantiations_.end();
- ++gen_it) {
- const string& instantiation_name = gen_it->first;
- ParamGenerator<ParamType> generator((*gen_it->second)());
-
- Message test_case_name_stream;
- if ( !instantiation_name.empty() )
- test_case_name_stream << instantiation_name << "/";
- test_case_name_stream << test_info->test_case_base_name;
-
- int i = 0;
- for (typename ParamGenerator<ParamType>::iterator param_it =
- generator.begin();
- param_it != generator.end(); ++param_it, ++i) {
- Message test_name_stream;
- test_name_stream << test_info->test_base_name << "/" << i;
- MakeAndRegisterTestInfo(
- test_case_name_stream.GetString().c_str(),
- test_name_stream.GetString().c_str(),
- NULL, // No type parameter.
- PrintToString(*param_it).c_str(),
- GetTestCaseTypeId(),
- TestCase::SetUpTestCase,
- TestCase::TearDownTestCase,
- test_info->test_meta_factory->CreateTestFactory(*param_it));
- } // for param_it
- } // for gen_it
- } // for test_it
- } // RegisterTests
-
- private:
- // LocalTestInfo structure keeps information about a single test registered
- // with TEST_P macro.
- struct TestInfo {
- TestInfo(const char* a_test_case_base_name,
- const char* a_test_base_name,
- TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
- test_case_base_name(a_test_case_base_name),
- test_base_name(a_test_base_name),
- test_meta_factory(a_test_meta_factory) {}
-
- const string test_case_base_name;
- const string test_base_name;
- const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
- };
- typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
- // Keeps pairs of <Instantiation name, Sequence generator creation function>
- // received from INSTANTIATE_TEST_CASE_P macros.
- typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
- InstantiationContainer;
-
- const string test_case_name_;
- TestInfoContainer tests_;
- InstantiationContainer instantiations_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
-}; // class ParameterizedTestCaseInfo
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
-// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
-// macros use it to locate their corresponding ParameterizedTestCaseInfo
-// descriptors.
-class ParameterizedTestCaseRegistry {
- public:
- ParameterizedTestCaseRegistry() {}
- ~ParameterizedTestCaseRegistry() {
- for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
- it != test_case_infos_.end(); ++it) {
- delete *it;
- }
- }
-
- // Looks up or creates and returns a structure containing information about
- // tests and instantiations of a particular test case.
- template <class TestCase>
- ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
- const char* test_case_name,
- const char* file,
- int line) {
- ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
- for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
- it != test_case_infos_.end(); ++it) {
- if ((*it)->GetTestCaseName() == test_case_name) {
- if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
- // Complain about incorrect usage of Google Test facilities
- // and terminate the program since we cannot guaranty correct
- // test case setup and tear-down in this case.
- ReportInvalidTestCaseType(test_case_name, file, line);
- posix::Abort();
- } else {
- // At this point we are sure that the object we found is of the same
- // type we are looking for, so we downcast it to that type
- // without further checks.
- typed_test_info = CheckedDowncastToActualType<
- ParameterizedTestCaseInfo<TestCase> >(*it);
- }
- break;
- }
- }
- if (typed_test_info == NULL) {
- typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
- test_case_infos_.push_back(typed_test_info);
- }
- return typed_test_info;
- }
- void RegisterTests() {
- for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
- it != test_case_infos_.end(); ++it) {
- (*it)->RegisterTests();
- }
- }
-
- private:
- typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
-
- TestCaseInfoContainer test_case_infos_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
-};
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_HAS_PARAM_TEST
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-port.h b/unit_tests/gtest/include/gtest/internal/gtest-port.h
deleted file mode 100644
index 02aa14b..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-port.h
+++ /dev/null
@@ -1,1785 +0,0 @@
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: wan at google.com (Zhanyong Wan)
-//
-// Low-level types and utilities for porting Google Test to various
-// platforms. They are subject to change without notice. DO NOT USE
-// THEM IN USER CODE.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
-
-#ifdef __ICC
-// Disable explicit warning on Intel compiler
-#pragma warning disable 2304
-#endif
-
-// The user can define the following macros in the build script to
-// control Google Test's behavior. If the user doesn't define a macro
-// in this list, Google Test will define it.
-//
-// GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2)
-// is/isn't available.
-// GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions
-// are enabled.
-// GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string
-// is/isn't available (some systems define
-// ::string, which is different to std::string).
-// GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
-// is/isn't available (some systems define
-// ::wstring, which is different to std::wstring).
-// GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular
-// expressions are/aren't available.
-// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that <pthread.h>
-// is/isn't available.
-// GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't
-// enabled.
-// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that
-// std::wstring does/doesn't work (Google Test can
-// be used where std::wstring is unavailable).
-// GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple
-// is/isn't available.
-// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the
-// compiler supports Microsoft's "Structured
-// Exception Handling".
-// GTEST_HAS_STREAM_REDIRECTION
-// - Define it to 1/0 to indicate whether the
-// platform supports I/O stream redirection using
-// dup() and dup2().
-// GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google
-// Test's own tr1 tuple implementation should be
-// used. Unused when the user sets
-// GTEST_HAS_TR1_TUPLE to 0.
-// GTEST_LINKED_AS_SHARED_LIBRARY
-// - Define to 1 when compiling tests that use
-// Google Test as a shared library (known as
-// DLL on Windows).
-// GTEST_CREATE_SHARED_LIBRARY
-// - Define to 1 when compiling Google Test itself
-// as a shared library.
-
-// This header defines the following utilities:
-//
-// Macros indicating the current platform (defined to 1 if compiled on
-// the given platform; otherwise undefined):
-// GTEST_OS_AIX - IBM AIX
-// GTEST_OS_CYGWIN - Cygwin
-// GTEST_OS_HPUX - HP-UX
-// GTEST_OS_LINUX - Linux
-// GTEST_OS_LINUX_ANDROID - Google Android
-// GTEST_OS_MAC - Mac OS X
-// GTEST_OS_NACL - Google Native Client (NaCl)
-// GTEST_OS_SOLARIS - Sun Solaris
-// GTEST_OS_SYMBIAN - Symbian
-// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile)
-// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop
-// GTEST_OS_WINDOWS_MINGW - MinGW
-// GTEST_OS_WINDOWS_MOBILE - Windows Mobile
-// GTEST_OS_ZOS - z/OS
-//
-// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
-// most stable support. Since core members of the Google Test project
-// don't have access to other platforms, support for them may be less
-// stable. If you notice any problems on your platform, please notify
-// googletestframework at googlegroups.com (patches for fixing them are
-// even more welcome!).
-//
-// Note that it is possible that none of the GTEST_OS_* macros are defined.
-//
-// Macros indicating available Google Test features (defined to 1 if
-// the corresponding feature is supported; otherwise undefined):
-// GTEST_HAS_COMBINE - the Combine() function (for value-parameterized
-// tests)
-// GTEST_HAS_DEATH_TEST - death tests
-// GTEST_HAS_PARAM_TEST - value-parameterized tests
-// GTEST_HAS_TYPED_TEST - typed tests
-// GTEST_HAS_TYPED_TEST_P - type-parameterized tests
-// GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with
-// GTEST_HAS_POSIX_RE (see above) which users can
-// define themselves.
-// GTEST_USES_SIMPLE_RE - our own simple regex is used;
-// the above two are mutually exclusive.
-// GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
-//
-// Macros for basic C++ coding:
-// GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
-// GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a
-// variable don't have to be used.
-// GTEST_DISALLOW_ASSIGN_ - disables operator=.
-// GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
-// GTEST_MUST_USE_RESULT_ - declares that a function's result must be used.
-//
-// Synchronization:
-// Mutex, MutexLock, ThreadLocal, GetThreadCount()
-// - synchronization primitives.
-// GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
-// synchronization primitives have real implementations
-// and Google Test is thread-safe; or 0 otherwise.
-//
-// Template meta programming:
-// is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only.
-// IteratorTraits - partial implementation of std::iterator_traits, which
-// is not available in libCstd when compiled with Sun C++.
-//
-// Smart pointers:
-// scoped_ptr - as in TR2.
-//
-// Regular expressions:
-// RE - a simple regular expression class using the POSIX
-// Extended Regular Expression syntax on UNIX-like
-// platforms, or a reduced regular exception syntax on
-// other platforms, including Windows.
-//
-// Logging:
-// GTEST_LOG_() - logs messages at the specified severity level.
-// LogToStderr() - directs all log messages to stderr.
-// FlushInfoLog() - flushes informational log messages.
-//
-// Stdout and stderr capturing:
-// CaptureStdout() - starts capturing stdout.
-// GetCapturedStdout() - stops capturing stdout and returns the captured
-// string.
-// CaptureStderr() - starts capturing stderr.
-// GetCapturedStderr() - stops capturing stderr and returns the captured
-// string.
-//
-// Integer types:
-// TypeWithSize - maps an integer to a int type.
-// Int32, UInt32, Int64, UInt64, TimeInMillis
-// - integers of known sizes.
-// BiggestInt - the biggest signed integer type.
-//
-// Command-line utilities:
-// GTEST_FLAG() - references a flag.
-// GTEST_DECLARE_*() - declares a flag.
-// GTEST_DEFINE_*() - defines a flag.
-// GetArgvs() - returns the command line as a vector of strings.
-//
-// Environment variable utilities:
-// GetEnv() - gets the value of an environment variable.
-// BoolFromGTestEnv() - parses a bool environment variable.
-// Int32FromGTestEnv() - parses an Int32 environment variable.
-// StringFromGTestEnv() - parses a string environment variable.
-
-#include <ctype.h> // for isspace, etc
-#include <stddef.h> // for ptrdiff_t
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#ifndef _WIN32_WCE
-# include <sys/types.h>
-# include <sys/stat.h>
-#endif // !_WIN32_WCE
-
-#include <iostream> // NOLINT
-#include <sstream> // NOLINT
-#include <string> // NOLINT
-
-#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
-#define GTEST_FLAG_PREFIX_ "gtest_"
-#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
-#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
-#define GTEST_NAME_ "Google Test"
-#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
-
-// Determines the version of gcc that is used to compile this.
-#ifdef __GNUC__
-// 40302 means version 4.3.2.
-# define GTEST_GCC_VER_ \
- (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
-#endif // __GNUC__
-
-// Determines the platform on which Google Test is compiled.
-#ifdef __CYGWIN__
-# define GTEST_OS_CYGWIN 1
-#elif defined __SYMBIAN32__
-# define GTEST_OS_SYMBIAN 1
-#elif defined _WIN32
-# define GTEST_OS_WINDOWS 1
-# ifdef _WIN32_WCE
-# define GTEST_OS_WINDOWS_MOBILE 1
-# elif defined(__MINGW__) || defined(__MINGW32__)
-# define GTEST_OS_WINDOWS_MINGW 1
-# else
-# define GTEST_OS_WINDOWS_DESKTOP 1
-# endif // _WIN32_WCE
-#elif defined __APPLE__
-# define GTEST_OS_MAC 1
-#elif defined __linux__
-# define GTEST_OS_LINUX 1
-# ifdef ANDROID
-# define GTEST_OS_LINUX_ANDROID 1
-# endif // ANDROID
-#elif defined __MVS__
-# define GTEST_OS_ZOS 1
-#elif defined(__sun) && defined(__SVR4)
-# define GTEST_OS_SOLARIS 1
-#elif defined(_AIX)
-# define GTEST_OS_AIX 1
-#elif defined(__hpux)
-# define GTEST_OS_HPUX 1
-#elif defined __native_client__
-# define GTEST_OS_NACL 1
-#endif // __CYGWIN__
-
-// Brings in definitions for functions used in the testing::internal::posix
-// namespace (read, write, close, chdir, isatty, stat). We do not currently
-// use them on Windows Mobile.
-#if !GTEST_OS_WINDOWS
-// This assumes that non-Windows OSes provide unistd.h. For OSes where this
-// is not the case, we need to include headers that provide the functions
-// mentioned above.
-# include <unistd.h>
-# if !GTEST_OS_NACL
-// TODO(vladl at google.com): Remove this condition when Native Client SDK adds
-// strings.h (tracked in
-// http://code.google.com/p/nativeclient/issues/detail?id=1175).
-# include <strings.h> // Native Client doesn't provide strings.h.
-# endif
-#elif !GTEST_OS_WINDOWS_MOBILE
-# include <direct.h>
-# include <io.h>
-#endif
-
-// Defines this to true iff Google Test can use POSIX regular expressions.
-#ifndef GTEST_HAS_POSIX_RE
-# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
-#endif
-
-#if GTEST_HAS_POSIX_RE
-
-// On some platforms, <regex.h> needs someone to define size_t, and
-// won't compile otherwise. We can #include it here as we already
-// included <stdlib.h>, which is guaranteed to define size_t through
-// <stddef.h>.
-# include <regex.h> // NOLINT
-
-# define GTEST_USES_POSIX_RE 1
-
-#elif GTEST_OS_WINDOWS
-
-// <regex.h> is not available on Windows. Use our own simple regex
-// implementation instead.
-# define GTEST_USES_SIMPLE_RE 1
-
-#else
-
-// <regex.h> may not be available on this platform. Use our own
-// simple regex implementation instead.
-# define GTEST_USES_SIMPLE_RE 1
-
-#endif // GTEST_HAS_POSIX_RE
-
-#ifndef GTEST_HAS_EXCEPTIONS
-// The user didn't tell us whether exceptions are enabled, so we need
-// to figure it out.
-# if defined(_MSC_VER) || defined(__BORLANDC__)
-// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
-// macro to enable exceptions, so we'll do the same.
-// Assumes that exceptions are enabled by default.
-# ifndef _HAS_EXCEPTIONS
-# define _HAS_EXCEPTIONS 1
-# endif // _HAS_EXCEPTIONS
-# define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
-# elif defined(__GNUC__) && __EXCEPTIONS
-// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
-# define GTEST_HAS_EXCEPTIONS 1
-# elif defined(__SUNPRO_CC)
-// Sun Pro CC supports exceptions. However, there is no compile-time way of
-// detecting whether they are enabled or not. Therefore, we assume that
-// they are enabled unless the user tells us otherwise.
-# define GTEST_HAS_EXCEPTIONS 1
-# elif defined(__IBMCPP__) && __EXCEPTIONS
-// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
-# define GTEST_HAS_EXCEPTIONS 1
-# elif defined(__HP_aCC)
-// Exception handling is in effect by default in HP aCC compiler. It has to
-// be turned of by +noeh compiler option if desired.
-# define GTEST_HAS_EXCEPTIONS 1
-# else
-// For other compilers, we assume exceptions are disabled to be
-// conservative.
-# define GTEST_HAS_EXCEPTIONS 0
-# endif // defined(_MSC_VER) || defined(__BORLANDC__)
-#endif // GTEST_HAS_EXCEPTIONS
-
-#if !defined(GTEST_HAS_STD_STRING)
-// Even though we don't use this macro any longer, we keep it in case
-// some clients still depend on it.
-# define GTEST_HAS_STD_STRING 1
-#elif !GTEST_HAS_STD_STRING
-// The user told us that ::std::string isn't available.
-# error "Google Test cannot be used where ::std::string isn't available."
-#endif // !defined(GTEST_HAS_STD_STRING)
-
-#ifndef GTEST_HAS_GLOBAL_STRING
-// The user didn't tell us whether ::string is available, so we need
-// to figure it out.
-
-# define GTEST_HAS_GLOBAL_STRING 0
-
-#endif // GTEST_HAS_GLOBAL_STRING
-
-#ifndef GTEST_HAS_STD_WSTRING
-// The user didn't tell us whether ::std::wstring is available, so we need
-// to figure it out.
-// TODO(wan at google.com): uses autoconf to detect whether ::std::wstring
-// is available.
-
-// Cygwin 1.7 and below doesn't support ::std::wstring.
-// Solaris' libc++ doesn't support it either. Android has
-// no support for it at least as recent as Froyo (2.2).
-# define GTEST_HAS_STD_WSTRING \
- (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
-
-#endif // GTEST_HAS_STD_WSTRING
-
-#ifndef GTEST_HAS_GLOBAL_WSTRING
-// The user didn't tell us whether ::wstring is available, so we need
-// to figure it out.
-# define GTEST_HAS_GLOBAL_WSTRING \
- (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
-// Determines whether RTTI is available.
-#ifndef GTEST_HAS_RTTI
-// The user didn't tell us whether RTTI is enabled, so we need to
-// figure it out.
-
-# ifdef _MSC_VER
-
-# ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled.
-# define GTEST_HAS_RTTI 1
-# else
-# define GTEST_HAS_RTTI 0
-# endif
-
-// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
-# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
-
-# ifdef __GXX_RTTI
-# define GTEST_HAS_RTTI 1
-# else
-# define GTEST_HAS_RTTI 0
-# endif // __GXX_RTTI
-
-// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
-// both the typeid and dynamic_cast features are present.
-# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
-
-# ifdef __RTTI_ALL__
-# define GTEST_HAS_RTTI 1
-# else
-# define GTEST_HAS_RTTI 0
-# endif
-
-# else
-
-// For all other compilers, we assume RTTI is enabled.
-# define GTEST_HAS_RTTI 1
-
-# endif // _MSC_VER
-
-#endif // GTEST_HAS_RTTI
-
-// It's this header's responsibility to #include <typeinfo> when RTTI
-// is enabled.
-#if GTEST_HAS_RTTI
-# include <typeinfo>
-#endif
-
-// Determines whether Google Test can use the pthreads library.
-#ifndef GTEST_HAS_PTHREAD
-// The user didn't tell us explicitly, so we assume pthreads support is
-// available on Linux and Mac.
-//
-// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
-// to your compiler flags.
-# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX)
-#endif // GTEST_HAS_PTHREAD
-
-#if GTEST_HAS_PTHREAD
-// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
-// true.
-# include <pthread.h> // NOLINT
-
-// For timespec and nanosleep, used below.
-# include <time.h> // NOLINT
-#endif
-
-// Determines whether Google Test can use tr1/tuple. You can define
-// this macro to 0 to prevent Google Test from using tuple (any
-// feature depending on tuple with be disabled in this mode).
-#ifndef GTEST_HAS_TR1_TUPLE
-// The user didn't tell us not to do it, so we assume it's OK.
-# define GTEST_HAS_TR1_TUPLE 1
-#endif // GTEST_HAS_TR1_TUPLE
-
-// Determines whether Google Test's own tr1 tuple implementation
-// should be used.
-#ifndef GTEST_USE_OWN_TR1_TUPLE
-// The user didn't tell us, so we need to figure it out.
-
-// We use our own TR1 tuple if we aren't sure the user has an
-// implementation of it already. At this time, GCC 4.0.0+ and MSVC
-// 2010 are the only mainstream compilers that come with a TR1 tuple
-// implementation. NVIDIA's CUDA NVCC compiler pretends to be GCC by
-// defining __GNUC__ and friends, but cannot compile GCC's tuple
-// implementation. MSVC 2008 (9.0) provides TR1 tuple in a 323 MB
-// Feature Pack download, which we cannot assume the user has.
-# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000)) \
- || _MSC_VER >= 1600
-# define GTEST_USE_OWN_TR1_TUPLE 0
-# else
-# define GTEST_USE_OWN_TR1_TUPLE 1
-# endif
-
-#endif // GTEST_USE_OWN_TR1_TUPLE
-
-// To avoid conditional compilation everywhere, we make it
-// gtest-port.h's responsibility to #include the header implementing
-// tr1/tuple.
-#if GTEST_HAS_TR1_TUPLE
-
-# if GTEST_USE_OWN_TR1_TUPLE
-# include "gtest/internal/gtest-tuple.h"
-# elif GTEST_OS_SYMBIAN
-
-// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
-// use STLport's tuple implementation, which unfortunately doesn't
-// work as the copy of STLport distributed with Symbian is incomplete.
-// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
-// use its own tuple implementation.
-# ifdef BOOST_HAS_TR1_TUPLE
-# undef BOOST_HAS_TR1_TUPLE
-# endif // BOOST_HAS_TR1_TUPLE
-
-// This prevents <boost/tr1/detail/config.hpp>, which defines
-// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
-# define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
-# include <tuple>
-
-# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
-// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does
-// not conform to the TR1 spec, which requires the header to be <tuple>.
-
-# if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
-// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
-// which is #included by <tr1/tuple>, to not compile when RTTI is
-// disabled. _TR1_FUNCTIONAL is the header guard for
-// <tr1/functional>. Hence the following #define is a hack to prevent
-// <tr1/functional> from being included.
-# define _TR1_FUNCTIONAL 1
-# include <tr1/tuple>
-# undef _TR1_FUNCTIONAL // Allows the user to #include
- // <tr1/functional> if he chooses to.
-# else
-# include <tr1/tuple> // NOLINT
-# endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
-
-# else
-// If the compiler is not GCC 4.0+, we assume the user is using a
-// spec-conforming TR1 implementation.
-# include <tuple> // NOLINT
-# endif // GTEST_USE_OWN_TR1_TUPLE
-
-#endif // GTEST_HAS_TR1_TUPLE
-
-// Determines whether clone(2) is supported.
-// Usually it will only be available on Linux, excluding
-// Linux on the Itanium architecture.
-// Also see http://linux.die.net/man/2/clone.
-#ifndef GTEST_HAS_CLONE
-// The user didn't tell us, so we need to figure it out.
-
-# if GTEST_OS_LINUX && !defined(__ia64__)
-# define GTEST_HAS_CLONE 1
-# else
-# define GTEST_HAS_CLONE 0
-# endif // GTEST_OS_LINUX && !defined(__ia64__)
-
-#endif // GTEST_HAS_CLONE
-
-// Determines whether to support stream redirection. This is used to test
-// output correctness and to implement death tests.
-#ifndef GTEST_HAS_STREAM_REDIRECTION
-// By default, we assume that stream redirection is supported on all
-// platforms except known mobile ones.
-# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
-# define GTEST_HAS_STREAM_REDIRECTION 0
-# else
-# define GTEST_HAS_STREAM_REDIRECTION 1
-# endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
-#endif // GTEST_HAS_STREAM_REDIRECTION
-
-// Determines whether to support death tests.
-// Google Test does not support death tests for VC 7.1 and earlier as
-// abort() in a VC 7.1 application compiled as GUI in debug config
-// pops up a dialog window that cannot be suppressed programmatically.
-#if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
- (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
- GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX)
-# define GTEST_HAS_DEATH_TEST 1
-# include <vector> // NOLINT
-#endif
-
-// We don't support MSVC 7.1 with exceptions disabled now. Therefore
-// all the compilers we care about are adequate for supporting
-// value-parameterized tests.
-#define GTEST_HAS_PARAM_TEST 1
-
-// Determines whether to support type-driven tests.
-
-// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
-// Sun Pro CC, IBM Visual Age, and HP aCC support.
-#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
- defined(__IBMCPP__) || defined(__HP_aCC)
-# define GTEST_HAS_TYPED_TEST 1
-# define GTEST_HAS_TYPED_TEST_P 1
-#endif
-
-// Determines whether to support Combine(). This only makes sense when
-// value-parameterized tests are enabled. The implementation doesn't
-// work on Sun Studio since it doesn't understand templated conversion
-// operators.
-#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
-# define GTEST_HAS_COMBINE 1
-#endif
-
-// Determines whether the system compiler uses UTF-16 for encoding wide strings.
-#define GTEST_WIDE_STRING_USES_UTF16_ \
- (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
-
-// Determines whether test results can be streamed to a socket.
-#if GTEST_OS_LINUX
-# define GTEST_CAN_STREAM_RESULTS_ 1
-#endif
-
-// Defines some utility macros.
-
-// The GNU compiler emits a warning if nested "if" statements are followed by
-// an "else" statement and braces are not used to explicitly disambiguate the
-// "else" binding. This leads to problems with code like:
-//
-// if (gate)
-// ASSERT_*(condition) << "Some message";
-//
-// The "switch (0) case 0:" idiom is used to suppress this.
-#ifdef __INTEL_COMPILER
-# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
-#else
-# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT
-#endif
-
-// Use this annotation at the end of a struct/class definition to
-// prevent the compiler from optimizing away instances that are never
-// used. This is useful when all interesting logic happens inside the
-// c'tor and / or d'tor. Example:
-//
-// struct Foo {
-// Foo() { ... }
-// } GTEST_ATTRIBUTE_UNUSED_;
-//
-// Also use it after a variable or parameter declaration to tell the
-// compiler the variable/parameter does not have to be used.
-#if defined(__GNUC__) && !defined(COMPILER_ICC)
-# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
-#else
-# define GTEST_ATTRIBUTE_UNUSED_
-#endif
-
-// A macro to disallow operator=
-// This should be used in the private: declarations for a class.
-#define GTEST_DISALLOW_ASSIGN_(type)\
- void operator=(type const &)
-
-// A macro to disallow copy constructor and operator=
-// This should be used in the private: declarations for a class.
-#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
- type(type const &);\
- GTEST_DISALLOW_ASSIGN_(type)
-
-// Tell the compiler to warn about unused return values for functions declared
-// with this macro. The macro should be used on function declarations
-// following the argument list:
-//
-// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
-#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
-# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
-#else
-# define GTEST_MUST_USE_RESULT_
-#endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
-
-// Determine whether the compiler supports Microsoft's Structured Exception
-// Handling. This is supported by several Windows compilers but generally
-// does not exist on any other system.
-#ifndef GTEST_HAS_SEH
-// The user didn't tell us, so we need to figure it out.
-
-# if defined(_MSC_VER) || defined(__BORLANDC__)
-// These two compilers are known to support SEH.
-# define GTEST_HAS_SEH 1
-# else
-// Assume no SEH.
-# define GTEST_HAS_SEH 0
-# endif
-
-#endif // GTEST_HAS_SEH
-
-#ifdef _MSC_VER
-
-# if GTEST_LINKED_AS_SHARED_LIBRARY
-# define GTEST_API_ __declspec(dllimport)
-# elif GTEST_CREATE_SHARED_LIBRARY
-# define GTEST_API_ __declspec(dllexport)
-# endif
-
-#endif // _MSC_VER
-
-#ifndef GTEST_API_
-# define GTEST_API_
-#endif
-
-#ifdef __GNUC__
-// Ask the compiler to never inline a given function.
-# define GTEST_NO_INLINE_ __attribute__((noinline))
-#else
-# define GTEST_NO_INLINE_
-#endif
-
-namespace testing {
-
-class Message;
-
-namespace internal {
-
-class String;
-
-// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
-// expression is true. For example, you could use it to verify the
-// size of a static array:
-//
-// GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
-// content_type_names_incorrect_size);
-//
-// or to make sure a struct is smaller than a certain size:
-//
-// GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
-//
-// The second argument to the macro is the name of the variable. If
-// the expression is false, most compilers will issue a warning/error
-// containing the name of the variable.
-
-template <bool>
-struct CompileAssert {
-};
-
-#define GTEST_COMPILE_ASSERT_(expr, msg) \
- typedef ::testing::internal::CompileAssert<(bool(expr))> \
- msg[bool(expr) ? 1 : -1]
-
-// Implementation details of GTEST_COMPILE_ASSERT_:
-//
-// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
-// elements (and thus is invalid) when the expression is false.
-//
-// - The simpler definition
-//
-// #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
-//
-// does not work, as gcc supports variable-length arrays whose sizes
-// are determined at run-time (this is gcc's extension and not part
-// of the C++ standard). As a result, gcc fails to reject the
-// following code with the simple definition:
-//
-// int foo;
-// GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
-// // not a compile-time constant.
-//
-// - By using the type CompileAssert<(bool(expr))>, we ensures that
-// expr is a compile-time constant. (Template arguments must be
-// determined at compile-time.)
-//
-// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
-// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written
-//
-// CompileAssert<bool(expr)>
-//
-// instead, these compilers will refuse to compile
-//
-// GTEST_COMPILE_ASSERT_(5 > 0, some_message);
-//
-// (They seem to think the ">" in "5 > 0" marks the end of the
-// template argument list.)
-//
-// - The array size is (bool(expr) ? 1 : -1), instead of simply
-//
-// ((expr) ? 1 : -1).
-//
-// This is to avoid running into a bug in MS VC 7.1, which
-// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
-
-// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
-//
-// This template is declared, but intentionally undefined.
-template <typename T1, typename T2>
-struct StaticAssertTypeEqHelper;
-
-template <typename T>
-struct StaticAssertTypeEqHelper<T, T> {};
-
-#if GTEST_HAS_GLOBAL_STRING
-typedef ::string string;
-#else
-typedef ::std::string string;
-#endif // GTEST_HAS_GLOBAL_STRING
-
-#if GTEST_HAS_GLOBAL_WSTRING
-typedef ::wstring wstring;
-#elif GTEST_HAS_STD_WSTRING
-typedef ::std::wstring wstring;
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
-// A helper for suppressing warnings on constant condition. It just
-// returns 'condition'.
-GTEST_API_ bool IsTrue(bool condition);
-
-// Defines scoped_ptr.
-
-// This implementation of scoped_ptr is PARTIAL - it only contains
-// enough stuff to satisfy Google Test's need.
-template <typename T>
-class scoped_ptr {
- public:
- typedef T element_type;
-
- explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
- ~scoped_ptr() { reset(); }
-
- T& operator*() const { return *ptr_; }
- T* operator->() const { return ptr_; }
- T* get() const { return ptr_; }
-
- T* release() {
- T* const ptr = ptr_;
- ptr_ = NULL;
- return ptr;
- }
-
- void reset(T* p = NULL) {
- if (p != ptr_) {
- if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type.
- delete ptr_;
- }
- ptr_ = p;
- }
- }
- private:
- T* ptr_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
-};
-
-// Defines RE.
-
-// A simple C++ wrapper for <regex.h>. It uses the POSIX Extended
-// Regular Expression syntax.
-class GTEST_API_ RE {
- public:
- // A copy constructor is required by the Standard to initialize object
- // references from r-values.
- RE(const RE& other) { Init(other.pattern()); }
-
- // Constructs an RE from a string.
- RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT
-
-#if GTEST_HAS_GLOBAL_STRING
-
- RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT
-
-#endif // GTEST_HAS_GLOBAL_STRING
-
- RE(const char* regex) { Init(regex); } // NOLINT
- ~RE();
-
- // Returns the string representation of the regex.
- const char* pattern() const { return pattern_; }
-
- // FullMatch(str, re) returns true iff regular expression re matches
- // the entire str.
- // PartialMatch(str, re) returns true iff regular expression re
- // matches a substring of str (including str itself).
- //
- // TODO(wan at google.com): make FullMatch() and PartialMatch() work
- // when str contains NUL characters.
- static bool FullMatch(const ::std::string& str, const RE& re) {
- return FullMatch(str.c_str(), re);
- }
- static bool PartialMatch(const ::std::string& str, const RE& re) {
- return PartialMatch(str.c_str(), re);
- }
-
-#if GTEST_HAS_GLOBAL_STRING
-
- static bool FullMatch(const ::string& str, const RE& re) {
- return FullMatch(str.c_str(), re);
- }
- static bool PartialMatch(const ::string& str, const RE& re) {
- return PartialMatch(str.c_str(), re);
- }
-
-#endif // GTEST_HAS_GLOBAL_STRING
-
- static bool FullMatch(const char* str, const RE& re);
- static bool PartialMatch(const char* str, const RE& re);
-
- private:
- void Init(const char* regex);
-
- // We use a const char* instead of a string, as Google Test may be used
- // where string is not available. We also do not use Google Test's own
- // String type here, in order to simplify dependencies between the
- // files.
- const char* pattern_;
- bool is_valid_;
-
-#if GTEST_USES_POSIX_RE
-
- regex_t full_regex_; // For FullMatch().
- regex_t partial_regex_; // For PartialMatch().
-
-#else // GTEST_USES_SIMPLE_RE
-
- const char* full_pattern_; // For FullMatch();
-
-#endif
-
- GTEST_DISALLOW_ASSIGN_(RE);
-};
-
-// Formats a source file path and a line number as they would appear
-// in an error message from the compiler used to compile this code.
-GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
-
-// Formats a file location for compiler-independent XML output.
-// Although this function is not platform dependent, we put it next to
-// FormatFileLocation in order to contrast the two functions.
-GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
- int line);
-
-// Defines logging utilities:
-// GTEST_LOG_(severity) - logs messages at the specified severity level. The
-// message itself is streamed into the macro.
-// LogToStderr() - directs all log messages to stderr.
-// FlushInfoLog() - flushes informational log messages.
-
-enum GTestLogSeverity {
- GTEST_INFO,
- GTEST_WARNING,
- GTEST_ERROR,
- GTEST_FATAL
-};
-
-// Formats log entry severity, provides a stream object for streaming the
-// log message, and terminates the message with a newline when going out of
-// scope.
-class GTEST_API_ GTestLog {
- public:
- GTestLog(GTestLogSeverity severity, const char* file, int line);
-
- // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
- ~GTestLog();
-
- ::std::ostream& GetStream() { return ::std::cerr; }
-
- private:
- const GTestLogSeverity severity_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
-};
-
-#define GTEST_LOG_(severity) \
- ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
- __FILE__, __LINE__).GetStream()
-
-inline void LogToStderr() {}
-inline void FlushInfoLog() { fflush(NULL); }
-
-// INTERNAL IMPLEMENTATION - DO NOT USE.
-//
-// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
-// is not satisfied.
-// Synopsys:
-// GTEST_CHECK_(boolean_condition);
-// or
-// GTEST_CHECK_(boolean_condition) << "Additional message";
-//
-// This checks the condition and if the condition is not satisfied
-// it prints message about the condition violation, including the
-// condition itself, plus additional message streamed into it, if any,
-// and then it aborts the program. It aborts the program irrespective of
-// whether it is built in the debug mode or not.
-#define GTEST_CHECK_(condition) \
- GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
- if (::testing::internal::IsTrue(condition)) \
- ; \
- else \
- GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
-
-// An all-mode assert to verify that the given POSIX-style function
-// call returns 0 (indicating success). Known limitation: this
-// doesn't expand to a balanced 'if' statement, so enclose the macro
-// in {} if you need to use it as the only statement in an 'if'
-// branch.
-#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
- if (const int gtest_error = (posix_call)) \
- GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
- << gtest_error
-
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
-//
-// Use ImplicitCast_ as a safe version of static_cast for upcasting in
-// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
-// const Foo*). When you use ImplicitCast_, the compiler checks that
-// the cast is safe. Such explicit ImplicitCast_s are necessary in
-// surprisingly many situations where C++ demands an exact type match
-// instead of an argument type convertable to a target type.
-//
-// The syntax for using ImplicitCast_ is the same as for static_cast:
-//
-// ImplicitCast_<ToType>(expr)
-//
-// ImplicitCast_ would have been part of the C++ standard library,
-// but the proposal was submitted too late. It will probably make
-// its way into the language in the future.
-//
-// This relatively ugly name is intentional. It prevents clashes with
-// similar functions users may have (e.g., implicit_cast). The internal
-// namespace alone is not enough because the function can be found by ADL.
-template<typename To>
-inline To ImplicitCast_(To x) { return x; }
-
-// When you upcast (that is, cast a pointer from type Foo to type
-// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
-// always succeed. When you downcast (that is, cast a pointer from
-// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
-// how do you know the pointer is really of type SubclassOfFoo? It
-// could be a bare Foo, or of type DifferentSubclassOfFoo. Thus,
-// when you downcast, you should use this macro. In debug mode, we
-// use dynamic_cast<> to double-check the downcast is legal (we die
-// if it's not). In normal mode, we do the efficient static_cast<>
-// instead. Thus, it's important to test in debug mode to make sure
-// the cast is legal!
-// This is the only place in the code we should use dynamic_cast<>.
-// In particular, you SHOULDN'T be using dynamic_cast<> in order to
-// do RTTI (eg code like this:
-// if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
-// if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
-// You should design the code some other way not to need this.
-//
-// This relatively ugly name is intentional. It prevents clashes with
-// similar functions users may have (e.g., down_cast). The internal
-// namespace alone is not enough because the function can be found by ADL.
-template<typename To, typename From> // use like this: DownCast_<T*>(foo);
-inline To DownCast_(From* f) { // so we only accept pointers
- // Ensures that To is a sub-type of From *. This test is here only
- // for compile-time type checking, and has no overhead in an
- // optimized build at run-time, as it will be optimized away
- // completely.
- if (false) {
- const To to = NULL;
- ::testing::internal::ImplicitCast_<From*>(to);
- }
-
-#if GTEST_HAS_RTTI
- // RTTI: debug mode only!
- GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
-#endif
- return static_cast<To>(f);
-}
-
-// Downcasts the pointer of type Base to Derived.
-// Derived must be a subclass of Base. The parameter MUST
-// point to a class of type Derived, not any subclass of it.
-// When RTTI is available, the function performs a runtime
-// check to enforce this.
-template <class Derived, class Base>
-Derived* CheckedDowncastToActualType(Base* base) {
-#if GTEST_HAS_RTTI
- GTEST_CHECK_(typeid(*base) == typeid(Derived));
- return dynamic_cast<Derived*>(base); // NOLINT
-#else
- return static_cast<Derived*>(base); // Poor man's downcast.
-#endif
-}
-
-#if GTEST_HAS_STREAM_REDIRECTION
-
-// Defines the stderr capturer:
-// CaptureStdout - starts capturing stdout.
-// GetCapturedStdout - stops capturing stdout and returns the captured string.
-// CaptureStderr - starts capturing stderr.
-// GetCapturedStderr - stops capturing stderr and returns the captured string.
-//
-GTEST_API_ void CaptureStdout();
-GTEST_API_ String GetCapturedStdout();
-GTEST_API_ void CaptureStderr();
-GTEST_API_ String GetCapturedStderr();
-
-#endif // GTEST_HAS_STREAM_REDIRECTION
-
-
-#if GTEST_HAS_DEATH_TEST
-
-// A copy of all command line arguments. Set by InitGoogleTest().
-extern ::std::vector<String> g_argvs;
-
-// GTEST_HAS_DEATH_TEST implies we have ::std::string.
-const ::std::vector<String>& GetArgvs();
-
-#endif // GTEST_HAS_DEATH_TEST
-
-// Defines synchronization primitives.
-
-#if GTEST_HAS_PTHREAD
-
-// Sleeps for (roughly) n milli-seconds. This function is only for
-// testing Google Test's own constructs. Don't use it in user tests,
-// either directly or indirectly.
-inline void SleepMilliseconds(int n) {
- const timespec time = {
- 0, // 0 seconds.
- n * 1000L * 1000L, // And n ms.
- };
- nanosleep(&time, NULL);
-}
-
-// Allows a controller thread to pause execution of newly created
-// threads until notified. Instances of this class must be created
-// and destroyed in the controller thread.
-//
-// This class is only for testing Google Test's own constructs. Do not
-// use it in user tests, either directly or indirectly.
-class Notification {
- public:
- Notification() : notified_(false) {}
-
- // Notifies all threads created with this notification to start. Must
- // be called from the controller thread.
- void Notify() { notified_ = true; }
-
- // Blocks until the controller thread notifies. Must be called from a test
- // thread.
- void WaitForNotification() {
- while(!notified_) {
- SleepMilliseconds(10);
- }
- }
-
- private:
- volatile bool notified_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
-};
-
-// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
-// Consequently, it cannot select a correct instantiation of ThreadWithParam
-// in order to call its Run(). Introducing ThreadWithParamBase as a
-// non-templated base class for ThreadWithParam allows us to bypass this
-// problem.
-class ThreadWithParamBase {
- public:
- virtual ~ThreadWithParamBase() {}
- virtual void Run() = 0;
-};
-
-// pthread_create() accepts a pointer to a function type with the C linkage.
-// According to the Standard (7.5/1), function types with different linkages
-// are different even if they are otherwise identical. Some compilers (for
-// example, SunStudio) treat them as different types. Since class methods
-// cannot be defined with C-linkage we need to define a free C-function to
-// pass into pthread_create().
-extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
- static_cast<ThreadWithParamBase*>(thread)->Run();
- return NULL;
-}
-
-// Helper class for testing Google Test's multi-threading constructs.
-// To use it, write:
-//
-// void ThreadFunc(int param) { /* Do things with param */ }
-// Notification thread_can_start;
-// ...
-// // The thread_can_start parameter is optional; you can supply NULL.
-// ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
-// thread_can_start.Notify();
-//
-// These classes are only for testing Google Test's own constructs. Do
-// not use them in user tests, either directly or indirectly.
-template <typename T>
-class ThreadWithParam : public ThreadWithParamBase {
- public:
- typedef void (*UserThreadFunc)(T);
-
- ThreadWithParam(
- UserThreadFunc func, T param, Notification* thread_can_start)
- : func_(func),
- param_(param),
- thread_can_start_(thread_can_start),
- finished_(false) {
- ThreadWithParamBase* const base = this;
- // The thread can be created only after all fields except thread_
- // have been initialized.
- GTEST_CHECK_POSIX_SUCCESS_(
- pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
- }
- ~ThreadWithParam() { Join(); }
-
- void Join() {
- if (!finished_) {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
- finished_ = true;
- }
- }
-
- virtual void Run() {
- if (thread_can_start_ != NULL)
- thread_can_start_->WaitForNotification();
- func_(param_);
- }
-
- private:
- const UserThreadFunc func_; // User-supplied thread function.
- const T param_; // User-supplied parameter to the thread function.
- // When non-NULL, used to block execution until the controller thread
- // notifies.
- Notification* const thread_can_start_;
- bool finished_; // true iff we know that the thread function has finished.
- pthread_t thread_; // The native thread object.
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
-};
-
-// MutexBase and Mutex implement mutex on pthreads-based platforms. They
-// are used in conjunction with class MutexLock:
-//
-// Mutex mutex;
-// ...
-// MutexLock lock(&mutex); // Acquires the mutex and releases it at the end
-// // of the current scope.
-//
-// MutexBase implements behavior for both statically and dynamically
-// allocated mutexes. Do not use MutexBase directly. Instead, write
-// the following to define a static mutex:
-//
-// GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
-//
-// You can forward declare a static mutex like this:
-//
-// GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
-//
-// To create a dynamic mutex, just define an object of type Mutex.
-class MutexBase {
- public:
- // Acquires this mutex.
- void Lock() {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
- owner_ = pthread_self();
- }
-
- // Releases this mutex.
- void Unlock() {
- // We don't protect writing to owner_ here, as it's the caller's
- // responsibility to ensure that the current thread holds the
- // mutex when this is called.
- owner_ = 0;
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
- }
-
- // Does nothing if the current thread holds the mutex. Otherwise, crashes
- // with high probability.
- void AssertHeld() const {
- GTEST_CHECK_(owner_ == pthread_self())
- << "The current thread is not holding the mutex @" << this;
- }
-
- // A static mutex may be used before main() is entered. It may even
- // be used before the dynamic initialization stage. Therefore we
- // must be able to initialize a static mutex object at link time.
- // This means MutexBase has to be a POD and its member variables
- // have to be public.
- public:
- pthread_mutex_t mutex_; // The underlying pthread mutex.
- pthread_t owner_; // The thread holding the mutex; 0 means no one holds it.
-};
-
-// Forward-declares a static mutex.
-# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
- extern ::testing::internal::MutexBase mutex
-
-// Defines and statically (i.e. at link time) initializes a static mutex.
-# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
- ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, 0 }
-
-// The Mutex class can only be used for mutexes created at runtime. It
-// shares its API with MutexBase otherwise.
-class Mutex : public MutexBase {
- public:
- Mutex() {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
- owner_ = 0;
- }
- ~Mutex() {
- GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
- }
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
-};
-
-// We cannot name this class MutexLock as the ctor declaration would
-// conflict with a macro named MutexLock, which is defined on some
-// platforms. Hence the typedef trick below.
-class GTestMutexLock {
- public:
- explicit GTestMutexLock(MutexBase* mutex)
- : mutex_(mutex) { mutex_->Lock(); }
-
- ~GTestMutexLock() { mutex_->Unlock(); }
-
- private:
- MutexBase* const mutex_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
-};
-
-typedef GTestMutexLock MutexLock;
-
-// Helpers for ThreadLocal.
-
-// pthread_key_create() requires DeleteThreadLocalValue() to have
-// C-linkage. Therefore it cannot be templatized to access
-// ThreadLocal<T>. Hence the need for class
-// ThreadLocalValueHolderBase.
-class ThreadLocalValueHolderBase {
- public:
- virtual ~ThreadLocalValueHolderBase() {}
-};
-
-// Called by pthread to delete thread-local data stored by
-// pthread_setspecific().
-extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
- delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
-}
-
-// Implements thread-local storage on pthreads-based systems.
-//
-// // Thread 1
-// ThreadLocal<int> tl(100); // 100 is the default value for each thread.
-//
-// // Thread 2
-// tl.set(150); // Changes the value for thread 2 only.
-// EXPECT_EQ(150, tl.get());
-//
-// // Thread 1
-// EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value.
-// tl.set(200);
-// EXPECT_EQ(200, tl.get());
-//
-// The template type argument T must have a public copy constructor.
-// In addition, the default ThreadLocal constructor requires T to have
-// a public default constructor.
-//
-// An object managed for a thread by a ThreadLocal instance is deleted
-// when the thread exits. Or, if the ThreadLocal instance dies in
-// that thread, when the ThreadLocal dies. It's the user's
-// responsibility to ensure that all other threads using a ThreadLocal
-// have exited when it dies, or the per-thread objects for those
-// threads will not be deleted.
-//
-// Google Test only uses global ThreadLocal objects. That means they
-// will die after main() has returned. Therefore, no per-thread
-// object managed by Google Test will be leaked as long as all threads
-// using Google Test have exited when main() returns.
-template <typename T>
-class ThreadLocal {
- public:
- ThreadLocal() : key_(CreateKey()),
- default_() {}
- explicit ThreadLocal(const T& value) : key_(CreateKey()),
- default_(value) {}
-
- ~ThreadLocal() {
- // Destroys the managed object for the current thread, if any.
- DeleteThreadLocalValue(pthread_getspecific(key_));
-
- // Releases resources associated with the key. This will *not*
- // delete managed objects for other threads.
- GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
- }
-
- T* pointer() { return GetOrCreateValue(); }
- const T* pointer() const { return GetOrCreateValue(); }
- const T& get() const { return *pointer(); }
- void set(const T& value) { *pointer() = value; }
-
- private:
- // Holds a value of type T.
- class ValueHolder : public ThreadLocalValueHolderBase {
- public:
- explicit ValueHolder(const T& value) : value_(value) {}
-
- T* pointer() { return &value_; }
-
- private:
- T value_;
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
- };
-
- static pthread_key_t CreateKey() {
- pthread_key_t key;
- // When a thread exits, DeleteThreadLocalValue() will be called on
- // the object managed for that thread.
- GTEST_CHECK_POSIX_SUCCESS_(
- pthread_key_create(&key, &DeleteThreadLocalValue));
- return key;
- }
-
- T* GetOrCreateValue() const {
- ThreadLocalValueHolderBase* const holder =
- static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
- if (holder != NULL) {
- return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
- }
-
- ValueHolder* const new_holder = new ValueHolder(default_);
- ThreadLocalValueHolderBase* const holder_base = new_holder;
- GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
- return new_holder->pointer();
- }
-
- // A key pthreads uses for looking up per-thread values.
- const pthread_key_t key_;
- const T default_; // The default value for each thread.
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
-};
-
-# define GTEST_IS_THREADSAFE 1
-
-#else // GTEST_HAS_PTHREAD
-
-// A dummy implementation of synchronization primitives (mutex, lock,
-// and thread-local variable). Necessary for compiling Google Test where
-// mutex is not supported - using Google Test in multiple threads is not
-// supported on such platforms.
-
-class Mutex {
- public:
- Mutex() {}
- void AssertHeld() const {}
-};
-
-# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
- extern ::testing::internal::Mutex mutex
-
-# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
-
-class GTestMutexLock {
- public:
- explicit GTestMutexLock(Mutex*) {} // NOLINT
-};
-
-typedef GTestMutexLock MutexLock;
-
-template <typename T>
-class ThreadLocal {
- public:
- ThreadLocal() : value_() {}
- explicit ThreadLocal(const T& value) : value_(value) {}
- T* pointer() { return &value_; }
- const T* pointer() const { return &value_; }
- const T& get() const { return value_; }
- void set(const T& value) { value_ = value; }
- private:
- T value_;
-};
-
-// The above synchronization primitives have dummy implementations.
-// Therefore Google Test is not thread-safe.
-# define GTEST_IS_THREADSAFE 0
-
-#endif // GTEST_HAS_PTHREAD
-
-// Returns the number of threads running in the process, or 0 to indicate that
-// we cannot detect it.
-GTEST_API_ size_t GetThreadCount();
-
-// Passing non-POD classes through ellipsis (...) crashes the ARM
-// compiler and generates a warning in Sun Studio. The Nokia Symbian
-// and the IBM XL C/C++ compiler try to instantiate a copy constructor
-// for objects passed through ellipsis (...), failing for uncopyable
-// objects. We define this to ensure that only POD is passed through
-// ellipsis on these systems.
-#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
-// We lose support for NULL detection where the compiler doesn't like
-// passing non-POD classes through ellipsis (...).
-# define GTEST_ELLIPSIS_NEEDS_POD_ 1
-#else
-# define GTEST_CAN_COMPARE_NULL 1
-#endif
-
-// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
-// const T& and const T* in a function template. These compilers
-// _can_ decide between class template specializations for T and T*,
-// so a tr1::type_traits-like is_pointer works.
-#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
-# define GTEST_NEEDS_IS_POINTER_ 1
-#endif
-
-template <bool bool_value>
-struct bool_constant {
- typedef bool_constant<bool_value> type;
- static const bool value = bool_value;
-};
-template <bool bool_value> const bool bool_constant<bool_value>::value;
-
-typedef bool_constant<false> false_type;
-typedef bool_constant<true> true_type;
-
-template <typename T>
-struct is_pointer : public false_type {};
-
-template <typename T>
-struct is_pointer<T*> : public true_type {};
-
-template <typename Iterator>
-struct IteratorTraits {
- typedef typename Iterator::value_type value_type;
-};
-
-template <typename T>
-struct IteratorTraits<T*> {
- typedef T value_type;
-};
-
-template <typename T>
-struct IteratorTraits<const T*> {
- typedef T value_type;
-};
-
-#if GTEST_OS_WINDOWS
-# define GTEST_PATH_SEP_ "\\"
-# define GTEST_HAS_ALT_PATH_SEP_ 1
-// The biggest signed integer type the compiler supports.
-typedef __int64 BiggestInt;
-#else
-# define GTEST_PATH_SEP_ "/"
-# define GTEST_HAS_ALT_PATH_SEP_ 0
-typedef long long BiggestInt; // NOLINT
-#endif // GTEST_OS_WINDOWS
-
-// Utilities for char.
-
-// isspace(int ch) and friends accept an unsigned char or EOF. char
-// may be signed, depending on the compiler (or compiler flags).
-// Therefore we need to cast a char to unsigned char before calling
-// isspace(), etc.
-
-inline bool IsAlpha(char ch) {
- return isalpha(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsAlNum(char ch) {
- return isalnum(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsDigit(char ch) {
- return isdigit(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsLower(char ch) {
- return islower(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsSpace(char ch) {
- return isspace(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsUpper(char ch) {
- return isupper(static_cast<unsigned char>(ch)) != 0;
-}
-inline bool IsXDigit(char ch) {
- return isxdigit(static_cast<unsigned char>(ch)) != 0;
-}
-
-inline char ToLower(char ch) {
- return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
-}
-inline char ToUpper(char ch) {
- return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
-}
-
-// The testing::internal::posix namespace holds wrappers for common
-// POSIX functions. These wrappers hide the differences between
-// Windows/MSVC and POSIX systems. Since some compilers define these
-// standard functions as macros, the wrapper cannot have the same name
-// as the wrapped function.
-
-namespace posix {
-
-// Functions with a different name on Windows.
-
-#if GTEST_OS_WINDOWS
-
-typedef struct _stat StatStruct;
-
-# ifdef __BORLANDC__
-inline int IsATTY(int fd) { return isatty(fd); }
-inline int StrCaseCmp(const char* s1, const char* s2) {
- return stricmp(s1, s2);
-}
-inline char* StrDup(const char* src) { return strdup(src); }
-# else // !__BORLANDC__
-# if GTEST_OS_WINDOWS_MOBILE
-inline int IsATTY(int /* fd */) { return 0; }
-# else
-inline int IsATTY(int fd) { return _isatty(fd); }
-# endif // GTEST_OS_WINDOWS_MOBILE
-inline int StrCaseCmp(const char* s1, const char* s2) {
- return _stricmp(s1, s2);
-}
-inline char* StrDup(const char* src) { return _strdup(src); }
-# endif // __BORLANDC__
-
-# if GTEST_OS_WINDOWS_MOBILE
-inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
-// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
-// time and thus not defined there.
-# else
-inline int FileNo(FILE* file) { return _fileno(file); }
-inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
-inline int RmDir(const char* dir) { return _rmdir(dir); }
-inline bool IsDir(const StatStruct& st) {
- return (_S_IFDIR & st.st_mode) != 0;
-}
-# endif // GTEST_OS_WINDOWS_MOBILE
-
-#else
-
-typedef struct stat StatStruct;
-
-inline int FileNo(FILE* file) { return fileno(file); }
-inline int IsATTY(int fd) { return isatty(fd); }
-inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
-inline int StrCaseCmp(const char* s1, const char* s2) {
- return strcasecmp(s1, s2);
-}
-inline char* StrDup(const char* src) { return strdup(src); }
-inline int RmDir(const char* dir) { return rmdir(dir); }
-inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
-
-#endif // GTEST_OS_WINDOWS
-
-// Functions deprecated by MSVC 8.0.
-
-#ifdef _MSC_VER
-// Temporarily disable warning 4996 (deprecated function).
-# pragma warning(push)
-# pragma warning(disable:4996)
-#endif
-
-inline const char* StrNCpy(char* dest, const char* src, size_t n) {
- return strncpy(dest, src, n);
-}
-
-// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
-// StrError() aren't needed on Windows CE at this time and thus not
-// defined there.
-
-#if !GTEST_OS_WINDOWS_MOBILE
-inline int ChDir(const char* dir) { return chdir(dir); }
-#endif
-inline FILE* FOpen(const char* path, const char* mode) {
- return fopen(path, mode);
-}
-#if !GTEST_OS_WINDOWS_MOBILE
-inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
- return freopen(path, mode, stream);
-}
-inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
-#endif
-inline int FClose(FILE* fp) { return fclose(fp); }
-#if !GTEST_OS_WINDOWS_MOBILE
-inline int Read(int fd, void* buf, unsigned int count) {
- return static_cast<int>(read(fd, buf, count));
-}
-inline int Write(int fd, const void* buf, unsigned int count) {
- return static_cast<int>(write(fd, buf, count));
-}
-inline int Close(int fd) { return close(fd); }
-inline const char* StrError(int errnum) { return strerror(errnum); }
-#endif
-inline const char* GetEnv(const char* name) {
-#if GTEST_OS_WINDOWS_MOBILE
- // We are on Windows CE, which has no environment variables.
- return NULL;
-#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
- // Environment variables which we programmatically clear will be set to the
- // empty string rather than unset (NULL). Handle that case.
- const char* const env = getenv(name);
- return (env != NULL && env[0] != '\0') ? env : NULL;
-#else
- return getenv(name);
-#endif
-}
-
-#ifdef _MSC_VER
-# pragma warning(pop) // Restores the warning state.
-#endif
-
-#if GTEST_OS_WINDOWS_MOBILE
-// Windows CE has no C library. The abort() function is used in
-// several places in Google Test. This implementation provides a reasonable
-// imitation of standard behaviour.
-void Abort();
-#else
-inline void Abort() { abort(); }
-#endif // GTEST_OS_WINDOWS_MOBILE
-
-} // namespace posix
-
-// The maximum number a BiggestInt can represent. This definition
-// works no matter BiggestInt is represented in one's complement or
-// two's complement.
-//
-// We cannot rely on numeric_limits in STL, as __int64 and long long
-// are not part of standard C++ and numeric_limits doesn't need to be
-// defined for them.
-const BiggestInt kMaxBiggestInt =
- ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
-
-// This template class serves as a compile-time function from size to
-// type. It maps a size in bytes to a primitive type with that
-// size. e.g.
-//
-// TypeWithSize<4>::UInt
-//
-// is typedef-ed to be unsigned int (unsigned integer made up of 4
-// bytes).
-//
-// Such functionality should belong to STL, but I cannot find it
-// there.
-//
-// Google Test uses this class in the implementation of floating-point
-// comparison.
-//
-// For now it only handles UInt (unsigned int) as that's all Google Test
-// needs. Other types can be easily added in the future if need
-// arises.
-template <size_t size>
-class TypeWithSize {
- public:
- // This prevents the user from using TypeWithSize<N> with incorrect
- // values of N.
- typedef void UInt;
-};
-
-// The specialization for size 4.
-template <>
-class TypeWithSize<4> {
- public:
- // unsigned int has size 4 in both gcc and MSVC.
- //
- // As base/basictypes.h doesn't compile on Windows, we cannot use
- // uint32, uint64, and etc here.
- typedef int Int;
- typedef unsigned int UInt;
-};
-
-// The specialization for size 8.
-template <>
-class TypeWithSize<8> {
- public:
-
-#if GTEST_OS_WINDOWS
- typedef __int64 Int;
- typedef unsigned __int64 UInt;
-#else
- typedef long long Int; // NOLINT
- typedef unsigned long long UInt; // NOLINT
-#endif // GTEST_OS_WINDOWS
-};
-
-// Integer types of known sizes.
-typedef TypeWithSize<4>::Int Int32;
-typedef TypeWithSize<4>::UInt UInt32;
-typedef TypeWithSize<8>::Int Int64;
-typedef TypeWithSize<8>::UInt UInt64;
-typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds.
-
-// Utilities for command line flags and environment variables.
-
-// Macro for referencing flags.
-#define GTEST_FLAG(name) FLAGS_gtest_##name
-
-// Macros for declaring flags.
-#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
-#define GTEST_DECLARE_int32_(name) \
- GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
-#define GTEST_DECLARE_string_(name) \
- GTEST_API_ extern ::testing::internal::String GTEST_FLAG(name)
-
-// Macros for defining flags.
-#define GTEST_DEFINE_bool_(name, default_val, doc) \
- GTEST_API_ bool GTEST_FLAG(name) = (default_val)
-#define GTEST_DEFINE_int32_(name, default_val, doc) \
- GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
-#define GTEST_DEFINE_string_(name, default_val, doc) \
- GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val)
-
-// Parses 'str' for a 32-bit signed integer. If successful, writes the result
-// to *value and returns true; otherwise leaves *value unchanged and returns
-// false.
-// TODO(chandlerc): Find a better way to refactor flag and environment parsing
-// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
-// function.
-bool ParseInt32(const Message& src_text, const char* str, Int32* value);
-
-// Parses a bool/Int32/string from the environment variable
-// corresponding to the given Google Test flag.
-bool BoolFromGTestEnv(const char* flag, bool default_val);
-GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
-const char* StringFromGTestEnv(const char* flag, const char* default_val);
-
-} // namespace internal
-} // namespace testing
-
-#ifdef __ICC
-#pragma warning enable 2304
-#endif
-
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-string.h b/unit_tests/gtest/include/gtest/internal/gtest-string.h
deleted file mode 100644
index 9657ce5..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-string.h
+++ /dev/null
@@ -1,360 +0,0 @@
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
-//
-// The Google C++ Testing Framework (Google Test)
-//
-// This header file declares the String class and functions used internally by
-// Google Test. They are subject to change without notice. They should not used
-// by code external to Google Test.
-//
-// This header file is #included by <gtest/internal/gtest-internal.h>.
-// It should not be #included by other files.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
-
-#ifdef __ICC
-// Disable explicit warning on Intel compiler
-#pragma warning disable 2304
-#endif
-
-#ifdef __BORLANDC__
-// string.h is not guaranteed to provide strcpy on C++ Builder.
-# include <mem.h>
-#endif
-
-#include <string.h>
-#include "gtest/internal/gtest-port.h"
-
-#include <string>
-
-namespace testing {
-namespace internal {
-
-// String - a UTF-8 string class.
-//
-// For historic reasons, we don't use std::string.
-//
-// TODO(wan at google.com): replace this class with std::string or
-// implement it in terms of the latter.
-//
-// Note that String can represent both NULL and the empty string,
-// while std::string cannot represent NULL.
-//
-// NULL and the empty string are considered different. NULL is less
-// than anything (including the empty string) except itself.
-//
-// This class only provides minimum functionality necessary for
-// implementing Google Test. We do not intend to implement a full-fledged
-// string class here.
-//
-// Since the purpose of this class is to provide a substitute for
-// std::string on platforms where it cannot be used, we define a copy
-// constructor and assignment operators such that we don't need
-// conditional compilation in a lot of places.
-//
-// In order to make the representation efficient, the d'tor of String
-// is not virtual. Therefore DO NOT INHERIT FROM String.
-class GTEST_API_ String {
- public:
- // Static utility methods
-
- // Returns the input enclosed in double quotes if it's not NULL;
- // otherwise returns "(null)". For example, "\"Hello\"" is returned
- // for input "Hello".
- //
- // This is useful for printing a C string in the syntax of a literal.
- //
- // Known issue: escape sequences are not handled yet.
- static String ShowCStringQuoted(const char* c_str);
-
- // Clones a 0-terminated C string, allocating memory using new. The
- // caller is responsible for deleting the return value using
- // delete[]. Returns the cloned string, or NULL if the input is
- // NULL.
- //
- // This is different from strdup() in string.h, which allocates
- // memory using malloc().
- static const char* CloneCString(const char* c_str);
-
-#if GTEST_OS_WINDOWS_MOBILE
- // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
- // able to pass strings to Win32 APIs on CE we need to convert them
- // to 'Unicode', UTF-16.
-
- // Creates a UTF-16 wide string from the given ANSI string, allocating
- // memory using new. The caller is responsible for deleting the return
- // value using delete[]. Returns the wide string, or NULL if the
- // input is NULL.
- //
- // The wide string is created using the ANSI codepage (CP_ACP) to
- // match the behaviour of the ANSI versions of Win32 calls and the
- // C runtime.
- static LPCWSTR AnsiToUtf16(const char* c_str);
-
- // Creates an ANSI string from the given wide string, allocating
- // memory using new. The caller is responsible for deleting the return
- // value using delete[]. Returns the ANSI string, or NULL if the
- // input is NULL.
- //
- // The returned string is created using the ANSI codepage (CP_ACP) to
- // match the behaviour of the ANSI versions of Win32 calls and the
- // C runtime.
- static const char* Utf16ToAnsi(LPCWSTR utf16_str);
-#endif
-
- // Compares two C strings. Returns true iff they have the same content.
- //
- // Unlike strcmp(), this function can handle NULL argument(s). A
- // NULL C string is considered different to any non-NULL C string,
- // including the empty string.
- static bool CStringEquals(const char* lhs, const char* rhs);
-
- // Converts a wide C string to a String using the UTF-8 encoding.
- // NULL will be converted to "(null)". If an error occurred during
- // the conversion, "(failed to convert from wide string)" is
- // returned.
- static String ShowWideCString(const wchar_t* wide_c_str);
-
- // Similar to ShowWideCString(), except that this function encloses
- // the converted string in double quotes.
- static String ShowWideCStringQuoted(const wchar_t* wide_c_str);
-
- // Compares two wide C strings. Returns true iff they have the same
- // content.
- //
- // Unlike wcscmp(), this function can handle NULL argument(s). A
- // NULL C string is considered different to any non-NULL C string,
- // including the empty string.
- static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
-
- // Compares two C strings, ignoring case. Returns true iff they
- // have the same content.
- //
- // Unlike strcasecmp(), this function can handle NULL argument(s).
- // A NULL C string is considered different to any non-NULL C string,
- // including the empty string.
- static bool CaseInsensitiveCStringEquals(const char* lhs,
- const char* rhs);
-
- // Compares two wide C strings, ignoring case. Returns true iff they
- // have the same content.
- //
- // Unlike wcscasecmp(), this function can handle NULL argument(s).
- // A NULL C string is considered different to any non-NULL wide C string,
- // including the empty string.
- // NB: The implementations on different platforms slightly differ.
- // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
- // environment variable. On GNU platform this method uses wcscasecmp
- // which compares according to LC_CTYPE category of the current locale.
- // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
- // current locale.
- static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
- const wchar_t* rhs);
-
- // Formats a list of arguments to a String, using the same format
- // spec string as for printf.
- //
- // We do not use the StringPrintf class as it is not universally
- // available.
- //
- // The result is limited to 4096 characters (including the tailing
- // 0). If 4096 characters are not enough to format the input,
- // "<buffer exceeded>" is returned.
- static String Format(const char* format, ...);
-
- // C'tors
-
- // The default c'tor constructs a NULL string.
- String() : c_str_(NULL), length_(0) {}
-
- // Constructs a String by cloning a 0-terminated C string.
- String(const char* a_c_str) { // NOLINT
- if (a_c_str == NULL) {
- c_str_ = NULL;
- length_ = 0;
- } else {
- ConstructNonNull(a_c_str, strlen(a_c_str));
- }
- }
-
- // Constructs a String by copying a given number of chars from a
- // buffer. E.g. String("hello", 3) creates the string "hel",
- // String("a\0bcd", 4) creates "a\0bc", String(NULL, 0) creates "",
- // and String(NULL, 1) results in access violation.
- String(const char* buffer, size_t a_length) {
- ConstructNonNull(buffer, a_length);
- }
-
- // The copy c'tor creates a new copy of the string. The two
- // String objects do not share content.
- String(const String& str) : c_str_(NULL), length_(0) { *this = str; }
-
- // D'tor. String is intended to be a final class, so the d'tor
- // doesn't need to be virtual.
- ~String() { delete[] c_str_; }
-
- // Allows a String to be implicitly converted to an ::std::string or
- // ::string, and vice versa. Converting a String containing a NULL
- // pointer to ::std::string or ::string is undefined behavior.
- // Converting a ::std::string or ::string containing an embedded NUL
- // character to a String will result in the prefix up to the first
- // NUL character.
- String(const ::std::string& str) {
- ConstructNonNull(str.c_str(), str.length());
- }
-
- operator ::std::string() const { return ::std::string(c_str(), length()); }
-
-#if GTEST_HAS_GLOBAL_STRING
- String(const ::string& str) {
- ConstructNonNull(str.c_str(), str.length());
- }
-
- operator ::string() const { return ::string(c_str(), length()); }
-#endif // GTEST_HAS_GLOBAL_STRING
-
- // Returns true iff this is an empty string (i.e. "").
- bool empty() const { return (c_str() != NULL) && (length() == 0); }
-
- // Compares this with another String.
- // Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0
- // if this is greater than rhs.
- int Compare(const String& rhs) const;
-
- // Returns true iff this String equals the given C string. A NULL
- // string and a non-NULL string are considered not equal.
- bool operator==(const char* a_c_str) const { return Compare(a_c_str) == 0; }
-
- // Returns true iff this String is less than the given String. A
- // NULL string is considered less than "".
- bool operator<(const String& rhs) const { return Compare(rhs) < 0; }
-
- // Returns true iff this String doesn't equal the given C string. A NULL
- // string and a non-NULL string are considered not equal.
- bool operator!=(const char* a_c_str) const { return !(*this == a_c_str); }
-
- // Returns true iff this String ends with the given suffix. *Any*
- // String is considered to end with a NULL or empty suffix.
- bool EndsWith(const char* suffix) const;
-
- // Returns true iff this String ends with the given suffix, not considering
- // case. Any String is considered to end with a NULL or empty suffix.
- bool EndsWithCaseInsensitive(const char* suffix) const;
-
- // Returns the length of the encapsulated string, or 0 if the
- // string is NULL.
- size_t length() const { return length_; }
-
- // Gets the 0-terminated C string this String object represents.
- // The String object still owns the string. Therefore the caller
- // should NOT delete the return value.
- const char* c_str() const { return c_str_; }
-
- // Assigns a C string to this object. Self-assignment works.
- const String& operator=(const char* a_c_str) {
- return *this = String(a_c_str);
- }
-
- // Assigns a String object to this object. Self-assignment works.
- const String& operator=(const String& rhs) {
- if (this != &rhs) {
- delete[] c_str_;
- if (rhs.c_str() == NULL) {
- c_str_ = NULL;
- length_ = 0;
- } else {
- ConstructNonNull(rhs.c_str(), rhs.length());
- }
- }
-
- return *this;
- }
-
- private:
- // Constructs a non-NULL String from the given content. This
- // function can only be called when c_str_ has not been allocated.
- // ConstructNonNull(NULL, 0) results in an empty string ("").
- // ConstructNonNull(NULL, non_zero) is undefined behavior.
- void ConstructNonNull(const char* buffer, size_t a_length) {
- char* const str = new char[a_length + 1];
- memcpy(str, buffer, a_length);
- str[a_length] = '\0';
- c_str_ = str;
- length_ = a_length;
- }
-
- const char* c_str_;
- size_t length_;
-}; // class String
-
-// Streams a String to an ostream. Each '\0' character in the String
-// is replaced with "\\0".
-inline ::std::ostream& operator<<(::std::ostream& os, const String& str) {
- if (str.c_str() == NULL) {
- os << "(null)";
- } else {
- const char* const c_str = str.c_str();
- for (size_t i = 0; i != str.length(); i++) {
- if (c_str[i] == '\0') {
- os << "\\0";
- } else {
- os << c_str[i];
- }
- }
- }
- return os;
-}
-
-// Gets the content of the stringstream's buffer as a String. Each '\0'
-// character in the buffer is replaced with "\\0".
-GTEST_API_ String StringStreamToString(::std::stringstream* stream);
-
-// Converts a streamable value to a String. A NULL pointer is
-// converted to "(null)". When the input value is a ::string,
-// ::std::string, ::wstring, or ::std::wstring object, each NUL
-// character in it is replaced with "\\0".
-
-// Declared here but defined in gtest.h, so that it has access
-// to the definition of the Message class, required by the ARM
-// compiler.
-template <typename T>
-String StreamableToString(const T& streamable);
-
-} // namespace internal
-} // namespace testing
-
-#ifdef __ICC
-// Disable explicit warning on Intel compiler
-#pragma warning enable 2304
-#endif
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-tuple.h b/unit_tests/gtest/include/gtest/internal/gtest-tuple.h
deleted file mode 100644
index d1af50e..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-tuple.h
+++ /dev/null
@@ -1,968 +0,0 @@
-// This file was GENERATED by a script. DO NOT EDIT BY HAND!!!
-
-// Copyright 2009 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
-
-#include <utility> // For ::std::pair.
-
-// The compiler used in Symbian has a bug that prevents us from declaring the
-// tuple template as a friend (it complains that tuple is redefined). This
-// hack bypasses the bug by declaring the members that should otherwise be
-// private as public.
-// Sun Studio versions < 12 also have the above bug.
-#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
-# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
-#else
-# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
- template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
- private:
-#endif
-
-// GTEST_n_TUPLE_(T) is the type of an n-tuple.
-#define GTEST_0_TUPLE_(T) tuple<>
-#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
- void, void, void>
-#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
- void, void, void>
-#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
- void, void, void>
-#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
- void, void, void>
-#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
- void, void, void>
-#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
- void, void, void>
-#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
- void, void, void>
-#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
- T##7, void, void>
-#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
- T##7, T##8, void>
-#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
- T##7, T##8, T##9>
-
-// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
-#define GTEST_0_TYPENAMES_(T)
-#define GTEST_1_TYPENAMES_(T) typename T##0
-#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
-#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
-#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3
-#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3, typename T##4
-#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3, typename T##4, typename T##5
-#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3, typename T##4, typename T##5, typename T##6
-#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
-#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3, typename T##4, typename T##5, typename T##6, \
- typename T##7, typename T##8
-#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
- typename T##3, typename T##4, typename T##5, typename T##6, \
- typename T##7, typename T##8, typename T##9
-
-// In theory, defining stuff in the ::std namespace is undefined
-// behavior. We can do this as we are playing the role of a standard
-// library vendor.
-namespace std {
-namespace tr1 {
-
-template <typename T0 = void, typename T1 = void, typename T2 = void,
- typename T3 = void, typename T4 = void, typename T5 = void,
- typename T6 = void, typename T7 = void, typename T8 = void,
- typename T9 = void>
-class tuple;
-
-// Anything in namespace gtest_internal is Google Test's INTERNAL
-// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
-namespace gtest_internal {
-
-// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
-template <typename T>
-struct ByRef { typedef const T& type; }; // NOLINT
-template <typename T>
-struct ByRef<T&> { typedef T& type; }; // NOLINT
-
-// A handy wrapper for ByRef.
-#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
-
-// AddRef<T>::type is T if T is a reference; otherwise it's T&. This
-// is the same as tr1::add_reference<T>::type.
-template <typename T>
-struct AddRef { typedef T& type; }; // NOLINT
-template <typename T>
-struct AddRef<T&> { typedef T& type; }; // NOLINT
-
-// A handy wrapper for AddRef.
-#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
-
-// A helper for implementing get<k>().
-template <int k> class Get;
-
-// A helper for implementing tuple_element<k, T>. kIndexValid is true
-// iff k < the number of fields in tuple type T.
-template <bool kIndexValid, int kIndex, class Tuple>
-struct TupleElement;
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 0, GTEST_10_TUPLE_(T)> { typedef T0 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 1, GTEST_10_TUPLE_(T)> { typedef T1 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 2, GTEST_10_TUPLE_(T)> { typedef T2 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 3, GTEST_10_TUPLE_(T)> { typedef T3 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 4, GTEST_10_TUPLE_(T)> { typedef T4 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 5, GTEST_10_TUPLE_(T)> { typedef T5 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 6, GTEST_10_TUPLE_(T)> { typedef T6 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 7, GTEST_10_TUPLE_(T)> { typedef T7 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 8, GTEST_10_TUPLE_(T)> { typedef T8 type; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct TupleElement<true, 9, GTEST_10_TUPLE_(T)> { typedef T9 type; };
-
-} // namespace gtest_internal
-
-template <>
-class tuple<> {
- public:
- tuple() {}
- tuple(const tuple& /* t */) {}
- tuple& operator=(const tuple& /* t */) { return *this; }
-};
-
-template <GTEST_1_TYPENAMES_(T)>
-class GTEST_1_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
-
- tuple(const tuple& t) : f0_(t.f0_) {}
-
- template <GTEST_1_TYPENAMES_(U)>
- tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_1_TYPENAMES_(U)>
- tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_1_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
- f0_ = t.f0_;
- return *this;
- }
-
- T0 f0_;
-};
-
-template <GTEST_2_TYPENAMES_(T)>
-class GTEST_2_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
- f1_(f1) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
-
- template <GTEST_2_TYPENAMES_(U)>
- tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
- template <typename U0, typename U1>
- tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_2_TYPENAMES_(U)>
- tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
- template <typename U0, typename U1>
- tuple& operator=(const ::std::pair<U0, U1>& p) {
- f0_ = p.first;
- f1_ = p.second;
- return *this;
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_2_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
-};
-
-template <GTEST_3_TYPENAMES_(T)>
-class GTEST_3_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
-
- template <GTEST_3_TYPENAMES_(U)>
- tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_3_TYPENAMES_(U)>
- tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_3_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
-};
-
-template <GTEST_4_TYPENAMES_(T)>
-class GTEST_4_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
- f3_(f3) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
-
- template <GTEST_4_TYPENAMES_(U)>
- tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_4_TYPENAMES_(U)>
- tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_4_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
-};
-
-template <GTEST_5_TYPENAMES_(T)>
-class GTEST_5_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
- GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
- f4_(t.f4_) {}
-
- template <GTEST_5_TYPENAMES_(U)>
- tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_), f4_(t.f4_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_5_TYPENAMES_(U)>
- tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_5_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- f4_ = t.f4_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
- T4 f4_;
-};
-
-template <GTEST_6_TYPENAMES_(T)>
-class GTEST_6_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
- GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
- f5_(f5) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
- f4_(t.f4_), f5_(t.f5_) {}
-
- template <GTEST_6_TYPENAMES_(U)>
- tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_6_TYPENAMES_(U)>
- tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_6_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- f4_ = t.f4_;
- f5_ = t.f5_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
- T4 f4_;
- T5 f5_;
-};
-
-template <GTEST_7_TYPENAMES_(T)>
-class GTEST_7_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
- GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
- f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
- f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
-
- template <GTEST_7_TYPENAMES_(U)>
- tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_7_TYPENAMES_(U)>
- tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_7_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- f4_ = t.f4_;
- f5_ = t.f5_;
- f6_ = t.f6_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
- T4 f4_;
- T5 f5_;
- T6 f6_;
-};
-
-template <GTEST_8_TYPENAMES_(T)>
-class GTEST_8_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
- GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
- GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
- f5_(f5), f6_(f6), f7_(f7) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
- f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
-
- template <GTEST_8_TYPENAMES_(U)>
- tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_8_TYPENAMES_(U)>
- tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_8_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- f4_ = t.f4_;
- f5_ = t.f5_;
- f6_ = t.f6_;
- f7_ = t.f7_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
- T4 f4_;
- T5 f5_;
- T6 f6_;
- T7 f7_;
-};
-
-template <GTEST_9_TYPENAMES_(T)>
-class GTEST_9_TUPLE_(T) {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
- GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
- GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
- f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
- f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
-
- template <GTEST_9_TYPENAMES_(U)>
- tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_9_TYPENAMES_(U)>
- tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_9_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- f4_ = t.f4_;
- f5_ = t.f5_;
- f6_ = t.f6_;
- f7_ = t.f7_;
- f8_ = t.f8_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
- T4 f4_;
- T5 f5_;
- T6 f6_;
- T7 f7_;
- T8 f8_;
-};
-
-template <GTEST_10_TYPENAMES_(T)>
-class tuple {
- public:
- template <int k> friend class gtest_internal::Get;
-
- tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
- f9_() {}
-
- explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
- GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
- GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
- GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
- f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
-
- tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
- f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
-
- template <GTEST_10_TYPENAMES_(U)>
- tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
- f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
- f9_(t.f9_) {}
-
- tuple& operator=(const tuple& t) { return CopyFrom(t); }
-
- template <GTEST_10_TYPENAMES_(U)>
- tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
- return CopyFrom(t);
- }
-
- GTEST_DECLARE_TUPLE_AS_FRIEND_
-
- template <GTEST_10_TYPENAMES_(U)>
- tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
- f0_ = t.f0_;
- f1_ = t.f1_;
- f2_ = t.f2_;
- f3_ = t.f3_;
- f4_ = t.f4_;
- f5_ = t.f5_;
- f6_ = t.f6_;
- f7_ = t.f7_;
- f8_ = t.f8_;
- f9_ = t.f9_;
- return *this;
- }
-
- T0 f0_;
- T1 f1_;
- T2 f2_;
- T3 f3_;
- T4 f4_;
- T5 f5_;
- T6 f6_;
- T7 f7_;
- T8 f8_;
- T9 f9_;
-};
-
-// 6.1.3.2 Tuple creation functions.
-
-// Known limitations: we don't support passing an
-// std::tr1::reference_wrapper<T> to make_tuple(). And we don't
-// implement tie().
-
-inline tuple<> make_tuple() { return tuple<>(); }
-
-template <GTEST_1_TYPENAMES_(T)>
-inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
- return GTEST_1_TUPLE_(T)(f0);
-}
-
-template <GTEST_2_TYPENAMES_(T)>
-inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
- return GTEST_2_TUPLE_(T)(f0, f1);
-}
-
-template <GTEST_3_TYPENAMES_(T)>
-inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
- return GTEST_3_TUPLE_(T)(f0, f1, f2);
-}
-
-template <GTEST_4_TYPENAMES_(T)>
-inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3) {
- return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
-}
-
-template <GTEST_5_TYPENAMES_(T)>
-inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3, const T4& f4) {
- return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
-}
-
-template <GTEST_6_TYPENAMES_(T)>
-inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3, const T4& f4, const T5& f5) {
- return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
-}
-
-template <GTEST_7_TYPENAMES_(T)>
-inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
- return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
-}
-
-template <GTEST_8_TYPENAMES_(T)>
-inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
- return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
-}
-
-template <GTEST_9_TYPENAMES_(T)>
-inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
- const T8& f8) {
- return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
-}
-
-template <GTEST_10_TYPENAMES_(T)>
-inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
- const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
- const T8& f8, const T9& f9) {
- return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
-}
-
-// 6.1.3.3 Tuple helper classes.
-
-template <typename Tuple> struct tuple_size;
-
-template <GTEST_0_TYPENAMES_(T)>
-struct tuple_size<GTEST_0_TUPLE_(T)> { static const int value = 0; };
-
-template <GTEST_1_TYPENAMES_(T)>
-struct tuple_size<GTEST_1_TUPLE_(T)> { static const int value = 1; };
-
-template <GTEST_2_TYPENAMES_(T)>
-struct tuple_size<GTEST_2_TUPLE_(T)> { static const int value = 2; };
-
-template <GTEST_3_TYPENAMES_(T)>
-struct tuple_size<GTEST_3_TUPLE_(T)> { static const int value = 3; };
-
-template <GTEST_4_TYPENAMES_(T)>
-struct tuple_size<GTEST_4_TUPLE_(T)> { static const int value = 4; };
-
-template <GTEST_5_TYPENAMES_(T)>
-struct tuple_size<GTEST_5_TUPLE_(T)> { static const int value = 5; };
-
-template <GTEST_6_TYPENAMES_(T)>
-struct tuple_size<GTEST_6_TUPLE_(T)> { static const int value = 6; };
-
-template <GTEST_7_TYPENAMES_(T)>
-struct tuple_size<GTEST_7_TUPLE_(T)> { static const int value = 7; };
-
-template <GTEST_8_TYPENAMES_(T)>
-struct tuple_size<GTEST_8_TUPLE_(T)> { static const int value = 8; };
-
-template <GTEST_9_TYPENAMES_(T)>
-struct tuple_size<GTEST_9_TUPLE_(T)> { static const int value = 9; };
-
-template <GTEST_10_TYPENAMES_(T)>
-struct tuple_size<GTEST_10_TUPLE_(T)> { static const int value = 10; };
-
-template <int k, class Tuple>
-struct tuple_element {
- typedef typename gtest_internal::TupleElement<
- k < (tuple_size<Tuple>::value), k, Tuple>::type type;
-};
-
-#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
-
-// 6.1.3.4 Element access.
-
-namespace gtest_internal {
-
-template <>
-class Get<0> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
- Field(Tuple& t) { return t.f0_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
- ConstField(const Tuple& t) { return t.f0_; }
-};
-
-template <>
-class Get<1> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
- Field(Tuple& t) { return t.f1_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
- ConstField(const Tuple& t) { return t.f1_; }
-};
-
-template <>
-class Get<2> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
- Field(Tuple& t) { return t.f2_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
- ConstField(const Tuple& t) { return t.f2_; }
-};
-
-template <>
-class Get<3> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
- Field(Tuple& t) { return t.f3_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
- ConstField(const Tuple& t) { return t.f3_; }
-};
-
-template <>
-class Get<4> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
- Field(Tuple& t) { return t.f4_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
- ConstField(const Tuple& t) { return t.f4_; }
-};
-
-template <>
-class Get<5> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
- Field(Tuple& t) { return t.f5_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
- ConstField(const Tuple& t) { return t.f5_; }
-};
-
-template <>
-class Get<6> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
- Field(Tuple& t) { return t.f6_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
- ConstField(const Tuple& t) { return t.f6_; }
-};
-
-template <>
-class Get<7> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
- Field(Tuple& t) { return t.f7_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
- ConstField(const Tuple& t) { return t.f7_; }
-};
-
-template <>
-class Get<8> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
- Field(Tuple& t) { return t.f8_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
- ConstField(const Tuple& t) { return t.f8_; }
-};
-
-template <>
-class Get<9> {
- public:
- template <class Tuple>
- static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
- Field(Tuple& t) { return t.f9_; } // NOLINT
-
- template <class Tuple>
- static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
- ConstField(const Tuple& t) { return t.f9_; }
-};
-
-} // namespace gtest_internal
-
-template <int k, GTEST_10_TYPENAMES_(T)>
-GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
-get(GTEST_10_TUPLE_(T)& t) {
- return gtest_internal::Get<k>::Field(t);
-}
-
-template <int k, GTEST_10_TYPENAMES_(T)>
-GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
-get(const GTEST_10_TUPLE_(T)& t) {
- return gtest_internal::Get<k>::ConstField(t);
-}
-
-// 6.1.3.5 Relational operators
-
-// We only implement == and !=, as we don't have a need for the rest yet.
-
-namespace gtest_internal {
-
-// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
-// first k fields of t1 equals the first k fields of t2.
-// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
-// k1 != k2.
-template <int kSize1, int kSize2>
-struct SameSizeTuplePrefixComparator;
-
-template <>
-struct SameSizeTuplePrefixComparator<0, 0> {
- template <class Tuple1, class Tuple2>
- static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
- return true;
- }
-};
-
-template <int k>
-struct SameSizeTuplePrefixComparator<k, k> {
- template <class Tuple1, class Tuple2>
- static bool Eq(const Tuple1& t1, const Tuple2& t2) {
- return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
- ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
- }
-};
-
-} // namespace gtest_internal
-
-template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
-inline bool operator==(const GTEST_10_TUPLE_(T)& t,
- const GTEST_10_TUPLE_(U)& u) {
- return gtest_internal::SameSizeTuplePrefixComparator<
- tuple_size<GTEST_10_TUPLE_(T)>::value,
- tuple_size<GTEST_10_TUPLE_(U)>::value>::Eq(t, u);
-}
-
-template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
-inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
- const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
-
-// 6.1.4 Pairs.
-// Unimplemented.
-
-} // namespace tr1
-} // namespace std
-
-#undef GTEST_0_TUPLE_
-#undef GTEST_1_TUPLE_
-#undef GTEST_2_TUPLE_
-#undef GTEST_3_TUPLE_
-#undef GTEST_4_TUPLE_
-#undef GTEST_5_TUPLE_
-#undef GTEST_6_TUPLE_
-#undef GTEST_7_TUPLE_
-#undef GTEST_8_TUPLE_
-#undef GTEST_9_TUPLE_
-#undef GTEST_10_TUPLE_
-
-#undef GTEST_0_TYPENAMES_
-#undef GTEST_1_TYPENAMES_
-#undef GTEST_2_TYPENAMES_
-#undef GTEST_3_TYPENAMES_
-#undef GTEST_4_TYPENAMES_
-#undef GTEST_5_TYPENAMES_
-#undef GTEST_6_TYPENAMES_
-#undef GTEST_7_TYPENAMES_
-#undef GTEST_8_TYPENAMES_
-#undef GTEST_9_TYPENAMES_
-#undef GTEST_10_TYPENAMES_
-
-#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
-#undef GTEST_BY_REF_
-#undef GTEST_ADD_REF_
-#undef GTEST_TUPLE_ELEMENT_
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
diff --git a/unit_tests/gtest/include/gtest/internal/gtest-type-util.h b/unit_tests/gtest/include/gtest/internal/gtest-type-util.h
deleted file mode 100644
index b7b01b0..0000000
--- a/unit_tests/gtest/include/gtest/internal/gtest-type-util.h
+++ /dev/null
@@ -1,3330 +0,0 @@
-// This file was GENERATED by command:
-// pump.py gtest-type-util.h.pump
-// DO NOT EDIT BY HAND!!!
-
-// Copyright 2008 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-// Type utilities needed for implementing typed and type-parameterized
-// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
-//
-// Currently we support at most 50 types in a list, and at most 50
-// type-parameterized tests in one type-parameterized test case.
-// Please contact googletestframework at googlegroups.com if you need
-// more.
-
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
-
-#include "gtest/internal/gtest-port.h"
-#include "gtest/internal/gtest-string.h"
-
-// #ifdef __GNUC__ is too general here. It is possible to use gcc without using
-// libstdc++ (which is where cxxabi.h comes from).
-# ifdef __GLIBCXX__
-# include <cxxabi.h>
-# elif defined(__HP_aCC)
-# include <acxx_demangle.h>
-# endif // __GLIBCXX__
-
-namespace testing {
-namespace internal {
-
-// GetTypeName<T>() returns a human-readable name of type T.
-// NB: This function is also used in Google Mock, so don't move it inside of
-// the typed-test-only section below.
-template <typename T>
-String GetTypeName() {
-# if GTEST_HAS_RTTI
-
- const char* const name = typeid(T).name();
-# if defined(__GLIBCXX__) || defined(__HP_aCC)
- int status = 0;
- // gcc's implementation of typeid(T).name() mangles the type name,
- // so we have to demangle it.
-# ifdef __GLIBCXX__
- using abi::__cxa_demangle;
-# endif // __GLIBCXX__
- char* const readable_name = __cxa_demangle(name, 0, 0, &status);
- const String name_str(status == 0 ? readable_name : name);
- free(readable_name);
- return name_str;
-# else
- return name;
-# endif // __GLIBCXX__ || __HP_aCC
-
-# else
-
- return "<type>";
-
-# endif // GTEST_HAS_RTTI
-}
-
-#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
-
-// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
-// type. This can be used as a compile-time assertion to ensure that
-// two types are equal.
-
-template <typename T1, typename T2>
-struct AssertTypeEq;
-
-template <typename T>
-struct AssertTypeEq<T, T> {
- typedef bool type;
-};
-
-// A unique type used as the default value for the arguments of class
-// template Types. This allows us to simulate variadic templates
-// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
-// support directly.
-struct None {};
-
-// The following family of struct and struct templates are used to
-// represent type lists. In particular, TypesN<T1, T2, ..., TN>
-// represents a type list with N types (T1, T2, ..., and TN) in it.
-// Except for Types0, every struct in the family has two member types:
-// Head for the first type in the list, and Tail for the rest of the
-// list.
-
-// The empty type list.
-struct Types0 {};
-
-// Type lists of length 1, 2, 3, and so on.
-
-template <typename T1>
-struct Types1 {
- typedef T1 Head;
- typedef Types0 Tail;
-};
-template <typename T1, typename T2>
-struct Types2 {
- typedef T1 Head;
- typedef Types1<T2> Tail;
-};
-
-template <typename T1, typename T2, typename T3>
-struct Types3 {
- typedef T1 Head;
- typedef Types2<T2, T3> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4>
-struct Types4 {
- typedef T1 Head;
- typedef Types3<T2, T3, T4> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-struct Types5 {
- typedef T1 Head;
- typedef Types4<T2, T3, T4, T5> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
-struct Types6 {
- typedef T1 Head;
- typedef Types5<T2, T3, T4, T5, T6> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
-struct Types7 {
- typedef T1 Head;
- typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
-struct Types8 {
- typedef T1 Head;
- typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
-struct Types9 {
- typedef T1 Head;
- typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
-struct Types10 {
- typedef T1 Head;
- typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11>
-struct Types11 {
- typedef T1 Head;
- typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12>
-struct Types12 {
- typedef T1 Head;
- typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13>
-struct Types13 {
- typedef T1 Head;
- typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14>
-struct Types14 {
- typedef T1 Head;
- typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15>
-struct Types15 {
- typedef T1 Head;
- typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16>
-struct Types16 {
- typedef T1 Head;
- typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17>
-struct Types17 {
- typedef T1 Head;
- typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18>
-struct Types18 {
- typedef T1 Head;
- typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19>
-struct Types19 {
- typedef T1 Head;
- typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20>
-struct Types20 {
- typedef T1 Head;
- typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21>
-struct Types21 {
- typedef T1 Head;
- typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22>
-struct Types22 {
- typedef T1 Head;
- typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23>
-struct Types23 {
- typedef T1 Head;
- typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24>
-struct Types24 {
- typedef T1 Head;
- typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25>
-struct Types25 {
- typedef T1 Head;
- typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26>
-struct Types26 {
- typedef T1 Head;
- typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27>
-struct Types27 {
- typedef T1 Head;
- typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28>
-struct Types28 {
- typedef T1 Head;
- typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29>
-struct Types29 {
- typedef T1 Head;
- typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30>
-struct Types30 {
- typedef T1 Head;
- typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31>
-struct Types31 {
- typedef T1 Head;
- typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32>
-struct Types32 {
- typedef T1 Head;
- typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33>
-struct Types33 {
- typedef T1 Head;
- typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34>
-struct Types34 {
- typedef T1 Head;
- typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35>
-struct Types35 {
- typedef T1 Head;
- typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36>
-struct Types36 {
- typedef T1 Head;
- typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37>
-struct Types37 {
- typedef T1 Head;
- typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38>
-struct Types38 {
- typedef T1 Head;
- typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39>
-struct Types39 {
- typedef T1 Head;
- typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40>
-struct Types40 {
- typedef T1 Head;
- typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41>
-struct Types41 {
- typedef T1 Head;
- typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42>
-struct Types42 {
- typedef T1 Head;
- typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43>
-struct Types43 {
- typedef T1 Head;
- typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44>
-struct Types44 {
- typedef T1 Head;
- typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45>
-struct Types45 {
- typedef T1 Head;
- typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46>
-struct Types46 {
- typedef T1 Head;
- typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47>
-struct Types47 {
- typedef T1 Head;
- typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48>
-struct Types48 {
- typedef T1 Head;
- typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49>
-struct Types49 {
- typedef T1 Head;
- typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48, T49> Tail;
-};
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49, typename T50>
-struct Types50 {
- typedef T1 Head;
- typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48, T49, T50> Tail;
-};
-
-
-} // namespace internal
-
-// We don't want to require the users to write TypesN<...> directly,
-// as that would require them to count the length. Types<...> is much
-// easier to write, but generates horrible messages when there is a
-// compiler error, as gcc insists on printing out each template
-// argument, even if it has the default value (this means Types<int>
-// will appear as Types<int, None, None, ..., None> in the compiler
-// errors).
-//
-// Our solution is to combine the best part of the two approaches: a
-// user would write Types<T1, ..., TN>, and Google Test will translate
-// that to TypesN<T1, ..., TN> internally to make error messages
-// readable. The translation is done by the 'type' member of the
-// Types template.
-template <typename T1 = internal::None, typename T2 = internal::None,
- typename T3 = internal::None, typename T4 = internal::None,
- typename T5 = internal::None, typename T6 = internal::None,
- typename T7 = internal::None, typename T8 = internal::None,
- typename T9 = internal::None, typename T10 = internal::None,
- typename T11 = internal::None, typename T12 = internal::None,
- typename T13 = internal::None, typename T14 = internal::None,
- typename T15 = internal::None, typename T16 = internal::None,
- typename T17 = internal::None, typename T18 = internal::None,
- typename T19 = internal::None, typename T20 = internal::None,
- typename T21 = internal::None, typename T22 = internal::None,
- typename T23 = internal::None, typename T24 = internal::None,
- typename T25 = internal::None, typename T26 = internal::None,
- typename T27 = internal::None, typename T28 = internal::None,
- typename T29 = internal::None, typename T30 = internal::None,
- typename T31 = internal::None, typename T32 = internal::None,
- typename T33 = internal::None, typename T34 = internal::None,
- typename T35 = internal::None, typename T36 = internal::None,
- typename T37 = internal::None, typename T38 = internal::None,
- typename T39 = internal::None, typename T40 = internal::None,
- typename T41 = internal::None, typename T42 = internal::None,
- typename T43 = internal::None, typename T44 = internal::None,
- typename T45 = internal::None, typename T46 = internal::None,
- typename T47 = internal::None, typename T48 = internal::None,
- typename T49 = internal::None, typename T50 = internal::None>
-struct Types {
- typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
-};
-
-template <>
-struct Types<internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types0 type;
-};
-template <typename T1>
-struct Types<T1, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types1<T1> type;
-};
-template <typename T1, typename T2>
-struct Types<T1, T2, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types2<T1, T2> type;
-};
-template <typename T1, typename T2, typename T3>
-struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types3<T1, T2, T3> type;
-};
-template <typename T1, typename T2, typename T3, typename T4>
-struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types4<T1, T2, T3, T4> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5>
-struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types5<T1, T2, T3, T4, T5> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6>
-struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7>
-struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
- T12> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
- T26> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
- T40> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None, internal::None> {
- typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- internal::None, internal::None, internal::None, internal::None,
- internal::None, internal::None> {
- typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
- internal::None, internal::None, internal::None, internal::None,
- internal::None> {
- typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
- T46, internal::None, internal::None, internal::None, internal::None> {
- typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45, T46> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
- T46, T47, internal::None, internal::None, internal::None> {
- typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45, T46, T47> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
- T46, T47, T48, internal::None, internal::None> {
- typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45, T46, T47, T48> type;
-};
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49>
-struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
- T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
- T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
- T46, T47, T48, T49, internal::None> {
- typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
-};
-
-namespace internal {
-
-# define GTEST_TEMPLATE_ template <typename T> class
-
-// The template "selector" struct TemplateSel<Tmpl> is used to
-// represent Tmpl, which must be a class template with one type
-// parameter, as a type. TemplateSel<Tmpl>::Bind<T>::type is defined
-// as the type Tmpl<T>. This allows us to actually instantiate the
-// template "selected" by TemplateSel<Tmpl>.
-//
-// This trick is necessary for simulating typedef for class templates,
-// which C++ doesn't support directly.
-template <GTEST_TEMPLATE_ Tmpl>
-struct TemplateSel {
- template <typename T>
- struct Bind {
- typedef Tmpl<T> type;
- };
-};
-
-# define GTEST_BIND_(TmplSel, T) \
- TmplSel::template Bind<T>::type
-
-// A unique struct template used as the default value for the
-// arguments of class template Templates. This allows us to simulate
-// variadic templates (e.g. Templates<int>, Templates<int, double>,
-// and etc), which C++ doesn't support directly.
-template <typename T>
-struct NoneT {};
-
-// The following family of struct and struct templates are used to
-// represent template lists. In particular, TemplatesN<T1, T2, ...,
-// TN> represents a list of N templates (T1, T2, ..., and TN). Except
-// for Templates0, every struct in the family has two member types:
-// Head for the selector of the first template in the list, and Tail
-// for the rest of the list.
-
-// The empty template list.
-struct Templates0 {};
-
-// Template lists of length 1, 2, 3, and so on.
-
-template <GTEST_TEMPLATE_ T1>
-struct Templates1 {
- typedef TemplateSel<T1> Head;
- typedef Templates0 Tail;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
-struct Templates2 {
- typedef TemplateSel<T1> Head;
- typedef Templates1<T2> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
-struct Templates3 {
- typedef TemplateSel<T1> Head;
- typedef Templates2<T2, T3> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4>
-struct Templates4 {
- typedef TemplateSel<T1> Head;
- typedef Templates3<T2, T3, T4> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
-struct Templates5 {
- typedef TemplateSel<T1> Head;
- typedef Templates4<T2, T3, T4, T5> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
-struct Templates6 {
- typedef TemplateSel<T1> Head;
- typedef Templates5<T2, T3, T4, T5, T6> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7>
-struct Templates7 {
- typedef TemplateSel<T1> Head;
- typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
-struct Templates8 {
- typedef TemplateSel<T1> Head;
- typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
-struct Templates9 {
- typedef TemplateSel<T1> Head;
- typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10>
-struct Templates10 {
- typedef TemplateSel<T1> Head;
- typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
-struct Templates11 {
- typedef TemplateSel<T1> Head;
- typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
-struct Templates12 {
- typedef TemplateSel<T1> Head;
- typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13>
-struct Templates13 {
- typedef TemplateSel<T1> Head;
- typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
-struct Templates14 {
- typedef TemplateSel<T1> Head;
- typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
-struct Templates15 {
- typedef TemplateSel<T1> Head;
- typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16>
-struct Templates16 {
- typedef TemplateSel<T1> Head;
- typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
-struct Templates17 {
- typedef TemplateSel<T1> Head;
- typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
-struct Templates18 {
- typedef TemplateSel<T1> Head;
- typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19>
-struct Templates19 {
- typedef TemplateSel<T1> Head;
- typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
-struct Templates20 {
- typedef TemplateSel<T1> Head;
- typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
-struct Templates21 {
- typedef TemplateSel<T1> Head;
- typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22>
-struct Templates22 {
- typedef TemplateSel<T1> Head;
- typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
-struct Templates23 {
- typedef TemplateSel<T1> Head;
- typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
-struct Templates24 {
- typedef TemplateSel<T1> Head;
- typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25>
-struct Templates25 {
- typedef TemplateSel<T1> Head;
- typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
-struct Templates26 {
- typedef TemplateSel<T1> Head;
- typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
-struct Templates27 {
- typedef TemplateSel<T1> Head;
- typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28>
-struct Templates28 {
- typedef TemplateSel<T1> Head;
- typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
-struct Templates29 {
- typedef TemplateSel<T1> Head;
- typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
-struct Templates30 {
- typedef TemplateSel<T1> Head;
- typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31>
-struct Templates31 {
- typedef TemplateSel<T1> Head;
- typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
-struct Templates32 {
- typedef TemplateSel<T1> Head;
- typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
-struct Templates33 {
- typedef TemplateSel<T1> Head;
- typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34>
-struct Templates34 {
- typedef TemplateSel<T1> Head;
- typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
-struct Templates35 {
- typedef TemplateSel<T1> Head;
- typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
-struct Templates36 {
- typedef TemplateSel<T1> Head;
- typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37>
-struct Templates37 {
- typedef TemplateSel<T1> Head;
- typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
-struct Templates38 {
- typedef TemplateSel<T1> Head;
- typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
-struct Templates39 {
- typedef TemplateSel<T1> Head;
- typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40>
-struct Templates40 {
- typedef TemplateSel<T1> Head;
- typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
-struct Templates41 {
- typedef TemplateSel<T1> Head;
- typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
-struct Templates42 {
- typedef TemplateSel<T1> Head;
- typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43>
-struct Templates43 {
- typedef TemplateSel<T1> Head;
- typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
-struct Templates44 {
- typedef TemplateSel<T1> Head;
- typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
-struct Templates45 {
- typedef TemplateSel<T1> Head;
- typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44, T45> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46>
-struct Templates46 {
- typedef TemplateSel<T1> Head;
- typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44, T45, T46> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
-struct Templates47 {
- typedef TemplateSel<T1> Head;
- typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44, T45, T46, T47> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
-struct Templates48 {
- typedef TemplateSel<T1> Head;
- typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44, T45, T46, T47, T48> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
- GTEST_TEMPLATE_ T49>
-struct Templates49 {
- typedef TemplateSel<T1> Head;
- typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44, T45, T46, T47, T48, T49> Tail;
-};
-
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
- GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
-struct Templates50 {
- typedef TemplateSel<T1> Head;
- typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
- T43, T44, T45, T46, T47, T48, T49, T50> Tail;
-};
-
-
-// We don't want to require the users to write TemplatesN<...> directly,
-// as that would require them to count the length. Templates<...> is much
-// easier to write, but generates horrible messages when there is a
-// compiler error, as gcc insists on printing out each template
-// argument, even if it has the default value (this means Templates<list>
-// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
-// errors).
-//
-// Our solution is to combine the best part of the two approaches: a
-// user would write Templates<T1, ..., TN>, and Google Test will translate
-// that to TemplatesN<T1, ..., TN> internally to make error messages
-// readable. The translation is done by the 'type' member of the
-// Templates template.
-template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
- GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
- GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
- GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
- GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
- GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
- GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
- GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
- GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
- GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
- GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
- GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
- GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
- GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
- GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
- GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
- GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
- GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
- GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
- GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
- GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
- GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
- GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
- GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
- GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
-struct Templates {
- typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
-};
-
-template <>
-struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT> {
- typedef Templates0 type;
-};
-template <GTEST_TEMPLATE_ T1>
-struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT> {
- typedef Templates1<T1> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
-struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT> {
- typedef Templates2<T1, T2> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
-struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates3<T1, T2, T3> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4>
-struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates4<T1, T2, T3, T4> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
-struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates5<T1, T2, T3, T4, T5> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
-struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates6<T1, T2, T3, T4, T5, T6> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT> {
- typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT> {
- typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT> {
- typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT> {
- typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT> {
- typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT> {
- typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT> {
- typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT> {
- typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT> {
- typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT> {
- typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT> {
- typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT> {
- typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44, T45> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- T45, T46, NoneT, NoneT, NoneT, NoneT> {
- typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44, T45, T46> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- T45, T46, T47, NoneT, NoneT, NoneT> {
- typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44, T45, T46, T47> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- T45, T46, T47, T48, NoneT, NoneT> {
- typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44, T45, T46, T47, T48> type;
-};
-template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
- GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
- GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
- GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
- GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
- GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
- GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
- GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
- GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
- GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
- GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
- GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
- GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
- GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
- GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
- GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
- GTEST_TEMPLATE_ T49>
-struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
- T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
- T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
- T45, T46, T47, T48, T49, NoneT> {
- typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
- T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
- T42, T43, T44, T45, T46, T47, T48, T49> type;
-};
-
-// The TypeList template makes it possible to use either a single type
-// or a Types<...> list in TYPED_TEST_CASE() and
-// INSTANTIATE_TYPED_TEST_CASE_P().
-
-template <typename T>
-struct TypeList { typedef Types1<T> type; };
-
-template <typename T1, typename T2, typename T3, typename T4, typename T5,
- typename T6, typename T7, typename T8, typename T9, typename T10,
- typename T11, typename T12, typename T13, typename T14, typename T15,
- typename T16, typename T17, typename T18, typename T19, typename T20,
- typename T21, typename T22, typename T23, typename T24, typename T25,
- typename T26, typename T27, typename T28, typename T29, typename T30,
- typename T31, typename T32, typename T33, typename T34, typename T35,
- typename T36, typename T37, typename T38, typename T39, typename T40,
- typename T41, typename T42, typename T43, typename T44, typename T45,
- typename T46, typename T47, typename T48, typename T49, typename T50>
-struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
- T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
- T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
- T44, T45, T46, T47, T48, T49, T50> > {
- typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
- T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
- T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
- T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
-};
-
-#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
diff --git a/unit_tests/gtest/src/gtest-all.cc b/unit_tests/gtest/src/gtest-all.cc
index 0a9cee5..a9a03b2 100644
--- a/unit_tests/gtest/src/gtest-all.cc
+++ b/unit_tests/gtest/src/gtest-all.cc
@@ -39,10 +39,9554 @@
#include "gtest/gtest.h"
// The following lines pull in the real gtest *.cc files.
-#include "src/gtest.cc"
-#include "src/gtest-death-test.cc"
-#include "src/gtest-filepath.cc"
-#include "src/gtest-port.cc"
-#include "src/gtest-printers.cc"
-#include "src/gtest-test-part.cc"
-#include "src/gtest-typed-test.cc"
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Utilities for testing Google Test itself and code that uses Google Test
+// (e.g. frameworks built on top of Google Test).
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+
+namespace testing {
+
+// This helper class can be used to mock out Google Test failure reporting
+// so that we can test Google Test or code that builds on Google Test.
+//
+// An object of this class appends a TestPartResult object to the
+// TestPartResultArray object given in the constructor whenever a Google Test
+// failure is reported. It can either intercept only failures that are
+// generated in the same thread that created this object or it can intercept
+// all generated failures. The scope of this mock object can be controlled with
+// the second argument to the two arguments constructor.
+class GTEST_API_ ScopedFakeTestPartResultReporter
+ : public TestPartResultReporterInterface {
+ public:
+ // The two possible mocking modes of this object.
+ enum InterceptMode {
+ INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures.
+ INTERCEPT_ALL_THREADS // Intercepts all failures.
+ };
+
+ // The c'tor sets this object as the test part result reporter used
+ // by Google Test. The 'result' parameter specifies where to report the
+ // results. This reporter will only catch failures generated in the current
+ // thread. DEPRECATED
+ explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
+
+ // Same as above, but you can choose the interception scope of this object.
+ ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
+ TestPartResultArray* result);
+
+ // The d'tor restores the previous test part result reporter.
+ virtual ~ScopedFakeTestPartResultReporter();
+
+ // Appends the TestPartResult object to the TestPartResultArray
+ // received in the constructor.
+ //
+ // This method is from the TestPartResultReporterInterface
+ // interface.
+ virtual void ReportTestPartResult(const TestPartResult& result);
+ private:
+ void Init();
+
+ const InterceptMode intercept_mode_;
+ TestPartResultReporterInterface* old_reporter_;
+ TestPartResultArray* const result_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
+};
+
+namespace internal {
+
+// A helper class for implementing EXPECT_FATAL_FAILURE() and
+// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring. If that's not the case, a
+// non-fatal failure will be generated.
+class GTEST_API_ SingleFailureChecker {
+ public:
+ // The constructor remembers the arguments.
+ SingleFailureChecker(const TestPartResultArray* results,
+ TestPartResult::Type type,
+ const string& substr);
+ ~SingleFailureChecker();
+ private:
+ const TestPartResultArray* const results_;
+ const TestPartResult::Type type_;
+ const string substr_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
+};
+
+} // namespace internal
+
+} // namespace testing
+
+// A set of macros for testing Google Test assertions or code that's expected
+// to generate Google Test fatal failures. It verifies that the given
+// statement will cause exactly one fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+// - 'statement' cannot reference local non-static variables or
+// non-static members of the current object.
+// - 'statement' cannot return a value.
+// - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works. The AcceptsMacroThatExpandsToUnprotectedComma test in
+// gtest_unittest.cc will fail to compile if we do that.
+#define EXPECT_FATAL_FAILURE(statement, substr) \
+ do { \
+ class GTestExpectFatalFailureHelper {\
+ public:\
+ static void Execute() { statement; }\
+ };\
+ ::testing::TestPartResultArray gtest_failures;\
+ ::testing::internal::SingleFailureChecker gtest_checker(\
+ >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+ {\
+ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+ ::testing::ScopedFakeTestPartResultReporter:: \
+ INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
+ GTestExpectFatalFailureHelper::Execute();\
+ }\
+ } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+ do { \
+ class GTestExpectFatalFailureHelper {\
+ public:\
+ static void Execute() { statement; }\
+ };\
+ ::testing::TestPartResultArray gtest_failures;\
+ ::testing::internal::SingleFailureChecker gtest_checker(\
+ >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+ {\
+ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+ ::testing::ScopedFakeTestPartResultReporter:: \
+ INTERCEPT_ALL_THREADS, >est_failures);\
+ GTestExpectFatalFailureHelper::Execute();\
+ }\
+ } while (::testing::internal::AlwaysFalse())
+
+// A macro for testing Google Test assertions or code that's expected to
+// generate Google Test non-fatal failures. It asserts that the given
+// statement will cause exactly one non-fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// 'statement' is allowed to reference local variables and members of
+// the current object.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+// - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works. If we do that, the code won't compile when the user gives
+// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
+// expands to code containing an unprotected comma. The
+// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
+// catches that.
+//
+// For the same reason, we have to write
+// if (::testing::internal::AlwaysTrue()) { statement; }
+// instead of
+// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+// to avoid an MSVC warning on unreachable code.
+#define EXPECT_NONFATAL_FAILURE(statement, substr) \
+ do {\
+ ::testing::TestPartResultArray gtest_failures;\
+ ::testing::internal::SingleFailureChecker gtest_checker(\
+ >est_failures, ::testing::TestPartResult::kNonFatalFailure, \
+ (substr));\
+ {\
+ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+ ::testing::ScopedFakeTestPartResultReporter:: \
+ INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\
+ if (::testing::internal::AlwaysTrue()) { statement; }\
+ }\
+ } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+ do {\
+ ::testing::TestPartResultArray gtest_failures;\
+ ::testing::internal::SingleFailureChecker gtest_checker(\
+ >est_failures, ::testing::TestPartResult::kNonFatalFailure, \
+ (substr));\
+ {\
+ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+ ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
+ >est_failures);\
+ if (::testing::internal::AlwaysTrue()) { statement; }\
+ }\
+ } while (::testing::internal::AlwaysFalse())
+
+#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include <algorithm>
+#include <iomanip>
+#include <limits>
+#include <ostream> // NOLINT
+#include <sstream>
+#include <vector>
+
+#if GTEST_OS_LINUX
+
+// TODO(kenton at google.com): Use autoconf to detect availability of
+// gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+# include <fcntl.h> // NOLINT
+# include <limits.h> // NOLINT
+# include <sched.h> // NOLINT
+// Declares vsnprintf(). This header is not available on Windows.
+# include <strings.h> // NOLINT
+# include <sys/mman.h> // NOLINT
+# include <sys/time.h> // NOLINT
+# include <unistd.h> // NOLINT
+# include <string>
+
+#elif GTEST_OS_SYMBIAN
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h> // NOLINT
+
+#elif GTEST_OS_ZOS
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h> // NOLINT
+
+// On z/OS we additionally need strings.h for strcasecmp.
+# include <strings.h> // NOLINT
+
+#elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE.
+
+# include <windows.h> // NOLINT
+
+#elif GTEST_OS_WINDOWS // We are on Windows proper.
+
+# include <io.h> // NOLINT
+# include <sys/timeb.h> // NOLINT
+# include <sys/types.h> // NOLINT
+# include <sys/stat.h> // NOLINT
+
+# if GTEST_OS_WINDOWS_MINGW
+// MinGW has gettimeofday() but not _ftime64().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+// gettimeofday().
+// TODO(kenton at google.com): There are other ways to get the time on
+// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW
+// supports these. consider using them instead.
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h> // NOLINT
+# endif // GTEST_OS_WINDOWS_MINGW
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <windows.h> // NOLINT
+
+#else
+
+// Assume other platforms have gettimeofday().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+// gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <sys/time.h> // NOLINT
+# include <unistd.h> // NOLINT
+
+#endif // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h> // NOLINT
+# include <netdb.h> // NOLINT
+#endif
+
+// Indicates that this translation unit is part of Google Test's
+// implementation. It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error. This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Utility functions and classes used by the Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This file contains purely Google Test's internal implementation. Please
+// DO NOT #INCLUDE IT IN A USER PROGRAM.
+
+#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
+#define GTEST_SRC_GTEST_INTERNAL_INL_H_
+
+// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
+// part of Google Test's implementation; otherwise it's undefined.
+#if !GTEST_IMPLEMENTATION_
+// A user is trying to include this from his code - just say no.
+# error "gtest-internal-inl.h is part of Google Test's internal implementation."
+# error "It must not be included except by Google Test itself."
+#endif // GTEST_IMPLEMENTATION_
+
+#ifndef _WIN32_WCE
+# include <errno.h>
+#endif // !_WIN32_WCE
+#include <stddef.h>
+#include <stdlib.h> // For strtoll/_strtoul64/malloc/free.
+#include <string.h> // For memmove.
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h> // NOLINT
+# include <netdb.h> // NOLINT
+#endif
+
+#if GTEST_OS_WINDOWS
+# include <windows.h> // NOLINT
+#endif // GTEST_OS_WINDOWS
+
+
+namespace testing {
+
+// Declares the flags.
+//
+// We don't want the users to modify this flag in the code, but want
+// Google Test's own unit tests to be able to access it. Therefore we
+// declare it here as opposed to in gtest.h.
+GTEST_DECLARE_bool_(death_test_use_fork);
+
+namespace internal {
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library. This is solely for testing GetTestTypeId().
+GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
+const char kBreakOnFailureFlag[] = "break_on_failure";
+const char kCatchExceptionsFlag[] = "catch_exceptions";
+const char kColorFlag[] = "color";
+const char kFilterFlag[] = "filter";
+const char kListTestsFlag[] = "list_tests";
+const char kOutputFlag[] = "output";
+const char kPrintTimeFlag[] = "print_time";
+const char kRandomSeedFlag[] = "random_seed";
+const char kRepeatFlag[] = "repeat";
+const char kShuffleFlag[] = "shuffle";
+const char kStackTraceDepthFlag[] = "stack_trace_depth";
+const char kStreamResultToFlag[] = "stream_result_to";
+const char kThrowOnFailureFlag[] = "throw_on_failure";
+
+// A valid random seed must be in [1, kMaxRandomSeed].
+const int kMaxRandomSeed = 99999;
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+GTEST_API_ extern bool g_help_flag;
+
+// Returns the current time in milliseconds.
+GTEST_API_ TimeInMillis GetTimeInMillis();
+
+// Returns true iff Google Test should use colors in the output.
+GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
+
+// Formats the given time in milliseconds as seconds.
+GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
+
+// Converts the given time in milliseconds to a date string in the ISO 8601
+// format, without the timezone information. N.B.: due to the use the
+// non-reentrant localtime() function, this function is not thread safe. Do
+// not use it in any code that can be called from multiple threads.
+GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
+
+// Parses a string for an Int32 flag, in the form of "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true. On failure, returns false without changing *value.
+GTEST_API_ bool ParseInt32Flag(
+ const char* str, const char* flag, Int32* value);
+
+// Returns a random seed in range [1, kMaxRandomSeed] based on the
+// given --gtest_random_seed flag value.
+inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
+ const unsigned int raw_seed = (random_seed_flag == 0) ?
+ static_cast<unsigned int>(GetTimeInMillis()) :
+ static_cast<unsigned int>(random_seed_flag);
+
+ // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
+ // it's easy to type.
+ const int normalized_seed =
+ static_cast<int>((raw_seed - 1U) %
+ static_cast<unsigned int>(kMaxRandomSeed)) + 1;
+ return normalized_seed;
+}
+
+// Returns the first valid random seed after 'seed'. The behavior is
+// undefined if 'seed' is invalid. The seed after kMaxRandomSeed is
+// considered to be 1.
+inline int GetNextRandomSeed(int seed) {
+ GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
+ << "Invalid random seed " << seed << " - must be in [1, "
+ << kMaxRandomSeed << "].";
+ const int next_seed = seed + 1;
+ return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
+}
+
+// This class saves the values of all Google Test flags in its c'tor, and
+// restores them in its d'tor.
+class GTestFlagSaver {
+ public:
+ // The c'tor.
+ GTestFlagSaver() {
+ also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
+ break_on_failure_ = GTEST_FLAG(break_on_failure);
+ catch_exceptions_ = GTEST_FLAG(catch_exceptions);
+ color_ = GTEST_FLAG(color);
+ death_test_style_ = GTEST_FLAG(death_test_style);
+ death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
+ filter_ = GTEST_FLAG(filter);
+ internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
+ list_tests_ = GTEST_FLAG(list_tests);
+ output_ = GTEST_FLAG(output);
+ print_time_ = GTEST_FLAG(print_time);
+ random_seed_ = GTEST_FLAG(random_seed);
+ repeat_ = GTEST_FLAG(repeat);
+ shuffle_ = GTEST_FLAG(shuffle);
+ stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
+ stream_result_to_ = GTEST_FLAG(stream_result_to);
+ throw_on_failure_ = GTEST_FLAG(throw_on_failure);
+ }
+
+ // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS.
+ ~GTestFlagSaver() {
+ GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
+ GTEST_FLAG(break_on_failure) = break_on_failure_;
+ GTEST_FLAG(catch_exceptions) = catch_exceptions_;
+ GTEST_FLAG(color) = color_;
+ GTEST_FLAG(death_test_style) = death_test_style_;
+ GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
+ GTEST_FLAG(filter) = filter_;
+ GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
+ GTEST_FLAG(list_tests) = list_tests_;
+ GTEST_FLAG(output) = output_;
+ GTEST_FLAG(print_time) = print_time_;
+ GTEST_FLAG(random_seed) = random_seed_;
+ GTEST_FLAG(repeat) = repeat_;
+ GTEST_FLAG(shuffle) = shuffle_;
+ GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
+ GTEST_FLAG(stream_result_to) = stream_result_to_;
+ GTEST_FLAG(throw_on_failure) = throw_on_failure_;
+ }
+
+ private:
+ // Fields for saving the original values of flags.
+ bool also_run_disabled_tests_;
+ bool break_on_failure_;
+ bool catch_exceptions_;
+ std::string color_;
+ std::string death_test_style_;
+ bool death_test_use_fork_;
+ std::string filter_;
+ std::string internal_run_death_test_;
+ bool list_tests_;
+ std::string output_;
+ bool print_time_;
+ internal::Int32 random_seed_;
+ internal::Int32 repeat_;
+ bool shuffle_;
+ internal::Int32 stack_trace_depth_;
+ std::string stream_result_to_;
+ bool throw_on_failure_;
+} GTEST_ATTRIBUTE_UNUSED_;
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+// UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded();
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (e.g., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+GTEST_API_ bool ShouldShard(const char* total_shards_str,
+ const char* shard_index_str,
+ bool in_subprocess_for_death_test);
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error and
+// and aborts.
+GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+GTEST_API_ bool ShouldRunTestOnShard(
+ int total_shards, int shard_index, int test_id);
+
+// STL container utilities.
+
+// Returns the number of elements in the given container that satisfy
+// the given predicate.
+template <class Container, typename Predicate>
+inline int CountIf(const Container& c, Predicate predicate) {
+ // Implemented as an explicit loop since std::count_if() in libCstd on
+ // Solaris has a non-standard signature.
+ int count = 0;
+ for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
+ if (predicate(*it))
+ ++count;
+ }
+ return count;
+}
+
+// Applies a function/functor to each element in the container.
+template <class Container, typename Functor>
+void ForEach(const Container& c, Functor functor) {
+ std::for_each(c.begin(), c.end(), functor);
+}
+
+// Returns the i-th element of the vector, or default_value if i is not
+// in range [0, v.size()).
+template <typename E>
+inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
+ return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
+}
+
+// Performs an in-place shuffle of a range of the vector's elements.
+// 'begin' and 'end' are element indices as an STL-style range;
+// i.e. [begin, end) are shuffled, where 'end' == size() means to
+// shuffle to the end of the vector.
+template <typename E>
+void ShuffleRange(internal::Random* random, int begin, int end,
+ std::vector<E>* v) {
+ const int size = static_cast<int>(v->size());
+ GTEST_CHECK_(0 <= begin && begin <= size)
+ << "Invalid shuffle range start " << begin << ": must be in range [0, "
+ << size << "].";
+ GTEST_CHECK_(begin <= end && end <= size)
+ << "Invalid shuffle range finish " << end << ": must be in range ["
+ << begin << ", " << size << "].";
+
+ // Fisher-Yates shuffle, from
+ // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
+ for (int range_width = end - begin; range_width >= 2; range_width--) {
+ const int last_in_range = begin + range_width - 1;
+ const int selected = begin + random->Generate(range_width);
+ std::swap((*v)[selected], (*v)[last_in_range]);
+ }
+}
+
+// Performs an in-place shuffle of the vector's elements.
+template <typename E>
+inline void Shuffle(internal::Random* random, std::vector<E>* v) {
+ ShuffleRange(random, 0, static_cast<int>(v->size()), v);
+}
+
+// A function for deleting an object. Handy for being used as a
+// functor.
+template <typename T>
+static void Delete(T* x) {
+ delete x;
+}
+
+// A predicate that checks the key of a TestProperty against a known key.
+//
+// TestPropertyKeyIs is copyable.
+class TestPropertyKeyIs {
+ public:
+ // Constructor.
+ //
+ // TestPropertyKeyIs has NO default constructor.
+ explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
+
+ // Returns true iff the test name of test property matches on key_.
+ bool operator()(const TestProperty& test_property) const {
+ return test_property.key() == key_;
+ }
+
+ private:
+ std::string key_;
+};
+
+// Class UnitTestOptions.
+//
+// This class contains functions for processing options the user
+// specifies when running the tests. It has only static members.
+//
+// In most cases, the user can specify an option using either an
+// environment variable or a command line flag. E.g. you can set the
+// test filter using either GTEST_FILTER or --gtest_filter. If both
+// the variable and the flag are present, the latter overrides the
+// former.
+class GTEST_API_ UnitTestOptions {
+ public:
+ // Functions for processing the gtest_output flag.
+
+ // Returns the output format, or "" for normal printed output.
+ static std::string GetOutputFormat();
+
+ // Returns the absolute path of the requested output file, or the
+ // default (test_detail.xml in the original working directory) if
+ // none was explicitly specified.
+ static std::string GetAbsolutePathToOutputFile();
+
+ // Functions for processing the gtest_filter flag.
+
+ // Returns true iff the wildcard pattern matches the string. The
+ // first ':' or '\0' character in pattern marks the end of it.
+ //
+ // This recursive algorithm isn't very efficient, but is clear and
+ // works well enough for matching test names, which are short.
+ static bool PatternMatchesString(const char *pattern, const char *str);
+
+ // Returns true iff the user-specified filter matches the test case
+ // name and the test name.
+ static bool FilterMatchesTest(const std::string &test_case_name,
+ const std::string &test_name);
+
+#if GTEST_OS_WINDOWS
+ // Function for supporting the gtest_catch_exception flag.
+
+ // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+ // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+ // This function is useful as an __except condition.
+ static int GTestShouldProcessSEH(DWORD exception_code);
+#endif // GTEST_OS_WINDOWS
+
+ // Returns true if "name" matches the ':' separated list of glob-style
+ // filters in "filter".
+ static bool MatchesFilter(const std::string& name, const char* filter);
+};
+
+// Returns the current application's name, removing directory path if that
+// is present. Used by UnitTestOptions::GetOutputFile.
+GTEST_API_ FilePath GetCurrentExecutableName();
+
+// The role interface for getting the OS stack trace as a string.
+class OsStackTraceGetterInterface {
+ public:
+ OsStackTraceGetterInterface() {}
+ virtual ~OsStackTraceGetterInterface() {}
+
+ // Returns the current OS stack trace as an std::string. Parameters:
+ //
+ // max_depth - the maximum number of stack frames to be included
+ // in the trace.
+ // skip_count - the number of top frames to be skipped; doesn't count
+ // against max_depth.
+ virtual string CurrentStackTrace(int max_depth, int skip_count) = 0;
+
+ // UponLeavingGTest() should be called immediately before Google Test calls
+ // user code. It saves some information about the current stack that
+ // CurrentStackTrace() will use to find and hide Google Test stack frames.
+ virtual void UponLeavingGTest() = 0;
+
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
+};
+
+// A working implementation of the OsStackTraceGetterInterface interface.
+class OsStackTraceGetter : public OsStackTraceGetterInterface {
+ public:
+ OsStackTraceGetter() : caller_frame_(NULL) {}
+
+ virtual string CurrentStackTrace(int max_depth, int skip_count)
+ GTEST_LOCK_EXCLUDED_(mutex_);
+
+ virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_);
+
+ // This string is inserted in place of stack frames that are part of
+ // Google Test's implementation.
+ static const char* const kElidedFramesMarker;
+
+ private:
+ Mutex mutex_; // protects all internal state
+
+ // We save the stack frame below the frame that calls user code.
+ // We do this because the address of the frame immediately below
+ // the user code changes between the call to UponLeavingGTest()
+ // and any calls to CurrentStackTrace() from within the user code.
+ void* caller_frame_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
+};
+
+// Information about a Google Test trace point.
+struct TraceInfo {
+ const char* file;
+ int line;
+ std::string message;
+};
+
+// This is the default global test part result reporter used in UnitTestImpl.
+// This class should only be used by UnitTestImpl.
+class DefaultGlobalTestPartResultReporter
+ : public TestPartResultReporterInterface {
+ public:
+ explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
+ // Implements the TestPartResultReporterInterface. Reports the test part
+ // result in the current test.
+ virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+ UnitTestImpl* const unit_test_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
+};
+
+// This is the default per thread test part result reporter used in
+// UnitTestImpl. This class should only be used by UnitTestImpl.
+class DefaultPerThreadTestPartResultReporter
+ : public TestPartResultReporterInterface {
+ public:
+ explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
+ // Implements the TestPartResultReporterInterface. The implementation just
+ // delegates to the current global test part result reporter of *unit_test_.
+ virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+ UnitTestImpl* const unit_test_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
+};
+
+// The private implementation of the UnitTest class. We don't protect
+// the methods under a mutex, as this class is not accessible by a
+// user and the UnitTest class that delegates work to this class does
+// proper locking.
+class GTEST_API_ UnitTestImpl {
+ public:
+ explicit UnitTestImpl(UnitTest* parent);
+ virtual ~UnitTestImpl();
+
+ // There are two different ways to register your own TestPartResultReporter.
+ // You can register your own repoter to listen either only for test results
+ // from the current thread or for results from all threads.
+ // By default, each per-thread test result repoter just passes a new
+ // TestPartResult to the global test result reporter, which registers the
+ // test part result for the currently running test.
+
+ // Returns the global test part result reporter.
+ TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
+
+ // Sets the global test part result reporter.
+ void SetGlobalTestPartResultReporter(
+ TestPartResultReporterInterface* reporter);
+
+ // Returns the test part result reporter for the current thread.
+ TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
+
+ // Sets the test part result reporter for the current thread.
+ void SetTestPartResultReporterForCurrentThread(
+ TestPartResultReporterInterface* reporter);
+
+ // Gets the number of successful test cases.
+ int successful_test_case_count() const;
+
+ // Gets the number of failed test cases.
+ int failed_test_case_count() const;
+
+ // Gets the number of all test cases.
+ int total_test_case_count() const;
+
+ // Gets the number of all test cases that contain at least one test
+ // that should run.
+ int test_case_to_run_count() const;
+
+ // Gets the number of successful tests.
+ int successful_test_count() const;
+
+ // Gets the number of failed tests.
+ int failed_test_count() const;
+
+ // Gets the number of disabled tests that will be reported in the XML report.
+ int reportable_disabled_test_count() const;
+
+ // Gets the number of disabled tests.
+ int disabled_test_count() const;
+
+ // Gets the number of tests to be printed in the XML report.
+ int reportable_test_count() const;
+
+ // Gets the number of all tests.
+ int total_test_count() const;
+
+ // Gets the number of tests that should run.
+ int test_to_run_count() const;
+
+ // Gets the time of the test program start, in ms from the start of the
+ // UNIX epoch.
+ TimeInMillis start_timestamp() const { return start_timestamp_; }
+
+ // Gets the elapsed time, in milliseconds.
+ TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+ // Returns true iff the unit test passed (i.e. all test cases passed).
+ bool Passed() const { return !Failed(); }
+
+ // Returns true iff the unit test failed (i.e. some test case failed
+ // or something outside of all tests failed).
+ bool Failed() const {
+ return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
+ }
+
+ // Gets the i-th test case among all the test cases. i can range from 0 to
+ // total_test_case_count() - 1. If i is not in that range, returns NULL.
+ const TestCase* GetTestCase(int i) const {
+ const int index = GetElementOr(test_case_indices_, i, -1);
+ return index < 0 ? NULL : test_cases_[i];
+ }
+
+ // Gets the i-th test case among all the test cases. i can range from 0 to
+ // total_test_case_count() - 1. If i is not in that range, returns NULL.
+ TestCase* GetMutableTestCase(int i) {
+ const int index = GetElementOr(test_case_indices_, i, -1);
+ return index < 0 ? NULL : test_cases_[index];
+ }
+
+ // Provides access to the event listener list.
+ TestEventListeners* listeners() { return &listeners_; }
+
+ // Returns the TestResult for the test that's currently running, or
+ // the TestResult for the ad hoc test if no test is running.
+ TestResult* current_test_result();
+
+ // Returns the TestResult for the ad hoc test.
+ const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
+
+ // Sets the OS stack trace getter.
+ //
+ // Does nothing if the input and the current OS stack trace getter
+ // are the same; otherwise, deletes the old getter and makes the
+ // input the current getter.
+ void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
+
+ // Returns the current OS stack trace getter if it is not NULL;
+ // otherwise, creates an OsStackTraceGetter, makes it the current
+ // getter, and returns it.
+ OsStackTraceGetterInterface* os_stack_trace_getter();
+
+ // Returns the current OS stack trace as an std::string.
+ //
+ // The maximum number of stack frames to be included is specified by
+ // the gtest_stack_trace_depth flag. The skip_count parameter
+ // specifies the number of top frames to be skipped, which doesn't
+ // count against the number of frames to be included.
+ //
+ // For example, if Foo() calls Bar(), which in turn calls
+ // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+ // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+ std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
+
+ // Finds and returns a TestCase with the given name. If one doesn't
+ // exist, creates one and returns it.
+ //
+ // Arguments:
+ //
+ // test_case_name: name of the test case
+ // type_param: the name of the test's type parameter, or NULL if
+ // this is not a typed or a type-parameterized test.
+ // set_up_tc: pointer to the function that sets up the test case
+ // tear_down_tc: pointer to the function that tears down the test case
+ TestCase* GetTestCase(const char* test_case_name,
+ const char* type_param,
+ Test::SetUpTestCaseFunc set_up_tc,
+ Test::TearDownTestCaseFunc tear_down_tc);
+
+ // Adds a TestInfo to the unit test.
+ //
+ // Arguments:
+ //
+ // set_up_tc: pointer to the function that sets up the test case
+ // tear_down_tc: pointer to the function that tears down the test case
+ // test_info: the TestInfo object
+ void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
+ Test::TearDownTestCaseFunc tear_down_tc,
+ TestInfo* test_info) {
+ // In order to support thread-safe death tests, we need to
+ // remember the original working directory when the test program
+ // was first invoked. We cannot do this in RUN_ALL_TESTS(), as
+ // the user may have changed the current directory before calling
+ // RUN_ALL_TESTS(). Therefore we capture the current directory in
+ // AddTestInfo(), which is called to register a TEST or TEST_F
+ // before main() is reached.
+ if (original_working_dir_.IsEmpty()) {
+ original_working_dir_.Set(FilePath::GetCurrentDir());
+ GTEST_CHECK_(!original_working_dir_.IsEmpty())
+ << "Failed to get the current working directory.";
+ }
+
+ GetTestCase(test_info->test_case_name(),
+ test_info->type_param(),
+ set_up_tc,
+ tear_down_tc)->AddTestInfo(test_info);
+ }
+
+#if GTEST_HAS_PARAM_TEST
+ // Returns ParameterizedTestCaseRegistry object used to keep track of
+ // value-parameterized tests and instantiate and register them.
+ internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
+ return parameterized_test_registry_;
+ }
+#endif // GTEST_HAS_PARAM_TEST
+
+ // Sets the TestCase object for the test that's currently running.
+ void set_current_test_case(TestCase* a_current_test_case) {
+ current_test_case_ = a_current_test_case;
+ }
+
+ // Sets the TestInfo object for the test that's currently running. If
+ // current_test_info is NULL, the assertion results will be stored in
+ // ad_hoc_test_result_.
+ void set_current_test_info(TestInfo* a_current_test_info) {
+ current_test_info_ = a_current_test_info;
+ }
+
+ // Registers all parameterized tests defined using TEST_P and
+ // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
+ // combination. This method can be called more then once; it has guards
+ // protecting from registering the tests more then once. If
+ // value-parameterized tests are disabled, RegisterParameterizedTests is
+ // present but does nothing.
+ void RegisterParameterizedTests();
+
+ // Runs all tests in this UnitTest object, prints the result, and
+ // returns true if all tests are successful. If any exception is
+ // thrown during a test, this test is considered to be failed, but
+ // the rest of the tests will still be run.
+ bool RunAllTests();
+
+ // Clears the results of all tests, except the ad hoc tests.
+ void ClearNonAdHocTestResult() {
+ ForEach(test_cases_, TestCase::ClearTestCaseResult);
+ }
+
+ // Clears the results of ad-hoc test assertions.
+ void ClearAdHocTestResult() {
+ ad_hoc_test_result_.Clear();
+ }
+
+ // Adds a TestProperty to the current TestResult object when invoked in a
+ // context of a test or a test case, or to the global property set. If the
+ // result already contains a property with the same key, the value will be
+ // updated.
+ void RecordProperty(const TestProperty& test_property);
+
+ enum ReactionToSharding {
+ HONOR_SHARDING_PROTOCOL,
+ IGNORE_SHARDING_PROTOCOL
+ };
+
+ // Matches the full name of each test against the user-specified
+ // filter to decide whether the test should run, then records the
+ // result in each TestCase and TestInfo object.
+ // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
+ // based on sharding variables in the environment.
+ // Returns the number of tests that should run.
+ int FilterTests(ReactionToSharding shard_tests);
+
+ // Prints the names of the tests matching the user-specified filter flag.
+ void ListTestsMatchingFilter();
+
+ const TestCase* current_test_case() const { return current_test_case_; }
+ TestInfo* current_test_info() { return current_test_info_; }
+ const TestInfo* current_test_info() const { return current_test_info_; }
+
+ // Returns the vector of environments that need to be set-up/torn-down
+ // before/after the tests are run.
+ std::vector<Environment*>& environments() { return environments_; }
+
+ // Getters for the per-thread Google Test trace stack.
+ std::vector<TraceInfo>& gtest_trace_stack() {
+ return *(gtest_trace_stack_.pointer());
+ }
+ const std::vector<TraceInfo>& gtest_trace_stack() const {
+ return gtest_trace_stack_.get();
+ }
+
+#if GTEST_HAS_DEATH_TEST
+ void InitDeathTestSubprocessControlInfo() {
+ internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
+ }
+ // Returns a pointer to the parsed --gtest_internal_run_death_test
+ // flag, or NULL if that flag was not specified.
+ // This information is useful only in a death test child process.
+ // Must not be called before a call to InitGoogleTest.
+ const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
+ return internal_run_death_test_flag_.get();
+ }
+
+ // Returns a pointer to the current death test factory.
+ internal::DeathTestFactory* death_test_factory() {
+ return death_test_factory_.get();
+ }
+
+ void SuppressTestEventsIfInSubprocess();
+
+ friend class ReplaceDeathTestFactory;
+#endif // GTEST_HAS_DEATH_TEST
+
+ // Initializes the event listener performing XML output as specified by
+ // UnitTestOptions. Must not be called before InitGoogleTest.
+ void ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+ // Initializes the event listener for streaming test results to a socket.
+ // Must not be called before InitGoogleTest.
+ void ConfigureStreamingOutput();
+#endif
+
+ // Performs initialization dependent upon flag values obtained in
+ // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to
+ // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest
+ // this function is also called from RunAllTests. Since this function can be
+ // called more than once, it has to be idempotent.
+ void PostFlagParsingInit();
+
+ // Gets the random seed used at the start of the current test iteration.
+ int random_seed() const { return random_seed_; }
+
+ // Gets the random number generator.
+ internal::Random* random() { return &random_; }
+
+ // Shuffles all test cases, and the tests within each test case,
+ // making sure that death tests are still run first.
+ void ShuffleTests();
+
+ // Restores the test cases and tests to their order before the first shuffle.
+ void UnshuffleTests();
+
+ // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
+ // UnitTest::Run() starts.
+ bool catch_exceptions() const { return catch_exceptions_; }
+
+ private:
+ friend class ::testing::UnitTest;
+
+ // Used by UnitTest::Run() to capture the state of
+ // GTEST_FLAG(catch_exceptions) at the moment it starts.
+ void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
+
+ // The UnitTest object that owns this implementation object.
+ UnitTest* const parent_;
+
+ // The working directory when the first TEST() or TEST_F() was
+ // executed.
+ internal::FilePath original_working_dir_;
+
+ // The default test part result reporters.
+ DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
+ DefaultPerThreadTestPartResultReporter
+ default_per_thread_test_part_result_reporter_;
+
+ // Points to (but doesn't own) the global test part result reporter.
+ TestPartResultReporterInterface* global_test_part_result_repoter_;
+
+ // Protects read and write access to global_test_part_result_reporter_.
+ internal::Mutex global_test_part_result_reporter_mutex_;
+
+ // Points to (but doesn't own) the per-thread test part result reporter.
+ internal::ThreadLocal<TestPartResultReporterInterface*>
+ per_thread_test_part_result_reporter_;
+
+ // The vector of environments that need to be set-up/torn-down
+ // before/after the tests are run.
+ std::vector<Environment*> environments_;
+
+ // The vector of TestCases in their original order. It owns the
+ // elements in the vector.
+ std::vector<TestCase*> test_cases_;
+
+ // Provides a level of indirection for the test case list to allow
+ // easy shuffling and restoring the test case order. The i-th
+ // element of this vector is the index of the i-th test case in the
+ // shuffled order.
+ std::vector<int> test_case_indices_;
+
+#if GTEST_HAS_PARAM_TEST
+ // ParameterizedTestRegistry object used to register value-parameterized
+ // tests.
+ internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
+
+ // Indicates whether RegisterParameterizedTests() has been called already.
+ bool parameterized_tests_registered_;
+#endif // GTEST_HAS_PARAM_TEST
+
+ // Index of the last death test case registered. Initially -1.
+ int last_death_test_case_;
+
+ // This points to the TestCase for the currently running test. It
+ // changes as Google Test goes through one test case after another.
+ // When no test is running, this is set to NULL and Google Test
+ // stores assertion results in ad_hoc_test_result_. Initially NULL.
+ TestCase* current_test_case_;
+
+ // This points to the TestInfo for the currently running test. It
+ // changes as Google Test goes through one test after another. When
+ // no test is running, this is set to NULL and Google Test stores
+ // assertion results in ad_hoc_test_result_. Initially NULL.
+ TestInfo* current_test_info_;
+
+ // Normally, a user only writes assertions inside a TEST or TEST_F,
+ // or inside a function called by a TEST or TEST_F. Since Google
+ // Test keeps track of which test is current running, it can
+ // associate such an assertion with the test it belongs to.
+ //
+ // If an assertion is encountered when no TEST or TEST_F is running,
+ // Google Test attributes the assertion result to an imaginary "ad hoc"
+ // test, and records the result in ad_hoc_test_result_.
+ TestResult ad_hoc_test_result_;
+
+ // The list of event listeners that can be used to track events inside
+ // Google Test.
+ TestEventListeners listeners_;
+
+ // The OS stack trace getter. Will be deleted when the UnitTest
+ // object is destructed. By default, an OsStackTraceGetter is used,
+ // but the user can set this field to use a custom getter if that is
+ // desired.
+ OsStackTraceGetterInterface* os_stack_trace_getter_;
+
+ // True iff PostFlagParsingInit() has been called.
+ bool post_flag_parse_init_performed_;
+
+ // The random number seed used at the beginning of the test run.
+ int random_seed_;
+
+ // Our random number generator.
+ internal::Random random_;
+
+ // The time of the test program start, in ms from the start of the
+ // UNIX epoch.
+ TimeInMillis start_timestamp_;
+
+ // How long the test took to run, in milliseconds.
+ TimeInMillis elapsed_time_;
+
+#if GTEST_HAS_DEATH_TEST
+ // The decomposed components of the gtest_internal_run_death_test flag,
+ // parsed when RUN_ALL_TESTS is called.
+ internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
+ internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
+#endif // GTEST_HAS_DEATH_TEST
+
+ // A per-thread stack of traces created by the SCOPED_TRACE() macro.
+ internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
+
+ // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
+ // starts.
+ bool catch_exceptions_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
+}; // class UnitTestImpl
+
+// Convenience function for accessing the global UnitTest
+// implementation object.
+inline UnitTestImpl* GetUnitTestImpl() {
+ return UnitTest::GetInstance()->impl();
+}
+
+#if GTEST_USES_SIMPLE_RE
+
+// Internal helper functions for implementing the simple regular
+// expression matcher.
+GTEST_API_ bool IsInSet(char ch, const char* str);
+GTEST_API_ bool IsAsciiDigit(char ch);
+GTEST_API_ bool IsAsciiPunct(char ch);
+GTEST_API_ bool IsRepeat(char ch);
+GTEST_API_ bool IsAsciiWhiteSpace(char ch);
+GTEST_API_ bool IsAsciiWordChar(char ch);
+GTEST_API_ bool IsValidEscape(char ch);
+GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
+GTEST_API_ bool ValidateRegex(const char* regex);
+GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
+GTEST_API_ bool MatchRepetitionAndRegexAtHead(
+ bool escaped, char ch, char repeat, const char* regex, const char* str);
+GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
+
+#endif // GTEST_USES_SIMPLE_RE
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
+
+#if GTEST_HAS_DEATH_TEST
+
+// Returns the message describing the last system error, regardless of the
+// platform.
+GTEST_API_ std::string GetLastErrnoDescription();
+
+# if GTEST_OS_WINDOWS
+// Provides leak-safe Windows kernel handle ownership.
+class AutoHandle {
+ public:
+ AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
+ explicit AutoHandle(HANDLE handle) : handle_(handle) {}
+
+ ~AutoHandle() { Reset(); }
+
+ HANDLE Get() const { return handle_; }
+ void Reset() { Reset(INVALID_HANDLE_VALUE); }
+ void Reset(HANDLE handle) {
+ if (handle != handle_) {
+ if (handle_ != INVALID_HANDLE_VALUE)
+ ::CloseHandle(handle_);
+ handle_ = handle;
+ }
+ }
+
+ private:
+ HANDLE handle_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
+};
+# endif // GTEST_OS_WINDOWS
+
+// Attempts to parse a string into a positive integer pointed to by the
+// number parameter. Returns true if that is possible.
+// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
+// it here.
+template <typename Integer>
+bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
+ // Fail fast if the given string does not begin with a digit;
+ // this bypasses strtoXXX's "optional leading whitespace and plus
+ // or minus sign" semantics, which are undesirable here.
+ if (str.empty() || !IsDigit(str[0])) {
+ return false;
+ }
+ errno = 0;
+
+ char* end;
+ // BiggestConvertible is the largest integer type that system-provided
+ // string-to-number conversion routines can return.
+
+# if GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+ // MSVC and C++ Builder define __int64 instead of the standard long long.
+ typedef unsigned __int64 BiggestConvertible;
+ const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
+
+# else
+
+ typedef unsigned long long BiggestConvertible; // NOLINT
+ const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
+
+# endif // GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+ const bool parse_success = *end == '\0' && errno == 0;
+
+ // TODO(vladl at google.com): Convert this to compile time assertion when it is
+ // available.
+ GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
+
+ const Integer result = static_cast<Integer>(parsed);
+ if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
+ *number = result;
+ return true;
+ }
+ return false;
+}
+#endif // GTEST_HAS_DEATH_TEST
+
+// TestResult contains some private methods that should be hidden from
+// Google Test user but are required for testing. This class allow our tests
+// to access them.
+//
+// This class is supplied only for the purpose of testing Google Test's own
+// constructs. Do not use it in user tests, either directly or indirectly.
+class TestResultAccessor {
+ public:
+ static void RecordProperty(TestResult* test_result,
+ const std::string& xml_element,
+ const TestProperty& property) {
+ test_result->RecordProperty(xml_element, property);
+ }
+
+ static void ClearTestPartResults(TestResult* test_result) {
+ test_result->ClearTestPartResults();
+ }
+
+ static const std::vector<testing::TestPartResult>& test_part_results(
+ const TestResult& test_result) {
+ return test_result.test_part_results();
+ }
+};
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Streams test results to the given port on the given host machine.
+class StreamingListener : public EmptyTestEventListener {
+ public:
+ // Abstract base class for writing strings to a socket.
+ class AbstractSocketWriter {
+ public:
+ virtual ~AbstractSocketWriter() {}
+
+ // Sends a string to the socket.
+ virtual void Send(const string& message) = 0;
+
+ // Closes the socket.
+ virtual void CloseConnection() {}
+
+ // Sends a string and a newline to the socket.
+ void SendLn(const string& message) {
+ Send(message + "\n");
+ }
+ };
+
+ // Concrete class for actually writing strings to a socket.
+ class SocketWriter : public AbstractSocketWriter {
+ public:
+ SocketWriter(const string& host, const string& port)
+ : sockfd_(-1), host_name_(host), port_num_(port) {
+ MakeConnection();
+ }
+
+ virtual ~SocketWriter() {
+ if (sockfd_ != -1)
+ CloseConnection();
+ }
+
+ // Sends a string to the socket.
+ virtual void Send(const string& message) {
+ GTEST_CHECK_(sockfd_ != -1)
+ << "Send() can be called only when there is a connection.";
+
+ const int len = static_cast<int>(message.length());
+ if (write(sockfd_, message.c_str(), len) != len) {
+ GTEST_LOG_(WARNING)
+ << "stream_result_to: failed to stream to "
+ << host_name_ << ":" << port_num_;
+ }
+ }
+
+ private:
+ // Creates a client socket and connects to the server.
+ void MakeConnection();
+
+ // Closes the socket.
+ void CloseConnection() {
+ GTEST_CHECK_(sockfd_ != -1)
+ << "CloseConnection() can be called only when there is a connection.";
+
+ close(sockfd_);
+ sockfd_ = -1;
+ }
+
+ int sockfd_; // socket file descriptor
+ const string host_name_;
+ const string port_num_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
+ }; // class SocketWriter
+
+ // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
+ static string UrlEncode(const char* str);
+
+ StreamingListener(const string& host, const string& port)
+ : socket_writer_(new SocketWriter(host, port)) { Start(); }
+
+ explicit StreamingListener(AbstractSocketWriter* socket_writer)
+ : socket_writer_(socket_writer) { Start(); }
+
+ void OnTestProgramStart(const UnitTest& /* unit_test */) {
+ SendLn("event=TestProgramStart");
+ }
+
+ void OnTestProgramEnd(const UnitTest& unit_test) {
+ // Note that Google Test current only report elapsed time for each
+ // test iteration, not for the entire test program.
+ SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
+
+ // Notify the streaming server to stop.
+ socket_writer_->CloseConnection();
+ }
+
+ void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
+ SendLn("event=TestIterationStart&iteration=" +
+ StreamableToString(iteration));
+ }
+
+ void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
+ SendLn("event=TestIterationEnd&passed=" +
+ FormatBool(unit_test.Passed()) + "&elapsed_time=" +
+ StreamableToString(unit_test.elapsed_time()) + "ms");
+ }
+
+ void OnTestCaseStart(const TestCase& test_case) {
+ SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
+ }
+
+ void OnTestCaseEnd(const TestCase& test_case) {
+ SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
+ + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())
+ + "ms");
+ }
+
+ void OnTestStart(const TestInfo& test_info) {
+ SendLn(std::string("event=TestStart&name=") + test_info.name());
+ }
+
+ void OnTestEnd(const TestInfo& test_info) {
+ SendLn("event=TestEnd&passed=" +
+ FormatBool((test_info.result())->Passed()) +
+ "&elapsed_time=" +
+ StreamableToString((test_info.result())->elapsed_time()) + "ms");
+ }
+
+ void OnTestPartResult(const TestPartResult& test_part_result) {
+ const char* file_name = test_part_result.file_name();
+ if (file_name == NULL)
+ file_name = "";
+ SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
+ "&line=" + StreamableToString(test_part_result.line_number()) +
+ "&message=" + UrlEncode(test_part_result.message()));
+ }
+
+ private:
+ // Sends the given message and a newline to the socket.
+ void SendLn(const string& message) { socket_writer_->SendLn(message); }
+
+ // Called at the start of streaming to notify the receiver what
+ // protocol we are using.
+ void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
+
+ string FormatBool(bool value) { return value ? "1" : "0"; }
+
+ const scoped_ptr<AbstractSocketWriter> socket_writer_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
+}; // class StreamingListener
+
+#endif // GTEST_CAN_STREAM_RESULTS_
+
+} // namespace internal
+} // namespace testing
+
+#endif // GTEST_SRC_GTEST_INTERNAL_INL_H_
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS
+# define vsnprintf _vsnprintf
+#endif // GTEST_OS_WINDOWS
+
+namespace testing {
+
+using internal::CountIf;
+using internal::ForEach;
+using internal::GetElementOr;
+using internal::Shuffle;
+
+// Constants.
+
+// A test whose test case name or test name matches this filter is
+// disabled and not run.
+static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
+
+// A test case whose name matches this filter is considered a death
+// test case and will be run before test cases whose name doesn't
+// match this filter.
+static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
+
+// A test filter that matches everything.
+static const char kUniversalFilter[] = "*";
+
+// The default output file for XML output.
+static const char kDefaultOutputFile[] = "test_detail.xml";
+
+// The environment variable name for the test shard index.
+static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
+// The environment variable name for the total number of test shards.
+static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
+// The environment variable name for the test shard status file.
+static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
+
+namespace internal {
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+const char kStackTraceMarker[] = "\nStack trace:\n";
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+bool g_help_flag = false;
+
+} // namespace internal
+
+static const char* GetDefaultFilter() {
+ return kUniversalFilter;
+}
+
+GTEST_DEFINE_bool_(
+ also_run_disabled_tests,
+ internal::BoolFromGTestEnv("also_run_disabled_tests", false),
+ "Run disabled tests too, in addition to the tests normally being run.");
+
+GTEST_DEFINE_bool_(
+ break_on_failure,
+ internal::BoolFromGTestEnv("break_on_failure", false),
+ "True iff a failed assertion should be a debugger break-point.");
+
+GTEST_DEFINE_bool_(
+ catch_exceptions,
+ internal::BoolFromGTestEnv("catch_exceptions", true),
+ "True iff " GTEST_NAME_
+ " should catch exceptions and treat them as test failures.");
+
+GTEST_DEFINE_string_(
+ color,
+ internal::StringFromGTestEnv("color", "auto"),
+ "Whether to use colors in the output. Valid values: yes, no, "
+ "and auto. 'auto' means to use colors if the output is "
+ "being sent to a terminal and the TERM environment variable "
+ "is set to a terminal type that supports colors.");
+
+GTEST_DEFINE_string_(
+ filter,
+ internal::StringFromGTestEnv("filter", GetDefaultFilter()),
+ "A colon-separated list of glob (not regex) patterns "
+ "for filtering the tests to run, optionally followed by a "
+ "'-' and a : separated list of negative patterns (tests to "
+ "exclude). A test is run if it matches one of the positive "
+ "patterns and does not match any of the negative patterns.");
+
+GTEST_DEFINE_bool_(list_tests, false,
+ "List all tests without running them.");
+
+GTEST_DEFINE_string_(
+ output,
+ internal::StringFromGTestEnv("output", ""),
+ "A format (currently must be \"xml\"), optionally followed "
+ "by a colon and an output file name or directory. A directory "
+ "is indicated by a trailing pathname separator. "
+ "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
+ "If a directory is specified, output files will be created "
+ "within that directory, with file-names based on the test "
+ "executable's name and, if necessary, made unique by adding "
+ "digits.");
+
+GTEST_DEFINE_bool_(
+ print_time,
+ internal::BoolFromGTestEnv("print_time", true),
+ "True iff " GTEST_NAME_
+ " should display elapsed time in text output.");
+
+GTEST_DEFINE_int32_(
+ random_seed,
+ internal::Int32FromGTestEnv("random_seed", 0),
+ "Random number seed to use when shuffling test orders. Must be in range "
+ "[1, 99999], or 0 to use a seed based on the current time.");
+
+GTEST_DEFINE_int32_(
+ repeat,
+ internal::Int32FromGTestEnv("repeat", 1),
+ "How many times to repeat each test. Specify a negative number "
+ "for repeating forever. Useful for shaking out flaky tests.");
+
+GTEST_DEFINE_bool_(
+ show_internal_stack_frames, false,
+ "True iff " GTEST_NAME_ " should include internal stack frames when "
+ "printing test failure stack traces.");
+
+GTEST_DEFINE_bool_(
+ shuffle,
+ internal::BoolFromGTestEnv("shuffle", false),
+ "True iff " GTEST_NAME_
+ " should randomize tests' order on every run.");
+
+GTEST_DEFINE_int32_(
+ stack_trace_depth,
+ internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
+ "The maximum number of stack frames to print when an "
+ "assertion fails. The valid range is 0 through 100, inclusive.");
+
+GTEST_DEFINE_string_(
+ stream_result_to,
+ internal::StringFromGTestEnv("stream_result_to", ""),
+ "This flag specifies the host name and the port number on which to stream "
+ "test results. Example: \"localhost:555\". The flag is effective only on "
+ "Linux.");
+
+GTEST_DEFINE_bool_(
+ throw_on_failure,
+ internal::BoolFromGTestEnv("throw_on_failure", false),
+ "When this flag is specified, a failed assertion will throw an exception "
+ "if exceptions are enabled or exit the program with a non-zero code "
+ "otherwise.");
+
+namespace internal {
+
+// Generates a random number from [0, range), using a Linear
+// Congruential Generator (LCG). Crashes if 'range' is 0 or greater
+// than kMaxRange.
+UInt32 Random::Generate(UInt32 range) {
+ // These constants are the same as are used in glibc's rand(3).
+ state_ = (1103515245U*state_ + 12345U) % kMaxRange;
+
+ GTEST_CHECK_(range > 0)
+ << "Cannot generate a number in the range [0, 0).";
+ GTEST_CHECK_(range <= kMaxRange)
+ << "Generation of a number in [0, " << range << ") was requested, "
+ << "but this can only generate numbers in [0, " << kMaxRange << ").";
+
+ // Converting via modulus introduces a bit of downward bias, but
+ // it's simple, and a linear congruential generator isn't too good
+ // to begin with.
+ return state_ % range;
+}
+
+// GTestIsInitialized() returns true iff the user has initialized
+// Google Test. Useful for catching the user mistake of not initializing
+// Google Test before calling RUN_ALL_TESTS().
+//
+// A user must call testing::InitGoogleTest() to initialize Google
+// Test. g_init_gtest_count is set to the number of times
+// InitGoogleTest() has been called. We don't protect this variable
+// under a mutex as it is only accessed in the main thread.
+GTEST_API_ int g_init_gtest_count = 0;
+static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
+
+// Iterates over a vector of TestCases, keeping a running sum of the
+// results of calling a given int-returning method on each.
+// Returns the sum.
+static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
+ int (TestCase::*method)() const) {
+ int sum = 0;
+ for (size_t i = 0; i < case_list.size(); i++) {
+ sum += (case_list[i]->*method)();
+ }
+ return sum;
+}
+
+// Returns true iff the test case passed.
+static bool TestCasePassed(const TestCase* test_case) {
+ return test_case->should_run() && test_case->Passed();
+}
+
+// Returns true iff the test case failed.
+static bool TestCaseFailed(const TestCase* test_case) {
+ return test_case->should_run() && test_case->Failed();
+}
+
+// Returns true iff test_case contains at least one test that should
+// run.
+static bool ShouldRunTestCase(const TestCase* test_case) {
+ return test_case->should_run();
+}
+
+// AssertHelper constructor.
+AssertHelper::AssertHelper(TestPartResult::Type type,
+ const char* file,
+ int line,
+ const char* message)
+ : data_(new AssertHelperData(type, file, line, message)) {
+}
+
+AssertHelper::~AssertHelper() {
+ delete data_;
+}
+
+// Message assignment, for assertion streaming support.
+void AssertHelper::operator=(const Message& message) const {
+ UnitTest::GetInstance()->
+ AddTestPartResult(data_->type, data_->file, data_->line,
+ AppendUserMessage(data_->message, message),
+ UnitTest::GetInstance()->impl()
+ ->CurrentOsStackTraceExceptTop(1)
+ // Skips the stack frame for this function itself.
+ ); // NOLINT
+}
+
+// Mutex for linked pointers.
+GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// Application pathname gotten in InitGoogleTest.
+std::string g_executable_path;
+
+// Returns the current application's name, removing directory path if that
+// is present.
+FilePath GetCurrentExecutableName() {
+ FilePath result;
+
+#if GTEST_OS_WINDOWS
+ result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
+#else
+ result.Set(FilePath(g_executable_path));
+#endif // GTEST_OS_WINDOWS
+
+ return result.RemoveDirectoryName();
+}
+
+// Functions for processing the gtest_output flag.
+
+// Returns the output format, or "" for normal printed output.
+std::string UnitTestOptions::GetOutputFormat() {
+ const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+ if (gtest_output_flag == NULL) return std::string("");
+
+ const char* const colon = strchr(gtest_output_flag, ':');
+ return (colon == NULL) ?
+ std::string(gtest_output_flag) :
+ std::string(gtest_output_flag, colon - gtest_output_flag);
+}
+
+// Returns the name of the requested output file, or the default if none
+// was explicitly specified.
+std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
+ const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+ if (gtest_output_flag == NULL)
+ return "";
+
+ const char* const colon = strchr(gtest_output_flag, ':');
+ if (colon == NULL)
+ return internal::FilePath::ConcatPaths(
+ internal::FilePath(
+ UnitTest::GetInstance()->original_working_dir()),
+ internal::FilePath(kDefaultOutputFile)).string();
+
+ internal::FilePath output_name(colon + 1);
+ if (!output_name.IsAbsolutePath())
+ // TODO(wan at google.com): on Windows \some\path is not an absolute
+ // path (as its meaning depends on the current drive), yet the
+ // following logic for turning it into an absolute path is wrong.
+ // Fix it.
+ output_name = internal::FilePath::ConcatPaths(
+ internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
+ internal::FilePath(colon + 1));
+
+ if (!output_name.IsDirectory())
+ return output_name.string();
+
+ internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
+ output_name, internal::GetCurrentExecutableName(),
+ GetOutputFormat().c_str()));
+ return result.string();
+}
+
+// Returns true iff the wildcard pattern matches the string. The
+// first ':' or '\0' character in pattern marks the end of it.
+//
+// This recursive algorithm isn't very efficient, but is clear and
+// works well enough for matching test names, which are short.
+bool UnitTestOptions::PatternMatchesString(const char *pattern,
+ const char *str) {
+ switch (*pattern) {
+ case '\0':
+ case ':': // Either ':' or '\0' marks the end of the pattern.
+ return *str == '\0';
+ case '?': // Matches any single character.
+ return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
+ case '*': // Matches any string (possibly empty) of characters.
+ return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
+ PatternMatchesString(pattern + 1, str);
+ default: // Non-special character. Matches itself.
+ return *pattern == *str &&
+ PatternMatchesString(pattern + 1, str + 1);
+ }
+}
+
+bool UnitTestOptions::MatchesFilter(
+ const std::string& name, const char* filter) {
+ const char *cur_pattern = filter;
+ for (;;) {
+ if (PatternMatchesString(cur_pattern, name.c_str())) {
+ return true;
+ }
+
+ // Finds the next pattern in the filter.
+ cur_pattern = strchr(cur_pattern, ':');
+
+ // Returns if no more pattern can be found.
+ if (cur_pattern == NULL) {
+ return false;
+ }
+
+ // Skips the pattern separater (the ':' character).
+ cur_pattern++;
+ }
+}
+
+// Returns true iff the user-specified filter matches the test case
+// name and the test name.
+bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,
+ const std::string &test_name) {
+ const std::string& full_name = test_case_name + "." + test_name.c_str();
+
+ // Split --gtest_filter at '-', if there is one, to separate into
+ // positive filter and negative filter portions
+ const char* const p = GTEST_FLAG(filter).c_str();
+ const char* const dash = strchr(p, '-');
+ std::string positive;
+ std::string negative;
+ if (dash == NULL) {
+ positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter
+ negative = "";
+ } else {
+ positive = std::string(p, dash); // Everything up to the dash
+ negative = std::string(dash + 1); // Everything after the dash
+ if (positive.empty()) {
+ // Treat '-test1' as the same as '*-test1'
+ positive = kUniversalFilter;
+ }
+ }
+
+ // A filter is a colon-separated list of patterns. It matches a
+ // test if any pattern in it matches the test.
+ return (MatchesFilter(full_name, positive.c_str()) &&
+ !MatchesFilter(full_name, negative.c_str()));
+}
+
+#if GTEST_HAS_SEH
+// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+// This function is useful as an __except condition.
+int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
+ // Google Test should handle a SEH exception if:
+ // 1. the user wants it to, AND
+ // 2. this is not a breakpoint exception, AND
+ // 3. this is not a C++ exception (VC++ implements them via SEH,
+ // apparently).
+ //
+ // SEH exception code for C++ exceptions.
+ // (see http://support.microsoft.com/kb/185294 for more information).
+ const DWORD kCxxExceptionCode = 0xe06d7363;
+
+ bool should_handle = true;
+
+ if (!GTEST_FLAG(catch_exceptions))
+ should_handle = false;
+ else if (exception_code == EXCEPTION_BREAKPOINT)
+ should_handle = false;
+ else if (exception_code == kCxxExceptionCode)
+ should_handle = false;
+
+ return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
+}
+#endif // GTEST_HAS_SEH
+
+} // namespace internal
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test. The 'result' parameter specifies where to report the
+// results. Intercepts only failures from the current thread.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+ TestPartResultArray* result)
+ : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
+ result_(result) {
+ Init();
+}
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test. The 'result' parameter specifies where to report the
+// results.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+ InterceptMode intercept_mode, TestPartResultArray* result)
+ : intercept_mode_(intercept_mode),
+ result_(result) {
+ Init();
+}
+
+void ScopedFakeTestPartResultReporter::Init() {
+ internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+ if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+ old_reporter_ = impl->GetGlobalTestPartResultReporter();
+ impl->SetGlobalTestPartResultReporter(this);
+ } else {
+ old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
+ impl->SetTestPartResultReporterForCurrentThread(this);
+ }
+}
+
+// The d'tor restores the test part result reporter used by Google Test
+// before.
+ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
+ internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+ if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+ impl->SetGlobalTestPartResultReporter(old_reporter_);
+ } else {
+ impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
+ }
+}
+
+// Increments the test part result count and remembers the result.
+// This method is from the TestPartResultReporterInterface interface.
+void ScopedFakeTestPartResultReporter::ReportTestPartResult(
+ const TestPartResult& result) {
+ result_->Append(result);
+}
+
+namespace internal {
+
+// Returns the type ID of ::testing::Test. We should always call this
+// instead of GetTypeId< ::testing::Test>() to get the type ID of
+// testing::Test. This is to work around a suspected linker bug when
+// using Google Test as a framework on Mac OS X. The bug causes
+// GetTypeId< ::testing::Test>() to return different values depending
+// on whether the call is from the Google Test framework itself or
+// from user test code. GetTestTypeId() is guaranteed to always
+// return the same value, as it always calls GetTypeId<>() from the
+// gtest.cc, which is within the Google Test framework.
+TypeId GetTestTypeId() {
+ return GetTypeId<Test>();
+}
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library. This is solely for testing GetTestTypeId().
+extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
+
+// This predicate-formatter checks that 'results' contains a test part
+// failure of the given type and that the failure message contains the
+// given substring.
+AssertionResult HasOneFailure(const char* /* results_expr */,
+ const char* /* type_expr */,
+ const char* /* substr_expr */,
+ const TestPartResultArray& results,
+ TestPartResult::Type type,
+ const string& substr) {
+ const std::string expected(type == TestPartResult::kFatalFailure ?
+ "1 fatal failure" :
+ "1 non-fatal failure");
+ Message msg;
+ if (results.size() != 1) {
+ msg << "Expected: " << expected << "\n"
+ << " Actual: " << results.size() << " failures";
+ for (int i = 0; i < results.size(); i++) {
+ msg << "\n" << results.GetTestPartResult(i);
+ }
+ return AssertionFailure() << msg;
+ }
+
+ const TestPartResult& r = results.GetTestPartResult(0);
+ if (r.type() != type) {
+ return AssertionFailure() << "Expected: " << expected << "\n"
+ << " Actual:\n"
+ << r;
+ }
+
+ if (strstr(r.message(), substr.c_str()) == NULL) {
+ return AssertionFailure() << "Expected: " << expected << " containing \""
+ << substr << "\"\n"
+ << " Actual:\n"
+ << r;
+ }
+
+ return AssertionSuccess();
+}
+
+// The constructor of SingleFailureChecker remembers where to look up
+// test part results, what type of failure we expect, and what
+// substring the failure message should contain.
+SingleFailureChecker:: SingleFailureChecker(
+ const TestPartResultArray* results,
+ TestPartResult::Type type,
+ const string& substr)
+ : results_(results),
+ type_(type),
+ substr_(substr) {}
+
+// The destructor of SingleFailureChecker verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring. If that's not the case, a
+// non-fatal failure will be generated.
+SingleFailureChecker::~SingleFailureChecker() {
+ EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
+}
+
+DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
+ UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
+ const TestPartResult& result) {
+ unit_test_->current_test_result()->AddTestPartResult(result);
+ unit_test_->listeners()->repeater()->OnTestPartResult(result);
+}
+
+DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
+ UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
+ const TestPartResult& result) {
+ unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
+}
+
+// Returns the global test part result reporter.
+TestPartResultReporterInterface*
+UnitTestImpl::GetGlobalTestPartResultReporter() {
+ internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+ return global_test_part_result_repoter_;
+}
+
+// Sets the global test part result reporter.
+void UnitTestImpl::SetGlobalTestPartResultReporter(
+ TestPartResultReporterInterface* reporter) {
+ internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+ global_test_part_result_repoter_ = reporter;
+}
+
+// Returns the test part result reporter for the current thread.
+TestPartResultReporterInterface*
+UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
+ return per_thread_test_part_result_reporter_.get();
+}
+
+// Sets the test part result reporter for the current thread.
+void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
+ TestPartResultReporterInterface* reporter) {
+ per_thread_test_part_result_reporter_.set(reporter);
+}
+
+// Gets the number of successful test cases.
+int UnitTestImpl::successful_test_case_count() const {
+ return CountIf(test_cases_, TestCasePassed);
+}
+
+// Gets the number of failed test cases.
+int UnitTestImpl::failed_test_case_count() const {
+ return CountIf(test_cases_, TestCaseFailed);
+}
+
+// Gets the number of all test cases.
+int UnitTestImpl::total_test_case_count() const {
+ return static_cast<int>(test_cases_.size());
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTestImpl::test_case_to_run_count() const {
+ return CountIf(test_cases_, ShouldRunTestCase);
+}
+
+// Gets the number of successful tests.
+int UnitTestImpl::successful_test_count() const {
+ return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
+}
+
+// Gets the number of failed tests.
+int UnitTestImpl::failed_test_count() const {
+ return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTestImpl::reportable_disabled_test_count() const {
+ return SumOverTestCaseList(test_cases_,
+ &TestCase::reportable_disabled_test_count);
+}
+
+// Gets the number of disabled tests.
+int UnitTestImpl::disabled_test_count() const {
+ return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTestImpl::reportable_test_count() const {
+ return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);
+}
+
+// Gets the number of all tests.
+int UnitTestImpl::total_test_count() const {
+ return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
+}
+
+// Gets the number of tests that should run.
+int UnitTestImpl::test_to_run_count() const {
+ return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag. The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
+ (void)skip_count;
+ return "";
+}
+
+// Returns the current time in milliseconds.
+TimeInMillis GetTimeInMillis() {
+#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
+ // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
+ // http://analogous.blogspot.com/2005/04/epoch.html
+ const TimeInMillis kJavaEpochToWinFileTimeDelta =
+ static_cast<TimeInMillis>(116444736UL) * 100000UL;
+ const DWORD kTenthMicrosInMilliSecond = 10000;
+
+ SYSTEMTIME now_systime;
+ FILETIME now_filetime;
+ ULARGE_INTEGER now_int64;
+ // TODO(kenton at google.com): Shouldn't this just use
+ // GetSystemTimeAsFileTime()?
+ GetSystemTime(&now_systime);
+ if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
+ now_int64.LowPart = now_filetime.dwLowDateTime;
+ now_int64.HighPart = now_filetime.dwHighDateTime;
+ now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
+ kJavaEpochToWinFileTimeDelta;
+ return now_int64.QuadPart;
+ }
+ return 0;
+#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
+ __timeb64 now;
+
+# ifdef _MSC_VER
+
+ // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
+ // (deprecated function) there.
+ // TODO(kenton at google.com): Use GetTickCount()? Or use
+ // SystemTimeToFileTime()
+# pragma warning(push) // Saves the current warning state.
+# pragma warning(disable:4996) // Temporarily disables warning 4996.
+ _ftime64(&now);
+# pragma warning(pop) // Restores the warning state.
+# else
+
+ _ftime64(&now);
+
+# endif // _MSC_VER
+
+ return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
+#elif GTEST_HAS_GETTIMEOFDAY_
+ struct timeval now;
+ gettimeofday(&now, NULL);
+ return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
+#else
+# error "Don't know how to get the current time on your system."
+#endif
+}
+
+// Utilities
+
+// class String.
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Creates a UTF-16 wide string from the given ANSI string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the wide string, or NULL if the
+// input is NULL.
+LPCWSTR String::AnsiToUtf16(const char* ansi) {
+ if (!ansi) return NULL;
+ const int length = strlen(ansi);
+ const int unicode_length =
+ MultiByteToWideChar(CP_ACP, 0, ansi, length,
+ NULL, 0);
+ WCHAR* unicode = new WCHAR[unicode_length + 1];
+ MultiByteToWideChar(CP_ACP, 0, ansi, length,
+ unicode, unicode_length);
+ unicode[unicode_length] = 0;
+ return unicode;
+}
+
+// Creates an ANSI string from the given wide string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the ANSI string, or NULL if the
+// input is NULL.
+const char* String::Utf16ToAnsi(LPCWSTR utf16_str) {
+ if (!utf16_str) return NULL;
+ const int ansi_length =
+ WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+ NULL, 0, NULL, NULL);
+ char* ansi = new char[ansi_length + 1];
+ WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+ ansi, ansi_length, NULL, NULL);
+ ansi[ansi_length] = 0;
+ return ansi;
+}
+
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+// Compares two C strings. Returns true iff they have the same content.
+//
+// Unlike strcmp(), this function can handle NULL argument(s). A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CStringEquals(const char * lhs, const char * rhs) {
+ if ( lhs == NULL ) return rhs == NULL;
+
+ if ( rhs == NULL ) return false;
+
+ return strcmp(lhs, rhs) == 0;
+}
+
+#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+// Converts an array of wide chars to a narrow string using the UTF-8
+// encoding, and streams the result to the given Message object.
+static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
+ Message* msg) {
+ for (size_t i = 0; i != length; ) { // NOLINT
+ if (wstr[i] != L'\0') {
+ *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
+ while (i != length && wstr[i] != L'\0')
+ i++;
+ } else {
+ *msg << '\0';
+ i++;
+ }
+ }
+}
+
+#endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+} // namespace internal
+
+// Constructs an empty Message.
+// We allocate the stringstream separately because otherwise each use of
+// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
+// stack frame leading to huge stack frames in some cases; gcc does not reuse
+// the stack space.
+Message::Message() : ss_(new ::std::stringstream) {
+ // By default, we want there to be enough precision when printing
+ // a double to a Message.
+ *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
+}
+
+// These two overloads allow streaming a wide C string to a Message
+// using the UTF-8 encoding.
+Message& Message::operator <<(const wchar_t* wide_c_str) {
+ return *this << internal::String::ShowWideCString(wide_c_str);
+}
+Message& Message::operator <<(wchar_t* wide_c_str) {
+ return *this << internal::String::ShowWideCString(wide_c_str);
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::std::wstring& wstr) {
+ internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+ return *this;
+}
+#endif // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::wstring& wstr) {
+ internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+ return *this;
+}
+#endif // GTEST_HAS_GLOBAL_WSTRING
+
+// Gets the text streamed to this object so far as an std::string.
+// Each '\0' character in the buffer is replaced with "\\0".
+std::string Message::GetString() const {
+ return internal::StringStreamToString(ss_.get());
+}
+
+// AssertionResult constructors.
+// Used in EXPECT_TRUE/FALSE(assertion_result).
+AssertionResult::AssertionResult(const AssertionResult& other)
+ : success_(other.success_),
+ message_(other.message_.get() != NULL ?
+ new ::std::string(*other.message_) :
+ static_cast< ::std::string*>(NULL)) {
+}
+
+// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+AssertionResult AssertionResult::operator!() const {
+ AssertionResult negation(!success_);
+ if (message_.get() != NULL)
+ negation << *message_;
+ return negation;
+}
+
+// Makes a successful assertion result.
+AssertionResult AssertionSuccess() {
+ return AssertionResult(true);
+}
+
+// Makes a failed assertion result.
+AssertionResult AssertionFailure() {
+ return AssertionResult(false);
+}
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << message.
+AssertionResult AssertionFailure(const Message& message) {
+ return AssertionFailure() << message;
+}
+
+namespace internal {
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings. For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+// expected_expression: "foo"
+// actual_expression: "bar"
+// expected_value: "5"
+// actual_value: "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+AssertionResult EqFailure(const char* expected_expression,
+ const char* actual_expression,
+ const std::string& expected_value,
+ const std::string& actual_value,
+ bool ignoring_case) {
+ Message msg;
+ msg << "Value of: " << actual_expression;
+ if (actual_value != actual_expression) {
+ msg << "\n Actual: " << actual_value;
+ }
+
+ msg << "\nExpected: " << expected_expression;
+ if (ignoring_case) {
+ msg << " (ignoring case)";
+ }
+ if (expected_value != expected_expression) {
+ msg << "\nWhich is: " << expected_value;
+ }
+
+ return AssertionFailure() << msg;
+}
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+std::string GetBoolAssertionFailureMessage(
+ const AssertionResult& assertion_result,
+ const char* expression_text,
+ const char* actual_predicate_value,
+ const char* expected_predicate_value) {
+ const char* actual_message = assertion_result.message();
+ Message msg;
+ msg << "Value of: " << expression_text
+ << "\n Actual: " << actual_predicate_value;
+ if (actual_message[0] != '\0')
+ msg << " (" << actual_message << ")";
+ msg << "\nExpected: " << expected_predicate_value;
+ return msg.GetString();
+}
+
+// Helper function for implementing ASSERT_NEAR.
+AssertionResult DoubleNearPredFormat(const char* expr1,
+ const char* expr2,
+ const char* abs_error_expr,
+ double val1,
+ double val2,
+ double abs_error) {
+ const double diff = fabs(val1 - val2);
+ if (diff <= abs_error) return AssertionSuccess();
+
+ // TODO(wan): do not print the value of an expression if it's
+ // already a literal.
+ return AssertionFailure()
+ << "The difference between " << expr1 << " and " << expr2
+ << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
+ << expr1 << " evaluates to " << val1 << ",\n"
+ << expr2 << " evaluates to " << val2 << ", and\n"
+ << abs_error_expr << " evaluates to " << abs_error << ".";
+}
+
+
+// Helper template for implementing FloatLE() and DoubleLE().
+template <typename RawType>
+AssertionResult FloatingPointLE(const char* expr1,
+ const char* expr2,
+ RawType val1,
+ RawType val2) {
+ // Returns success if val1 is less than val2,
+ if (val1 < val2) {
+ return AssertionSuccess();
+ }
+
+ // or if val1 is almost equal to val2.
+ const FloatingPoint<RawType> lhs(val1), rhs(val2);
+ if (lhs.AlmostEquals(rhs)) {
+ return AssertionSuccess();
+ }
+
+ // Note that the above two checks will both fail if either val1 or
+ // val2 is NaN, as the IEEE floating-point standard requires that
+ // any predicate involving a NaN must return false.
+
+ ::std::stringstream val1_ss;
+ val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+ << val1;
+
+ ::std::stringstream val2_ss;
+ val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+ << val2;
+
+ return AssertionFailure()
+ << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
+ << " Actual: " << StringStreamToString(&val1_ss) << " vs "
+ << StringStreamToString(&val2_ss);
+}
+
+} // namespace internal
+
+// Asserts that val1 is less than, or almost equal to, val2. Fails
+// otherwise. In particular, it fails if either val1 or val2 is NaN.
+AssertionResult FloatLE(const char* expr1, const char* expr2,
+ float val1, float val2) {
+ return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
+}
+
+// Asserts that val1 is less than, or almost equal to, val2. Fails
+// otherwise. In particular, it fails if either val1 or val2 is NaN.
+AssertionResult DoubleLE(const char* expr1, const char* expr2,
+ double val1, double val2) {
+ return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
+}
+
+namespace internal {
+
+// The helper function for {ASSERT|EXPECT}_EQ with int or enum
+// arguments.
+AssertionResult CmpHelperEQ(const char* expected_expression,
+ const char* actual_expression,
+ BiggestInt expected,
+ BiggestInt actual) {
+ if (expected == actual) {
+ return AssertionSuccess();
+ }
+
+ return EqFailure(expected_expression,
+ actual_expression,
+ FormatForComparisonFailureMessage(expected, actual),
+ FormatForComparisonFailureMessage(actual, expected),
+ false);
+}
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here
+// just to avoid copy-and-paste of similar code.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+ BiggestInt val1, BiggestInt val2) {\
+ if (val1 op val2) {\
+ return AssertionSuccess();\
+ } else {\
+ return AssertionFailure() \
+ << "Expected: (" << expr1 << ") " #op " (" << expr2\
+ << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+ << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+ }\
+}
+
+// Implements the helper function for {ASSERT|EXPECT}_NE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(NE, !=)
+// Implements the helper function for {ASSERT|EXPECT}_LE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LE, <=)
+// Implements the helper function for {ASSERT|EXPECT}_LT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LT, < )
+// Implements the helper function for {ASSERT|EXPECT}_GE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GE, >=)
+// Implements the helper function for {ASSERT|EXPECT}_GT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GT, > )
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+ const char* actual_expression,
+ const char* expected,
+ const char* actual) {
+ if (String::CStringEquals(expected, actual)) {
+ return AssertionSuccess();
+ }
+
+ return EqFailure(expected_expression,
+ actual_expression,
+ PrintToString(expected),
+ PrintToString(actual),
+ false);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+ const char* actual_expression,
+ const char* expected,
+ const char* actual) {
+ if (String::CaseInsensitiveCStringEquals(expected, actual)) {
+ return AssertionSuccess();
+ }
+
+ return EqFailure(expected_expression,
+ actual_expression,
+ PrintToString(expected),
+ PrintToString(actual),
+ true);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+ const char* s2_expression,
+ const char* s1,
+ const char* s2) {
+ if (!String::CStringEquals(s1, s2)) {
+ return AssertionSuccess();
+ } else {
+ return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+ << s2_expression << "), actual: \""
+ << s1 << "\" vs \"" << s2 << "\"";
+ }
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+ const char* s2_expression,
+ const char* s1,
+ const char* s2) {
+ if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
+ return AssertionSuccess();
+ } else {
+ return AssertionFailure()
+ << "Expected: (" << s1_expression << ") != ("
+ << s2_expression << ") (ignoring case), actual: \""
+ << s1 << "\" vs \"" << s2 << "\"";
+ }
+}
+
+} // namespace internal
+
+namespace {
+
+// Helper functions for implementing IsSubString() and IsNotSubstring().
+
+// This group of overloaded functions return true iff needle is a
+// substring of haystack. NULL is considered a substring of itself
+// only.
+
+bool IsSubstringPred(const char* needle, const char* haystack) {
+ if (needle == NULL || haystack == NULL)
+ return needle == haystack;
+
+ return strstr(haystack, needle) != NULL;
+}
+
+bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
+ if (needle == NULL || haystack == NULL)
+ return needle == haystack;
+
+ return wcsstr(haystack, needle) != NULL;
+}
+
+// StringType here can be either ::std::string or ::std::wstring.
+template <typename StringType>
+bool IsSubstringPred(const StringType& needle,
+ const StringType& haystack) {
+ return haystack.find(needle) != StringType::npos;
+}
+
+// This function implements either IsSubstring() or IsNotSubstring(),
+// depending on the value of the expected_to_be_substring parameter.
+// StringType here can be const char*, const wchar_t*, ::std::string,
+// or ::std::wstring.
+template <typename StringType>
+AssertionResult IsSubstringImpl(
+ bool expected_to_be_substring,
+ const char* needle_expr, const char* haystack_expr,
+ const StringType& needle, const StringType& haystack) {
+ if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
+ return AssertionSuccess();
+
+ const bool is_wide_string = sizeof(needle[0]) > 1;
+ const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+ return AssertionFailure()
+ << "Value of: " << needle_expr << "\n"
+ << " Actual: " << begin_string_quote << needle << "\"\n"
+ << "Expected: " << (expected_to_be_substring ? "" : "not ")
+ << "a substring of " << haystack_expr << "\n"
+ << "Which is: " << begin_string_quote << haystack << "\"";
+}
+
+} // namespace
+
+// IsSubstring() and IsNotSubstring() check whether needle is a
+// substring of haystack (NULL is considered a substring of itself
+// only), and return an appropriate error message when they fail.
+
+AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const char* needle, const char* haystack) {
+ return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const wchar_t* needle, const wchar_t* haystack) {
+ return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const char* needle, const char* haystack) {
+ return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const wchar_t* needle, const wchar_t* haystack) {
+ return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::string& needle, const ::std::string& haystack) {
+ return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::string& needle, const ::std::string& haystack) {
+ return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+#if GTEST_HAS_STD_WSTRING
+AssertionResult IsSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::wstring& needle, const ::std::wstring& haystack) {
+ return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+ const char* needle_expr, const char* haystack_expr,
+ const ::std::wstring& needle, const ::std::wstring& haystack) {
+ return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+#endif // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+
+namespace {
+
+// Helper function for IsHRESULT{SuccessFailure} predicates
+AssertionResult HRESULTFailureHelper(const char* expr,
+ const char* expected,
+ long hr) { // NOLINT
+# if GTEST_OS_WINDOWS_MOBILE
+
+ // Windows CE doesn't support FormatMessage.
+ const char error_text[] = "";
+
+# else
+
+ // Looks up the human-readable system message for the HRESULT code
+ // and since we're not passing any params to FormatMessage, we don't
+ // want inserts expanded.
+ const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS;
+ const DWORD kBufSize = 4096;
+ // Gets the system's human readable message string for this HRESULT.
+ char error_text[kBufSize] = { '\0' };
+ DWORD message_length = ::FormatMessageA(kFlags,
+ 0, // no source, we're asking system
+ hr, // the error
+ 0, // no line width restrictions
+ error_text, // output buffer
+ kBufSize, // buf size
+ NULL); // no arguments for inserts
+ // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
+ for (; message_length && IsSpace(error_text[message_length - 1]);
+ --message_length) {
+ error_text[message_length - 1] = '\0';
+ }
+
+# endif // GTEST_OS_WINDOWS_MOBILE
+
+ const std::string error_hex("0x" + String::FormatHexInt(hr));
+ return ::testing::AssertionFailure()
+ << "Expected: " << expr << " " << expected << ".\n"
+ << " Actual: " << error_hex << " " << error_text << "\n";
+}
+
+} // namespace
+
+AssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT
+ if (SUCCEEDED(hr)) {
+ return AssertionSuccess();
+ }
+ return HRESULTFailureHelper(expr, "succeeds", hr);
+}
+
+AssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT
+ if (FAILED(hr)) {
+ return AssertionSuccess();
+ }
+ return HRESULTFailureHelper(expr, "fails", hr);
+}
+
+#endif // GTEST_OS_WINDOWS
+
+// Utility functions for encoding Unicode text (wide strings) in
+// UTF-8.
+
+// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
+// like this:
+//
+// Code-point length Encoding
+// 0 - 7 bits 0xxxxxxx
+// 8 - 11 bits 110xxxxx 10xxxxxx
+// 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx
+// 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+// The maximum code-point a one-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) << 7) - 1;
+
+// The maximum code-point a two-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
+
+// The maximum code-point a three-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
+
+// The maximum code-point a four-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
+
+// Chops off the n lowest bits from a bit pattern. Returns the n
+// lowest bits. As a side effect, the original bit pattern will be
+// shifted to the right by n bits.
+inline UInt32 ChopLowBits(UInt32* bits, int n) {
+ const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
+ *bits >>= n;
+ return low_bits;
+}
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+std::string CodePointToUtf8(UInt32 code_point) {
+ if (code_point > kMaxCodePoint4) {
+ return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";
+ }
+
+ char str[5]; // Big enough for the largest valid code point.
+ if (code_point <= kMaxCodePoint1) {
+ str[1] = '\0';
+ str[0] = static_cast<char>(code_point); // 0xxxxxxx
+ } else if (code_point <= kMaxCodePoint2) {
+ str[2] = '\0';
+ str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
+ str[0] = static_cast<char>(0xC0 | code_point); // 110xxxxx
+ } else if (code_point <= kMaxCodePoint3) {
+ str[3] = '\0';
+ str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
+ str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
+ str[0] = static_cast<char>(0xE0 | code_point); // 1110xxxx
+ } else { // code_point <= kMaxCodePoint4
+ str[4] = '\0';
+ str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
+ str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
+ str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
+ str[0] = static_cast<char>(0xF0 | code_point); // 11110xxx
+ }
+ return str;
+}
+
+// The following two functions only make sense if the the system
+// uses UTF-16 for wide string encoding. All supported systems
+// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
+
+// Determines if the arguments constitute UTF-16 surrogate pair
+// and thus should be combined into a single Unicode code point
+// using CreateCodePointFromUtf16SurrogatePair.
+inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
+ return sizeof(wchar_t) == 2 &&
+ (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
+}
+
+// Creates a Unicode code point from UTF16 surrogate pair.
+inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
+ wchar_t second) {
+ const UInt32 mask = (1 << 10) - 1;
+ return (sizeof(wchar_t) == 2) ?
+ (((first & mask) << 10) | (second & mask)) + 0x10000 :
+ // This function should not be called when the condition is
+ // false, but we provide a sensible default in case it is.
+ static_cast<UInt32>(first);
+}
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+// UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
+ if (num_chars == -1)
+ num_chars = static_cast<int>(wcslen(str));
+
+ ::std::stringstream stream;
+ for (int i = 0; i < num_chars; ++i) {
+ UInt32 unicode_code_point;
+
+ if (str[i] == L'\0') {
+ break;
+ } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
+ unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
+ str[i + 1]);
+ i++;
+ } else {
+ unicode_code_point = static_cast<UInt32>(str[i]);
+ }
+
+ stream << CodePointToUtf8(unicode_code_point);
+ }
+ return StringStreamToString(&stream);
+}
+
+// Converts a wide C string to an std::string using the UTF-8 encoding.
+// NULL will be converted to "(null)".
+std::string String::ShowWideCString(const wchar_t * wide_c_str) {
+ if (wide_c_str == NULL) return "(null)";
+
+ return internal::WideStringToUtf8(wide_c_str, -1);
+}
+
+// Compares two wide C strings. Returns true iff they have the same
+// content.
+//
+// Unlike wcscmp(), this function can handle NULL argument(s). A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
+ if (lhs == NULL) return rhs == NULL;
+
+ if (rhs == NULL) return false;
+
+ return wcscmp(lhs, rhs) == 0;
+}
+
+// Helper function for *_STREQ on wide strings.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+ const char* actual_expression,
+ const wchar_t* expected,
+ const wchar_t* actual) {
+ if (String::WideCStringEquals(expected, actual)) {
+ return AssertionSuccess();
+ }
+
+ return EqFailure(expected_expression,
+ actual_expression,
+ PrintToString(expected),
+ PrintToString(actual),
+ false);
+}
+
+// Helper function for *_STRNE on wide strings.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+ const char* s2_expression,
+ const wchar_t* s1,
+ const wchar_t* s2) {
+ if (!String::WideCStringEquals(s1, s2)) {
+ return AssertionSuccess();
+ }
+
+ return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+ << s2_expression << "), actual: "
+ << PrintToString(s1)
+ << " vs " << PrintToString(s2);
+}
+
+// Compares two C strings, ignoring case. Returns true iff they have
+// the same content.
+//
+// Unlike strcasecmp(), this function can handle NULL argument(s). A
+// NULL C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
+ if (lhs == NULL)
+ return rhs == NULL;
+ if (rhs == NULL)
+ return false;
+ return posix::StrCaseCmp(lhs, rhs) == 0;
+}
+
+ // Compares two wide C strings, ignoring case. Returns true iff they
+ // have the same content.
+ //
+ // Unlike wcscasecmp(), this function can handle NULL argument(s).
+ // A NULL C string is considered different to any non-NULL wide C string,
+ // including the empty string.
+ // NB: The implementations on different platforms slightly differ.
+ // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+ // environment variable. On GNU platform this method uses wcscasecmp
+ // which compares according to LC_CTYPE category of the current locale.
+ // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+ // current locale.
+bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+ const wchar_t* rhs) {
+ if (lhs == NULL) return rhs == NULL;
+
+ if (rhs == NULL) return false;
+
+#if GTEST_OS_WINDOWS
+ return _wcsicmp(lhs, rhs) == 0;
+#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
+ return wcscasecmp(lhs, rhs) == 0;
+#else
+ // Android, Mac OS X and Cygwin don't define wcscasecmp.
+ // Other unknown OSes may not define it either.
+ wint_t left, right;
+ do {
+ left = towlower(*lhs++);
+ right = towlower(*rhs++);
+ } while (left && left == right);
+ return left == right;
+#endif // OS selector
+}
+
+// Returns true iff str ends with the given suffix, ignoring case.
+// Any string is considered to end with an empty suffix.
+bool String::EndsWithCaseInsensitive(
+ const std::string& str, const std::string& suffix) {
+ const size_t str_len = str.length();
+ const size_t suffix_len = suffix.length();
+ return (str_len >= suffix_len) &&
+ CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
+ suffix.c_str());
+}
+
+// Formats an int value as "%02d".
+std::string String::FormatIntWidth2(int value) {
+ std::stringstream ss;
+ ss << std::setfill('0') << std::setw(2) << value;
+ return ss.str();
+}
+
+// Formats an int value as "%X".
+std::string String::FormatHexInt(int value) {
+ std::stringstream ss;
+ ss << std::hex << std::uppercase << value;
+ return ss.str();
+}
+
+// Formats a byte as "%02X".
+std::string String::FormatByte(unsigned char value) {
+ std::stringstream ss;
+ ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
+ << static_cast<unsigned int>(value);
+ return ss.str();
+}
+
+// Converts the buffer in a stringstream to an std::string, converting NUL
+// bytes to "\\0" along the way.
+std::string StringStreamToString(::std::stringstream* ss) {
+ const ::std::string& str = ss->str();
+ const char* const start = str.c_str();
+ const char* const end = start + str.length();
+
+ std::string result;
+ result.reserve(2 * (end - start));
+ for (const char* ch = start; ch != end; ++ch) {
+ if (*ch == '\0') {
+ result += "\\0"; // Replaces NUL with "\\0";
+ } else {
+ result += *ch;
+ }
+ }
+
+ return result;
+}
+
+// Appends the user-supplied message to the Google-Test-generated message.
+std::string AppendUserMessage(const std::string& gtest_msg,
+ const Message& user_msg) {
+ // Appends the user message if it's non-empty.
+ const std::string user_msg_string = user_msg.GetString();
+ if (user_msg_string.empty()) {
+ return gtest_msg;
+ }
+
+ return gtest_msg + "\n" + user_msg_string;
+}
+
+} // namespace internal
+
+// class TestResult
+
+// Creates an empty TestResult.
+TestResult::TestResult()
+ : death_test_count_(0),
+ elapsed_time_(0) {
+}
+
+// D'tor.
+TestResult::~TestResult() {
+}
+
+// Returns the i-th test part result among all the results. i can
+// range from 0 to total_part_count() - 1. If i is not in that range,
+// aborts the program.
+const TestPartResult& TestResult::GetTestPartResult(int i) const {
+ if (i < 0 || i >= total_part_count())
+ internal::posix::Abort();
+ return test_part_results_.at(i);
+}
+
+// Returns the i-th test property. i can range from 0 to
+// test_property_count() - 1. If i is not in that range, aborts the
+// program.
+const TestProperty& TestResult::GetTestProperty(int i) const {
+ if (i < 0 || i >= test_property_count())
+ internal::posix::Abort();
+ return test_properties_.at(i);
+}
+
+// Clears the test part results.
+void TestResult::ClearTestPartResults() {
+ test_part_results_.clear();
+}
+
+// Adds a test part result to the list.
+void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
+ test_part_results_.push_back(test_part_result);
+}
+
+// Adds a test property to the list. If a property with the same key as the
+// supplied property is already represented, the value of this test_property
+// replaces the old value for that key.
+void TestResult::RecordProperty(const std::string& xml_element,
+ const TestProperty& test_property) {
+ if (!ValidateTestProperty(xml_element, test_property)) {
+ return;
+ }
+ internal::MutexLock lock(&test_properites_mutex_);
+ const std::vector<TestProperty>::iterator property_with_matching_key =
+ std::find_if(test_properties_.begin(), test_properties_.end(),
+ internal::TestPropertyKeyIs(test_property.key()));
+ if (property_with_matching_key == test_properties_.end()) {
+ test_properties_.push_back(test_property);
+ return;
+ }
+ property_with_matching_key->SetValue(test_property.value());
+}
+
+// The list of reserved attributes used in the <testsuites> element of XML
+// output.
+static const char* const kReservedTestSuitesAttributes[] = {
+ "disabled",
+ "errors",
+ "failures",
+ "name",
+ "random_seed",
+ "tests",
+ "time",
+ "timestamp"
+};
+
+// The list of reserved attributes used in the <testsuite> element of XML
+// output.
+static const char* const kReservedTestSuiteAttributes[] = {
+ "disabled",
+ "errors",
+ "failures",
+ "name",
+ "tests",
+ "time"
+};
+
+// The list of reserved attributes used in the <testcase> element of XML output.
+static const char* const kReservedTestCaseAttributes[] = {
+ "classname",
+ "name",
+ "status",
+ "time",
+ "type_param",
+ "value_param"
+};
+
+template <int kSize>
+std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
+ return std::vector<std::string>(array, array + kSize);
+}
+
+static std::vector<std::string> GetReservedAttributesForElement(
+ const std::string& xml_element) {
+ if (xml_element == "testsuites") {
+ return ArrayAsVector(kReservedTestSuitesAttributes);
+ } else if (xml_element == "testsuite") {
+ return ArrayAsVector(kReservedTestSuiteAttributes);
+ } else if (xml_element == "testcase") {
+ return ArrayAsVector(kReservedTestCaseAttributes);
+ } else {
+ GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
+ }
+ // This code is unreachable but some compilers may not realizes that.
+ return std::vector<std::string>();
+}
+
+static std::string FormatWordList(const std::vector<std::string>& words) {
+ Message word_list;
+ for (size_t i = 0; i < words.size(); ++i) {
+ if (i > 0 && words.size() > 2) {
+ word_list << ", ";
+ }
+ if (i == words.size() - 1) {
+ word_list << "and ";
+ }
+ word_list << "'" << words[i] << "'";
+ }
+ return word_list.GetString();
+}
+
+bool ValidateTestPropertyName(const std::string& property_name,
+ const std::vector<std::string>& reserved_names) {
+ if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
+ reserved_names.end()) {
+ ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
+ << " (" << FormatWordList(reserved_names)
+ << " are reserved by " << GTEST_NAME_ << ")";
+ return false;
+ }
+ return true;
+}
+
+// Adds a failure if the key is a reserved attribute of the element named
+// xml_element. Returns true if the property is valid.
+bool TestResult::ValidateTestProperty(const std::string& xml_element,
+ const TestProperty& test_property) {
+ return ValidateTestPropertyName(test_property.key(),
+ GetReservedAttributesForElement(xml_element));
+}
+
+// Clears the object.
+void TestResult::Clear() {
+ test_part_results_.clear();
+ test_properties_.clear();
+ death_test_count_ = 0;
+ elapsed_time_ = 0;
+}
+
+// Returns true iff the test failed.
+bool TestResult::Failed() const {
+ for (int i = 0; i < total_part_count(); ++i) {
+ if (GetTestPartResult(i).failed())
+ return true;
+ }
+ return false;
+}
+
+// Returns true iff the test part fatally failed.
+static bool TestPartFatallyFailed(const TestPartResult& result) {
+ return result.fatally_failed();
+}
+
+// Returns true iff the test fatally failed.
+bool TestResult::HasFatalFailure() const {
+ return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
+}
+
+// Returns true iff the test part non-fatally failed.
+static bool TestPartNonfatallyFailed(const TestPartResult& result) {
+ return result.nonfatally_failed();
+}
+
+// Returns true iff the test has a non-fatal failure.
+bool TestResult::HasNonfatalFailure() const {
+ return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
+}
+
+// Gets the number of all test parts. This is the sum of the number
+// of successful test parts and the number of failed test parts.
+int TestResult::total_part_count() const {
+ return static_cast<int>(test_part_results_.size());
+}
+
+// Returns the number of the test properties.
+int TestResult::test_property_count() const {
+ return static_cast<int>(test_properties_.size());
+}
+
+// class Test
+
+// Creates a Test object.
+
+// The c'tor saves the values of all Google Test flags.
+Test::Test()
+ : gtest_flag_saver_(new internal::GTestFlagSaver) {
+}
+
+// The d'tor restores the values of all Google Test flags.
+Test::~Test() {
+ delete gtest_flag_saver_;
+}
+
+// Sets up the test fixture.
+//
+// A sub-class may override this.
+void Test::SetUp() {
+}
+
+// Tears down the test fixture.
+//
+// A sub-class may override this.
+void Test::TearDown() {
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, const std::string& value) {
+ UnitTest::GetInstance()->RecordProperty(key, value);
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, int value) {
+ Message value_message;
+ value_message << value;
+ RecordProperty(key, value_message.GetString().c_str());
+}
+
+namespace internal {
+
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+ const std::string& message) {
+ // This function is a friend of UnitTest and as such has access to
+ // AddTestPartResult.
+ UnitTest::GetInstance()->AddTestPartResult(
+ result_type,
+ NULL, // No info about the source file where the exception occurred.
+ -1, // We have no info on which line caused the exception.
+ message,
+ ""); // No stack trace, either.
+}
+
+} // namespace internal
+
+// Google Test requires all tests in the same test case to use the same test
+// fixture class. This function checks if the current test has the
+// same fixture class as the first test in the current test case. If
+// yes, it returns true; otherwise it generates a Google Test failure and
+// returns false.
+bool Test::HasSameFixtureClass() {
+ internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+ const TestCase* const test_case = impl->current_test_case();
+
+ // Info about the first test in the current test case.
+ const TestInfo* const first_test_info = test_case->test_info_list()[0];
+ const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
+ const char* const first_test_name = first_test_info->name();
+
+ // Info about the current test.
+ const TestInfo* const this_test_info = impl->current_test_info();
+ const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
+ const char* const this_test_name = this_test_info->name();
+
+ if (this_fixture_id != first_fixture_id) {
+ // Is the first test defined using TEST?
+ const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
+ // Is this test defined using TEST?
+ const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
+
+ if (first_is_TEST || this_is_TEST) {
+ // The user mixed TEST and TEST_F in this test case - we'll tell
+ // him/her how to fix it.
+
+ // Gets the name of the TEST and the name of the TEST_F. Note
+ // that first_is_TEST and this_is_TEST cannot both be true, as
+ // the fixture IDs are different for the two tests.
+ const char* const TEST_name =
+ first_is_TEST ? first_test_name : this_test_name;
+ const char* const TEST_F_name =
+ first_is_TEST ? this_test_name : first_test_name;
+
+ ADD_FAILURE()
+ << "All tests in the same test case must use the same test fixture\n"
+ << "class, so mixing TEST_F and TEST in the same test case is\n"
+ << "illegal. In test case " << this_test_info->test_case_name()
+ << ",\n"
+ << "test " << TEST_F_name << " is defined using TEST_F but\n"
+ << "test " << TEST_name << " is defined using TEST. You probably\n"
+ << "want to change the TEST to TEST_F or move it to another test\n"
+ << "case.";
+ } else {
+ // The user defined two fixture classes with the same name in
+ // two namespaces - we'll tell him/her how to fix it.
+ ADD_FAILURE()
+ << "All tests in the same test case must use the same test fixture\n"
+ << "class. However, in test case "
+ << this_test_info->test_case_name() << ",\n"
+ << "you defined test " << first_test_name
+ << " and test " << this_test_name << "\n"
+ << "using two different test fixture classes. This can happen if\n"
+ << "the two classes are from different namespaces or translation\n"
+ << "units and have the same name. You should probably rename one\n"
+ << "of the classes to put the tests into different test cases.";
+ }
+ return false;
+ }
+
+ return true;
+}
+
+#if GTEST_HAS_SEH
+
+// Adds an "exception thrown" fatal failure to the current test. This
+// function returns its result via an output parameter pointer because VC++
+// prohibits creation of objects with destructors on stack in functions
+// using __try (see error C2712).
+static std::string* FormatSehExceptionMessage(DWORD exception_code,
+ const char* location) {
+ Message message;
+ message << "SEH exception with code 0x" << std::setbase(16) <<
+ exception_code << std::setbase(10) << " thrown in " << location << ".";
+
+ return new std::string(message.GetString());
+}
+
+#endif // GTEST_HAS_SEH
+
+namespace internal {
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Adds an "exception thrown" fatal failure to the current test.
+static std::string FormatCxxExceptionMessage(const char* description,
+ const char* location) {
+ Message message;
+ if (description != NULL) {
+ message << "C++ exception with description \"" << description << "\"";
+ } else {
+ message << "Unknown C++ exception";
+ }
+ message << " thrown in " << location << ".";
+
+ return message.GetString();
+}
+
+static std::string PrintTestPartResultToString(
+ const TestPartResult& test_part_result);
+
+GoogleTestFailureException::GoogleTestFailureException(
+ const TestPartResult& failure)
+ : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
+
+#endif // GTEST_HAS_EXCEPTIONS
+
+// We put these helper functions in the internal namespace as IBM's xlC
+// compiler rejects the code if they were declared static.
+
+// Runs the given method and handles SEH exceptions it throws, when
+// SEH is supported; returns the 0-value for type Result in case of an
+// SEH exception. (Microsoft compilers cannot handle SEH and C++
+// exceptions in the same function. Therefore, we provide a separate
+// wrapper function for handling SEH exceptions.)
+template <class T, typename Result>
+Result HandleSehExceptionsInMethodIfSupported(
+ T* object, Result (T::*method)(), const char* location) {
+#if GTEST_HAS_SEH
+ __try {
+ return (object->*method)();
+ } __except (internal::UnitTestOptions::GTestShouldProcessSEH( // NOLINT
+ GetExceptionCode())) {
+ // We create the exception message on the heap because VC++ prohibits
+ // creation of objects with destructors on stack in functions using __try
+ // (see error C2712).
+ std::string* exception_message = FormatSehExceptionMessage(
+ GetExceptionCode(), location);
+ internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
+ *exception_message);
+ delete exception_message;
+ return static_cast<Result>(0);
+ }
+#else
+ (void)location;
+ return (object->*method)();
+#endif // GTEST_HAS_SEH
+}
+
+// Runs the given method and catches and reports C++ and/or SEH-style
+// exceptions, if they are supported; returns the 0-value for type
+// Result in case of an SEH exception.
+template <class T, typename Result>
+Result HandleExceptionsInMethodIfSupported(
+ T* object, Result (T::*method)(), const char* location) {
+ // NOTE: The user code can affect the way in which Google Test handles
+ // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
+ // RUN_ALL_TESTS() starts. It is technically possible to check the flag
+ // after the exception is caught and either report or re-throw the
+ // exception based on the flag's value:
+ //
+ // try {
+ // // Perform the test method.
+ // } catch (...) {
+ // if (GTEST_FLAG(catch_exceptions))
+ // // Report the exception as failure.
+ // else
+ // throw; // Re-throws the original exception.
+ // }
+ //
+ // However, the purpose of this flag is to allow the program to drop into
+ // the debugger when the exception is thrown. On most platforms, once the
+ // control enters the catch block, the exception origin information is
+ // lost and the debugger will stop the program at the point of the
+ // re-throw in this function -- instead of at the point of the original
+ // throw statement in the code under test. For this reason, we perform
+ // the check early, sacrificing the ability to affect Google Test's
+ // exception handling in the method where the exception is thrown.
+ if (internal::GetUnitTestImpl()->catch_exceptions()) {
+#if GTEST_HAS_EXCEPTIONS
+ try {
+ return HandleSehExceptionsInMethodIfSupported(object, method, location);
+ } catch (const internal::GoogleTestFailureException&) { // NOLINT
+ // This exception type can only be thrown by a failed Google
+ // Test assertion with the intention of letting another testing
+ // framework catch it. Therefore we just re-throw it.
+ throw;
+ } catch (const std::exception& e) { // NOLINT
+ internal::ReportFailureInUnknownLocation(
+ TestPartResult::kFatalFailure,
+ FormatCxxExceptionMessage(e.what(), location));
+ } catch (...) { // NOLINT
+ internal::ReportFailureInUnknownLocation(
+ TestPartResult::kFatalFailure,
+ FormatCxxExceptionMessage(NULL, location));
+ }
+ return static_cast<Result>(0);
+#else
+ return HandleSehExceptionsInMethodIfSupported(object, method, location);
+#endif // GTEST_HAS_EXCEPTIONS
+ } else {
+ return (object->*method)();
+ }
+}
+
+} // namespace internal
+
+// Runs the test and updates the test result.
+void Test::Run() {
+ if (!HasSameFixtureClass()) return;
+
+ internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+ internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
+ // We will run the test only if SetUp() was successful.
+ if (!HasFatalFailure()) {
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+ internal::HandleExceptionsInMethodIfSupported(
+ this, &Test::TestBody, "the test body");
+ }
+
+ // However, we want to clean up as much as possible. Hence we will
+ // always call TearDown(), even if SetUp() or the test body has
+ // failed.
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+ internal::HandleExceptionsInMethodIfSupported(
+ this, &Test::TearDown, "TearDown()");
+}
+
+// Returns true iff the current test has a fatal failure.
+bool Test::HasFatalFailure() {
+ return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
+}
+
+// Returns true iff the current test has a non-fatal failure.
+bool Test::HasNonfatalFailure() {
+ return internal::GetUnitTestImpl()->current_test_result()->
+ HasNonfatalFailure();
+}
+
+// class TestInfo
+
+// Constructs a TestInfo object. It assumes ownership of the test factory
+// object.
+TestInfo::TestInfo(const std::string& a_test_case_name,
+ const std::string& a_name,
+ const char* a_type_param,
+ const char* a_value_param,
+ internal::TypeId fixture_class_id,
+ internal::TestFactoryBase* factory)
+ : test_case_name_(a_test_case_name),
+ name_(a_name),
+ type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+ value_param_(a_value_param ? new std::string(a_value_param) : NULL),
+ fixture_class_id_(fixture_class_id),
+ should_run_(false),
+ is_disabled_(false),
+ matches_filter_(false),
+ factory_(factory),
+ result_() {}
+
+// Destructs a TestInfo object.
+TestInfo::~TestInfo() { delete factory_; }
+
+namespace internal {
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+// test_case_name: name of the test case
+// name: name of the test
+// type_param: the name of the test's type parameter, or NULL if
+// this is not a typed or a type-parameterized test.
+// value_param: text representation of the test's value parameter,
+// or NULL if this is not a value-parameterized test.
+// fixture_class_id: ID of the test fixture class
+// set_up_tc: pointer to the function that sets up the test case
+// tear_down_tc: pointer to the function that tears down the test case
+// factory: pointer to the factory that creates a test object.
+// The newly created TestInfo instance will assume
+// ownership of the factory object.
+TestInfo* MakeAndRegisterTestInfo(
+ const char* test_case_name,
+ const char* name,
+ const char* type_param,
+ const char* value_param,
+ TypeId fixture_class_id,
+ SetUpTestCaseFunc set_up_tc,
+ TearDownTestCaseFunc tear_down_tc,
+ TestFactoryBase* factory) {
+ TestInfo* const test_info =
+ new TestInfo(test_case_name, name, type_param, value_param,
+ fixture_class_id, factory);
+ GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
+ return test_info;
+}
+
+#if GTEST_HAS_PARAM_TEST
+void ReportInvalidTestCaseType(const char* test_case_name,
+ const char* file, int line) {
+ Message errors;
+ errors
+ << "Attempted redefinition of test case " << test_case_name << ".\n"
+ << "All tests in the same test case must use the same test fixture\n"
+ << "class. However, in test case " << test_case_name << ", you tried\n"
+ << "to define a test using a fixture class different from the one\n"
+ << "used earlier. This can happen if the two fixture classes are\n"
+ << "from different namespaces and have the same name. You should\n"
+ << "probably rename one of the classes to put the tests into different\n"
+ << "test cases.";
+
+ fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+ errors.GetString().c_str());
+}
+#endif // GTEST_HAS_PARAM_TEST
+
+} // namespace internal
+
+namespace {
+
+// A predicate that checks the test name of a TestInfo against a known
+// value.
+//
+// This is used for implementation of the TestCase class only. We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestNameIs is copyable.
+class TestNameIs {
+ public:
+ // Constructor.
+ //
+ // TestNameIs has NO default constructor.
+ explicit TestNameIs(const char* name)
+ : name_(name) {}
+
+ // Returns true iff the test name of test_info matches name_.
+ bool operator()(const TestInfo * test_info) const {
+ return test_info && test_info->name() == name_;
+ }
+
+ private:
+ std::string name_;
+};
+
+} // namespace
+
+namespace internal {
+
+// This method expands all parameterized tests registered with macros TEST_P
+// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
+// This will be done just once during the program runtime.
+void UnitTestImpl::RegisterParameterizedTests() {
+#if GTEST_HAS_PARAM_TEST
+ if (!parameterized_tests_registered_) {
+ parameterized_test_registry_.RegisterTests();
+ parameterized_tests_registered_ = true;
+ }
+#endif
+}
+
+} // namespace internal
+
+// Creates the test object, runs it, records its result, and then
+// deletes it.
+void TestInfo::Run() {
+ if (!should_run_) return;
+
+ // Tells UnitTest where to store test result.
+ internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+ impl->set_current_test_info(this);
+
+ TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+ // Notifies the unit test event listeners that a test is about to start.
+ repeater->OnTestStart(*this);
+
+ const TimeInMillis start = internal::GetTimeInMillis();
+
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+
+ // Creates the test object.
+ Test* const test = internal::HandleExceptionsInMethodIfSupported(
+ factory_, &internal::TestFactoryBase::CreateTest,
+ "the test fixture's constructor");
+
+ // Runs the test only if the test object was created and its
+ // constructor didn't generate a fatal failure.
+ if ((test != NULL) && !Test::HasFatalFailure()) {
+ // This doesn't throw as all user code that can throw are wrapped into
+ // exception handling code.
+ test->Run();
+ }
+
+ // Deletes the test object.
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+ internal::HandleExceptionsInMethodIfSupported(
+ test, &Test::DeleteSelf_, "the test fixture's destructor");
+
+ result_.set_elapsed_time(internal::GetTimeInMillis() - start);
+
+ // Notifies the unit test event listener that a test has just finished.
+ repeater->OnTestEnd(*this);
+
+ // Tells UnitTest to stop associating assertion results to this
+ // test.
+ impl->set_current_test_info(NULL);
+}
+
+// class TestCase
+
+// Gets the number of successful tests in this test case.
+int TestCase::successful_test_count() const {
+ return CountIf(test_info_list_, TestPassed);
+}
+
+// Gets the number of failed tests in this test case.
+int TestCase::failed_test_count() const {
+ return CountIf(test_info_list_, TestFailed);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int TestCase::reportable_disabled_test_count() const {
+ return CountIf(test_info_list_, TestReportableDisabled);
+}
+
+// Gets the number of disabled tests in this test case.
+int TestCase::disabled_test_count() const {
+ return CountIf(test_info_list_, TestDisabled);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int TestCase::reportable_test_count() const {
+ return CountIf(test_info_list_, TestReportable);
+}
+
+// Get the number of tests in this test case that should run.
+int TestCase::test_to_run_count() const {
+ return CountIf(test_info_list_, ShouldRunTest);
+}
+
+// Gets the number of all tests.
+int TestCase::total_test_count() const {
+ return static_cast<int>(test_info_list_.size());
+}
+
+// Creates a TestCase with the given name.
+//
+// Arguments:
+//
+// name: name of the test case
+// a_type_param: the name of the test case's type parameter, or NULL if
+// this is not a typed or a type-parameterized test case.
+// set_up_tc: pointer to the function that sets up the test case
+// tear_down_tc: pointer to the function that tears down the test case
+TestCase::TestCase(const char* a_name, const char* a_type_param,
+ Test::SetUpTestCaseFunc set_up_tc,
+ Test::TearDownTestCaseFunc tear_down_tc)
+ : name_(a_name),
+ type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+ set_up_tc_(set_up_tc),
+ tear_down_tc_(tear_down_tc),
+ should_run_(false),
+ elapsed_time_(0) {
+}
+
+// Destructor of TestCase.
+TestCase::~TestCase() {
+ // Deletes every Test in the collection.
+ ForEach(test_info_list_, internal::Delete<TestInfo>);
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+const TestInfo* TestCase::GetTestInfo(int i) const {
+ const int index = GetElementOr(test_indices_, i, -1);
+ return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+TestInfo* TestCase::GetMutableTestInfo(int i) {
+ const int index = GetElementOr(test_indices_, i, -1);
+ return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Adds a test to this test case. Will delete the test upon
+// destruction of the TestCase object.
+void TestCase::AddTestInfo(TestInfo * test_info) {
+ test_info_list_.push_back(test_info);
+ test_indices_.push_back(static_cast<int>(test_indices_.size()));
+}
+
+// Runs every test in this TestCase.
+void TestCase::Run() {
+ if (!should_run_) return;
+
+ internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+ impl->set_current_test_case(this);
+
+ TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+ repeater->OnTestCaseStart(*this);
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+ internal::HandleExceptionsInMethodIfSupported(
+ this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
+
+ const internal::TimeInMillis start = internal::GetTimeInMillis();
+ for (int i = 0; i < total_test_count(); i++) {
+ GetMutableTestInfo(i)->Run();
+ }
+ elapsed_time_ = internal::GetTimeInMillis() - start;
+
+ impl->os_stack_trace_getter()->UponLeavingGTest();
+ internal::HandleExceptionsInMethodIfSupported(
+ this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
+
+ repeater->OnTestCaseEnd(*this);
+ impl->set_current_test_case(NULL);
+}
+
+// Clears the results of all tests in this test case.
+void TestCase::ClearResult() {
+ ad_hoc_test_result_.Clear();
+ ForEach(test_info_list_, TestInfo::ClearTestResult);
+}
+
+// Shuffles the tests in this test case.
+void TestCase::ShuffleTests(internal::Random* random) {
+ Shuffle(random, &test_indices_);
+}
+
+// Restores the test order to before the first shuffle.
+void TestCase::UnshuffleTests() {
+ for (size_t i = 0; i < test_indices_.size(); i++) {
+ test_indices_[i] = static_cast<int>(i);
+ }
+}
+
+// Formats a countable noun. Depending on its quantity, either the
+// singular form or the plural form is used. e.g.
+//
+// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
+// FormatCountableNoun(5, "book", "books") returns "5 books".
+static std::string FormatCountableNoun(int count,
+ const char * singular_form,
+ const char * plural_form) {
+ return internal::StreamableToString(count) + " " +
+ (count == 1 ? singular_form : plural_form);
+}
+
+// Formats the count of tests.
+static std::string FormatTestCount(int test_count) {
+ return FormatCountableNoun(test_count, "test", "tests");
+}
+
+// Formats the count of test cases.
+static std::string FormatTestCaseCount(int test_case_count) {
+ return FormatCountableNoun(test_case_count, "test case", "test cases");
+}
+
+// Converts a TestPartResult::Type enum to human-friendly string
+// representation. Both kNonFatalFailure and kFatalFailure are translated
+// to "Failure", as the user usually doesn't care about the difference
+// between the two when viewing the test result.
+static const char * TestPartResultTypeToString(TestPartResult::Type type) {
+ switch (type) {
+ case TestPartResult::kSuccess:
+ return "Success";
+
+ case TestPartResult::kNonFatalFailure:
+ case TestPartResult::kFatalFailure:
+#ifdef _MSC_VER
+ return "error: ";
+#else
+ return "Failure\n";
+#endif
+ default:
+ return "Unknown result type";
+ }
+}
+
+namespace internal {
+
+// Prints a TestPartResult to an std::string.
+static std::string PrintTestPartResultToString(
+ const TestPartResult& test_part_result) {
+ return (Message()
+ << internal::FormatFileLocation(test_part_result.file_name(),
+ test_part_result.line_number())
+ << " " << TestPartResultTypeToString(test_part_result.type())
+ << test_part_result.message()).GetString();
+}
+
+// Prints a TestPartResult.
+static void PrintTestPartResult(const TestPartResult& test_part_result) {
+ const std::string& result =
+ PrintTestPartResultToString(test_part_result);
+ printf("%s\n", result.c_str());
+ fflush(stdout);
+ // If the test program runs in Visual Studio or a debugger, the
+ // following statements add the test part result message to the Output
+ // window such that the user can double-click on it to jump to the
+ // corresponding source code location; otherwise they do nothing.
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+ // We don't call OutputDebugString*() on Windows Mobile, as printing
+ // to stdout is done by OutputDebugString() there already - we don't
+ // want the same message printed twice.
+ ::OutputDebugStringA(result.c_str());
+ ::OutputDebugStringA("\n");
+#endif
+}
+
+// class PrettyUnitTestResultPrinter
+
+enum GTestColor {
+ COLOR_DEFAULT,
+ COLOR_RED,
+ COLOR_GREEN,
+ COLOR_YELLOW
+};
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns the character attribute for the given color.
+WORD GetColorAttribute(GTestColor color) {
+ switch (color) {
+ case COLOR_RED: return FOREGROUND_RED;
+ case COLOR_GREEN: return FOREGROUND_GREEN;
+ case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
+ default: return 0;
+ }
+}
+
+#else
+
+// Returns the ANSI color code for the given color. COLOR_DEFAULT is
+// an invalid input.
+const char* GetAnsiColorCode(GTestColor color) {
+ switch (color) {
+ case COLOR_RED: return "1";
+ case COLOR_GREEN: return "2";
+ case COLOR_YELLOW: return "3";
+ default: return NULL;
+ };
+}
+
+#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns true iff Google Test should use colors in the output.
+bool ShouldUseColor(bool stdout_is_tty) {
+ const char* const gtest_color = GTEST_FLAG(color).c_str();
+
+ if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
+#if GTEST_OS_WINDOWS
+ // On Windows the TERM variable is usually not set, but the
+ // console there does support colors.
+ return stdout_is_tty;
+#else
+ // On non-Windows platforms, we rely on the TERM variable.
+ const char* const term = posix::GetEnv("TERM");
+ const bool term_supports_color =
+ String::CStringEquals(term, "xterm") ||
+ String::CStringEquals(term, "xterm-color") ||
+ String::CStringEquals(term, "xterm-256color") ||
+ String::CStringEquals(term, "screen") ||
+ String::CStringEquals(term, "screen-256color") ||
+ String::CStringEquals(term, "linux") ||
+ String::CStringEquals(term, "cygwin");
+ return stdout_is_tty && term_supports_color;
+#endif // GTEST_OS_WINDOWS
+ }
+
+ return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
+ String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
+ String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
+ String::CStringEquals(gtest_color, "1");
+ // We take "yes", "true", "t", and "1" as meaning "yes". If the
+ // value is neither one of these nor "auto", we treat it as "no" to
+ // be conservative.
+}
+
+// Helpers for printing colored strings to stdout. Note that on Windows, we
+// cannot simply emit special characters and have the terminal change colors.
+// This routine must actually emit the characters rather than return a string
+// that would be colored when printed, as can be done on Linux.
+void ColoredPrintf(GTestColor color, const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS
+ const bool use_color = false;
+#else
+ static const bool in_color_mode =
+ ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
+ const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
+#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
+ // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
+
+ if (!use_color) {
+ vprintf(fmt, args);
+ va_end(args);
+ return;
+ }
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+ const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+
+ // Gets the current text color.
+ CONSOLE_SCREEN_BUFFER_INFO buffer_info;
+ GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
+ const WORD old_color_attrs = buffer_info.wAttributes;
+
+ // We need to flush the stream buffers into the console before each
+ // SetConsoleTextAttribute call lest it affect the text that is already
+ // printed but has not yet reached the console.
+ fflush(stdout);
+ SetConsoleTextAttribute(stdout_handle,
+ GetColorAttribute(color) | FOREGROUND_INTENSITY);
+ vprintf(fmt, args);
+
+ fflush(stdout);
+ // Restores the text color.
+ SetConsoleTextAttribute(stdout_handle, old_color_attrs);
+#else
+ printf("\033[0;3%sm", GetAnsiColorCode(color));
+ vprintf(fmt, args);
+ printf("\033[m"); // Resets the terminal to default.
+#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+ va_end(args);
+}
+
+// Text printed in Google Test's text output and --gunit_list_tests
+// output to label the type parameter and value parameter for a test.
+static const char kTypeParamLabel[] = "TypeParam";
+static const char kValueParamLabel[] = "GetParam()";
+
+void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
+ const char* const type_param = test_info.type_param();
+ const char* const value_param = test_info.value_param();
+
+ if (type_param != NULL || value_param != NULL) {
+ printf(", where ");
+ if (type_param != NULL) {
+ printf("%s = %s", kTypeParamLabel, type_param);
+ if (value_param != NULL)
+ printf(" and ");
+ }
+ if (value_param != NULL) {
+ printf("%s = %s", kValueParamLabel, value_param);
+ }
+ }
+}
+
+// This class implements the TestEventListener interface.
+//
+// Class PrettyUnitTestResultPrinter is copyable.
+class PrettyUnitTestResultPrinter : public TestEventListener {
+ public:
+ PrettyUnitTestResultPrinter() {}
+ static void PrintTestName(const char * test_case, const char * test) {
+ printf("%s.%s", test_case, test);
+ }
+
+ // The following methods override what's in the TestEventListener class.
+ virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+ virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+ virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+ virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+ virtual void OnTestCaseStart(const TestCase& test_case);
+ virtual void OnTestStart(const TestInfo& test_info);
+ virtual void OnTestPartResult(const TestPartResult& result);
+ virtual void OnTestEnd(const TestInfo& test_info);
+ virtual void OnTestCaseEnd(const TestCase& test_case);
+ virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+ virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+ virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+ virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+
+ private:
+ static void PrintFailedTests(const UnitTest& unit_test);
+};
+
+ // Fired before each iteration of tests starts.
+void PrettyUnitTestResultPrinter::OnTestIterationStart(
+ const UnitTest& unit_test, int iteration) {
+ if (GTEST_FLAG(repeat) != 1)
+ printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
+
+ const char* const filter = GTEST_FLAG(filter).c_str();
+
+ // Prints the filter if it's not *. This reminds the user that some
+ // tests may be skipped.
+ if (!String::CStringEquals(filter, kUniversalFilter)) {
+ ColoredPrintf(COLOR_YELLOW,
+ "Note: %s filter = %s\n", GTEST_NAME_, filter);
+ }
+
+ if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
+ const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
+ ColoredPrintf(COLOR_YELLOW,
+ "Note: This is test shard %d of %s.\n",
+ static_cast<int>(shard_index) + 1,
+ internal::posix::GetEnv(kTestTotalShards));
+ }
+
+ if (GTEST_FLAG(shuffle)) {
+ ColoredPrintf(COLOR_YELLOW,
+ "Note: Randomizing tests' orders with a seed of %d .\n",
+ unit_test.random_seed());
+ }
+
+ ColoredPrintf(COLOR_GREEN, "[==========] ");
+ printf("Running %s from %s.\n",
+ FormatTestCount(unit_test.test_to_run_count()).c_str(),
+ FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+ fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
+ const UnitTest& /*unit_test*/) {
+ ColoredPrintf(COLOR_GREEN, "[----------] ");
+ printf("Global test environment set-up.\n");
+ fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
+ const std::string counts =
+ FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+ ColoredPrintf(COLOR_GREEN, "[----------] ");
+ printf("%s from %s", counts.c_str(), test_case.name());
+ if (test_case.type_param() == NULL) {
+ printf("\n");
+ } else {
+ printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
+ }
+ fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
+ ColoredPrintf(COLOR_GREEN, "[ RUN ] ");
+ PrintTestName(test_info.test_case_name(), test_info.name());
+ printf("\n");
+ fflush(stdout);
+}
+
+// Called after an assertion failure.
+void PrettyUnitTestResultPrinter::OnTestPartResult(
+ const TestPartResult& result) {
+ // If the test part succeeded, we don't need to do anything.
+ if (result.type() == TestPartResult::kSuccess)
+ return;
+
+ // Print failure message from the assertion (e.g. expected this and got that).
+ PrintTestPartResult(result);
+ fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
+ if (test_info.result()->Passed()) {
+ ColoredPrintf(COLOR_GREEN, "[ OK ] ");
+ } else {
+ ColoredPrintf(COLOR_RED, "[ FAILED ] ");
+ }
+ PrintTestName(test_info.test_case_name(), test_info.name());
+ if (test_info.result()->Failed())
+ PrintFullTestCommentIfPresent(test_info);
+
+ if (GTEST_FLAG(print_time)) {
+ printf(" (%s ms)\n", internal::StreamableToString(
+ test_info.result()->elapsed_time()).c_str());
+ } else {
+ printf("\n");
+ }
+ fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
+ if (!GTEST_FLAG(print_time)) return;
+
+ const std::string counts =
+ FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+ ColoredPrintf(COLOR_GREEN, "[----------] ");
+ printf("%s from %s (%s ms total)\n\n",
+ counts.c_str(), test_case.name(),
+ internal::StreamableToString(test_case.elapsed_time()).c_str());
+ fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
+ const UnitTest& /*unit_test*/) {
+ ColoredPrintf(COLOR_GREEN, "[----------] ");
+ printf("Global test environment tear-down\n");
+ fflush(stdout);
+}
+
+// Internal helper for printing the list of failed tests.
+void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
+ const int failed_test_count = unit_test.failed_test_count();
+ if (failed_test_count == 0) {
+ return;
+ }
+
+ for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+ const TestCase& test_case = *unit_test.GetTestCase(i);
+ if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
+ continue;
+ }
+ for (int j = 0; j < test_case.total_test_count(); ++j) {
+ const TestInfo& test_info = *test_case.GetTestInfo(j);
+ if (!test_info.should_run() || test_info.result()->Passed()) {
+ continue;
+ }
+ ColoredPrintf(COLOR_RED, "[ FAILED ] ");
+ printf("%s.%s", test_case.name(), test_info.name());
+ PrintFullTestCommentIfPresent(test_info);
+ printf("\n");
+ }
+ }
+}
+
+void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+ int /*iteration*/) {
+ ColoredPrintf(COLOR_GREEN, "[==========] ");
+ printf("%s from %s ran.",
+ FormatTestCount(unit_test.test_to_run_count()).c_str(),
+ FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+ if (GTEST_FLAG(print_time)) {
+ printf(" (%s ms total)",
+ internal::StreamableToString(unit_test.elapsed_time()).c_str());
+ }
+ printf("\n");
+ ColoredPrintf(COLOR_GREEN, "[ PASSED ] ");
+ printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
+
+ int num_failures = unit_test.failed_test_count();
+ if (!unit_test.Passed()) {
+ const int failed_test_count = unit_test.failed_test_count();
+ ColoredPrintf(COLOR_RED, "[ FAILED ] ");
+ printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
+ PrintFailedTests(unit_test);
+ printf("\n%2d FAILED %s\n", num_failures,
+ num_failures == 1 ? "TEST" : "TESTS");
+ }
+
+ int num_disabled = unit_test.reportable_disabled_test_count();
+ if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
+ if (!num_failures) {
+ printf("\n"); // Add a spacer if no FAILURE banner is displayed.
+ }
+ ColoredPrintf(COLOR_YELLOW,
+ " YOU HAVE %d DISABLED %s\n\n",
+ num_disabled,
+ num_disabled == 1 ? "TEST" : "TESTS");
+ }
+ // Ensure that Google Test output is printed before, e.g., heapchecker output.
+ fflush(stdout);
+}
+
+// End PrettyUnitTestResultPrinter
+
+// class TestEventRepeater
+//
+// This class forwards events to other event listeners.
+class TestEventRepeater : public TestEventListener {
+ public:
+ TestEventRepeater() : forwarding_enabled_(true) {}
+ virtual ~TestEventRepeater();
+ void Append(TestEventListener *listener);
+ TestEventListener* Release(TestEventListener* listener);
+
+ // Controls whether events will be forwarded to listeners_. Set to false
+ // in death test child processes.
+ bool forwarding_enabled() const { return forwarding_enabled_; }
+ void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
+
+ virtual void OnTestProgramStart(const UnitTest& unit_test);
+ virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+ virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+ virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
+ virtual void OnTestCaseStart(const TestCase& test_case);
+ virtual void OnTestStart(const TestInfo& test_info);
+ virtual void OnTestPartResult(const TestPartResult& result);
+ virtual void OnTestEnd(const TestInfo& test_info);
+ virtual void OnTestCaseEnd(const TestCase& test_case);
+ virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+ virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
+ virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+ virtual void OnTestProgramEnd(const UnitTest& unit_test);
+
+ private:
+ // Controls whether events will be forwarded to listeners_. Set to false
+ // in death test child processes.
+ bool forwarding_enabled_;
+ // The list of listeners that receive events.
+ std::vector<TestEventListener*> listeners_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
+};
+
+TestEventRepeater::~TestEventRepeater() {
+ ForEach(listeners_, Delete<TestEventListener>);
+}
+
+void TestEventRepeater::Append(TestEventListener *listener) {
+ listeners_.push_back(listener);
+}
+
+// TODO(vladl at google.com): Factor the search functionality into Vector::Find.
+TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
+ for (size_t i = 0; i < listeners_.size(); ++i) {
+ if (listeners_[i] == listener) {
+ listeners_.erase(listeners_.begin() + i);
+ return listener;
+ }
+ }
+
+ return NULL;
+}
+
+// Since most methods are very similar, use macros to reduce boilerplate.
+// This defines a member that forwards the call to all listeners.
+#define GTEST_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+ if (forwarding_enabled_) { \
+ for (size_t i = 0; i < listeners_.size(); i++) { \
+ listeners_[i]->Name(parameter); \
+ } \
+ } \
+}
+// This defines a member that forwards the call to all listeners in reverse
+// order.
+#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+ if (forwarding_enabled_) { \
+ for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
+ listeners_[i]->Name(parameter); \
+ } \
+ } \
+}
+
+GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
+GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
+GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
+GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
+
+#undef GTEST_REPEATER_METHOD_
+#undef GTEST_REVERSE_REPEATER_METHOD_
+
+void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
+ int iteration) {
+ if (forwarding_enabled_) {
+ for (size_t i = 0; i < listeners_.size(); i++) {
+ listeners_[i]->OnTestIterationStart(unit_test, iteration);
+ }
+ }
+}
+
+void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
+ int iteration) {
+ if (forwarding_enabled_) {
+ for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
+ listeners_[i]->OnTestIterationEnd(unit_test, iteration);
+ }
+ }
+}
+
+// End TestEventRepeater
+
+// This class generates an XML output file.
+class XmlUnitTestResultPrinter : public EmptyTestEventListener {
+ public:
+ explicit XmlUnitTestResultPrinter(const char* output_file);
+
+ virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+
+ private:
+ // Is c a whitespace character that is normalized to a space character
+ // when it appears in an XML attribute value?
+ static bool IsNormalizableWhitespace(char c) {
+ return c == 0x9 || c == 0xA || c == 0xD;
+ }
+
+ // May c appear in a well-formed XML document?
+ static bool IsValidXmlCharacter(char c) {
+ return IsNormalizableWhitespace(c) || c >= 0x20;
+ }
+
+ // Returns an XML-escaped copy of the input string str. If
+ // is_attribute is true, the text is meant to appear as an attribute
+ // value, and normalizable whitespace is preserved by replacing it
+ // with character references.
+ static std::string EscapeXml(const std::string& str, bool is_attribute);
+
+ // Returns the given string with all characters invalid in XML removed.
+ static std::string RemoveInvalidXmlCharacters(const std::string& str);
+
+ // Convenience wrapper around EscapeXml when str is an attribute value.
+ static std::string EscapeXmlAttribute(const std::string& str) {
+ return EscapeXml(str, true);
+ }
+
+ // Convenience wrapper around EscapeXml when str is not an attribute value.
+ static std::string EscapeXmlText(const char* str) {
+ return EscapeXml(str, false);
+ }
+
+ // Verifies that the given attribute belongs to the given element and
+ // streams the attribute as XML.
+ static void OutputXmlAttribute(std::ostream* stream,
+ const std::string& element_name,
+ const std::string& name,
+ const std::string& value);
+
+ // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+ static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
+
+ // Streams an XML representation of a TestInfo object.
+ static void OutputXmlTestInfo(::std::ostream* stream,
+ const char* test_case_name,
+ const TestInfo& test_info);
+
+ // Prints an XML representation of a TestCase object
+ static void PrintXmlTestCase(::std::ostream* stream,
+ const TestCase& test_case);
+
+ // Prints an XML summary of unit_test to output stream out.
+ static void PrintXmlUnitTest(::std::ostream* stream,
+ const UnitTest& unit_test);
+
+ // Produces a string representing the test properties in a result as space
+ // delimited XML attributes based on the property key="value" pairs.
+ // When the std::string is not empty, it includes a space at the beginning,
+ // to delimit this attribute from prior attributes.
+ static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
+
+ // The output file.
+ const std::string output_file_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
+};
+
+// Creates a new XmlUnitTestResultPrinter.
+XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
+ : output_file_(output_file) {
+ if (output_file_.c_str() == NULL || output_file_.empty()) {
+ fprintf(stderr, "XML output file may not be null\n");
+ fflush(stderr);
+ exit(EXIT_FAILURE);
+ }
+}
+
+// Called after the unit test ends.
+void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+ int /*iteration*/) {
+ FILE* xmlout = NULL;
+ FilePath output_file(output_file_);
+ FilePath output_dir(output_file.RemoveFileName());
+
+ if (output_dir.CreateDirectoriesRecursively()) {
+ xmlout = posix::FOpen(output_file_.c_str(), "w");
+ }
+ if (xmlout == NULL) {
+ // TODO(wan): report the reason of the failure.
+ //
+ // We don't do it for now as:
+ //
+ // 1. There is no urgent need for it.
+ // 2. It's a bit involved to make the errno variable thread-safe on
+ // all three operating systems (Linux, Windows, and Mac OS).
+ // 3. To interpret the meaning of errno in a thread-safe way,
+ // we need the strerror_r() function, which is not available on
+ // Windows.
+ fprintf(stderr,
+ "Unable to open file \"%s\"\n",
+ output_file_.c_str());
+ fflush(stderr);
+ exit(EXIT_FAILURE);
+ }
+ std::stringstream stream;
+ PrintXmlUnitTest(&stream, unit_test);
+ fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
+ fclose(xmlout);
+}
+
+// Returns an XML-escaped copy of the input string str. If is_attribute
+// is true, the text is meant to appear as an attribute value, and
+// normalizable whitespace is preserved by replacing it with character
+// references.
+//
+// Invalid XML characters in str, if any, are stripped from the output.
+// It is expected that most, if not all, of the text processed by this
+// module will consist of ordinary English text.
+// If this module is ever modified to produce version 1.1 XML output,
+// most invalid characters can be retained using character references.
+// TODO(wan): It might be nice to have a minimally invasive, human-readable
+// escaping scheme for invalid characters, rather than dropping them.
+std::string XmlUnitTestResultPrinter::EscapeXml(
+ const std::string& str, bool is_attribute) {
+ Message m;
+
+ for (size_t i = 0; i < str.size(); ++i) {
+ const char ch = str[i];
+ switch (ch) {
+ case '<':
+ m << "<";
+ break;
+ case '>':
+ m << ">";
+ break;
+ case '&':
+ m << "&";
+ break;
+ case '\'':
+ if (is_attribute)
+ m << "'";
+ else
+ m << '\'';
+ break;
+ case '"':
+ if (is_attribute)
+ m << """;
+ else
+ m << '"';
+ break;
+ default:
+ if (IsValidXmlCharacter(ch)) {
+ if (is_attribute && IsNormalizableWhitespace(ch))
+ m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
+ << ";";
+ else
+ m << ch;
+ }
+ break;
+ }
+ }
+
+ return m.GetString();
+}
+
+// Returns the given string with all characters invalid in XML removed.
+// Currently invalid characters are dropped from the string. An
+// alternative is to replace them with certain characters such as . or ?.
+std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
+ const std::string& str) {
+ std::string output;
+ output.reserve(str.size());
+ for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
+ if (IsValidXmlCharacter(*it))
+ output.push_back(*it);
+
+ return output;
+}
+
+// The following routines generate an XML representation of a UnitTest
+// object.
+//
+// This is how Google Test concepts map to the DTD:
+//
+// <testsuites name="AllTests"> <-- corresponds to a UnitTest object
+// <testsuite name="testcase-name"> <-- corresponds to a TestCase object
+// <testcase name="test-name"> <-- corresponds to a TestInfo object
+// <failure message="...">...</failure>
+// <failure message="...">...</failure>
+// <failure message="...">...</failure>
+// <-- individual assertion failures
+// </testcase>
+// </testsuite>
+// </testsuites>
+
+// Formats the given time in milliseconds as seconds.
+std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
+ ::std::stringstream ss;
+ ss << ms/1000.0;
+ return ss.str();
+}
+
+// Converts the given epoch time in milliseconds to a date string in the ISO
+// 8601 format, without the timezone information.
+std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
+ // Using non-reentrant version as localtime_r is not portable.
+ time_t seconds = static_cast<time_t>(ms / 1000);
+#ifdef _MSC_VER
+# pragma warning(push) // Saves the current warning state.
+# pragma warning(disable:4996) // Temporarily disables warning 4996
+ // (function or variable may be unsafe).
+ const struct tm* const time_struct = localtime(&seconds); // NOLINT
+# pragma warning(pop) // Restores the warning state again.
+#else
+ const struct tm* const time_struct = localtime(&seconds); // NOLINT
+#endif
+ if (time_struct == NULL)
+ return ""; // Invalid ms value
+
+ // YYYY-MM-DDThh:mm:ss
+ return StreamableToString(time_struct->tm_year + 1900) + "-" +
+ String::FormatIntWidth2(time_struct->tm_mon + 1) + "-" +
+ String::FormatIntWidth2(time_struct->tm_mday) + "T" +
+ String::FormatIntWidth2(time_struct->tm_hour) + ":" +
+ String::FormatIntWidth2(time_struct->tm_min) + ":" +
+ String::FormatIntWidth2(time_struct->tm_sec);
+}
+
+// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
+ const char* data) {
+ const char* segment = data;
+ *stream << "<![CDATA[";
+ for (;;) {
+ const char* const next_segment = strstr(segment, "]]>");
+ if (next_segment != NULL) {
+ stream->write(
+ segment, static_cast<std::streamsize>(next_segment - segment));
+ *stream << "]]>]]><![CDATA[";
+ segment = next_segment + strlen("]]>");
+ } else {
+ *stream << segment;
+ break;
+ }
+ }
+ *stream << "]]>";
+}
+
+void XmlUnitTestResultPrinter::OutputXmlAttribute(
+ std::ostream* stream,
+ const std::string& element_name,
+ const std::string& name,
+ const std::string& value) {
+ const std::vector<std::string>& allowed_names =
+ GetReservedAttributesForElement(element_name);
+
+ GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
+ allowed_names.end())
+ << "Attribute " << name << " is not allowed for element <" << element_name
+ << ">.";
+
+ *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
+}
+
+// Prints an XML representation of a TestInfo object.
+// TODO(wan): There is also value in printing properties with the plain printer.
+void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
+ const char* test_case_name,
+ const TestInfo& test_info) {
+ const TestResult& result = *test_info.result();
+ const std::string kTestcase = "testcase";
+
+ *stream << " <testcase";
+ OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
+
+ if (test_info.value_param() != NULL) {
+ OutputXmlAttribute(stream, kTestcase, "value_param",
+ test_info.value_param());
+ }
+ if (test_info.type_param() != NULL) {
+ OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());
+ }
+
+ OutputXmlAttribute(stream, kTestcase, "status",
+ test_info.should_run() ? "run" : "notrun");
+ OutputXmlAttribute(stream, kTestcase, "time",
+ FormatTimeInMillisAsSeconds(result.elapsed_time()));
+ OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
+ *stream << TestPropertiesAsXmlAttributes(result);
+
+ int failures = 0;
+ for (int i = 0; i < result.total_part_count(); ++i) {
+ const TestPartResult& part = result.GetTestPartResult(i);
+ if (part.failed()) {
+ if (++failures == 1) {
+ *stream << ">\n";
+ }
+ const string location = internal::FormatCompilerIndependentFileLocation(
+ part.file_name(), part.line_number());
+ const string summary = location + "\n" + part.summary();
+ *stream << " <failure message=\""
+ << EscapeXmlAttribute(summary.c_str())
+ << "\" type=\"\">";
+ const string detail = location + "\n" + part.message();
+ OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
+ *stream << "</failure>\n";
+ }
+ }
+
+ if (failures == 0)
+ *stream << " />\n";
+ else
+ *stream << " </testcase>\n";
+}
+
+// Prints an XML representation of a TestCase object
+void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,
+ const TestCase& test_case) {
+ const std::string kTestsuite = "testsuite";
+ *stream << " <" << kTestsuite;
+ OutputXmlAttribute(stream, kTestsuite, "name", test_case.name());
+ OutputXmlAttribute(stream, kTestsuite, "tests",
+ StreamableToString(test_case.reportable_test_count()));
+ OutputXmlAttribute(stream, kTestsuite, "failures",
+ StreamableToString(test_case.failed_test_count()));
+ OutputXmlAttribute(
+ stream, kTestsuite, "disabled",
+ StreamableToString(test_case.reportable_disabled_test_count()));
+ OutputXmlAttribute(stream, kTestsuite, "errors", "0");
+ OutputXmlAttribute(stream, kTestsuite, "time",
+ FormatTimeInMillisAsSeconds(test_case.elapsed_time()));
+ *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result())
+ << ">\n";
+
+ for (int i = 0; i < test_case.total_test_count(); ++i) {
+ if (test_case.GetTestInfo(i)->is_reportable())
+ OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));
+ }
+ *stream << " </" << kTestsuite << ">\n";
+}
+
+// Prints an XML summary of unit_test to output stream out.
+void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
+ const UnitTest& unit_test) {
+ const std::string kTestsuites = "testsuites";
+
+ *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ *stream << "<" << kTestsuites;
+
+ OutputXmlAttribute(stream, kTestsuites, "tests",
+ StreamableToString(unit_test.reportable_test_count()));
+ OutputXmlAttribute(stream, kTestsuites, "failures",
+ StreamableToString(unit_test.failed_test_count()));
+ OutputXmlAttribute(
+ stream, kTestsuites, "disabled",
+ StreamableToString(unit_test.reportable_disabled_test_count()));
+ OutputXmlAttribute(stream, kTestsuites, "errors", "0");
+ OutputXmlAttribute(
+ stream, kTestsuites, "timestamp",
+ FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
+ OutputXmlAttribute(stream, kTestsuites, "time",
+ FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
+
+ if (GTEST_FLAG(shuffle)) {
+ OutputXmlAttribute(stream, kTestsuites, "random_seed",
+ StreamableToString(unit_test.random_seed()));
+ }
+
+ *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
+
+ OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
+ *stream << ">\n";
+
+ for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+ if (unit_test.GetTestCase(i)->reportable_test_count() > 0)
+ PrintXmlTestCase(stream, *unit_test.GetTestCase(i));
+ }
+ *stream << "</" << kTestsuites << ">\n";
+}
+
+// Produces a string representing the test properties in a result as space
+// delimited XML attributes based on the property key="value" pairs.
+std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
+ const TestResult& result) {
+ Message attributes;
+ for (int i = 0; i < result.test_property_count(); ++i) {
+ const TestProperty& property = result.GetTestProperty(i);
+ attributes << " " << property.key() << "="
+ << "\"" << EscapeXmlAttribute(property.value()) << "\"";
+ }
+ return attributes.GetString();
+}
+
+// End XmlUnitTestResultPrinter
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
+// replaces them by "%xx" where xx is their hexadecimal value. For
+// example, replaces "=" with "%3D". This algorithm is O(strlen(str))
+// in both time and space -- important as the input str may contain an
+// arbitrarily long test failure message and stack trace.
+string StreamingListener::UrlEncode(const char* str) {
+ string result;
+ result.reserve(strlen(str) + 1);
+ for (char ch = *str; ch != '\0'; ch = *++str) {
+ switch (ch) {
+ case '%':
+ case '=':
+ case '&':
+ case '\n':
+ result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
+ break;
+ default:
+ result.push_back(ch);
+ break;
+ }
+ }
+ return result;
+}
+
+void StreamingListener::SocketWriter::MakeConnection() {
+ GTEST_CHECK_(sockfd_ == -1)
+ << "MakeConnection() can't be called when there is already a connection.";
+
+ addrinfo hints;
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC; // To allow both IPv4 and IPv6 addresses.
+ hints.ai_socktype = SOCK_STREAM;
+ addrinfo* servinfo = NULL;
+
+ // Use the getaddrinfo() to get a linked list of IP addresses for
+ // the given host name.
+ const int error_num = getaddrinfo(
+ host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
+ if (error_num != 0) {
+ GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
+ << gai_strerror(error_num);
+ }
+
+ // Loop through all the results and connect to the first we can.
+ for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
+ cur_addr = cur_addr->ai_next) {
+ sockfd_ = socket(
+ cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
+ if (sockfd_ != -1) {
+ // Connect the client socket to the server socket.
+ if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
+ close(sockfd_);
+ sockfd_ = -1;
+ }
+ }
+ }
+
+ freeaddrinfo(servinfo); // all done with this structure
+
+ if (sockfd_ == -1) {
+ GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
+ << host_name_ << ":" << port_num_;
+ }
+}
+
+// End of class Streaming Listener
+#endif // GTEST_CAN_STREAM_RESULTS__
+
+// Class ScopedTrace
+
+// Pushes the given source file location and message onto a per-thread
+// trace stack maintained by Google Test.
+ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
+ GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+ TraceInfo trace;
+ trace.file = file;
+ trace.line = line;
+ trace.message = message.GetString();
+
+ UnitTest::GetInstance()->PushGTestTrace(trace);
+}
+
+// Pops the info pushed by the c'tor.
+ScopedTrace::~ScopedTrace()
+ GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+ UnitTest::GetInstance()->PopGTestTrace();
+}
+
+
+// class OsStackTraceGetter
+
+// Returns the current OS stack trace as an std::string. Parameters:
+//
+// max_depth - the maximum number of stack frames to be included
+// in the trace.
+// skip_count - the number of top frames to be skipped; doesn't count
+// against max_depth.
+//
+string OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
+ int /* skip_count */)
+ GTEST_LOCK_EXCLUDED_(mutex_) {
+ return "";
+}
+
+void OsStackTraceGetter::UponLeavingGTest()
+ GTEST_LOCK_EXCLUDED_(mutex_) {
+}
+
+const char* const
+OsStackTraceGetter::kElidedFramesMarker =
+ "... " GTEST_NAME_ " internal frames ...";
+
+// A helper class that creates the premature-exit file in its
+// constructor and deletes the file in its destructor.
+class ScopedPrematureExitFile {
+ public:
+ explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
+ : premature_exit_filepath_(premature_exit_filepath) {
+ // If a path to the premature-exit file is specified...
+ if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
+ // create the file with a single "0" character in it. I/O
+ // errors are ignored as there's nothing better we can do and we
+ // don't want to fail the test because of this.
+ FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
+ fwrite("0", 1, 1, pfile);
+ fclose(pfile);
+ }
+ }
+
+ ~ScopedPrematureExitFile() {
+ if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
+ remove(premature_exit_filepath_);
+ }
+ }
+
+ private:
+ const char* const premature_exit_filepath_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
+};
+
+} // namespace internal
+
+// class TestEventListeners
+
+TestEventListeners::TestEventListeners()
+ : repeater_(new internal::TestEventRepeater()),
+ default_result_printer_(NULL),
+ default_xml_generator_(NULL) {
+}
+
+TestEventListeners::~TestEventListeners() { delete repeater_; }
+
+// Returns the standard listener responsible for the default console
+// output. Can be removed from the listeners list to shut down default
+// console output. Note that removing this object from the listener list
+// with Release transfers its ownership to the user.
+void TestEventListeners::Append(TestEventListener* listener) {
+ repeater_->Append(listener);
+}
+
+// Removes the given event listener from the list and returns it. It then
+// becomes the caller's responsibility to delete the listener. Returns
+// NULL if the listener is not found in the list.
+TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
+ if (listener == default_result_printer_)
+ default_result_printer_ = NULL;
+ else if (listener == default_xml_generator_)
+ default_xml_generator_ = NULL;
+ return repeater_->Release(listener);
+}
+
+// Returns repeater that broadcasts the TestEventListener events to all
+// subscribers.
+TestEventListener* TestEventListeners::repeater() { return repeater_; }
+
+// Sets the default_result_printer attribute to the provided listener.
+// The listener is also added to the listener list and previous
+// default_result_printer is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
+ if (default_result_printer_ != listener) {
+ // It is an error to pass this method a listener that is already in the
+ // list.
+ delete Release(default_result_printer_);
+ default_result_printer_ = listener;
+ if (listener != NULL)
+ Append(listener);
+ }
+}
+
+// Sets the default_xml_generator attribute to the provided listener. The
+// listener is also added to the listener list and previous
+// default_xml_generator is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
+ if (default_xml_generator_ != listener) {
+ // It is an error to pass this method a listener that is already in the
+ // list.
+ delete Release(default_xml_generator_);
+ default_xml_generator_ = listener;
+ if (listener != NULL)
+ Append(listener);
+ }
+}
+
+// Controls whether events will be forwarded by the repeater to the
+// listeners in the list.
+bool TestEventListeners::EventForwardingEnabled() const {
+ return repeater_->forwarding_enabled();
+}
+
+void TestEventListeners::SuppressEventForwarding() {
+ repeater_->set_forwarding_enabled(false);
+}
+
+// class UnitTest
+
+// Gets the singleton UnitTest object. The first time this method is
+// called, a UnitTest object is constructed and returned. Consecutive
+// calls will return the same object.
+//
+// We don't protect this under mutex_ as a user is not supposed to
+// call this before main() starts, from which point on the return
+// value will never change.
+UnitTest* UnitTest::GetInstance() {
+ // When compiled with MSVC 7.1 in optimized mode, destroying the
+ // UnitTest object upon exiting the program messes up the exit code,
+ // causing successful tests to appear failed. We have to use a
+ // different implementation in this case to bypass the compiler bug.
+ // This implementation makes the compiler happy, at the cost of
+ // leaking the UnitTest object.
+
+ // CodeGear C++Builder insists on a public destructor for the
+ // default implementation. Use this implementation to keep good OO
+ // design with private destructor.
+
+#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+ static UnitTest* const instance = new UnitTest;
+ return instance;
+#else
+ static UnitTest instance;
+ return &instance;
+#endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+}
+
+// Gets the number of successful test cases.
+int UnitTest::successful_test_case_count() const {
+ return impl()->successful_test_case_count();
+}
+
+// Gets the number of failed test cases.
+int UnitTest::failed_test_case_count() const {
+ return impl()->failed_test_case_count();
+}
+
+// Gets the number of all test cases.
+int UnitTest::total_test_case_count() const {
+ return impl()->total_test_case_count();
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTest::test_case_to_run_count() const {
+ return impl()->test_case_to_run_count();
+}
+
+// Gets the number of successful tests.
+int UnitTest::successful_test_count() const {
+ return impl()->successful_test_count();
+}
+
+// Gets the number of failed tests.
+int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTest::reportable_disabled_test_count() const {
+ return impl()->reportable_disabled_test_count();
+}
+
+// Gets the number of disabled tests.
+int UnitTest::disabled_test_count() const {
+ return impl()->disabled_test_count();
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTest::reportable_test_count() const {
+ return impl()->reportable_test_count();
+}
+
+// Gets the number of all tests.
+int UnitTest::total_test_count() const { return impl()->total_test_count(); }
+
+// Gets the number of tests that should run.
+int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
+
+// Gets the time of the test program start, in ms from the start of the
+// UNIX epoch.
+internal::TimeInMillis UnitTest::start_timestamp() const {
+ return impl()->start_timestamp();
+}
+
+// Gets the elapsed time, in milliseconds.
+internal::TimeInMillis UnitTest::elapsed_time() const {
+ return impl()->elapsed_time();
+}
+
+// Returns true iff the unit test passed (i.e. all test cases passed).
+bool UnitTest::Passed() const { return impl()->Passed(); }
+
+// Returns true iff the unit test failed (i.e. some test case failed
+// or something outside of all tests failed).
+bool UnitTest::Failed() const { return impl()->Failed(); }
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+const TestCase* UnitTest::GetTestCase(int i) const {
+ return impl()->GetTestCase(i);
+}
+
+// Returns the TestResult containing information on test failures and
+// properties logged outside of individual test cases.
+const TestResult& UnitTest::ad_hoc_test_result() const {
+ return *impl()->ad_hoc_test_result();
+}
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+TestCase* UnitTest::GetMutableTestCase(int i) {
+ return impl()->GetMutableTestCase(i);
+}
+
+// Returns the list of event listeners that can be used to track events
+// inside Google Test.
+TestEventListeners& UnitTest::listeners() {
+ return *impl()->listeners();
+}
+
+// Registers and returns a global test environment. When a test
+// program is run, all global test environments will be set-up in the
+// order they were registered. After all tests in the program have
+// finished, all global test environments will be torn-down in the
+// *reverse* order they were registered.
+//
+// The UnitTest object takes ownership of the given environment.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+Environment* UnitTest::AddEnvironment(Environment* env) {
+ if (env == NULL) {
+ return NULL;
+ }
+
+ impl_->environments().push_back(env);
+ return env;
+}
+
+// Adds a TestPartResult to the current TestResult object. All Google Test
+// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
+// this to report their results. The user code should use the
+// assertion macros instead of calling this directly.
+void UnitTest::AddTestPartResult(
+ TestPartResult::Type result_type,
+ const char* file_name,
+ int line_number,
+ const std::string& message,
+ const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
+ Message msg;
+ msg << message;
+
+ internal::MutexLock lock(&mutex_);
+ if (impl_->gtest_trace_stack().size() > 0) {
+ msg << "\n" << GTEST_NAME_ << " trace:";
+
+ for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
+ i > 0; --i) {
+ const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
+ msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
+ << " " << trace.message;
+ }
+ }
+
+ if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
+ msg << internal::kStackTraceMarker << os_stack_trace;
+ }
+
+ const TestPartResult result =
+ TestPartResult(result_type, file_name, line_number,
+ msg.GetString().c_str());
+ impl_->GetTestPartResultReporterForCurrentThread()->
+ ReportTestPartResult(result);
+
+ if (result_type != TestPartResult::kSuccess) {
+ // gtest_break_on_failure takes precedence over
+ // gtest_throw_on_failure. This allows a user to set the latter
+ // in the code (perhaps in order to use Google Test assertions
+ // with another testing framework) and specify the former on the
+ // command line for debugging.
+ if (GTEST_FLAG(break_on_failure)) {
+#if GTEST_OS_WINDOWS
+ // Using DebugBreak on Windows allows gtest to still break into a debugger
+ // when a failure happens and both the --gtest_break_on_failure and
+ // the --gtest_catch_exceptions flags are specified.
+ DebugBreak();
+#else
+ // Dereference NULL through a volatile pointer to prevent the compiler
+ // from removing. We use this rather than abort() or __builtin_trap() for
+ // portability: Symbian doesn't implement abort() well, and some debuggers
+ // don't correctly trap abort().
+ *static_cast<volatile int*>(NULL) = 1;
+#endif // GTEST_OS_WINDOWS
+ } else if (GTEST_FLAG(throw_on_failure)) {
+#if GTEST_HAS_EXCEPTIONS
+ throw internal::GoogleTestFailureException(result);
+#else
+ // We cannot call abort() as it generates a pop-up in debug mode
+ // that cannot be suppressed in VC 7.1 or below.
+ exit(1);
+#endif
+ }
+ }
+}
+
+// Adds a TestProperty to the current TestResult object when invoked from
+// inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+// from SetUpTestCase or TearDownTestCase, or to the global property set
+// when invoked elsewhere. If the result already contains a property with
+// the same key, the value will be updated.
+void UnitTest::RecordProperty(const std::string& key,
+ const std::string& value) {
+ impl_->RecordProperty(TestProperty(key, value));
+}
+
+// Runs all tests in this UnitTest object and prints the result.
+// Returns 0 if successful, or 1 otherwise.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+int UnitTest::Run() {
+ const bool in_death_test_child_process =
+ internal::GTEST_FLAG(internal_run_death_test).length() > 0;
+
+ // Google Test implements this protocol for catching that a test
+ // program exits before returning control to Google Test:
+ //
+ // 1. Upon start, Google Test creates a file whose absolute path
+ // is specified by the environment variable
+ // TEST_PREMATURE_EXIT_FILE.
+ // 2. When Google Test has finished its work, it deletes the file.
+ //
+ // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
+ // running a Google-Test-based test program and check the existence
+ // of the file at the end of the test execution to see if it has
+ // exited prematurely.
+
+ // If we are in the child process of a death test, don't
+ // create/delete the premature exit file, as doing so is unnecessary
+ // and will confuse the parent process. Otherwise, create/delete
+ // the file upon entering/leaving this function. If the program
+ // somehow exits before this function has a chance to return, the
+ // premature-exit file will be left undeleted, causing a test runner
+ // that understands the premature-exit-file protocol to report the
+ // test as having failed.
+ const internal::ScopedPrematureExitFile premature_exit_file(
+ in_death_test_child_process ?
+ NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
+
+ // Captures the value of GTEST_FLAG(catch_exceptions). This value will be
+ // used for the duration of the program.
+ impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
+
+#if GTEST_HAS_SEH
+ // Either the user wants Google Test to catch exceptions thrown by the
+ // tests or this is executing in the context of death test child
+ // process. In either case the user does not want to see pop-up dialogs
+ // about crashes - they are expected.
+ if (impl()->catch_exceptions() || in_death_test_child_process) {
+# if !GTEST_OS_WINDOWS_MOBILE
+ // SetErrorMode doesn't exist on CE.
+ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
+ SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
+# endif // !GTEST_OS_WINDOWS_MOBILE
+
+# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
+ // Death test children can be terminated with _abort(). On Windows,
+ // _abort() can show a dialog with a warning message. This forces the
+ // abort message to go to stderr instead.
+ _set_error_mode(_OUT_TO_STDERR);
+# endif
+
+# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+ // In the debug version, Visual Studio pops up a separate dialog
+ // offering a choice to debug the aborted program. We need to suppress
+ // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
+ // executed. Google Test will notify the user of any unexpected
+ // failure via stderr.
+ //
+ // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
+ // Users of prior VC versions shall suffer the agony and pain of
+ // clicking through the countless debug dialogs.
+ // TODO(vladl at google.com): find a way to suppress the abort dialog() in the
+ // debug mode when compiled with VC 7.1 or lower.
+ if (!GTEST_FLAG(break_on_failure))
+ _set_abort_behavior(
+ 0x0, // Clear the following flags:
+ _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump.
+# endif
+ }
+#endif // GTEST_HAS_SEH
+
+ return internal::HandleExceptionsInMethodIfSupported(
+ impl(),
+ &internal::UnitTestImpl::RunAllTests,
+ "auxiliary test code (environments or event listeners)") ? 0 : 1;
+}
+
+// Returns the working directory when the first TEST() or TEST_F() was
+// executed.
+const char* UnitTest::original_working_dir() const {
+ return impl_->original_working_dir_.c_str();
+}
+
+// Returns the TestCase object for the test that's currently running,
+// or NULL if no test is running.
+const TestCase* UnitTest::current_test_case() const
+ GTEST_LOCK_EXCLUDED_(mutex_) {
+ internal::MutexLock lock(&mutex_);
+ return impl_->current_test_case();
+}
+
+// Returns the TestInfo object for the test that's currently running,
+// or NULL if no test is running.
+const TestInfo* UnitTest::current_test_info() const
+ GTEST_LOCK_EXCLUDED_(mutex_) {
+ internal::MutexLock lock(&mutex_);
+ return impl_->current_test_info();
+}
+
+// Returns the random seed used at the start of the current test run.
+int UnitTest::random_seed() const { return impl_->random_seed(); }
+
+#if GTEST_HAS_PARAM_TEST
+// Returns ParameterizedTestCaseRegistry object used to keep track of
+// value-parameterized tests and instantiate and register them.
+internal::ParameterizedTestCaseRegistry&
+ UnitTest::parameterized_test_registry()
+ GTEST_LOCK_EXCLUDED_(mutex_) {
+ return impl_->parameterized_test_registry();
+}
+#endif // GTEST_HAS_PARAM_TEST
+
+// Creates an empty UnitTest.
+UnitTest::UnitTest() {
+ impl_ = new internal::UnitTestImpl(this);
+}
+
+// Destructor of UnitTest.
+UnitTest::~UnitTest() {
+ delete impl_;
+}
+
+// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+// Google Test trace stack.
+void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
+ GTEST_LOCK_EXCLUDED_(mutex_) {
+ internal::MutexLock lock(&mutex_);
+ impl_->gtest_trace_stack().push_back(trace);
+}
+
+// Pops a trace from the per-thread Google Test trace stack.
+void UnitTest::PopGTestTrace()
+ GTEST_LOCK_EXCLUDED_(mutex_) {
+ internal::MutexLock lock(&mutex_);
+ impl_->gtest_trace_stack().pop_back();
+}
+
+namespace internal {
+
+UnitTestImpl::UnitTestImpl(UnitTest* parent)
+ : parent_(parent),
+#ifdef _MSC_VER
+# pragma warning(push) // Saves the current warning state.
+# pragma warning(disable:4355) // Temporarily disables warning 4355
+ // (using this in initializer).
+ default_global_test_part_result_reporter_(this),
+ default_per_thread_test_part_result_reporter_(this),
+# pragma warning(pop) // Restores the warning state again.
+#else
+ default_global_test_part_result_reporter_(this),
+ default_per_thread_test_part_result_reporter_(this),
+#endif // _MSC_VER
+ global_test_part_result_repoter_(
+ &default_global_test_part_result_reporter_),
+ per_thread_test_part_result_reporter_(
+ &default_per_thread_test_part_result_reporter_),
+#if GTEST_HAS_PARAM_TEST
+ parameterized_test_registry_(),
+ parameterized_tests_registered_(false),
+#endif // GTEST_HAS_PARAM_TEST
+ last_death_test_case_(-1),
+ current_test_case_(NULL),
+ current_test_info_(NULL),
+ ad_hoc_test_result_(),
+ os_stack_trace_getter_(NULL),
+ post_flag_parse_init_performed_(false),
+ random_seed_(0), // Will be overridden by the flag before first use.
+ random_(0), // Will be reseeded before first use.
+ start_timestamp_(0),
+ elapsed_time_(0),
+#if GTEST_HAS_DEATH_TEST
+ death_test_factory_(new DefaultDeathTestFactory),
+#endif
+ // Will be overridden by the flag before first use.
+ catch_exceptions_(false) {
+ listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
+}
+
+UnitTestImpl::~UnitTestImpl() {
+ // Deletes every TestCase.
+ ForEach(test_cases_, internal::Delete<TestCase>);
+
+ // Deletes every Environment.
+ ForEach(environments_, internal::Delete<Environment>);
+
+ delete os_stack_trace_getter_;
+}
+
+// Adds a TestProperty to the current TestResult object when invoked in a
+// context of a test, to current test case's ad_hoc_test_result when invoke
+// from SetUpTestCase/TearDownTestCase, or to the global property set
+// otherwise. If the result already contains a property with the same key,
+// the value will be updated.
+void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
+ std::string xml_element;
+ TestResult* test_result; // TestResult appropriate for property recording.
+
+ if (current_test_info_ != NULL) {
+ xml_element = "testcase";
+ test_result = &(current_test_info_->result_);
+ } else if (current_test_case_ != NULL) {
+ xml_element = "testsuite";
+ test_result = &(current_test_case_->ad_hoc_test_result_);
+ } else {
+ xml_element = "testsuites";
+ test_result = &ad_hoc_test_result_;
+ }
+ test_result->RecordProperty(xml_element, test_property);
+}
+
+#if GTEST_HAS_DEATH_TEST
+// Disables event forwarding if the control is currently in a death test
+// subprocess. Must not be called before InitGoogleTest.
+void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
+ if (internal_run_death_test_flag_.get() != NULL)
+ listeners()->SuppressEventForwarding();
+}
+#endif // GTEST_HAS_DEATH_TEST
+
+// Initializes event listeners performing XML output as specified by
+// UnitTestOptions. Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureXmlOutput() {
+ const std::string& output_format = UnitTestOptions::GetOutputFormat();
+ if (output_format == "xml") {
+ listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
+ UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
+ } else if (output_format != "") {
+ printf("WARNING: unrecognized output format \"%s\" ignored.\n",
+ output_format.c_str());
+ fflush(stdout);
+ }
+}
+
+#if GTEST_CAN_STREAM_RESULTS_
+// Initializes event listeners for streaming test results in string form.
+// Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureStreamingOutput() {
+ const std::string& target = GTEST_FLAG(stream_result_to);
+ if (!target.empty()) {
+ const size_t pos = target.find(':');
+ if (pos != std::string::npos) {
+ listeners()->Append(new StreamingListener(target.substr(0, pos),
+ target.substr(pos+1)));
+ } else {
+ printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
+ target.c_str());
+ fflush(stdout);
+ }
+ }
+}
+#endif // GTEST_CAN_STREAM_RESULTS_
+
+// Performs initialization dependent upon flag values obtained in
+// ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to
+// ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest
+// this function is also called from RunAllTests. Since this function can be
+// called more than once, it has to be idempotent.
+void UnitTestImpl::PostFlagParsingInit() {
+ // Ensures that this function does not execute more than once.
+ if (!post_flag_parse_init_performed_) {
+ post_flag_parse_init_performed_ = true;
+
+#if GTEST_HAS_DEATH_TEST
+ InitDeathTestSubprocessControlInfo();
+ SuppressTestEventsIfInSubprocess();
+#endif // GTEST_HAS_DEATH_TEST
+
+ // Registers parameterized tests. This makes parameterized tests
+ // available to the UnitTest reflection API without running
+ // RUN_ALL_TESTS.
+ RegisterParameterizedTests();
+
+ // Configures listeners for XML output. This makes it possible for users
+ // to shut down the default XML output before invoking RUN_ALL_TESTS.
+ ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+ // Configures listeners for streaming test results to the specified server.
+ ConfigureStreamingOutput();
+#endif // GTEST_CAN_STREAM_RESULTS_
+ }
+}
+
+// A predicate that checks the name of a TestCase against a known
+// value.
+//
+// This is used for implementation of the UnitTest class only. We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestCaseNameIs is copyable.
+class TestCaseNameIs {
+ public:
+ // Constructor.
+ explicit TestCaseNameIs(const std::string& name)
+ : name_(name) {}
+
+ // Returns true iff the name of test_case matches name_.
+ bool operator()(const TestCase* test_case) const {
+ return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
+ }
+
+ private:
+ std::string name_;
+};
+
+// Finds and returns a TestCase with the given name. If one doesn't
+// exist, creates one and returns it. It's the CALLER'S
+// RESPONSIBILITY to ensure that this function is only called WHEN THE
+// TESTS ARE NOT SHUFFLED.
+//
+// Arguments:
+//
+// test_case_name: name of the test case
+// type_param: the name of the test case's type parameter, or NULL if
+// this is not a typed or a type-parameterized test case.
+// set_up_tc: pointer to the function that sets up the test case
+// tear_down_tc: pointer to the function that tears down the test case
+TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
+ const char* type_param,
+ Test::SetUpTestCaseFunc set_up_tc,
+ Test::TearDownTestCaseFunc tear_down_tc) {
+ // Can we find a TestCase with the given name?
+ const std::vector<TestCase*>::const_iterator test_case =
+ std::find_if(test_cases_.begin(), test_cases_.end(),
+ TestCaseNameIs(test_case_name));
+
+ if (test_case != test_cases_.end())
+ return *test_case;
+
+ // No. Let's create one.
+ TestCase* const new_test_case =
+ new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
+
+ // Is this a death test case?
+ if (internal::UnitTestOptions::MatchesFilter(test_case_name,
+ kDeathTestCaseFilter)) {
+ // Yes. Inserts the test case after the last death test case
+ // defined so far. This only works when the test cases haven't
+ // been shuffled. Otherwise we may end up running a death test
+ // after a non-death test.
+ ++last_death_test_case_;
+ test_cases_.insert(test_cases_.begin() + last_death_test_case_,
+ new_test_case);
+ } else {
+ // No. Appends to the end of the list.
+ test_cases_.push_back(new_test_case);
+ }
+
+ test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
+ return new_test_case;
+}
+
+// Helpers for setting up / tearing down the given environment. They
+// are for use in the ForEach() function.
+static void SetUpEnvironment(Environment* env) { env->SetUp(); }
+static void TearDownEnvironment(Environment* env) { env->TearDown(); }
+
+// Runs all tests in this UnitTest object, prints the result, and
+// returns true if all tests are successful. If any exception is
+// thrown during a test, the test is considered to be failed, but the
+// rest of the tests will still be run.
+//
+// When parameterized tests are enabled, it expands and registers
+// parameterized tests first in RegisterParameterizedTests().
+// All other functions called from RunAllTests() may safely assume that
+// parameterized tests are ready to be counted and run.
+bool UnitTestImpl::RunAllTests() {
+ // Makes sure InitGoogleTest() was called.
+ if (!GTestIsInitialized()) {
+ printf("%s",
+ "\nThis test program did NOT call ::testing::InitGoogleTest "
+ "before calling RUN_ALL_TESTS(). Please fix it.\n");
+ return false;
+ }
+
+ // Do not run any test if the --help flag was specified.
+ if (g_help_flag)
+ return true;
+
+ // Repeats the call to the post-flag parsing initialization in case the
+ // user didn't call InitGoogleTest.
+ PostFlagParsingInit();
+
+ // Even if sharding is not on, test runners may want to use the
+ // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
+ // protocol.
+ internal::WriteToShardStatusFileIfNeeded();
+
+ // True iff we are in a subprocess for running a thread-safe-style
+ // death test.
+ bool in_subprocess_for_death_test = false;
+
+#if GTEST_HAS_DEATH_TEST
+ in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
+#endif // GTEST_HAS_DEATH_TEST
+
+ const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
+ in_subprocess_for_death_test);
+
+ // Compares the full test names with the filter to decide which
+ // tests to run.
+ const bool has_tests_to_run = FilterTests(should_shard
+ ? HONOR_SHARDING_PROTOCOL
+ : IGNORE_SHARDING_PROTOCOL) > 0;
+
+ // Lists the tests and exits if the --gtest_list_tests flag was specified.
+ if (GTEST_FLAG(list_tests)) {
+ // This must be called *after* FilterTests() has been called.
+ ListTestsMatchingFilter();
+ return true;
+ }
+
+ random_seed_ = GTEST_FLAG(shuffle) ?
+ GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
+
+ // True iff at least one test has failed.
+ bool failed = false;
+
+ TestEventListener* repeater = listeners()->repeater();
+
+ start_timestamp_ = GetTimeInMillis();
+ repeater->OnTestProgramStart(*parent_);
+
+ // How many times to repeat the tests? We don't want to repeat them
+ // when we are inside the subprocess of a death test.
+ const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
+ // Repeats forever if the repeat count is negative.
+ const bool forever = repeat < 0;
+ for (int i = 0; forever || i != repeat; i++) {
+ // We want to preserve failures generated by ad-hoc test
+ // assertions executed before RUN_ALL_TESTS().
+ ClearNonAdHocTestResult();
+
+ const TimeInMillis start = GetTimeInMillis();
+
+ // Shuffles test cases and tests if requested.
+ if (has_tests_to_run && GTEST_FLAG(shuffle)) {
+ random()->Reseed(random_seed_);
+ // This should be done before calling OnTestIterationStart(),
+ // such that a test event listener can see the actual test order
+ // in the event.
+ ShuffleTests();
+ }
+
+ // Tells the unit test event listeners that the tests are about to start.
+ repeater->OnTestIterationStart(*parent_, i);
+
+ // Runs each test case if there is at least one test to run.
+ if (has_tests_to_run) {
+ // Sets up all environments beforehand.
+ repeater->OnEnvironmentsSetUpStart(*parent_);
+ ForEach(environments_, SetUpEnvironment);
+ repeater->OnEnvironmentsSetUpEnd(*parent_);
+
+ // Runs the tests only if there was no fatal failure during global
+ // set-up.
+ if (!Test::HasFatalFailure()) {
+ for (int test_index = 0; test_index < total_test_case_count();
+ test_index++) {
+ GetMutableTestCase(test_index)->Run();
+ }
+ }
+
+ // Tears down all environments in reverse order afterwards.
+ repeater->OnEnvironmentsTearDownStart(*parent_);
+ std::for_each(environments_.rbegin(), environments_.rend(),
+ TearDownEnvironment);
+ repeater->OnEnvironmentsTearDownEnd(*parent_);
+ }
+
+ elapsed_time_ = GetTimeInMillis() - start;
+
+ // Tells the unit test event listener that the tests have just finished.
+ repeater->OnTestIterationEnd(*parent_, i);
+
+ // Gets the result and clears it.
+ if (!Passed()) {
+ failed = true;
+ }
+
+ // Restores the original test order after the iteration. This
+ // allows the user to quickly repro a failure that happens in the
+ // N-th iteration without repeating the first (N - 1) iterations.
+ // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
+ // case the user somehow changes the value of the flag somewhere
+ // (it's always safe to unshuffle the tests).
+ UnshuffleTests();
+
+ if (GTEST_FLAG(shuffle)) {
+ // Picks a new random seed for each iteration.
+ random_seed_ = GetNextRandomSeed(random_seed_);
+ }
+ }
+
+ repeater->OnTestProgramEnd(*parent_);
+
+ return !failed;
+}
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded() {
+ const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
+ if (test_shard_file != NULL) {
+ FILE* const file = posix::FOpen(test_shard_file, "w");
+ if (file == NULL) {
+ ColoredPrintf(COLOR_RED,
+ "Could not write to the test shard status file \"%s\" "
+ "specified by the %s environment variable.\n",
+ test_shard_file, kTestShardStatusFile);
+ fflush(stdout);
+ exit(EXIT_FAILURE);
+ }
+ fclose(file);
+ }
+}
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (i.e., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+bool ShouldShard(const char* total_shards_env,
+ const char* shard_index_env,
+ bool in_subprocess_for_death_test) {
+ if (in_subprocess_for_death_test) {
+ return false;
+ }
+
+ const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
+ const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
+
+ if (total_shards == -1 && shard_index == -1) {
+ return false;
+ } else if (total_shards == -1 && shard_index != -1) {
+ const Message msg = Message()
+ << "Invalid environment variables: you have "
+ << kTestShardIndex << " = " << shard_index
+ << ", but have left " << kTestTotalShards << " unset.\n";
+ ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+ fflush(stdout);
+ exit(EXIT_FAILURE);
+ } else if (total_shards != -1 && shard_index == -1) {
+ const Message msg = Message()
+ << "Invalid environment variables: you have "
+ << kTestTotalShards << " = " << total_shards
+ << ", but have left " << kTestShardIndex << " unset.\n";
+ ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+ fflush(stdout);
+ exit(EXIT_FAILURE);
+ } else if (shard_index < 0 || shard_index >= total_shards) {
+ const Message msg = Message()
+ << "Invalid environment variables: we require 0 <= "
+ << kTestShardIndex << " < " << kTestTotalShards
+ << ", but you have " << kTestShardIndex << "=" << shard_index
+ << ", " << kTestTotalShards << "=" << total_shards << ".\n";
+ ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+ fflush(stdout);
+ exit(EXIT_FAILURE);
+ }
+
+ return total_shards > 1;
+}
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error
+// and aborts.
+Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
+ const char* str_val = posix::GetEnv(var);
+ if (str_val == NULL) {
+ return default_val;
+ }
+
+ Int32 result;
+ if (!ParseInt32(Message() << "The value of environment variable " << var,
+ str_val, &result)) {
+ exit(EXIT_FAILURE);
+ }
+ return result;
+}
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
+ return (test_id % total_shards) == shard_index;
+}
+
+// Compares the name of each test with the user-specified filter to
+// decide whether the test should be run, then records the result in
+// each TestCase and TestInfo object.
+// If shard_tests == true, further filters tests based on sharding
+// variables in the environment - see
+// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
+// Returns the number of tests that should run.
+int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
+ const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
+ Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
+ const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
+ Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
+
+ // num_runnable_tests are the number of tests that will
+ // run across all shards (i.e., match filter and are not disabled).
+ // num_selected_tests are the number of tests to be run on
+ // this shard.
+ int num_runnable_tests = 0;
+ int num_selected_tests = 0;
+ for (size_t i = 0; i < test_cases_.size(); i++) {
+ TestCase* const test_case = test_cases_[i];
+ const std::string &test_case_name = test_case->name();
+ test_case->set_should_run(false);
+
+ for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+ TestInfo* const test_info = test_case->test_info_list()[j];
+ const std::string test_name(test_info->name());
+ // A test is disabled if test case name or test name matches
+ // kDisableTestFilter.
+ const bool is_disabled =
+ internal::UnitTestOptions::MatchesFilter(test_case_name,
+ kDisableTestFilter) ||
+ internal::UnitTestOptions::MatchesFilter(test_name,
+ kDisableTestFilter);
+ test_info->is_disabled_ = is_disabled;
+
+ const bool matches_filter =
+ internal::UnitTestOptions::FilterMatchesTest(test_case_name,
+ test_name);
+ test_info->matches_filter_ = matches_filter;
+
+ const bool is_runnable =
+ (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
+ matches_filter;
+
+ const bool is_selected = is_runnable &&
+ (shard_tests == IGNORE_SHARDING_PROTOCOL ||
+ ShouldRunTestOnShard(total_shards, shard_index,
+ num_runnable_tests));
+
+ num_runnable_tests += is_runnable;
+ num_selected_tests += is_selected;
+
+ test_info->should_run_ = is_selected;
+ test_case->set_should_run(test_case->should_run() || is_selected);
+ }
+ }
+ return num_selected_tests;
+}
+
+// Prints the given C-string on a single line by replacing all '\n'
+// characters with string "\\n". If the output takes more than
+// max_length characters, only prints the first max_length characters
+// and "...".
+static void PrintOnOneLine(const char* str, int max_length) {
+ if (str != NULL) {
+ for (int i = 0; *str != '\0'; ++str) {
+ if (i >= max_length) {
+ printf("...");
+ break;
+ }
+ if (*str == '\n') {
+ printf("\\n");
+ i += 2;
+ } else {
+ printf("%c", *str);
+ ++i;
+ }
+ }
+ }
+}
+
+// Prints the names of the tests matching the user-specified filter flag.
+void UnitTestImpl::ListTestsMatchingFilter() {
+ // Print at most this many characters for each type/value parameter.
+ const int kMaxParamLength = 250;
+
+ for (size_t i = 0; i < test_cases_.size(); i++) {
+ const TestCase* const test_case = test_cases_[i];
+ bool printed_test_case_name = false;
+
+ for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+ const TestInfo* const test_info =
+ test_case->test_info_list()[j];
+ if (test_info->matches_filter_) {
+ if (!printed_test_case_name) {
+ printed_test_case_name = true;
+ printf("%s.", test_case->name());
+ if (test_case->type_param() != NULL) {
+ printf(" # %s = ", kTypeParamLabel);
+ // We print the type parameter on a single line to make
+ // the output easy to parse by a program.
+ PrintOnOneLine(test_case->type_param(), kMaxParamLength);
+ }
+ printf("\n");
+ }
+ printf(" %s", test_info->name());
+ if (test_info->value_param() != NULL) {
+ printf(" # %s = ", kValueParamLabel);
+ // We print the value parameter on a single line to make the
+ // output easy to parse by a program.
+ PrintOnOneLine(test_info->value_param(), kMaxParamLength);
+ }
+ printf("\n");
+ }
+ }
+ }
+ fflush(stdout);
+}
+
+// Sets the OS stack trace getter.
+//
+// Does nothing if the input and the current OS stack trace getter are
+// the same; otherwise, deletes the old getter and makes the input the
+// current getter.
+void UnitTestImpl::set_os_stack_trace_getter(
+ OsStackTraceGetterInterface* getter) {
+ if (os_stack_trace_getter_ != getter) {
+ delete os_stack_trace_getter_;
+ os_stack_trace_getter_ = getter;
+ }
+}
+
+// Returns the current OS stack trace getter if it is not NULL;
+// otherwise, creates an OsStackTraceGetter, makes it the current
+// getter, and returns it.
+OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
+ if (os_stack_trace_getter_ == NULL) {
+ os_stack_trace_getter_ = new OsStackTraceGetter;
+ }
+
+ return os_stack_trace_getter_;
+}
+
+// Returns the TestResult for the test that's currently running, or
+// the TestResult for the ad hoc test if no test is running.
+TestResult* UnitTestImpl::current_test_result() {
+ return current_test_info_ ?
+ &(current_test_info_->result_) : &ad_hoc_test_result_;
+}
+
+// Shuffles all test cases, and the tests within each test case,
+// making sure that death tests are still run first.
+void UnitTestImpl::ShuffleTests() {
+ // Shuffles the death test cases.
+ ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
+
+ // Shuffles the non-death test cases.
+ ShuffleRange(random(), last_death_test_case_ + 1,
+ static_cast<int>(test_cases_.size()), &test_case_indices_);
+
+ // Shuffles the tests inside each test case.
+ for (size_t i = 0; i < test_cases_.size(); i++) {
+ test_cases_[i]->ShuffleTests(random());
+ }
+}
+
+// Restores the test cases and tests to their order before the first shuffle.
+void UnitTestImpl::UnshuffleTests() {
+ for (size_t i = 0; i < test_cases_.size(); i++) {
+ // Unshuffles the tests in each test case.
+ test_cases_[i]->UnshuffleTests();
+ // Resets the index of each test case.
+ test_case_indices_[i] = static_cast<int>(i);
+ }
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag. The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
+ int skip_count) {
+ // We pass skip_count + 1 to skip this wrapper function in addition
+ // to what the user really wants to skip.
+ return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
+}
+
+// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
+// suppress unreachable code warnings.
+namespace {
+class ClassUniqueToAlwaysTrue {};
+}
+
+bool IsTrue(bool condition) { return condition; }
+
+bool AlwaysTrue() {
+#if GTEST_HAS_EXCEPTIONS
+ // This condition is always false so AlwaysTrue() never actually throws,
+ // but it makes the compiler think that it may throw.
+ if (IsTrue(false))
+ throw ClassUniqueToAlwaysTrue();
+#endif // GTEST_HAS_EXCEPTIONS
+ return true;
+}
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false. None of pstr, *pstr, and prefix can be NULL.
+bool SkipPrefix(const char* prefix, const char** pstr) {
+ const size_t prefix_len = strlen(prefix);
+ if (strncmp(*pstr, prefix, prefix_len) == 0) {
+ *pstr += prefix_len;
+ return true;
+ }
+ return false;
+}
+
+// Parses a string as a command line flag. The string should have
+// the format "--flag=value". When def_optional is true, the "=value"
+// part can be omitted.
+//
+// Returns the value of the flag, or NULL if the parsing failed.
+const char* ParseFlagValue(const char* str,
+ const char* flag,
+ bool def_optional) {
+ // str and flag must not be NULL.
+ if (str == NULL || flag == NULL) return NULL;
+
+ // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
+ const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
+ const size_t flag_len = flag_str.length();
+ if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
+
+ // Skips the flag name.
+ const char* flag_end = str + flag_len;
+
+ // When def_optional is true, it's OK to not have a "=value" part.
+ if (def_optional && (flag_end[0] == '\0')) {
+ return flag_end;
+ }
+
+ // If def_optional is true and there are more characters after the
+ // flag name, or if def_optional is false, there must be a '=' after
+ // the flag name.
+ if (flag_end[0] != '=') return NULL;
+
+ // Returns the string after "=".
+ return flag_end + 1;
+}
+
+// Parses a string for a bool flag, in the form of either
+// "--flag=value" or "--flag".
+//
+// In the former case, the value is taken as true as long as it does
+// not start with '0', 'f', or 'F'.
+//
+// In the latter case, the value is taken as true.
+//
+// On success, stores the value of the flag in *value, and returns
+// true. On failure, returns false without changing *value.
+bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
+ // Gets the value of the flag as a string.
+ const char* const value_str = ParseFlagValue(str, flag, true);
+
+ // Aborts if the parsing failed.
+ if (value_str == NULL) return false;
+
+ // Converts the string value to a bool.
+ *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
+ return true;
+}
+
+// Parses a string for an Int32 flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true. On failure, returns false without changing *value.
+bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
+ // Gets the value of the flag as a string.
+ const char* const value_str = ParseFlagValue(str, flag, false);
+
+ // Aborts if the parsing failed.
+ if (value_str == NULL) return false;
+
+ // Sets *value to the value of the flag.
+ return ParseInt32(Message() << "The value of flag --" << flag,
+ value_str, value);
+}
+
+// Parses a string for a string flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true. On failure, returns false without changing *value.
+bool ParseStringFlag(const char* str, const char* flag, std::string* value) {
+ // Gets the value of the flag as a string.
+ const char* const value_str = ParseFlagValue(str, flag, false);
+
+ // Aborts if the parsing failed.
+ if (value_str == NULL) return false;
+
+ // Sets *value to the value of the flag.
+ *value = value_str;
+ return true;
+}
+
+// Determines whether a string has a prefix that Google Test uses for its
+// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
+// If Google Test detects that a command line flag has its prefix but is not
+// recognized, it will print its help message. Flags starting with
+// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
+// internal flags and do not trigger the help message.
+static bool HasGoogleTestFlagPrefix(const char* str) {
+ return (SkipPrefix("--", &str) ||
+ SkipPrefix("-", &str) ||
+ SkipPrefix("/", &str)) &&
+ !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
+ (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
+ SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
+}
+
+// Prints a string containing code-encoded text. The following escape
+// sequences can be used in the string to control the text color:
+//
+// @@ prints a single '@' character.
+// @R changes the color to red.
+// @G changes the color to green.
+// @Y changes the color to yellow.
+// @D changes to the default terminal text color.
+//
+// TODO(wan at google.com): Write tests for this once we add stdout
+// capturing to Google Test.
+static void PrintColorEncoded(const char* str) {
+ GTestColor color = COLOR_DEFAULT; // The current color.
+
+ // Conceptually, we split the string into segments divided by escape
+ // sequences. Then we print one segment at a time. At the end of
+ // each iteration, the str pointer advances to the beginning of the
+ // next segment.
+ for (;;) {
+ const char* p = strchr(str, '@');
+ if (p == NULL) {
+ ColoredPrintf(color, "%s", str);
+ return;
+ }
+
+ ColoredPrintf(color, "%s", std::string(str, p).c_str());
+
+ const char ch = p[1];
+ str = p + 2;
+ if (ch == '@') {
+ ColoredPrintf(color, "@");
+ } else if (ch == 'D') {
+ color = COLOR_DEFAULT;
+ } else if (ch == 'R') {
+ color = COLOR_RED;
+ } else if (ch == 'G') {
+ color = COLOR_GREEN;
+ } else if (ch == 'Y') {
+ color = COLOR_YELLOW;
+ } else {
+ --str;
+ }
+ }
+}
+
+static const char kColorEncodedHelpMessage[] =
+"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
+"following command line flags to control its behavior:\n"
+"\n"
+"Test Selection:\n"
+" @G--" GTEST_FLAG_PREFIX_ "list_tests at D\n"
+" List the names of all tests instead of running them. The name of\n"
+" TEST(Foo, Bar) is \"Foo.Bar\".\n"
+" @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
+ "[@G- at YNEGATIVE_PATTERNS]@D\n"
+" Run only the tests whose name matches one of the positive patterns but\n"
+" none of the negative patterns. '?' matches any single character; '*'\n"
+" matches any substring; ':' separates two patterns.\n"
+" @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests at D\n"
+" Run all disabled tests too.\n"
+"\n"
+"Test Execution:\n"
+" @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
+" Run the tests repeatedly; use a negative count to repeat forever.\n"
+" @G--" GTEST_FLAG_PREFIX_ "shuffle at D\n"
+" Randomize tests' orders on every iteration.\n"
+" @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
+" Random number seed to use for shuffling test orders (between 1 and\n"
+" 99999, or 0 to use a seed based on the current time).\n"
+"\n"
+"Test Output:\n"
+" @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes at Y|@Gno at Y|@Gauto at Y)@D\n"
+" Enable/disable colored output. The default is @Gauto at D.\n"
+" - at G-" GTEST_FLAG_PREFIX_ "print_time=0 at D\n"
+" Don't print the elapsed time of each test.\n"
+" @G--" GTEST_FLAG_PREFIX_ "output=xml at Y[@G:@YDIRECTORY_PATH at G"
+ GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
+" Generate an XML report in the given directory or with the given file\n"
+" name. @YFILE_PATH at D defaults to @Gtest_details.xml at D.\n"
+#if GTEST_CAN_STREAM_RESULTS_
+" @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST at G:@YPORT at D\n"
+" Stream test results to the given server.\n"
+#endif // GTEST_CAN_STREAM_RESULTS_
+"\n"
+"Assertion Behavior:\n"
+#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+" @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast at Y|@Gthreadsafe at Y)@D\n"
+" Set the default death test style.\n"
+#endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+" @G--" GTEST_FLAG_PREFIX_ "break_on_failure at D\n"
+" Turn assertion failures into debugger break-points.\n"
+" @G--" GTEST_FLAG_PREFIX_ "throw_on_failure at D\n"
+" Turn assertion failures into C++ exceptions.\n"
+" @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0 at D\n"
+" Do not report exceptions as test failures. Instead, allow them\n"
+" to crash the program or throw a pop-up (on Windows).\n"
+"\n"
+"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests at D, you can alternatively set "
+ "the corresponding\n"
+"environment variable of a flag (all letters in upper-case). For example, to\n"
+"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
+ "color=no at D or set\n"
+"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR at D environment variable to @Gno at D.\n"
+"\n"
+"For more information, please read the " GTEST_NAME_ " documentation at\n"
+"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
+"(not one in your own code or tests), please report it to\n"
+"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test. The type parameter CharType can be
+// instantiated to either char or wchar_t.
+template <typename CharType>
+void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
+ for (int i = 1; i < *argc; i++) {
+ const std::string arg_string = StreamableToString(argv[i]);
+ const char* const arg = arg_string.c_str();
+
+ using internal::ParseBoolFlag;
+ using internal::ParseInt32Flag;
+ using internal::ParseStringFlag;
+
+ // Do we see a Google Test flag?
+ if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
+ >EST_FLAG(also_run_disabled_tests)) ||
+ ParseBoolFlag(arg, kBreakOnFailureFlag,
+ >EST_FLAG(break_on_failure)) ||
+ ParseBoolFlag(arg, kCatchExceptionsFlag,
+ >EST_FLAG(catch_exceptions)) ||
+ ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) ||
+ ParseStringFlag(arg, kDeathTestStyleFlag,
+ >EST_FLAG(death_test_style)) ||
+ ParseBoolFlag(arg, kDeathTestUseFork,
+ >EST_FLAG(death_test_use_fork)) ||
+ ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) ||
+ ParseStringFlag(arg, kInternalRunDeathTestFlag,
+ >EST_FLAG(internal_run_death_test)) ||
+ ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) ||
+ ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) ||
+ ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) ||
+ ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) ||
+ ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) ||
+ ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) ||
+ ParseInt32Flag(arg, kStackTraceDepthFlag,
+ >EST_FLAG(stack_trace_depth)) ||
+ ParseStringFlag(arg, kStreamResultToFlag,
+ >EST_FLAG(stream_result_to)) ||
+ ParseBoolFlag(arg, kThrowOnFailureFlag,
+ >EST_FLAG(throw_on_failure))
+ ) {
+ // Yes. Shift the remainder of the argv list left by one. Note
+ // that argv has (*argc + 1) elements, the last one always being
+ // NULL. The following loop moves the trailing NULL element as
+ // well.
+ for (int j = i; j != *argc; j++) {
+ argv[j] = argv[j + 1];
+ }
+
+ // Decrements the argument count.
+ (*argc)--;
+
+ // We also need to decrement the iterator as we just removed
+ // an element.
+ i--;
+ } else if (arg_string == "--help" || arg_string == "-h" ||
+ arg_string == "-?" || arg_string == "/?" ||
+ HasGoogleTestFlagPrefix(arg)) {
+ // Both help flag and unrecognized Google Test flags (excluding
+ // internal ones) trigger help display.
+ g_help_flag = true;
+ }
+ }
+
+ if (g_help_flag) {
+ // We print the help here instead of in RUN_ALL_TESTS(), as the
+ // latter may not be called at all if the user is using Google
+ // Test with another testing framework.
+ PrintColorEncoded(kColorEncodedHelpMessage);
+ }
+}
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
+ ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
+ ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+
+// The internal implementation of InitGoogleTest().
+//
+// The type parameter CharType can be instantiated to either char or
+// wchar_t.
+template <typename CharType>
+void InitGoogleTestImpl(int* argc, CharType** argv) {
+ g_init_gtest_count++;
+
+ // We don't want to run the initialization code twice.
+ if (g_init_gtest_count != 1) return;
+
+ if (*argc <= 0) return;
+
+ internal::g_executable_path = internal::StreamableToString(argv[0]);
+
+#if GTEST_HAS_DEATH_TEST
+
+ g_argvs.clear();
+ for (int i = 0; i != *argc; i++) {
+ g_argvs.push_back(StreamableToString(argv[i]));
+ }
+
+#endif // GTEST_HAS_DEATH_TEST
+
+ ParseGoogleTestFlagsOnly(argc, argv);
+ GetUnitTestImpl()->PostFlagParsingInit();
+}
+
+} // namespace internal
+
+// Initializes Google Test. This must be called before calling
+// RUN_ALL_TESTS(). In particular, it parses a command line for the
+// flags that Google Test recognizes. Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned. Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+void InitGoogleTest(int* argc, char** argv) {
+ internal::InitGoogleTestImpl(argc, argv);
+}
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+void InitGoogleTest(int* argc, wchar_t** argv) {
+ internal::InitGoogleTestImpl(argc, argv);
+}
+
+} // namespace testing
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan), vladl at google.com (Vlad Losev)
+//
+// This file implements death tests.
+
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_OS_MAC
+# include <crt_externs.h>
+# endif // GTEST_OS_MAC
+
+# include <errno.h>
+# include <fcntl.h>
+# include <limits.h>
+
+# if GTEST_OS_LINUX
+# include <signal.h>
+# endif // GTEST_OS_LINUX
+
+# include <stdarg.h>
+
+# if GTEST_OS_WINDOWS
+# include <windows.h>
+# else
+# include <sys/mman.h>
+# include <sys/wait.h>
+# endif // GTEST_OS_WINDOWS
+
+# if GTEST_OS_QNX
+# include <spawn.h>
+# endif // GTEST_OS_QNX
+
+#endif // GTEST_HAS_DEATH_TEST
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation. It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error. This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+// Constants.
+
+// The default death test style.
+static const char kDefaultDeathTestStyle[] = "fast";
+
+GTEST_DEFINE_string_(
+ death_test_style,
+ internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
+ "Indicates how to run a death test in a forked child process: "
+ "\"threadsafe\" (child process re-executes the test binary "
+ "from the beginning, running only the specific death test) or "
+ "\"fast\" (child process runs the death test immediately "
+ "after forking).");
+
+GTEST_DEFINE_bool_(
+ death_test_use_fork,
+ internal::BoolFromGTestEnv("death_test_use_fork", false),
+ "Instructs to use fork()/_exit() instead of clone() in death tests. "
+ "Ignored and always uses fork() on POSIX systems where clone() is not "
+ "implemented. Useful when running under valgrind or similar tools if "
+ "those do not support clone(). Valgrind 3.3.1 will just fail if "
+ "it sees an unsupported combination of clone() flags. "
+ "It is not recommended to use this flag w/o valgrind though it will "
+ "work in 99% of the cases. Once valgrind is fixed, this flag will "
+ "most likely be removed.");
+
+namespace internal {
+GTEST_DEFINE_string_(
+ internal_run_death_test, "",
+ "Indicates the file, line number, temporal index of "
+ "the single death test to run, and a file descriptor to "
+ "which a success code may be sent, all separated by "
+ "the '|' characters. This flag is specified if and only if the current "
+ "process is a sub-process launched for running a thread-safe "
+ "death test. FOR INTERNAL USE ONLY.");
+} // namespace internal
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Valid only for fast death tests. Indicates the code is running in the
+// child process of a fast style death test.
+static bool g_in_fast_death_test_child = false;
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process. Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests. IMPORTANT: This is an internal utility. Using it may break the
+// implementation of death tests. User code MUST NOT use it.
+bool InDeathTestChild() {
+# if GTEST_OS_WINDOWS
+
+ // On Windows, death tests are thread-safe regardless of the value of the
+ // death_test_style flag.
+ return !GTEST_FLAG(internal_run_death_test).empty();
+
+# else
+
+ if (GTEST_FLAG(death_test_style) == "threadsafe")
+ return !GTEST_FLAG(internal_run_death_test).empty();
+ else
+ return g_in_fast_death_test_child;
+#endif
+}
+
+} // namespace internal
+
+// ExitedWithCode constructor.
+ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
+}
+
+// ExitedWithCode function-call operator.
+bool ExitedWithCode::operator()(int exit_status) const {
+# if GTEST_OS_WINDOWS
+
+ return exit_status == exit_code_;
+
+# else
+
+ return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
+
+# endif // GTEST_OS_WINDOWS
+}
+
+# if !GTEST_OS_WINDOWS
+// KilledBySignal constructor.
+KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
+}
+
+// KilledBySignal function-call operator.
+bool KilledBySignal::operator()(int exit_status) const {
+ return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
+}
+# endif // !GTEST_OS_WINDOWS
+
+namespace internal {
+
+// Utilities needed for death tests.
+
+// Generates a textual description of a given exit code, in the format
+// specified by wait(2).
+static std::string ExitSummary(int exit_code) {
+ Message m;
+
+# if GTEST_OS_WINDOWS
+
+ m << "Exited with exit status " << exit_code;
+
+# else
+
+ if (WIFEXITED(exit_code)) {
+ m << "Exited with exit status " << WEXITSTATUS(exit_code);
+ } else if (WIFSIGNALED(exit_code)) {
+ m << "Terminated by signal " << WTERMSIG(exit_code);
+ }
+# ifdef WCOREDUMP
+ if (WCOREDUMP(exit_code)) {
+ m << " (core dumped)";
+ }
+# endif
+# endif // GTEST_OS_WINDOWS
+
+ return m.GetString();
+}
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+bool ExitedUnsuccessfully(int exit_status) {
+ return !ExitedWithCode(0)(exit_status);
+}
+
+# if !GTEST_OS_WINDOWS
+// Generates a textual failure message when a death test finds more than
+// one thread running, or cannot determine the number of threads, prior
+// to executing the given statement. It is the responsibility of the
+// caller not to pass a thread_count of 1.
+static std::string DeathTestThreadWarning(size_t thread_count) {
+ Message msg;
+ msg << "Death tests use fork(), which is unsafe particularly"
+ << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
+ if (thread_count == 0)
+ msg << "couldn't detect the number of threads.";
+ else
+ msg << "detected " << thread_count << " threads.";
+ return msg.GetString();
+}
+# endif // !GTEST_OS_WINDOWS
+
+// Flag characters for reporting a death test that did not die.
+static const char kDeathTestLived = 'L';
+static const char kDeathTestReturned = 'R';
+static const char kDeathTestThrew = 'T';
+static const char kDeathTestInternalError = 'I';
+
+// An enumeration describing all of the possible ways that a death test can
+// conclude. DIED means that the process died while executing the test
+// code; LIVED means that process lived beyond the end of the test code;
+// RETURNED means that the test statement attempted to execute a return
+// statement, which is not allowed; THREW means that the test statement
+// returned control by throwing an exception. IN_PROGRESS means the test
+// has not yet concluded.
+// TODO(vladl at google.com): Unify names and possibly values for
+// AbortReason, DeathTestOutcome, and flag characters above.
+enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
+
+// Routine for aborting the program which is safe to call from an
+// exec-style death test child process, in which case the error
+// message is propagated back to the parent process. Otherwise, the
+// message is simply printed to stderr. In either case, the program
+// then exits with status 1.
+void DeathTestAbort(const std::string& message) {
+ // On a POSIX system, this function may be called from a threadsafe-style
+ // death test child process, which operates on a very small stack. Use
+ // the heap for any additional non-minuscule memory requirements.
+ const InternalRunDeathTestFlag* const flag =
+ GetUnitTestImpl()->internal_run_death_test_flag();
+ if (flag != NULL) {
+ FILE* parent = posix::FDOpen(flag->write_fd(), "w");
+ fputc(kDeathTestInternalError, parent);
+ fprintf(parent, "%s", message.c_str());
+ fflush(parent);
+ _exit(1);
+ } else {
+ fprintf(stderr, "%s", message.c_str());
+ fflush(stderr);
+ posix::Abort();
+ }
+}
+
+// A replacement for CHECK that calls DeathTestAbort if the assertion
+// fails.
+# define GTEST_DEATH_TEST_CHECK_(expression) \
+ do { \
+ if (!::testing::internal::IsTrue(expression)) { \
+ DeathTestAbort( \
+ ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
+ + ::testing::internal::StreamableToString(__LINE__) + ": " \
+ + #expression); \
+ } \
+ } while (::testing::internal::AlwaysFalse())
+
+// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
+// evaluating any system call that fulfills two conditions: it must return
+// -1 on failure, and set errno to EINTR when it is interrupted and
+// should be tried again. The macro expands to a loop that repeatedly
+// evaluates the expression as long as it evaluates to -1 and sets
+// errno to EINTR. If the expression evaluates to -1 but errno is
+// something other than EINTR, DeathTestAbort is called.
+# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
+ do { \
+ int gtest_retval; \
+ do { \
+ gtest_retval = (expression); \
+ } while (gtest_retval == -1 && errno == EINTR); \
+ if (gtest_retval == -1) { \
+ DeathTestAbort( \
+ ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
+ + ::testing::internal::StreamableToString(__LINE__) + ": " \
+ + #expression + " != -1"); \
+ } \
+ } while (::testing::internal::AlwaysFalse())
+
+// Returns the message describing the last system error in errno.
+std::string GetLastErrnoDescription() {
+ return errno == 0 ? "" : posix::StrError(errno);
+}
+
+// This is called from a death test parent process to read a failure
+// message from the death test child process and log it with the FATAL
+// severity. On Windows, the message is read from a pipe handle. On other
+// platforms, it is read from a file descriptor.
+static void FailFromInternalError(int fd) {
+ Message error;
+ char buffer[256];
+ int num_read;
+
+ do {
+ while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
+ buffer[num_read] = '\0';
+ error << buffer;
+ }
+ } while (num_read == -1 && errno == EINTR);
+
+ if (num_read == 0) {
+ GTEST_LOG_(FATAL) << error.GetString();
+ } else {
+ const int last_error = errno;
+ GTEST_LOG_(FATAL) << "Error while reading death test internal: "
+ << GetLastErrnoDescription() << " [" << last_error << "]";
+ }
+}
+
+// Death test constructor. Increments the running death test count
+// for the current test.
+DeathTest::DeathTest() {
+ TestInfo* const info = GetUnitTestImpl()->current_test_info();
+ if (info == NULL) {
+ DeathTestAbort("Cannot run a death test outside of a TEST or "
+ "TEST_F construct");
+ }
+}
+
+// Creates and returns a death test by dispatching to the current
+// death test factory.
+bool DeathTest::Create(const char* statement, const RE* regex,
+ const char* file, int line, DeathTest** test) {
+ return GetUnitTestImpl()->death_test_factory()->Create(
+ statement, regex, file, line, test);
+}
+
+const char* DeathTest::LastMessage() {
+ return last_death_test_message_.c_str();
+}
+
+void DeathTest::set_last_death_test_message(const std::string& message) {
+ last_death_test_message_ = message;
+}
+
+std::string DeathTest::last_death_test_message_;
+
+// Provides cross platform implementation for some death functionality.
+class DeathTestImpl : public DeathTest {
+ protected:
+ DeathTestImpl(const char* a_statement, const RE* a_regex)
+ : statement_(a_statement),
+ regex_(a_regex),
+ spawned_(false),
+ status_(-1),
+ outcome_(IN_PROGRESS),
+ read_fd_(-1),
+ write_fd_(-1) {}
+
+ // read_fd_ is expected to be closed and cleared by a derived class.
+ ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
+
+ void Abort(AbortReason reason);
+ virtual bool Passed(bool status_ok);
+
+ const char* statement() const { return statement_; }
+ const RE* regex() const { return regex_; }
+ bool spawned() const { return spawned_; }
+ void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
+ int status() const { return status_; }
+ void set_status(int a_status) { status_ = a_status; }
+ DeathTestOutcome outcome() const { return outcome_; }
+ void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
+ int read_fd() const { return read_fd_; }
+ void set_read_fd(int fd) { read_fd_ = fd; }
+ int write_fd() const { return write_fd_; }
+ void set_write_fd(int fd) { write_fd_ = fd; }
+
+ // Called in the parent process only. Reads the result code of the death
+ // test child process via a pipe, interprets it to set the outcome_
+ // member, and closes read_fd_. Outputs diagnostics and terminates in
+ // case of unexpected codes.
+ void ReadAndInterpretStatusByte();
+
+ private:
+ // The textual content of the code this object is testing. This class
+ // doesn't own this string and should not attempt to delete it.
+ const char* const statement_;
+ // The regular expression which test output must match. DeathTestImpl
+ // doesn't own this object and should not attempt to delete it.
+ const RE* const regex_;
+ // True if the death test child process has been successfully spawned.
+ bool spawned_;
+ // The exit status of the child process.
+ int status_;
+ // How the death test concluded.
+ DeathTestOutcome outcome_;
+ // Descriptor to the read end of the pipe to the child process. It is
+ // always -1 in the child process. The child keeps its write end of the
+ // pipe in write_fd_.
+ int read_fd_;
+ // Descriptor to the child's write end of the pipe to the parent process.
+ // It is always -1 in the parent process. The parent keeps its end of the
+ // pipe in read_fd_.
+ int write_fd_;
+};
+
+// Called in the parent process only. Reads the result code of the death
+// test child process via a pipe, interprets it to set the outcome_
+// member, and closes read_fd_. Outputs diagnostics and terminates in
+// case of unexpected codes.
+void DeathTestImpl::ReadAndInterpretStatusByte() {
+ char flag;
+ int bytes_read;
+
+ // The read() here blocks until data is available (signifying the
+ // failure of the death test) or until the pipe is closed (signifying
+ // its success), so it's okay to call this in the parent before
+ // the child process has exited.
+ do {
+ bytes_read = posix::Read(read_fd(), &flag, 1);
+ } while (bytes_read == -1 && errno == EINTR);
+
+ if (bytes_read == 0) {
+ set_outcome(DIED);
+ } else if (bytes_read == 1) {
+ switch (flag) {
+ case kDeathTestReturned:
+ set_outcome(RETURNED);
+ break;
+ case kDeathTestThrew:
+ set_outcome(THREW);
+ break;
+ case kDeathTestLived:
+ set_outcome(LIVED);
+ break;
+ case kDeathTestInternalError:
+ FailFromInternalError(read_fd()); // Does not return.
+ break;
+ default:
+ GTEST_LOG_(FATAL) << "Death test child process reported "
+ << "unexpected status byte ("
+ << static_cast<unsigned int>(flag) << ")";
+ }
+ } else {
+ GTEST_LOG_(FATAL) << "Read from death test child process failed: "
+ << GetLastErrnoDescription();
+ }
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
+ set_read_fd(-1);
+}
+
+// Signals that the death test code which should have exited, didn't.
+// Should be called only in a death test child process.
+// Writes a status byte to the child's status file descriptor, then
+// calls _exit(1).
+void DeathTestImpl::Abort(AbortReason reason) {
+ // The parent process considers the death test to be a failure if
+ // it finds any data in our pipe. So, here we write a single flag byte
+ // to the pipe, then exit.
+ const char status_ch =
+ reason == TEST_DID_NOT_DIE ? kDeathTestLived :
+ reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
+
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
+ // We are leaking the descriptor here because on some platforms (i.e.,
+ // when built as Windows DLL), destructors of global objects will still
+ // run after calling _exit(). On such systems, write_fd_ will be
+ // indirectly closed from the destructor of UnitTestImpl, causing double
+ // close if it is also closed here. On debug configurations, double close
+ // may assert. As there are no in-process buffers to flush here, we are
+ // relying on the OS to close the descriptor after the process terminates
+ // when the destructors are not run.
+ _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash)
+}
+
+// Returns an indented copy of stderr output for a death test.
+// This makes distinguishing death test output lines from regular log lines
+// much easier.
+static ::std::string FormatDeathTestOutput(const ::std::string& output) {
+ ::std::string ret;
+ for (size_t at = 0; ; ) {
+ const size_t line_end = output.find('\n', at);
+ ret += "[ DEATH ] ";
+ if (line_end == ::std::string::npos) {
+ ret += output.substr(at);
+ break;
+ }
+ ret += output.substr(at, line_end + 1 - at);
+ at = line_end + 1;
+ }
+ return ret;
+}
+
+// Assesses the success or failure of a death test, using both private
+// members which have previously been set, and one argument:
+//
+// Private data members:
+// outcome: An enumeration describing how the death test
+// concluded: DIED, LIVED, THREW, or RETURNED. The death test
+// fails in the latter three cases.
+// status: The exit status of the child process. On *nix, it is in the
+// in the format specified by wait(2). On Windows, this is the
+// value supplied to the ExitProcess() API or a numeric code
+// of the exception that terminated the program.
+// regex: A regular expression object to be applied to
+// the test's captured standard error output; the death test
+// fails if it does not match.
+//
+// Argument:
+// status_ok: true if exit_status is acceptable in the context of
+// this particular death test, which fails if it is false
+//
+// Returns true iff all of the above conditions are met. Otherwise, the
+// first failing condition, in the order given above, is the one that is
+// reported. Also sets the last death test message string.
+bool DeathTestImpl::Passed(bool status_ok) {
+ if (!spawned())
+ return false;
+
+ const std::string error_message = GetCapturedStderr();
+
+ bool success = false;
+ Message buffer;
+
+ buffer << "Death test: " << statement() << "\n";
+ switch (outcome()) {
+ case LIVED:
+ buffer << " Result: failed to die.\n"
+ << " Error msg:\n" << FormatDeathTestOutput(error_message);
+ break;
+ case THREW:
+ buffer << " Result: threw an exception.\n"
+ << " Error msg:\n" << FormatDeathTestOutput(error_message);
+ break;
+ case RETURNED:
+ buffer << " Result: illegal return in test statement.\n"
+ << " Error msg:\n" << FormatDeathTestOutput(error_message);
+ break;
+ case DIED:
+ if (status_ok) {
+ const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
+ if (matched) {
+ success = true;
+ } else {
+ buffer << " Result: died but not with expected error.\n"
+ << " Expected: " << regex()->pattern() << "\n"
+ << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+ }
+ } else {
+ buffer << " Result: died but not with expected exit code:\n"
+ << " " << ExitSummary(status()) << "\n"
+ << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+ }
+ break;
+ case IN_PROGRESS:
+ default:
+ GTEST_LOG_(FATAL)
+ << "DeathTest::Passed somehow called before conclusion of test";
+ }
+
+ DeathTest::set_last_death_test_message(buffer.GetString());
+ return success;
+}
+
+# if GTEST_OS_WINDOWS
+// WindowsDeathTest implements death tests on Windows. Due to the
+// specifics of starting new processes on Windows, death tests there are
+// always threadsafe, and Google Test considers the
+// --gtest_death_test_style=fast setting to be equivalent to
+// --gtest_death_test_style=threadsafe there.
+//
+// A few implementation notes: Like the Linux version, the Windows
+// implementation uses pipes for child-to-parent communication. But due to
+// the specifics of pipes on Windows, some extra steps are required:
+//
+// 1. The parent creates a communication pipe and stores handles to both
+// ends of it.
+// 2. The parent starts the child and provides it with the information
+// necessary to acquire the handle to the write end of the pipe.
+// 3. The child acquires the write end of the pipe and signals the parent
+// using a Windows event.
+// 4. Now the parent can release the write end of the pipe on its side. If
+// this is done before step 3, the object's reference count goes down to
+// 0 and it is destroyed, preventing the child from acquiring it. The
+// parent now has to release it, or read operations on the read end of
+// the pipe will not return when the child terminates.
+// 5. The parent reads child's output through the pipe (outcome code and
+// any possible error messages) from the pipe, and its stderr and then
+// determines whether to fail the test.
+//
+// Note: to distinguish Win32 API calls from the local method and function
+// calls, the former are explicitly resolved in the global namespace.
+//
+class WindowsDeathTest : public DeathTestImpl {
+ public:
+ WindowsDeathTest(const char* a_statement,
+ const RE* a_regex,
+ const char* file,
+ int line)
+ : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
+
+ // All of these virtual functions are inherited from DeathTest.
+ virtual int Wait();
+ virtual TestRole AssumeRole();
+
+ private:
+ // The name of the file in which the death test is located.
+ const char* const file_;
+ // The line number on which the death test is located.
+ const int line_;
+ // Handle to the write end of the pipe to the child process.
+ AutoHandle write_handle_;
+ // Child process handle.
+ AutoHandle child_handle_;
+ // Event the child process uses to signal the parent that it has
+ // acquired the handle to the write end of the pipe. After seeing this
+ // event the parent can release its own handles to make sure its
+ // ReadFile() calls return when the child terminates.
+ AutoHandle event_handle_;
+};
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists. As a side effect, sets the
+// outcome data member.
+int WindowsDeathTest::Wait() {
+ if (!spawned())
+ return 0;
+
+ // Wait until the child either signals that it has acquired the write end
+ // of the pipe or it dies.
+ const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
+ switch (::WaitForMultipleObjects(2,
+ wait_handles,
+ FALSE, // Waits for any of the handles.
+ INFINITE)) {
+ case WAIT_OBJECT_0:
+ case WAIT_OBJECT_0 + 1:
+ break;
+ default:
+ GTEST_DEATH_TEST_CHECK_(false); // Should not get here.
+ }
+
+ // The child has acquired the write end of the pipe or exited.
+ // We release the handle on our side and continue.
+ write_handle_.Reset();
+ event_handle_.Reset();
+
+ ReadAndInterpretStatusByte();
+
+ // Waits for the child process to exit if it haven't already. This
+ // returns immediately if the child has already exited, regardless of
+ // whether previous calls to WaitForMultipleObjects synchronized on this
+ // handle or not.
+ GTEST_DEATH_TEST_CHECK_(
+ WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
+ INFINITE));
+ DWORD status_code;
+ GTEST_DEATH_TEST_CHECK_(
+ ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
+ child_handle_.Reset();
+ set_status(static_cast<int>(status_code));
+ return status();
+}
+
+// The AssumeRole process for a Windows death test. It creates a child
+// process with the same executable as the current process to run the
+// death test. The child process is given the --gtest_filter and
+// --gtest_internal_run_death_test flags such that it knows to run the
+// current death test only.
+DeathTest::TestRole WindowsDeathTest::AssumeRole() {
+ const UnitTestImpl* const impl = GetUnitTestImpl();
+ const InternalRunDeathTestFlag* const flag =
+ impl->internal_run_death_test_flag();
+ const TestInfo* const info = impl->current_test_info();
+ const int death_test_index = info->result()->death_test_count();
+
+ if (flag != NULL) {
+ // ParseInternalRunDeathTestFlag() has performed all the necessary
+ // processing.
+ set_write_fd(flag->write_fd());
+ return EXECUTE_TEST;
+ }
+
+ // WindowsDeathTest uses an anonymous pipe to communicate results of
+ // a death test.
+ SECURITY_ATTRIBUTES handles_are_inheritable = {
+ sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
+ HANDLE read_handle, write_handle;
+ GTEST_DEATH_TEST_CHECK_(
+ ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
+ 0) // Default buffer size.
+ != FALSE);
+ set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
+ O_RDONLY));
+ write_handle_.Reset(write_handle);
+ event_handle_.Reset(::CreateEvent(
+ &handles_are_inheritable,
+ TRUE, // The event will automatically reset to non-signaled state.
+ FALSE, // The initial state is non-signalled.
+ NULL)); // The even is unnamed.
+ GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
+ const std::string filter_flag =
+ std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +
+ info->test_case_name() + "." + info->name();
+ const std::string internal_flag =
+ std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
+ "=" + file_ + "|" + StreamableToString(line_) + "|" +
+ StreamableToString(death_test_index) + "|" +
+ StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
+ // size_t has the same width as pointers on both 32-bit and 64-bit
+ // Windows platforms.
+ // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
+ "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
+ "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
+
+ char executable_path[_MAX_PATH + 1]; // NOLINT
+ GTEST_DEATH_TEST_CHECK_(
+ _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
+ executable_path,
+ _MAX_PATH));
+
+ std::string command_line =
+ std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
+ internal_flag + "\"";
+
+ DeathTest::set_last_death_test_message("");
+
+ CaptureStderr();
+ // Flush the log buffers since the log streams are shared with the child.
+ FlushInfoLog();
+
+ // The child process will share the standard handles with the parent.
+ STARTUPINFOA startup_info;
+ memset(&startup_info, 0, sizeof(STARTUPINFO));
+ startup_info.dwFlags = STARTF_USESTDHANDLES;
+ startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
+ startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
+ startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
+
+ PROCESS_INFORMATION process_info;
+ GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
+ executable_path,
+ const_cast<char*>(command_line.c_str()),
+ NULL, // Retuned process handle is not inheritable.
+ NULL, // Retuned thread handle is not inheritable.
+ TRUE, // Child inherits all inheritable handles (for write_handle_).
+ 0x0, // Default creation flags.
+ NULL, // Inherit the parent's environment.
+ UnitTest::GetInstance()->original_working_dir(),
+ &startup_info,
+ &process_info) != FALSE);
+ child_handle_.Reset(process_info.hProcess);
+ ::CloseHandle(process_info.hThread);
+ set_spawned(true);
+ return OVERSEE_TEST;
+}
+# else // We are not on Windows.
+
+// ForkingDeathTest provides implementations for most of the abstract
+// methods of the DeathTest interface. Only the AssumeRole method is
+// left undefined.
+class ForkingDeathTest : public DeathTestImpl {
+ public:
+ ForkingDeathTest(const char* statement, const RE* regex);
+
+ // All of these virtual functions are inherited from DeathTest.
+ virtual int Wait();
+
+ protected:
+ void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
+
+ private:
+ // PID of child process during death test; 0 in the child process itself.
+ pid_t child_pid_;
+};
+
+// Constructs a ForkingDeathTest.
+ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
+ : DeathTestImpl(a_statement, a_regex),
+ child_pid_(-1) {}
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists. As a side effect, sets the
+// outcome data member.
+int ForkingDeathTest::Wait() {
+ if (!spawned())
+ return 0;
+
+ ReadAndInterpretStatusByte();
+
+ int status_value;
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
+ set_status(status_value);
+ return status_value;
+}
+
+// A concrete death test class that forks, then immediately runs the test
+// in the child process.
+class NoExecDeathTest : public ForkingDeathTest {
+ public:
+ NoExecDeathTest(const char* a_statement, const RE* a_regex) :
+ ForkingDeathTest(a_statement, a_regex) { }
+ virtual TestRole AssumeRole();
+};
+
+// The AssumeRole process for a fork-and-run death test. It implements a
+// straightforward fork, with a simple pipe to transmit the status byte.
+DeathTest::TestRole NoExecDeathTest::AssumeRole() {
+ const size_t thread_count = GetThreadCount();
+ if (thread_count != 1) {
+ GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
+ }
+
+ int pipe_fd[2];
+ GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+
+ DeathTest::set_last_death_test_message("");
+ CaptureStderr();
+ // When we fork the process below, the log file buffers are copied, but the
+ // file descriptors are shared. We flush all log files here so that closing
+ // the file descriptors in the child process doesn't throw off the
+ // synchronization between descriptors and buffers in the parent process.
+ // This is as close to the fork as possible to avoid a race condition in case
+ // there are multiple threads running before the death test, and another
+ // thread writes to the log file.
+ FlushInfoLog();
+
+ const pid_t child_pid = fork();
+ GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+ set_child_pid(child_pid);
+ if (child_pid == 0) {
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
+ set_write_fd(pipe_fd[1]);
+ // Redirects all logging to stderr in the child process to prevent
+ // concurrent writes to the log files. We capture stderr in the parent
+ // process and append the child process' output to a log.
+ LogToStderr();
+ // Event forwarding to the listeners of event listener API mush be shut
+ // down in death test subprocesses.
+ GetUnitTestImpl()->listeners()->SuppressEventForwarding();
+ g_in_fast_death_test_child = true;
+ return EXECUTE_TEST;
+ } else {
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+ set_read_fd(pipe_fd[0]);
+ set_spawned(true);
+ return OVERSEE_TEST;
+ }
+}
+
+// A concrete death test class that forks and re-executes the main
+// program from the beginning, with command-line flags set that cause
+// only this specific death test to be run.
+class ExecDeathTest : public ForkingDeathTest {
+ public:
+ ExecDeathTest(const char* a_statement, const RE* a_regex,
+ const char* file, int line) :
+ ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
+ virtual TestRole AssumeRole();
+ private:
+ static ::std::vector<testing::internal::string>
+ GetArgvsForDeathTestChildProcess() {
+ ::std::vector<testing::internal::string> args = GetInjectableArgvs();
+ return args;
+ }
+ // The name of the file in which the death test is located.
+ const char* const file_;
+ // The line number on which the death test is located.
+ const int line_;
+};
+
+// Utility class for accumulating command-line arguments.
+class Arguments {
+ public:
+ Arguments() {
+ args_.push_back(NULL);
+ }
+
+ ~Arguments() {
+ for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
+ ++i) {
+ free(*i);
+ }
+ }
+ void AddArgument(const char* argument) {
+ args_.insert(args_.end() - 1, posix::StrDup(argument));
+ }
+
+ template <typename Str>
+ void AddArguments(const ::std::vector<Str>& arguments) {
+ for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
+ i != arguments.end();
+ ++i) {
+ args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
+ }
+ }
+ char* const* Argv() {
+ return &args_[0];
+ }
+
+ private:
+ std::vector<char*> args_;
+};
+
+// A struct that encompasses the arguments to the child process of a
+// threadsafe-style death test process.
+struct ExecDeathTestArgs {
+ char* const* argv; // Command-line arguments for the child's call to exec
+ int close_fd; // File descriptor to close; the read end of a pipe
+};
+
+# if GTEST_OS_MAC
+inline char** GetEnviron() {
+ // When Google Test is built as a framework on MacOS X, the environ variable
+ // is unavailable. Apple's documentation (man environ) recommends using
+ // _NSGetEnviron() instead.
+ return *_NSGetEnviron();
+}
+# else
+// Some POSIX platforms expect you to declare environ. extern "C" makes
+// it reside in the global namespace.
+extern "C" char** environ;
+inline char** GetEnviron() { return environ; }
+# endif // GTEST_OS_MAC
+
+# if !GTEST_OS_QNX
+// The main function for a threadsafe-style death test child process.
+// This function is called in a clone()-ed process and thus must avoid
+// any potentially unsafe operations like malloc or libc functions.
+static int ExecDeathTestChildMain(void* child_arg) {
+ ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
+
+ // We need to execute the test program in the same environment where
+ // it was originally invoked. Therefore we change to the original
+ // working directory first.
+ const char* const original_dir =
+ UnitTest::GetInstance()->original_working_dir();
+ // We can safely call chdir() as it's a direct system call.
+ if (chdir(original_dir) != 0) {
+ DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+ GetLastErrnoDescription());
+ return EXIT_FAILURE;
+ }
+
+ // We can safely call execve() as it's a direct system call. We
+ // cannot use execvp() as it's a libc function and thus potentially
+ // unsafe. Since execve() doesn't search the PATH, the user must
+ // invoke the test program via a valid path that contains at least
+ // one path separator.
+ execve(args->argv[0], args->argv, GetEnviron());
+ DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
+ original_dir + " failed: " +
+ GetLastErrnoDescription());
+ return EXIT_FAILURE;
+}
+# endif // !GTEST_OS_QNX
+
+// Two utility routines that together determine the direction the stack
+// grows.
+// This could be accomplished more elegantly by a single recursive
+// function, but we want to guard against the unlikely possibility of
+// a smart compiler optimizing the recursion away.
+//
+// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
+// StackLowerThanAddress into StackGrowsDown, which then doesn't give
+// correct answer.
+void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
+void StackLowerThanAddress(const void* ptr, bool* result) {
+ int dummy;
+ *result = (&dummy < ptr);
+}
+
+bool StackGrowsDown() {
+ int dummy;
+ bool result;
+ StackLowerThanAddress(&dummy, &result);
+ return result;
+}
+
+// Spawns a child process with the same executable as the current process in
+// a thread-safe manner and instructs it to run the death test. The
+// implementation uses fork(2) + exec. On systems where clone(2) is
+// available, it is used instead, being slightly more thread-safe. On QNX,
+// fork supports only single-threaded environments, so this function uses
+// spawn(2) there instead. The function dies with an error message if
+// anything goes wrong.
+static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
+ ExecDeathTestArgs args = { argv, close_fd };
+ pid_t child_pid = -1;
+
+# if GTEST_OS_QNX
+ // Obtains the current directory and sets it to be closed in the child
+ // process.
+ const int cwd_fd = open(".", O_RDONLY);
+ GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
+ // We need to execute the test program in the same environment where
+ // it was originally invoked. Therefore we change to the original
+ // working directory first.
+ const char* const original_dir =
+ UnitTest::GetInstance()->original_working_dir();
+ // We can safely call chdir() as it's a direct system call.
+ if (chdir(original_dir) != 0) {
+ DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+ GetLastErrnoDescription());
+ return EXIT_FAILURE;
+ }
+
+ int fd_flags;
+ // Set close_fd to be closed after spawn.
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
+ fd_flags | FD_CLOEXEC));
+ struct inheritance inherit = {0};
+ // spawn is a system call.
+ child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
+ // Restores the current working directory.
+ GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
+
+# else // GTEST_OS_QNX
+# if GTEST_OS_LINUX
+ // When a SIGPROF signal is received while fork() or clone() are executing,
+ // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
+ // it after the call to fork()/clone() is complete.
+ struct sigaction saved_sigprof_action;
+ struct sigaction ignore_sigprof_action;
+ memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
+ sigemptyset(&ignore_sigprof_action.sa_mask);
+ ignore_sigprof_action.sa_handler = SIG_IGN;
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
+ SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
+# endif // GTEST_OS_LINUX
+
+# if GTEST_HAS_CLONE
+ const bool use_fork = GTEST_FLAG(death_test_use_fork);
+
+ if (!use_fork) {
+ static const bool stack_grows_down = StackGrowsDown();
+ const size_t stack_size = getpagesize();
+ // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
+ void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
+ MAP_ANON | MAP_PRIVATE, -1, 0);
+ GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
+
+ // Maximum stack alignment in bytes: For a downward-growing stack, this
+ // amount is subtracted from size of the stack space to get an address
+ // that is within the stack space and is aligned on all systems we care
+ // about. As far as I know there is no ABI with stack alignment greater
+ // than 64. We assume stack and stack_size already have alignment of
+ // kMaxStackAlignment.
+ const size_t kMaxStackAlignment = 64;
+ void* const stack_top =
+ static_cast<char*>(stack) +
+ (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
+ GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
+ reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
+
+ child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
+
+ GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
+ }
+# else
+ const bool use_fork = true;
+# endif // GTEST_HAS_CLONE
+
+ if (use_fork && (child_pid = fork()) == 0) {
+ ExecDeathTestChildMain(&args);
+ _exit(0);
+ }
+# endif // GTEST_OS_QNX
+# if GTEST_OS_LINUX
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(
+ sigaction(SIGPROF, &saved_sigprof_action, NULL));
+# endif // GTEST_OS_LINUX
+
+ GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+ return child_pid;
+}
+
+// The AssumeRole process for a fork-and-exec death test. It re-executes the
+// main program from the beginning, setting the --gtest_filter
+// and --gtest_internal_run_death_test flags to cause only the current
+// death test to be re-run.
+DeathTest::TestRole ExecDeathTest::AssumeRole() {
+ const UnitTestImpl* const impl = GetUnitTestImpl();
+ const InternalRunDeathTestFlag* const flag =
+ impl->internal_run_death_test_flag();
+ const TestInfo* const info = impl->current_test_info();
+ const int death_test_index = info->result()->death_test_count();
+
+ if (flag != NULL) {
+ set_write_fd(flag->write_fd());
+ return EXECUTE_TEST;
+ }
+
+ int pipe_fd[2];
+ GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+ // Clear the close-on-exec flag on the write end of the pipe, lest
+ // it be closed when the child process does an exec:
+ GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
+
+ const std::string filter_flag =
+ std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
+ + info->test_case_name() + "." + info->name();
+ const std::string internal_flag =
+ std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
+ + file_ + "|" + StreamableToString(line_) + "|"
+ + StreamableToString(death_test_index) + "|"
+ + StreamableToString(pipe_fd[1]);
+ Arguments args;
+ args.AddArguments(GetArgvsForDeathTestChildProcess());
+ args.AddArgument(filter_flag.c_str());
+ args.AddArgument(internal_flag.c_str());
+
+ DeathTest::set_last_death_test_message("");
+
+ CaptureStderr();
+ // See the comment in NoExecDeathTest::AssumeRole for why the next line
+ // is necessary.
+ FlushInfoLog();
+
+ const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
+ GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+ set_child_pid(child_pid);
+ set_read_fd(pipe_fd[0]);
+ set_spawned(true);
+ return OVERSEE_TEST;
+}
+
+# endif // !GTEST_OS_WINDOWS
+
+// Creates a concrete DeathTest-derived class that depends on the
+// --gtest_death_test_style flag, and sets the pointer pointed to
+// by the "test" argument to its address. If the test should be
+// skipped, sets that pointer to NULL. Returns true, unless the
+// flag is set to an invalid value.
+bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
+ const char* file, int line,
+ DeathTest** test) {
+ UnitTestImpl* const impl = GetUnitTestImpl();
+ const InternalRunDeathTestFlag* const flag =
+ impl->internal_run_death_test_flag();
+ const int death_test_index = impl->current_test_info()
+ ->increment_death_test_count();
+
+ if (flag != NULL) {
+ if (death_test_index > flag->index()) {
+ DeathTest::set_last_death_test_message(
+ "Death test count (" + StreamableToString(death_test_index)
+ + ") somehow exceeded expected maximum ("
+ + StreamableToString(flag->index()) + ")");
+ return false;
+ }
+
+ if (!(flag->file() == file && flag->line() == line &&
+ flag->index() == death_test_index)) {
+ *test = NULL;
+ return true;
+ }
+ }
+
+# if GTEST_OS_WINDOWS
+
+ if (GTEST_FLAG(death_test_style) == "threadsafe" ||
+ GTEST_FLAG(death_test_style) == "fast") {
+ *test = new WindowsDeathTest(statement, regex, file, line);
+ }
+
+# else
+
+ if (GTEST_FLAG(death_test_style) == "threadsafe") {
+ *test = new ExecDeathTest(statement, regex, file, line);
+ } else if (GTEST_FLAG(death_test_style) == "fast") {
+ *test = new NoExecDeathTest(statement, regex);
+ }
+
+# endif // GTEST_OS_WINDOWS
+
+ else { // NOLINT - this is more readable than unbalanced brackets inside #if.
+ DeathTest::set_last_death_test_message(
+ "Unknown death test style \"" + GTEST_FLAG(death_test_style)
+ + "\" encountered");
+ return false;
+ }
+
+ return true;
+}
+
+// Splits a given string on a given delimiter, populating a given
+// vector with the fields. GTEST_HAS_DEATH_TEST implies that we have
+// ::std::string, so we can use it here.
+static void SplitString(const ::std::string& str, char delimiter,
+ ::std::vector< ::std::string>* dest) {
+ ::std::vector< ::std::string> parsed;
+ ::std::string::size_type pos = 0;
+ while (::testing::internal::AlwaysTrue()) {
+ const ::std::string::size_type colon = str.find(delimiter, pos);
+ if (colon == ::std::string::npos) {
+ parsed.push_back(str.substr(pos));
+ break;
+ } else {
+ parsed.push_back(str.substr(pos, colon - pos));
+ pos = colon + 1;
+ }
+ }
+ dest->swap(parsed);
+}
+
+# if GTEST_OS_WINDOWS
+// Recreates the pipe and event handles from the provided parameters,
+// signals the event, and returns a file descriptor wrapped around the pipe
+// handle. This function is called in the child process only.
+int GetStatusFileDescriptor(unsigned int parent_process_id,
+ size_t write_handle_as_size_t,
+ size_t event_handle_as_size_t) {
+ AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
+ FALSE, // Non-inheritable.
+ parent_process_id));
+ if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
+ DeathTestAbort("Unable to open parent process " +
+ StreamableToString(parent_process_id));
+ }
+
+ // TODO(vladl at google.com): Replace the following check with a
+ // compile-time assertion when available.
+ GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
+
+ const HANDLE write_handle =
+ reinterpret_cast<HANDLE>(write_handle_as_size_t);
+ HANDLE dup_write_handle;
+
+ // The newly initialized handle is accessible only in in the parent
+ // process. To obtain one accessible within the child, we need to use
+ // DuplicateHandle.
+ if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
+ ::GetCurrentProcess(), &dup_write_handle,
+ 0x0, // Requested privileges ignored since
+ // DUPLICATE_SAME_ACCESS is used.
+ FALSE, // Request non-inheritable handler.
+ DUPLICATE_SAME_ACCESS)) {
+ DeathTestAbort("Unable to duplicate the pipe handle " +
+ StreamableToString(write_handle_as_size_t) +
+ " from the parent process " +
+ StreamableToString(parent_process_id));
+ }
+
+ const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
+ HANDLE dup_event_handle;
+
+ if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
+ ::GetCurrentProcess(), &dup_event_handle,
+ 0x0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS)) {
+ DeathTestAbort("Unable to duplicate the event handle " +
+ StreamableToString(event_handle_as_size_t) +
+ " from the parent process " +
+ StreamableToString(parent_process_id));
+ }
+
+ const int write_fd =
+ ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
+ if (write_fd == -1) {
+ DeathTestAbort("Unable to convert pipe handle " +
+ StreamableToString(write_handle_as_size_t) +
+ " to a file descriptor");
+ }
+
+ // Signals the parent that the write end of the pipe has been acquired
+ // so the parent can release its own write end.
+ ::SetEvent(dup_event_handle);
+
+ return write_fd;
+}
+# endif // GTEST_OS_WINDOWS
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
+ if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
+
+ // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
+ // can use it here.
+ int line = -1;
+ int index = -1;
+ ::std::vector< ::std::string> fields;
+ SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
+ int write_fd = -1;
+
+# if GTEST_OS_WINDOWS
+
+ unsigned int parent_process_id = 0;
+ size_t write_handle_as_size_t = 0;
+ size_t event_handle_as_size_t = 0;
+
+ if (fields.size() != 6
+ || !ParseNaturalNumber(fields[1], &line)
+ || !ParseNaturalNumber(fields[2], &index)
+ || !ParseNaturalNumber(fields[3], &parent_process_id)
+ || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
+ || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
+ DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
+ GTEST_FLAG(internal_run_death_test));
+ }
+ write_fd = GetStatusFileDescriptor(parent_process_id,
+ write_handle_as_size_t,
+ event_handle_as_size_t);
+# else
+
+ if (fields.size() != 4
+ || !ParseNaturalNumber(fields[1], &line)
+ || !ParseNaturalNumber(fields[2], &index)
+ || !ParseNaturalNumber(fields[3], &write_fd)) {
+ DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
+ + GTEST_FLAG(internal_run_death_test));
+ }
+
+# endif // GTEST_OS_WINDOWS
+
+ return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
+}
+
+} // namespace internal
+
+#endif // GTEST_HAS_DEATH_TEST
+
+} // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+
+
+#include <stdlib.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>
+#elif GTEST_OS_WINDOWS
+# include <direct.h>
+# include <io.h>
+#elif GTEST_OS_SYMBIAN
+// Symbian OpenC has PATH_MAX in sys/syslimits.h
+# include <sys/syslimits.h>
+#else
+# include <limits.h>
+# include <climits> // Some Linux distributions define PATH_MAX here.
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_MAX_ _MAX_PATH
+#elif defined(PATH_MAX)
+# define GTEST_PATH_MAX_ PATH_MAX
+#elif defined(_XOPEN_PATH_MAX)
+# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
+#else
+# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
+#endif // GTEST_OS_WINDOWS
+
+
+namespace testing {
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+// On Windows, '\\' is the standard path separator, but many tools and the
+// Windows API also accept '/' as an alternate path separator. Unless otherwise
+// noted, a file path can contain either kind of path separators, or a mixture
+// of them.
+const char kPathSeparator = '\\';
+const char kAlternatePathSeparator = '/';
+const char kPathSeparatorString[] = "\\";
+const char kAlternatePathSeparatorString[] = "/";
+# if GTEST_OS_WINDOWS_MOBILE
+// Windows CE doesn't have a current directory. You should not use
+// the current directory in tests on Windows CE, but this at least
+// provides a reasonable fallback.
+const char kCurrentDirectoryString[] = "\\";
+// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
+const DWORD kInvalidFileAttributes = 0xffffffff;
+# else
+const char kCurrentDirectoryString[] = ".\\";
+# endif // GTEST_OS_WINDOWS_MOBILE
+#else
+const char kPathSeparator = '/';
+const char kPathSeparatorString[] = "/";
+const char kCurrentDirectoryString[] = "./";
+#endif // GTEST_OS_WINDOWS
+
+// Returns whether the given character is a valid path separator.
+static bool IsPathSeparator(char c) {
+#if GTEST_HAS_ALT_PATH_SEP_
+ return (c == kPathSeparator) || (c == kAlternatePathSeparator);
+#else
+ return c == kPathSeparator;
+#endif
+}
+
+// Returns the current working directory, or "" if unsuccessful.
+FilePath FilePath::GetCurrentDir() {
+#if GTEST_OS_WINDOWS_MOBILE
+ // Windows CE doesn't have a current directory, so we just return
+ // something reasonable.
+ return FilePath(kCurrentDirectoryString);
+#elif GTEST_OS_WINDOWS
+ char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+ return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#else
+ char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+ return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#endif // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns a copy of the FilePath with the case-insensitive extension removed.
+// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+// FilePath("dir/file"). If a case-insensitive extension is not
+// found, returns a copy of the original FilePath.
+FilePath FilePath::RemoveExtension(const char* extension) const {
+ const std::string dot_extension = std::string(".") + extension;
+ if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {
+ return FilePath(pathname_.substr(
+ 0, pathname_.length() - dot_extension.length()));
+ }
+ return *this;
+}
+
+// Returns a pointer to the last occurence of a valid path separator in
+// the FilePath. On Windows, for example, both '/' and '\' are valid path
+// separators. Returns NULL if no path separator was found.
+const char* FilePath::FindLastPathSeparator() const {
+ const char* const last_sep = strrchr(c_str(), kPathSeparator);
+#if GTEST_HAS_ALT_PATH_SEP_
+ const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
+ // Comparing two pointers of which only one is NULL is undefined.
+ if (last_alt_sep != NULL &&
+ (last_sep == NULL || last_alt_sep > last_sep)) {
+ return last_alt_sep;
+ }
+#endif
+ return last_sep;
+}
+
+// Returns a copy of the FilePath with the directory part removed.
+// Example: FilePath("path/to/file").RemoveDirectoryName() returns
+// FilePath("file"). If there is no directory part ("just_a_file"), it returns
+// the FilePath unmodified. If there is no file part ("just_a_dir/") it
+// returns an empty FilePath ("").
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveDirectoryName() const {
+ const char* const last_sep = FindLastPathSeparator();
+ return last_sep ? FilePath(last_sep + 1) : *this;
+}
+
+// RemoveFileName returns the directory path with the filename removed.
+// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveFileName() const {
+ const char* const last_sep = FindLastPathSeparator();
+ std::string dir;
+ if (last_sep) {
+ dir = std::string(c_str(), last_sep + 1 - c_str());
+ } else {
+ dir = kCurrentDirectoryString;
+ }
+ return FilePath(dir);
+}
+
+// Helper functions for naming files in a directory for xml output.
+
+// Given directory = "dir", base_name = "test", number = 0,
+// extension = "xml", returns "dir/test.xml". If number is greater
+// than zero (e.g., 12), returns "dir/test_12.xml".
+// On Windows platform, uses \ as the separator rather than /.
+FilePath FilePath::MakeFileName(const FilePath& directory,
+ const FilePath& base_name,
+ int number,
+ const char* extension) {
+ std::string file;
+ if (number == 0) {
+ file = base_name.string() + "." + extension;
+ } else {
+ file = base_name.string() + "_" + StreamableToString(number)
+ + "." + extension;
+ }
+ return ConcatPaths(directory, FilePath(file));
+}
+
+// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
+// On Windows, uses \ as the separator rather than /.
+FilePath FilePath::ConcatPaths(const FilePath& directory,
+ const FilePath& relative_path) {
+ if (directory.IsEmpty())
+ return relative_path;
+ const FilePath dir(directory.RemoveTrailingPathSeparator());
+ return FilePath(dir.string() + kPathSeparator + relative_path.string());
+}
+
+// Returns true if pathname describes something findable in the file-system,
+// either a file, directory, or whatever.
+bool FilePath::FileOrDirectoryExists() const {
+#if GTEST_OS_WINDOWS_MOBILE
+ LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
+ const DWORD attributes = GetFileAttributes(unicode);
+ delete [] unicode;
+ return attributes != kInvalidFileAttributes;
+#else
+ posix::StatStruct file_stat;
+ return posix::Stat(pathname_.c_str(), &file_stat) == 0;
+#endif // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns true if pathname describes a directory in the file-system
+// that exists.
+bool FilePath::DirectoryExists() const {
+ bool result = false;
+#if GTEST_OS_WINDOWS
+ // Don't strip off trailing separator if path is a root directory on
+ // Windows (like "C:\\").
+ const FilePath& path(IsRootDirectory() ? *this :
+ RemoveTrailingPathSeparator());
+#else
+ const FilePath& path(*this);
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+ LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
+ const DWORD attributes = GetFileAttributes(unicode);
+ delete [] unicode;
+ if ((attributes != kInvalidFileAttributes) &&
+ (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
+ result = true;
+ }
+#else
+ posix::StatStruct file_stat;
+ result = posix::Stat(path.c_str(), &file_stat) == 0 &&
+ posix::IsDir(file_stat);
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+ return result;
+}
+
+// Returns true if pathname describes a root directory. (Windows has one
+// root directory per disk drive.)
+bool FilePath::IsRootDirectory() const {
+#if GTEST_OS_WINDOWS
+ // TODO(wan at google.com): on Windows a network share like
+ // \\server\share can be a root directory, although it cannot be the
+ // current directory. Handle this properly.
+ return pathname_.length() == 3 && IsAbsolutePath();
+#else
+ return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
+#endif
+}
+
+// Returns true if pathname describes an absolute path.
+bool FilePath::IsAbsolutePath() const {
+ const char* const name = pathname_.c_str();
+#if GTEST_OS_WINDOWS
+ return pathname_.length() >= 3 &&
+ ((name[0] >= 'a' && name[0] <= 'z') ||
+ (name[0] >= 'A' && name[0] <= 'Z')) &&
+ name[1] == ':' &&
+ IsPathSeparator(name[2]);
+#else
+ return IsPathSeparator(name[0]);
+#endif
+}
+
+// Returns a pathname for a file that does not currently exist. The pathname
+// will be directory/base_name.extension or
+// directory/base_name_<number>.extension if directory/base_name.extension
+// already exists. The number will be incremented until a pathname is found
+// that does not already exist.
+// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+// There could be a race condition if two or more processes are calling this
+// function at the same time -- they could both pick the same filename.
+FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
+ const FilePath& base_name,
+ const char* extension) {
+ FilePath full_pathname;
+ int number = 0;
+ do {
+ full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
+ } while (full_pathname.FileOrDirectoryExists());
+ return full_pathname;
+}
+
+// Returns true if FilePath ends with a path separator, which indicates that
+// it is intended to represent a directory. Returns false otherwise.
+// This does NOT check that a directory (or file) actually exists.
+bool FilePath::IsDirectory() const {
+ return !pathname_.empty() &&
+ IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
+}
+
+// Create directories so that path exists. Returns true if successful or if
+// the directories already exist; returns false if unable to create directories
+// for any reason.
+bool FilePath::CreateDirectoriesRecursively() const {
+ if (!this->IsDirectory()) {
+ return false;
+ }
+
+ if (pathname_.length() == 0 || this->DirectoryExists()) {
+ return true;
+ }
+
+ const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
+ return parent.CreateDirectoriesRecursively() && this->CreateFolder();
+}
+
+// Create the directory so that path exists. Returns true if successful or
+// if the directory already exists; returns false if unable to create the
+// directory for any reason, including if the parent directory does not
+// exist. Not named "CreateDirectory" because that's a macro on Windows.
+bool FilePath::CreateFolder() const {
+#if GTEST_OS_WINDOWS_MOBILE
+ FilePath removed_sep(this->RemoveTrailingPathSeparator());
+ LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
+ int result = CreateDirectory(unicode, NULL) ? 0 : -1;
+ delete [] unicode;
+#elif GTEST_OS_WINDOWS
+ int result = _mkdir(pathname_.c_str());
+#else
+ int result = mkdir(pathname_.c_str(), 0777);
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+ if (result == -1) {
+ return this->DirectoryExists(); // An error is OK if the directory exists.
+ }
+ return true; // No error.
+}
+
+// If input name has a trailing separator character, remove it and return the
+// name, otherwise return the name string unmodified.
+// On Windows platform, uses \ as the separator, other platforms use /.
+FilePath FilePath::RemoveTrailingPathSeparator() const {
+ return IsDirectory()
+ ? FilePath(pathname_.substr(0, pathname_.length() - 1))
+ : *this;
+}
+
+// Removes any redundant separators that might be in the pathname.
+// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+// redundancies that might be in a pathname involving "." or "..".
+// TODO(wan at google.com): handle Windows network shares (e.g. \\server\share).
+void FilePath::Normalize() {
+ if (pathname_.c_str() == NULL) {
+ pathname_ = "";
+ return;
+ }
+ const char* src = pathname_.c_str();
+ char* const dest = new char[pathname_.length() + 1];
+ char* dest_ptr = dest;
+ memset(dest_ptr, 0, pathname_.length() + 1);
+
+ while (*src != '\0') {
+ *dest_ptr = *src;
+ if (!IsPathSeparator(*src)) {
+ src++;
+ } else {
+#if GTEST_HAS_ALT_PATH_SEP_
+ if (*dest_ptr == kAlternatePathSeparator) {
+ *dest_ptr = kPathSeparator;
+ }
+#endif
+ while (IsPathSeparator(*src))
+ src++;
+ }
+ dest_ptr++;
+ }
+ *dest_ptr = '\0';
+ pathname_ = dest;
+ delete[] dest;
+}
+
+} // namespace internal
+} // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h> // For TerminateProcess()
+#elif GTEST_OS_WINDOWS
+# include <io.h>
+# include <sys/stat.h>
+#else
+# include <unistd.h>
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_MAC
+# include <mach/mach_init.h>
+# include <mach/task.h>
+# include <mach/vm_map.h>
+#endif // GTEST_OS_MAC
+
+#if GTEST_OS_QNX
+# include <devctl.h>
+# include <sys/procfs.h>
+#endif // GTEST_OS_QNX
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation. It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error. This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
+const int kStdOutFileno = 1;
+const int kStdErrFileno = 2;
+#else
+const int kStdOutFileno = STDOUT_FILENO;
+const int kStdErrFileno = STDERR_FILENO;
+#endif // _MSC_VER
+
+#if GTEST_OS_MAC
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+ const task_t task = mach_task_self();
+ mach_msg_type_number_t thread_count;
+ thread_act_array_t thread_list;
+ const kern_return_t status = task_threads(task, &thread_list, &thread_count);
+ if (status == KERN_SUCCESS) {
+ // task_threads allocates resources in thread_list and we need to free them
+ // to avoid leaks.
+ vm_deallocate(task,
+ reinterpret_cast<vm_address_t>(thread_list),
+ sizeof(thread_t) * thread_count);
+ return static_cast<size_t>(thread_count);
+ } else {
+ return 0;
+ }
+}
+
+#elif GTEST_OS_QNX
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+ const int fd = open("/proc/self/as", O_RDONLY);
+ if (fd < 0) {
+ return 0;
+ }
+ procfs_info process_info;
+ const int status =
+ devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
+ close(fd);
+ if (status == EOK) {
+ return static_cast<size_t>(process_info.num_threads);
+ } else {
+ return 0;
+ }
+}
+
+#else
+
+size_t GetThreadCount() {
+ // There's no portable way to detect the number of threads, so we just
+ // return 0 to indicate that we cannot detect it.
+ return 0;
+}
+
+#endif // GTEST_OS_MAC
+
+#if GTEST_USES_POSIX_RE
+
+// Implements RE. Currently only needed for death tests.
+
+RE::~RE() {
+ if (is_valid_) {
+ // regfree'ing an invalid regex might crash because the content
+ // of the regex is undefined. Since the regex's are essentially
+ // the same, one cannot be valid (or invalid) without the other
+ // being so too.
+ regfree(&partial_regex_);
+ regfree(&full_regex_);
+ }
+ free(const_cast<char*>(pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+ if (!re.is_valid_) return false;
+
+ regmatch_t match;
+ return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+ if (!re.is_valid_) return false;
+
+ regmatch_t match;
+ return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+ pattern_ = posix::StrDup(regex);
+
+ // Reserves enough bytes to hold the regular expression used for a
+ // full match.
+ const size_t full_regex_len = strlen(regex) + 10;
+ char* const full_pattern = new char[full_regex_len];
+
+ snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
+ is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
+ // We want to call regcomp(&partial_regex_, ...) even if the
+ // previous expression returns false. Otherwise partial_regex_ may
+ // not be properly initialized can may cause trouble when it's
+ // freed.
+ //
+ // Some implementation of POSIX regex (e.g. on at least some
+ // versions of Cygwin) doesn't accept the empty string as a valid
+ // regex. We change it to an equivalent form "()" to be safe.
+ if (is_valid_) {
+ const char* const partial_regex = (*regex == '\0') ? "()" : regex;
+ is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
+ }
+ EXPECT_TRUE(is_valid_)
+ << "Regular expression \"" << regex
+ << "\" is not a valid POSIX Extended regular expression.";
+
+ delete[] full_pattern;
+}
+
+#elif GTEST_USES_SIMPLE_RE
+
+// Returns true iff ch appears anywhere in str (excluding the
+// terminating '\0' character).
+bool IsInSet(char ch, const char* str) {
+ return ch != '\0' && strchr(str, ch) != NULL;
+}
+
+// Returns true iff ch belongs to the given classification. Unlike
+// similar functions in <ctype.h>, these aren't affected by the
+// current locale.
+bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
+bool IsAsciiPunct(char ch) {
+ return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
+}
+bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
+bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
+bool IsAsciiWordChar(char ch) {
+ return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
+ ('0' <= ch && ch <= '9') || ch == '_';
+}
+
+// Returns true iff "\\c" is a supported escape sequence.
+bool IsValidEscape(char c) {
+ return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
+}
+
+// Returns true iff the given atom (specified by escaped and pattern)
+// matches ch. The result is undefined if the atom is invalid.
+bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
+ if (escaped) { // "\\p" where p is pattern_char.
+ switch (pattern_char) {
+ case 'd': return IsAsciiDigit(ch);
+ case 'D': return !IsAsciiDigit(ch);
+ case 'f': return ch == '\f';
+ case 'n': return ch == '\n';
+ case 'r': return ch == '\r';
+ case 's': return IsAsciiWhiteSpace(ch);
+ case 'S': return !IsAsciiWhiteSpace(ch);
+ case 't': return ch == '\t';
+ case 'v': return ch == '\v';
+ case 'w': return IsAsciiWordChar(ch);
+ case 'W': return !IsAsciiWordChar(ch);
+ }
+ return IsAsciiPunct(pattern_char) && pattern_char == ch;
+ }
+
+ return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
+}
+
+// Helper function used by ValidateRegex() to format error messages.
+std::string FormatRegexSyntaxError(const char* regex, int index) {
+ return (Message() << "Syntax error at index " << index
+ << " in simple regular expression \"" << regex << "\": ").GetString();
+}
+
+// Generates non-fatal failures and returns false if regex is invalid;
+// otherwise returns true.
+bool ValidateRegex(const char* regex) {
+ if (regex == NULL) {
+ // TODO(wan at google.com): fix the source file location in the
+ // assertion failures to match where the regex is used in user
+ // code.
+ ADD_FAILURE() << "NULL is not a valid simple regular expression.";
+ return false;
+ }
+
+ bool is_valid = true;
+
+ // True iff ?, *, or + can follow the previous atom.
+ bool prev_repeatable = false;
+ for (int i = 0; regex[i]; i++) {
+ if (regex[i] == '\\') { // An escape sequence
+ i++;
+ if (regex[i] == '\0') {
+ ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+ << "'\\' cannot appear at the end.";
+ return false;
+ }
+
+ if (!IsValidEscape(regex[i])) {
+ ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+ << "invalid escape sequence \"\\" << regex[i] << "\".";
+ is_valid = false;
+ }
+ prev_repeatable = true;
+ } else { // Not an escape sequence.
+ const char ch = regex[i];
+
+ if (ch == '^' && i > 0) {
+ ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+ << "'^' can only appear at the beginning.";
+ is_valid = false;
+ } else if (ch == '$' && regex[i + 1] != '\0') {
+ ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+ << "'$' can only appear at the end.";
+ is_valid = false;
+ } else if (IsInSet(ch, "()[]{}|")) {
+ ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+ << "'" << ch << "' is unsupported.";
+ is_valid = false;
+ } else if (IsRepeat(ch) && !prev_repeatable) {
+ ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+ << "'" << ch << "' can only follow a repeatable token.";
+ is_valid = false;
+ }
+
+ prev_repeatable = !IsInSet(ch, "^$?*+");
+ }
+ }
+
+ return is_valid;
+}
+
+// Matches a repeated regex atom followed by a valid simple regular
+// expression. The regex atom is defined as c if escaped is false,
+// or \c otherwise. repeat is the repetition meta character (?, *,
+// or +). The behavior is undefined if str contains too many
+// characters to be indexable by size_t, in which case the test will
+// probably time out anyway. We are fine with this limitation as
+// std::string has it too.
+bool MatchRepetitionAndRegexAtHead(
+ bool escaped, char c, char repeat, const char* regex,
+ const char* str) {
+ const size_t min_count = (repeat == '+') ? 1 : 0;
+ const size_t max_count = (repeat == '?') ? 1 :
+ static_cast<size_t>(-1) - 1;
+ // We cannot call numeric_limits::max() as it conflicts with the
+ // max() macro on Windows.
+
+ for (size_t i = 0; i <= max_count; ++i) {
+ // We know that the atom matches each of the first i characters in str.
+ if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
+ // We have enough matches at the head, and the tail matches too.
+ // Since we only care about *whether* the pattern matches str
+ // (as opposed to *how* it matches), there is no need to find a
+ // greedy match.
+ return true;
+ }
+ if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
+ return false;
+ }
+ return false;
+}
+
+// Returns true iff regex matches a prefix of str. regex must be a
+// valid simple regular expression and not start with "^", or the
+// result is undefined.
+bool MatchRegexAtHead(const char* regex, const char* str) {
+ if (*regex == '\0') // An empty regex matches a prefix of anything.
+ return true;
+
+ // "$" only matches the end of a string. Note that regex being
+ // valid guarantees that there's nothing after "$" in it.
+ if (*regex == '$')
+ return *str == '\0';
+
+ // Is the first thing in regex an escape sequence?
+ const bool escaped = *regex == '\\';
+ if (escaped)
+ ++regex;
+ if (IsRepeat(regex[1])) {
+ // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
+ // here's an indirect recursion. It terminates as the regex gets
+ // shorter in each recursion.
+ return MatchRepetitionAndRegexAtHead(
+ escaped, regex[0], regex[1], regex + 2, str);
+ } else {
+ // regex isn't empty, isn't "$", and doesn't start with a
+ // repetition. We match the first atom of regex with the first
+ // character of str and recurse.
+ return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
+ MatchRegexAtHead(regex + 1, str + 1);
+ }
+}
+
+// Returns true iff regex matches any substring of str. regex must be
+// a valid simple regular expression, or the result is undefined.
+//
+// The algorithm is recursive, but the recursion depth doesn't exceed
+// the regex length, so we won't need to worry about running out of
+// stack space normally. In rare cases the time complexity can be
+// exponential with respect to the regex length + the string length,
+// but usually it's must faster (often close to linear).
+bool MatchRegexAnywhere(const char* regex, const char* str) {
+ if (regex == NULL || str == NULL)
+ return false;
+
+ if (*regex == '^')
+ return MatchRegexAtHead(regex + 1, str);
+
+ // A successful match can be anywhere in str.
+ do {
+ if (MatchRegexAtHead(regex, str))
+ return true;
+ } while (*str++ != '\0');
+ return false;
+}
+
+// Implements the RE class.
+
+RE::~RE() {
+ free(const_cast<char*>(pattern_));
+ free(const_cast<char*>(full_pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+ return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+ return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+ pattern_ = full_pattern_ = NULL;
+ if (regex != NULL) {
+ pattern_ = posix::StrDup(regex);
+ }
+
+ is_valid_ = ValidateRegex(regex);
+ if (!is_valid_) {
+ // No need to calculate the full pattern when the regex is invalid.
+ return;
+ }
+
+ const size_t len = strlen(regex);
+ // Reserves enough bytes to hold the regular expression used for a
+ // full match: we need space to prepend a '^', append a '$', and
+ // terminate the string with '\0'.
+ char* buffer = static_cast<char*>(malloc(len + 3));
+ full_pattern_ = buffer;
+
+ if (*regex != '^')
+ *buffer++ = '^'; // Makes sure full_pattern_ starts with '^'.
+
+ // We don't use snprintf or strncpy, as they trigger a warning when
+ // compiled with VC++ 8.0.
+ memcpy(buffer, regex, len);
+ buffer += len;
+
+ if (len == 0 || regex[len - 1] != '$')
+ *buffer++ = '$'; // Makes sure full_pattern_ ends with '$'.
+
+ *buffer = '\0';
+}
+
+#endif // GTEST_USES_POSIX_RE
+
+const char kUnknownFile[] = "unknown file";
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
+ const std::string file_name(file == NULL ? kUnknownFile : file);
+
+ if (line < 0) {
+ return file_name + ":";
+ }
+#ifdef _MSC_VER
+ return file_name + "(" + StreamableToString(line) + "):";
+#else
+ return file_name + ":" + StreamableToString(line) + ":";
+#endif // _MSC_VER
+}
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+// Note that FormatCompilerIndependentFileLocation() does NOT append colon
+// to the file location it produces, unlike FormatFileLocation().
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
+ const char* file, int line) {
+ const std::string file_name(file == NULL ? kUnknownFile : file);
+
+ if (line < 0)
+ return file_name;
+ else
+ return file_name + ":" + StreamableToString(line);
+}
+
+
+GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
+ : severity_(severity) {
+ const char* const marker =
+ severity == GTEST_INFO ? "[ INFO ]" :
+ severity == GTEST_WARNING ? "[WARNING]" :
+ severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]";
+ GetStream() << ::std::endl << marker << " "
+ << FormatFileLocation(file, line).c_str() << ": ";
+}
+
+// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+GTestLog::~GTestLog() {
+ GetStream() << ::std::endl;
+ if (severity_ == GTEST_FATAL) {
+ fflush(stderr);
+ posix::Abort();
+ }
+}
+// Disable Microsoft deprecation warnings for POSIX functions called from
+// this class (creat, dup, dup2, and close)
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4996)
+#endif // _MSC_VER
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Object that captures an output stream (stdout/stderr).
+class CapturedStream {
+ public:
+ // The ctor redirects the stream to a temporary file.
+ explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
+# if GTEST_OS_WINDOWS
+ char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT
+ char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT
+
+ ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
+ const UINT success = ::GetTempFileNameA(temp_dir_path,
+ "gtest_redir",
+ 0, // Generate unique file name.
+ temp_file_path);
+ GTEST_CHECK_(success != 0)
+ << "Unable to create a temporary file in " << temp_dir_path;
+ const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
+ GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
+ << temp_file_path;
+ filename_ = temp_file_path;
+# else
+ // There's no guarantee that a test has write access to the current
+ // directory, so we create the temporary file in the /tmp directory
+ // instead. We use /tmp on most systems, and /sdcard on Android.
+ // That's because Android doesn't have /tmp.
+# if GTEST_OS_LINUX_ANDROID
+ // Note: Android applications are expected to call the framework's
+ // Context.getExternalStorageDirectory() method through JNI to get
+ // the location of the world-writable SD Card directory. However,
+ // this requires a Context handle, which cannot be retrieved
+ // globally from native code. Doing so also precludes running the
+ // code as part of a regular standalone executable, which doesn't
+ // run in a Dalvik process (e.g. when running it through 'adb shell').
+ //
+ // The location /sdcard is directly accessible from native code
+ // and is the only location (unofficially) supported by the Android
+ // team. It's generally a symlink to the real SD Card mount point
+ // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
+ // other OEM-customized locations. Never rely on these, and always
+ // use /sdcard.
+ char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";
+# else
+ char name_template[] = "/tmp/captured_stream.XXXXXX";
+# endif // GTEST_OS_LINUX_ANDROID
+ const int captured_fd = mkstemp(name_template);
+ filename_ = name_template;
+# endif // GTEST_OS_WINDOWS
+ fflush(NULL);
+ dup2(captured_fd, fd_);
+ close(captured_fd);
+ }
+
+ ~CapturedStream() {
+ remove(filename_.c_str());
+ }
+
+ std::string GetCapturedString() {
+ if (uncaptured_fd_ != -1) {
+ // Restores the original stream.
+ fflush(NULL);
+ dup2(uncaptured_fd_, fd_);
+ close(uncaptured_fd_);
+ uncaptured_fd_ = -1;
+ }
+
+ FILE* const file = posix::FOpen(filename_.c_str(), "r");
+ const std::string content = ReadEntireFile(file);
+ posix::FClose(file);
+ return content;
+ }
+
+ private:
+ // Reads the entire content of a file as an std::string.
+ static std::string ReadEntireFile(FILE* file);
+
+ // Returns the size (in bytes) of a file.
+ static size_t GetFileSize(FILE* file);
+
+ const int fd_; // A stream to capture.
+ int uncaptured_fd_;
+ // Name of the temporary file holding the stderr output.
+ ::std::string filename_;
+
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
+};
+
+// Returns the size (in bytes) of a file.
+size_t CapturedStream::GetFileSize(FILE* file) {
+ fseek(file, 0, SEEK_END);
+ return static_cast<size_t>(ftell(file));
+}
+
+// Reads the entire content of a file as a string.
+std::string CapturedStream::ReadEntireFile(FILE* file) {
+ const size_t file_size = GetFileSize(file);
+ char* const buffer = new char[file_size];
+
+ size_t bytes_last_read = 0; // # of bytes read in the last fread()
+ size_t bytes_read = 0; // # of bytes read so far
+
+ fseek(file, 0, SEEK_SET);
+
+ // Keeps reading the file until we cannot read further or the
+ // pre-determined file size is reached.
+ do {
+ bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
+ bytes_read += bytes_last_read;
+ } while (bytes_last_read > 0 && bytes_read < file_size);
+
+ const std::string content(buffer, bytes_read);
+ delete[] buffer;
+
+ return content;
+}
+
+# ifdef _MSC_VER
+# pragma warning(pop)
+# endif // _MSC_VER
+
+static CapturedStream* g_captured_stderr = NULL;
+static CapturedStream* g_captured_stdout = NULL;
+
+// Starts capturing an output stream (stdout/stderr).
+void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
+ if (*stream != NULL) {
+ GTEST_LOG_(FATAL) << "Only one " << stream_name
+ << " capturer can exist at a time.";
+ }
+ *stream = new CapturedStream(fd);
+}
+
+// Stops capturing the output stream and returns the captured string.
+std::string GetCapturedStream(CapturedStream** captured_stream) {
+ const std::string content = (*captured_stream)->GetCapturedString();
+
+ delete *captured_stream;
+ *captured_stream = NULL;
+
+ return content;
+}
+
+// Starts capturing stdout.
+void CaptureStdout() {
+ CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
+}
+
+// Starts capturing stderr.
+void CaptureStderr() {
+ CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
+}
+
+// Stops capturing stdout and returns the captured string.
+std::string GetCapturedStdout() {
+ return GetCapturedStream(&g_captured_stdout);
+}
+
+// Stops capturing stderr and returns the captured string.
+std::string GetCapturedStderr() {
+ return GetCapturedStream(&g_captured_stderr);
+}
+
+#endif // GTEST_HAS_STREAM_REDIRECTION
+
+#if GTEST_HAS_DEATH_TEST
+
+// A copy of all command line arguments. Set by InitGoogleTest().
+::std::vector<testing::internal::string> g_argvs;
+
+static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
+ NULL; // Owned.
+
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
+ if (g_injected_test_argvs != argvs)
+ delete g_injected_test_argvs;
+ g_injected_test_argvs = argvs;
+}
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
+ if (g_injected_test_argvs != NULL) {
+ return *g_injected_test_argvs;
+ }
+ return g_argvs;
+}
+#endif // GTEST_HAS_DEATH_TEST
+
+#if GTEST_OS_WINDOWS_MOBILE
+namespace posix {
+void Abort() {
+ DebugBreak();
+ TerminateProcess(GetCurrentProcess(), 1);
+}
+} // namespace posix
+#endif // GTEST_OS_WINDOWS_MOBILE
+
+// Returns the name of the environment variable corresponding to the
+// given flag. For example, FlagToEnvVar("foo") will return
+// "GTEST_FOO" in the open-source version.
+static std::string FlagToEnvVar(const char* flag) {
+ const std::string full_flag =
+ (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
+
+ Message env_var;
+ for (size_t i = 0; i != full_flag.length(); i++) {
+ env_var << ToUpper(full_flag.c_str()[i]);
+ }
+
+ return env_var.GetString();
+}
+
+// Parses 'str' for a 32-bit signed integer. If successful, writes
+// the result to *value and returns true; otherwise leaves *value
+// unchanged and returns false.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
+ // Parses the environment variable as a decimal integer.
+ char* end = NULL;
+ const long long_value = strtol(str, &end, 10); // NOLINT
+
+ // Has strtol() consumed all characters in the string?
+ if (*end != '\0') {
+ // No - an invalid character was encountered.
+ Message msg;
+ msg << "WARNING: " << src_text
+ << " is expected to be a 32-bit integer, but actually"
+ << " has value \"" << str << "\".\n";
+ printf("%s", msg.GetString().c_str());
+ fflush(stdout);
+ return false;
+ }
+
+ // Is the parsed value in the range of an Int32?
+ const Int32 result = static_cast<Int32>(long_value);
+ if (long_value == LONG_MAX || long_value == LONG_MIN ||
+ // The parsed value overflows as a long. (strtol() returns
+ // LONG_MAX or LONG_MIN when the input overflows.)
+ result != long_value
+ // The parsed value overflows as an Int32.
+ ) {
+ Message msg;
+ msg << "WARNING: " << src_text
+ << " is expected to be a 32-bit integer, but actually"
+ << " has value " << str << ", which overflows.\n";
+ printf("%s", msg.GetString().c_str());
+ fflush(stdout);
+ return false;
+ }
+
+ *value = result;
+ return true;
+}
+
+// Reads and returns the Boolean environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+//
+// The value is considered true iff it's not "0".
+bool BoolFromGTestEnv(const char* flag, bool default_value) {
+ const std::string env_var = FlagToEnvVar(flag);
+ const char* const string_value = posix::GetEnv(env_var.c_str());
+ return string_value == NULL ?
+ default_value : strcmp(string_value, "0") != 0;
+}
+
+// Reads and returns a 32-bit integer stored in the environment
+// variable corresponding to the given flag; if it isn't set or
+// doesn't represent a valid 32-bit integer, returns default_value.
+Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
+ const std::string env_var = FlagToEnvVar(flag);
+ const char* const string_value = posix::GetEnv(env_var.c_str());
+ if (string_value == NULL) {
+ // The environment variable is not set.
+ return default_value;
+ }
+
+ Int32 result = default_value;
+ if (!ParseInt32(Message() << "Environment variable " << env_var,
+ string_value, &result)) {
+ printf("The default value %s is used.\n",
+ (Message() << default_value).GetString().c_str());
+ fflush(stdout);
+ return default_value;
+ }
+
+ return result;
+}
+
+// Reads and returns the string environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+const char* StringFromGTestEnv(const char* flag, const char* default_value) {
+ const std::string env_var = FlagToEnvVar(flag);
+ const char* const value = posix::GetEnv(env_var.c_str());
+ return value == NULL ? default_value : value;
+}
+
+} // namespace internal
+} // namespace testing
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// It uses the << operator when possible, and prints the bytes in the
+// object otherwise. A user can override its behavior for a class
+// type Foo by defining either operator<<(::std::ostream&, const Foo&)
+// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
+// defines Foo.
+
+#include <ctype.h>
+#include <stdio.h>
+#include <ostream> // NOLINT
+#include <string>
+
+namespace testing {
+
+namespace {
+
+using ::std::ostream;
+
+// Prints a segment of bytes in the given object.
+void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
+ size_t count, ostream* os) {
+ char text[5] = "";
+ for (size_t i = 0; i != count; i++) {
+ const size_t j = start + i;
+ if (i != 0) {
+ // Organizes the bytes into groups of 2 for easy parsing by
+ // human.
+ if ((j % 2) == 0)
+ *os << ' ';
+ else
+ *os << '-';
+ }
+ GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
+ *os << text;
+ }
+}
+
+// Prints the bytes in the given value to the given ostream.
+void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
+ ostream* os) {
+ // Tells the user how big the object is.
+ *os << count << "-byte object <";
+
+ const size_t kThreshold = 132;
+ const size_t kChunkSize = 64;
+ // If the object size is bigger than kThreshold, we'll have to omit
+ // some details by printing only the first and the last kChunkSize
+ // bytes.
+ // TODO(wan): let the user control the threshold using a flag.
+ if (count < kThreshold) {
+ PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
+ } else {
+ PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
+ *os << " ... ";
+ // Rounds up to 2-byte boundary.
+ const size_t resume_pos = (count - kChunkSize + 1)/2*2;
+ PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
+ }
+ *os << ">";
+}
+
+} // namespace
+
+namespace internal2 {
+
+// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
+// given object. The delegation simplifies the implementation, which
+// uses the << operator and thus is easier done outside of the
+// ::testing::internal namespace, which contains a << operator that
+// sometimes conflicts with the one in STL.
+void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
+ ostream* os) {
+ PrintBytesInObjectToImpl(obj_bytes, count, os);
+}
+
+} // namespace internal2
+
+namespace internal {
+
+// Depending on the value of a char (or wchar_t), we print it in one
+// of three formats:
+// - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
+// - as a hexidecimal escape sequence (e.g. '\x7F'), or
+// - as a special escape sequence (e.g. '\r', '\n').
+enum CharFormat {
+ kAsIs,
+ kHexEscape,
+ kSpecialEscape
+};
+
+// Returns true if c is a printable ASCII character. We test the
+// value of c directly instead of calling isprint(), which is buggy on
+// Windows Mobile.
+inline bool IsPrintableAscii(wchar_t c) {
+ return 0x20 <= c && c <= 0x7E;
+}
+
+// Prints a wide or narrow char c as a character literal without the
+// quotes, escaping it when necessary; returns how c was formatted.
+// The template argument UnsignedChar is the unsigned version of Char,
+// which is the type of c.
+template <typename UnsignedChar, typename Char>
+static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
+ switch (static_cast<wchar_t>(c)) {
+ case L'\0':
+ *os << "\\0";
+ break;
+ case L'\'':
+ *os << "\\'";
+ break;
+ case L'\\':
+ *os << "\\\\";
+ break;
+ case L'\a':
+ *os << "\\a";
+ break;
+ case L'\b':
+ *os << "\\b";
+ break;
+ case L'\f':
+ *os << "\\f";
+ break;
+ case L'\n':
+ *os << "\\n";
+ break;
+ case L'\r':
+ *os << "\\r";
+ break;
+ case L'\t':
+ *os << "\\t";
+ break;
+ case L'\v':
+ *os << "\\v";
+ break;
+ default:
+ if (IsPrintableAscii(c)) {
+ *os << static_cast<char>(c);
+ return kAsIs;
+ } else {
+ *os << "\\x" + String::FormatHexInt(static_cast<UnsignedChar>(c));
+ return kHexEscape;
+ }
+ }
+ return kSpecialEscape;
+}
+
+// Prints a wchar_t c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
+ switch (c) {
+ case L'\'':
+ *os << "'";
+ return kAsIs;
+ case L'"':
+ *os << "\\\"";
+ return kSpecialEscape;
+ default:
+ return PrintAsCharLiteralTo<wchar_t>(c, os);
+ }
+}
+
+// Prints a char c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
+ return PrintAsStringLiteralTo(
+ static_cast<wchar_t>(static_cast<unsigned char>(c)), os);
+}
+
+// Prints a wide or narrow character c and its code. '\0' is printed
+// as "'\\0'", other unprintable characters are also properly escaped
+// using the standard C++ escape sequence. The template argument
+// UnsignedChar is the unsigned version of Char, which is the type of c.
+template <typename UnsignedChar, typename Char>
+void PrintCharAndCodeTo(Char c, ostream* os) {
+ // First, print c as a literal in the most readable form we can find.
+ *os << ((sizeof(c) > 1) ? "L'" : "'");
+ const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
+ *os << "'";
+
+ // To aid user debugging, we also print c's code in decimal, unless
+ // it's 0 (in which case c was printed as '\\0', making the code
+ // obvious).
+ if (c == 0)
+ return;
+ *os << " (" << static_cast<int>(c);
+
+ // For more convenience, we print c's code again in hexidecimal,
+ // unless c was already printed in the form '\x##' or the code is in
+ // [1, 9].
+ if (format == kHexEscape || (1 <= c && c <= 9)) {
+ // Do nothing.
+ } else {
+ *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));
+ }
+ *os << ")";
+}
+
+void PrintTo(unsigned char c, ::std::ostream* os) {
+ PrintCharAndCodeTo<unsigned char>(c, os);
+}
+void PrintTo(signed char c, ::std::ostream* os) {
+ PrintCharAndCodeTo<unsigned char>(c, os);
+}
+
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its code. L'\0' is printed as "L'\\0'".
+void PrintTo(wchar_t wc, ostream* os) {
+ PrintCharAndCodeTo<wchar_t>(wc, os);
+}
+
+// Prints the given array of characters to the ostream. CharType must be either
+// char or wchar_t.
+// The array starts at begin, the length is len, it may include '\0' characters
+// and may not be NUL-terminated.
+template <typename CharType>
+static void PrintCharsAsStringTo(
+ const CharType* begin, size_t len, ostream* os) {
+ const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\"";
+ *os << kQuoteBegin;
+ bool is_previous_hex = false;
+ for (size_t index = 0; index < len; ++index) {
+ const CharType cur = begin[index];
+ if (is_previous_hex && IsXDigit(cur)) {
+ // Previous character is of '\x..' form and this character can be
+ // interpreted as another hexadecimal digit in its number. Break string to
+ // disambiguate.
+ *os << "\" " << kQuoteBegin;
+ }
+ is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
+ }
+ *os << "\"";
+}
+
+// Prints a (const) char/wchar_t array of 'len' elements, starting at address
+// 'begin'. CharType must be either char or wchar_t.
+template <typename CharType>
+static void UniversalPrintCharArray(
+ const CharType* begin, size_t len, ostream* os) {
+ // The code
+ // const char kFoo[] = "foo";
+ // generates an array of 4, not 3, elements, with the last one being '\0'.
+ //
+ // Therefore when printing a char array, we don't print the last element if
+ // it's '\0', such that the output matches the string literal as it's
+ // written in the source code.
+ if (len > 0 && begin[len - 1] == '\0') {
+ PrintCharsAsStringTo(begin, len - 1, os);
+ return;
+ }
+
+ // If, however, the last element in the array is not '\0', e.g.
+ // const char kFoo[] = { 'f', 'o', 'o' };
+ // we must print the entire array. We also print a message to indicate
+ // that the array is not NUL-terminated.
+ PrintCharsAsStringTo(begin, len, os);
+ *os << " (no terminating NUL)";
+}
+
+// Prints a (const) char array of 'len' elements, starting at address 'begin'.
+void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
+ UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints a (const) wchar_t array of 'len' elements, starting at address
+// 'begin'.
+void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
+ UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints the given C string to the ostream.
+void PrintTo(const char* s, ostream* os) {
+ if (s == NULL) {
+ *os << "NULL";
+ } else {
+ *os << ImplicitCast_<const void*>(s) << " pointing to ";
+ PrintCharsAsStringTo(s, strlen(s), os);
+ }
+}
+
+// MSVC compiler can be configured to define whar_t as a typedef
+// of unsigned short. Defining an overload for const wchar_t* in that case
+// would cause pointers to unsigned shorts be printed as wide strings,
+// possibly accessing more memory than intended and causing invalid
+// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
+// wchar_t is implemented as a native type.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Prints the given wide C string to the ostream.
+void PrintTo(const wchar_t* s, ostream* os) {
+ if (s == NULL) {
+ *os << "NULL";
+ } else {
+ *os << ImplicitCast_<const void*>(s) << " pointing to ";
+ PrintCharsAsStringTo(s, wcslen(s), os);
+ }
+}
+#endif // wchar_t is native
+
+// Prints a ::string object.
+#if GTEST_HAS_GLOBAL_STRING
+void PrintStringTo(const ::string& s, ostream* os) {
+ PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif // GTEST_HAS_GLOBAL_STRING
+
+void PrintStringTo(const ::std::string& s, ostream* os) {
+ PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+
+// Prints a ::wstring object.
+#if GTEST_HAS_GLOBAL_WSTRING
+void PrintWideStringTo(const ::wstring& s, ostream* os) {
+ PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
+ PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif // GTEST_HAS_STD_WSTRING
+
+} // namespace internal
+
+} // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// The Google C++ Testing Framework (Google Test)
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation. It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error. This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+using internal::GetUnitTestImpl;
+
+// Gets the summary of the failure message by omitting the stack trace
+// in it.
+std::string TestPartResult::ExtractSummary(const char* message) {
+ const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
+ return stack_trace == NULL ? message :
+ std::string(message, stack_trace);
+}
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
+ return os
+ << result.file_name() << ":" << result.line_number() << ": "
+ << (result.type() == TestPartResult::kSuccess ? "Success" :
+ result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
+ "Non-fatal failure") << ":\n"
+ << result.message() << std::endl;
+}
+
+// Appends a TestPartResult to the array.
+void TestPartResultArray::Append(const TestPartResult& result) {
+ array_.push_back(result);
+}
+
+// Returns the TestPartResult at the given index (0-based).
+const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
+ if (index < 0 || index >= size()) {
+ printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
+ internal::posix::Abort();
+ }
+
+ return array_[index];
+}
+
+// Returns the number of TestPartResult objects in the array.
+int TestPartResultArray::size() const {
+ return static_cast<int>(array_.size());
+}
+
+namespace internal {
+
+HasNewFatalFailureHelper::HasNewFatalFailureHelper()
+ : has_new_fatal_failure_(false),
+ original_reporter_(GetUnitTestImpl()->
+ GetTestPartResultReporterForCurrentThread()) {
+ GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
+}
+
+HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
+ GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
+ original_reporter_);
+}
+
+void HasNewFatalFailureHelper::ReportTestPartResult(
+ const TestPartResult& result) {
+ if (result.fatally_failed())
+ has_new_fatal_failure_ = true;
+ original_reporter_->ReportTestPartResult(result);
+}
+
+} // namespace internal
+
+} // namespace testing
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+namespace testing {
+namespace internal {
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// Skips to the first non-space char in str. Returns an empty string if str
+// contains only whitespace characters.
+static const char* SkipSpaces(const char* str) {
+ while (IsSpace(*str))
+ str++;
+ return str;
+}
+
+// Verifies that registered_tests match the test names in
+// defined_test_names_; returns registered_tests if successful, or
+// aborts the program otherwise.
+const char* TypedTestCasePState::VerifyRegisteredTestNames(
+ const char* file, int line, const char* registered_tests) {
+ typedef ::std::set<const char*>::const_iterator DefinedTestIter;
+ registered_ = true;
+
+ // Skip initial whitespace in registered_tests since some
+ // preprocessors prefix stringizied literals with whitespace.
+ registered_tests = SkipSpaces(registered_tests);
+
+ Message errors;
+ ::std::set<std::string> tests;
+ for (const char* names = registered_tests; names != NULL;
+ names = SkipComma(names)) {
+ const std::string name = GetPrefixUntilComma(names);
+ if (tests.count(name) != 0) {
+ errors << "Test " << name << " is listed more than once.\n";
+ continue;
+ }
+
+ bool found = false;
+ for (DefinedTestIter it = defined_test_names_.begin();
+ it != defined_test_names_.end();
+ ++it) {
+ if (name == *it) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found) {
+ tests.insert(name);
+ } else {
+ errors << "No test named " << name
+ << " can be found in this test case.\n";
+ }
+ }
+
+ for (DefinedTestIter it = defined_test_names_.begin();
+ it != defined_test_names_.end();
+ ++it) {
+ if (tests.count(*it) == 0) {
+ errors << "You forgot to list test " << *it << ".\n";
+ }
+ }
+
+ const std::string& errors_str = errors.GetString();
+ if (errors_str != "") {
+ fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+ errors_str.c_str());
+ fflush(stderr);
+ posix::Abort();
+ }
+
+ return registered_tests;
+}
+
+#endif // GTEST_HAS_TYPED_TEST_P
+
+} // namespace internal
+} // namespace testing
diff --git a/unit_tests/gtest/src/gtest-death-test.cc b/unit_tests/gtest/src/gtest-death-test.cc
deleted file mode 100644
index 8b2e413..0000000
--- a/unit_tests/gtest/src/gtest-death-test.cc
+++ /dev/null
@@ -1,1234 +0,0 @@
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan), vladl at google.com (Vlad Losev)
-//
-// This file implements death tests.
-
-#include "gtest/gtest-death-test.h"
-#include "gtest/internal/gtest-port.h"
-
-#if GTEST_HAS_DEATH_TEST
-
-# if GTEST_OS_MAC
-# include <crt_externs.h>
-# endif // GTEST_OS_MAC
-
-# include <errno.h>
-# include <fcntl.h>
-# include <limits.h>
-# include <stdarg.h>
-
-# if GTEST_OS_WINDOWS
-# include <windows.h>
-# else
-# include <sys/mman.h>
-# include <sys/wait.h>
-# endif // GTEST_OS_WINDOWS
-
-#endif // GTEST_HAS_DEATH_TEST
-
-#include "gtest/gtest-message.h"
-#include "gtest/internal/gtest-string.h"
-
-// Indicates that this translation unit is part of Google Test's
-// implementation. It must come before gtest-internal-inl.h is
-// included, or there will be a compiler error. This trick is to
-// prevent a user from accidentally including gtest-internal-inl.h in
-// his code.
-#define GTEST_IMPLEMENTATION_ 1
-#include "src/gtest-internal-inl.h"
-#undef GTEST_IMPLEMENTATION_
-
-namespace testing {
-
-// Constants.
-
-// The default death test style.
-static const char kDefaultDeathTestStyle[] = "fast";
-
-GTEST_DEFINE_string_(
- death_test_style,
- internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
- "Indicates how to run a death test in a forked child process: "
- "\"threadsafe\" (child process re-executes the test binary "
- "from the beginning, running only the specific death test) or "
- "\"fast\" (child process runs the death test immediately "
- "after forking).");
-
-GTEST_DEFINE_bool_(
- death_test_use_fork,
- internal::BoolFromGTestEnv("death_test_use_fork", false),
- "Instructs to use fork()/_exit() instead of clone() in death tests. "
- "Ignored and always uses fork() on POSIX systems where clone() is not "
- "implemented. Useful when running under valgrind or similar tools if "
- "those do not support clone(). Valgrind 3.3.1 will just fail if "
- "it sees an unsupported combination of clone() flags. "
- "It is not recommended to use this flag w/o valgrind though it will "
- "work in 99% of the cases. Once valgrind is fixed, this flag will "
- "most likely be removed.");
-
-namespace internal {
-GTEST_DEFINE_string_(
- internal_run_death_test, "",
- "Indicates the file, line number, temporal index of "
- "the single death test to run, and a file descriptor to "
- "which a success code may be sent, all separated by "
- "colons. This flag is specified if and only if the current "
- "process is a sub-process launched for running a thread-safe "
- "death test. FOR INTERNAL USE ONLY.");
-} // namespace internal
-
-#if GTEST_HAS_DEATH_TEST
-
-// ExitedWithCode constructor.
-ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
-}
-
-// ExitedWithCode function-call operator.
-bool ExitedWithCode::operator()(int exit_status) const {
-# if GTEST_OS_WINDOWS
-
- return exit_status == exit_code_;
-
-# else
-
- return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
-
-# endif // GTEST_OS_WINDOWS
-}
-
-# if !GTEST_OS_WINDOWS
-// KilledBySignal constructor.
-KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
-}
-
-// KilledBySignal function-call operator.
-bool KilledBySignal::operator()(int exit_status) const {
- return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
-}
-# endif // !GTEST_OS_WINDOWS
-
-namespace internal {
-
-// Utilities needed for death tests.
-
-// Generates a textual description of a given exit code, in the format
-// specified by wait(2).
-static String ExitSummary(int exit_code) {
- Message m;
-
-# if GTEST_OS_WINDOWS
-
- m << "Exited with exit status " << exit_code;
-
-# else
-
- if (WIFEXITED(exit_code)) {
- m << "Exited with exit status " << WEXITSTATUS(exit_code);
- } else if (WIFSIGNALED(exit_code)) {
- m << "Terminated by signal " << WTERMSIG(exit_code);
- }
-# ifdef WCOREDUMP
- if (WCOREDUMP(exit_code)) {
- m << " (core dumped)";
- }
-# endif
-# endif // GTEST_OS_WINDOWS
-
- return m.GetString();
-}
-
-// Returns true if exit_status describes a process that was terminated
-// by a signal, or exited normally with a nonzero exit code.
-bool ExitedUnsuccessfully(int exit_status) {
- return !ExitedWithCode(0)(exit_status);
-}
-
-# if !GTEST_OS_WINDOWS
-// Generates a textual failure message when a death test finds more than
-// one thread running, or cannot determine the number of threads, prior
-// to executing the given statement. It is the responsibility of the
-// caller not to pass a thread_count of 1.
-static String DeathTestThreadWarning(size_t thread_count) {
- Message msg;
- msg << "Death tests use fork(), which is unsafe particularly"
- << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
- if (thread_count == 0)
- msg << "couldn't detect the number of threads.";
- else
- msg << "detected " << thread_count << " threads.";
- return msg.GetString();
-}
-# endif // !GTEST_OS_WINDOWS
-
-// Flag characters for reporting a death test that did not die.
-static const char kDeathTestLived = 'L';
-static const char kDeathTestReturned = 'R';
-static const char kDeathTestThrew = 'T';
-static const char kDeathTestInternalError = 'I';
-
-// An enumeration describing all of the possible ways that a death test can
-// conclude. DIED means that the process died while executing the test
-// code; LIVED means that process lived beyond the end of the test code;
-// RETURNED means that the test statement attempted to execute a return
-// statement, which is not allowed; THREW means that the test statement
-// returned control by throwing an exception. IN_PROGRESS means the test
-// has not yet concluded.
-// TODO(vladl at google.com): Unify names and possibly values for
-// AbortReason, DeathTestOutcome, and flag characters above.
-enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
-
-// Routine for aborting the program which is safe to call from an
-// exec-style death test child process, in which case the error
-// message is propagated back to the parent process. Otherwise, the
-// message is simply printed to stderr. In either case, the program
-// then exits with status 1.
-void DeathTestAbort(const String& message) {
- // On a POSIX system, this function may be called from a threadsafe-style
- // death test child process, which operates on a very small stack. Use
- // the heap for any additional non-minuscule memory requirements.
- const InternalRunDeathTestFlag* const flag =
- GetUnitTestImpl()->internal_run_death_test_flag();
- if (flag != NULL) {
- FILE* parent = posix::FDOpen(flag->write_fd(), "w");
- fputc(kDeathTestInternalError, parent);
- fprintf(parent, "%s", message.c_str());
- fflush(parent);
- _exit(1);
- } else {
- fprintf(stderr, "%s", message.c_str());
- fflush(stderr);
- posix::Abort();
- }
-}
-
-// A replacement for CHECK that calls DeathTestAbort if the assertion
-// fails.
-# define GTEST_DEATH_TEST_CHECK_(expression) \
- do { \
- if (!::testing::internal::IsTrue(expression)) { \
- DeathTestAbort(::testing::internal::String::Format( \
- "CHECK failed: File %s, line %d: %s", \
- __FILE__, __LINE__, #expression)); \
- } \
- } while (::testing::internal::AlwaysFalse())
-
-// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
-// evaluating any system call that fulfills two conditions: it must return
-// -1 on failure, and set errno to EINTR when it is interrupted and
-// should be tried again. The macro expands to a loop that repeatedly
-// evaluates the expression as long as it evaluates to -1 and sets
-// errno to EINTR. If the expression evaluates to -1 but errno is
-// something other than EINTR, DeathTestAbort is called.
-# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
- do { \
- int gtest_retval; \
- do { \
- gtest_retval = (expression); \
- } while (gtest_retval == -1 && errno == EINTR); \
- if (gtest_retval == -1) { \
- DeathTestAbort(::testing::internal::String::Format( \
- "CHECK failed: File %s, line %d: %s != -1", \
- __FILE__, __LINE__, #expression)); \
- } \
- } while (::testing::internal::AlwaysFalse())
-
-// Returns the message describing the last system error in errno.
-String GetLastErrnoDescription() {
- return String(errno == 0 ? "" : posix::StrError(errno));
-}
-
-// This is called from a death test parent process to read a failure
-// message from the death test child process and log it with the FATAL
-// severity. On Windows, the message is read from a pipe handle. On other
-// platforms, it is read from a file descriptor.
-static void FailFromInternalError(int fd) {
- Message error;
- char buffer[256];
- int num_read;
-
- do {
- while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
- buffer[num_read] = '\0';
- error << buffer;
- }
- } while (num_read == -1 && errno == EINTR);
-
- if (num_read == 0) {
- GTEST_LOG_(FATAL) << error.GetString();
- } else {
- const int last_error = errno;
- GTEST_LOG_(FATAL) << "Error while reading death test internal: "
- << GetLastErrnoDescription() << " [" << last_error << "]";
- }
-}
-
-// Death test constructor. Increments the running death test count
-// for the current test.
-DeathTest::DeathTest() {
- TestInfo* const info = GetUnitTestImpl()->current_test_info();
- if (info == NULL) {
- DeathTestAbort("Cannot run a death test outside of a TEST or "
- "TEST_F construct");
- }
-}
-
-// Creates and returns a death test by dispatching to the current
-// death test factory.
-bool DeathTest::Create(const char* statement, const RE* regex,
- const char* file, int line, DeathTest** test) {
- return GetUnitTestImpl()->death_test_factory()->Create(
- statement, regex, file, line, test);
-}
-
-const char* DeathTest::LastMessage() {
- return last_death_test_message_.c_str();
-}
-
-void DeathTest::set_last_death_test_message(const String& message) {
- last_death_test_message_ = message;
-}
-
-String DeathTest::last_death_test_message_;
-
-// Provides cross platform implementation for some death functionality.
-class DeathTestImpl : public DeathTest {
- protected:
- DeathTestImpl(const char* a_statement, const RE* a_regex)
- : statement_(a_statement),
- regex_(a_regex),
- spawned_(false),
- status_(-1),
- outcome_(IN_PROGRESS),
- read_fd_(-1),
- write_fd_(-1) {}
-
- // read_fd_ is expected to be closed and cleared by a derived class.
- ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
-
- void Abort(AbortReason reason);
- virtual bool Passed(bool status_ok);
-
- const char* statement() const { return statement_; }
- const RE* regex() const { return regex_; }
- bool spawned() const { return spawned_; }
- void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
- int status() const { return status_; }
- void set_status(int a_status) { status_ = a_status; }
- DeathTestOutcome outcome() const { return outcome_; }
- void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
- int read_fd() const { return read_fd_; }
- void set_read_fd(int fd) { read_fd_ = fd; }
- int write_fd() const { return write_fd_; }
- void set_write_fd(int fd) { write_fd_ = fd; }
-
- // Called in the parent process only. Reads the result code of the death
- // test child process via a pipe, interprets it to set the outcome_
- // member, and closes read_fd_. Outputs diagnostics and terminates in
- // case of unexpected codes.
- void ReadAndInterpretStatusByte();
-
- private:
- // The textual content of the code this object is testing. This class
- // doesn't own this string and should not attempt to delete it.
- const char* const statement_;
- // The regular expression which test output must match. DeathTestImpl
- // doesn't own this object and should not attempt to delete it.
- const RE* const regex_;
- // True if the death test child process has been successfully spawned.
- bool spawned_;
- // The exit status of the child process.
- int status_;
- // How the death test concluded.
- DeathTestOutcome outcome_;
- // Descriptor to the read end of the pipe to the child process. It is
- // always -1 in the child process. The child keeps its write end of the
- // pipe in write_fd_.
- int read_fd_;
- // Descriptor to the child's write end of the pipe to the parent process.
- // It is always -1 in the parent process. The parent keeps its end of the
- // pipe in read_fd_.
- int write_fd_;
-};
-
-// Called in the parent process only. Reads the result code of the death
-// test child process via a pipe, interprets it to set the outcome_
-// member, and closes read_fd_. Outputs diagnostics and terminates in
-// case of unexpected codes.
-void DeathTestImpl::ReadAndInterpretStatusByte() {
- char flag;
- int bytes_read;
-
- // The read() here blocks until data is available (signifying the
- // failure of the death test) or until the pipe is closed (signifying
- // its success), so it's okay to call this in the parent before
- // the child process has exited.
- do {
- bytes_read = posix::Read(read_fd(), &flag, 1);
- } while (bytes_read == -1 && errno == EINTR);
-
- if (bytes_read == 0) {
- set_outcome(DIED);
- } else if (bytes_read == 1) {
- switch (flag) {
- case kDeathTestReturned:
- set_outcome(RETURNED);
- break;
- case kDeathTestThrew:
- set_outcome(THREW);
- break;
- case kDeathTestLived:
- set_outcome(LIVED);
- break;
- case kDeathTestInternalError:
- FailFromInternalError(read_fd()); // Does not return.
- break;
- default:
- GTEST_LOG_(FATAL) << "Death test child process reported "
- << "unexpected status byte ("
- << static_cast<unsigned int>(flag) << ")";
- }
- } else {
- GTEST_LOG_(FATAL) << "Read from death test child process failed: "
- << GetLastErrnoDescription();
- }
- GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
- set_read_fd(-1);
-}
-
-// Signals that the death test code which should have exited, didn't.
-// Should be called only in a death test child process.
-// Writes a status byte to the child's status file descriptor, then
-// calls _exit(1).
-void DeathTestImpl::Abort(AbortReason reason) {
- // The parent process considers the death test to be a failure if
- // it finds any data in our pipe. So, here we write a single flag byte
- // to the pipe, then exit.
- const char status_ch =
- reason == TEST_DID_NOT_DIE ? kDeathTestLived :
- reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
-
- GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
- // We are leaking the descriptor here because on some platforms (i.e.,
- // when built as Windows DLL), destructors of global objects will still
- // run after calling _exit(). On such systems, write_fd_ will be
- // indirectly closed from the destructor of UnitTestImpl, causing double
- // close if it is also closed here. On debug configurations, double close
- // may assert. As there are no in-process buffers to flush here, we are
- // relying on the OS to close the descriptor after the process terminates
- // when the destructors are not run.
- _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash)
-}
-
-// Returns an indented copy of stderr output for a death test.
-// This makes distinguishing death test output lines from regular log lines
-// much easier.
-static ::std::string FormatDeathTestOutput(const ::std::string& output) {
- ::std::string ret;
- for (size_t at = 0; ; ) {
- const size_t line_end = output.find('\n', at);
- ret += "[ DEATH ] ";
- if (line_end == ::std::string::npos) {
- ret += output.substr(at);
- break;
- }
- ret += output.substr(at, line_end + 1 - at);
- at = line_end + 1;
- }
- return ret;
-}
-
-// Assesses the success or failure of a death test, using both private
-// members which have previously been set, and one argument:
-//
-// Private data members:
-// outcome: An enumeration describing how the death test
-// concluded: DIED, LIVED, THREW, or RETURNED. The death test
-// fails in the latter three cases.
-// status: The exit status of the child process. On *nix, it is in the
-// in the format specified by wait(2). On Windows, this is the
-// value supplied to the ExitProcess() API or a numeric code
-// of the exception that terminated the program.
-// regex: A regular expression object to be applied to
-// the test's captured standard error output; the death test
-// fails if it does not match.
-//
-// Argument:
-// status_ok: true if exit_status is acceptable in the context of
-// this particular death test, which fails if it is false
-//
-// Returns true iff all of the above conditions are met. Otherwise, the
-// first failing condition, in the order given above, is the one that is
-// reported. Also sets the last death test message string.
-bool DeathTestImpl::Passed(bool status_ok) {
- if (!spawned())
- return false;
-
- const String error_message = GetCapturedStderr();
-
- bool success = false;
- Message buffer;
-
- buffer << "Death test: " << statement() << "\n";
- switch (outcome()) {
- case LIVED:
- buffer << " Result: failed to die.\n"
- << " Error msg:\n" << FormatDeathTestOutput(error_message);
- break;
- case THREW:
- buffer << " Result: threw an exception.\n"
- << " Error msg:\n" << FormatDeathTestOutput(error_message);
- break;
- case RETURNED:
- buffer << " Result: illegal return in test statement.\n"
- << " Error msg:\n" << FormatDeathTestOutput(error_message);
- break;
- case DIED:
- if (status_ok) {
- const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
- if (matched) {
- success = true;
- } else {
- buffer << " Result: died but not with expected error.\n"
- << " Expected: " << regex()->pattern() << "\n"
- << "Actual msg:\n" << FormatDeathTestOutput(error_message);
- }
- } else {
- buffer << " Result: died but not with expected exit code:\n"
- << " " << ExitSummary(status()) << "\n"
- << "Actual msg:\n" << FormatDeathTestOutput(error_message);
- }
- break;
- case IN_PROGRESS:
- default:
- GTEST_LOG_(FATAL)
- << "DeathTest::Passed somehow called before conclusion of test";
- }
-
- DeathTest::set_last_death_test_message(buffer.GetString());
- return success;
-}
-
-# if GTEST_OS_WINDOWS
-// WindowsDeathTest implements death tests on Windows. Due to the
-// specifics of starting new processes on Windows, death tests there are
-// always threadsafe, and Google Test considers the
-// --gtest_death_test_style=fast setting to be equivalent to
-// --gtest_death_test_style=threadsafe there.
-//
-// A few implementation notes: Like the Linux version, the Windows
-// implementation uses pipes for child-to-parent communication. But due to
-// the specifics of pipes on Windows, some extra steps are required:
-//
-// 1. The parent creates a communication pipe and stores handles to both
-// ends of it.
-// 2. The parent starts the child and provides it with the information
-// necessary to acquire the handle to the write end of the pipe.
-// 3. The child acquires the write end of the pipe and signals the parent
-// using a Windows event.
-// 4. Now the parent can release the write end of the pipe on its side. If
-// this is done before step 3, the object's reference count goes down to
-// 0 and it is destroyed, preventing the child from acquiring it. The
-// parent now has to release it, or read operations on the read end of
-// the pipe will not return when the child terminates.
-// 5. The parent reads child's output through the pipe (outcome code and
-// any possible error messages) from the pipe, and its stderr and then
-// determines whether to fail the test.
-//
-// Note: to distinguish Win32 API calls from the local method and function
-// calls, the former are explicitly resolved in the global namespace.
-//
-class WindowsDeathTest : public DeathTestImpl {
- public:
- WindowsDeathTest(const char* a_statement,
- const RE* a_regex,
- const char* file,
- int line)
- : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
-
- // All of these virtual functions are inherited from DeathTest.
- virtual int Wait();
- virtual TestRole AssumeRole();
-
- private:
- // The name of the file in which the death test is located.
- const char* const file_;
- // The line number on which the death test is located.
- const int line_;
- // Handle to the write end of the pipe to the child process.
- AutoHandle write_handle_;
- // Child process handle.
- AutoHandle child_handle_;
- // Event the child process uses to signal the parent that it has
- // acquired the handle to the write end of the pipe. After seeing this
- // event the parent can release its own handles to make sure its
- // ReadFile() calls return when the child terminates.
- AutoHandle event_handle_;
-};
-
-// Waits for the child in a death test to exit, returning its exit
-// status, or 0 if no child process exists. As a side effect, sets the
-// outcome data member.
-int WindowsDeathTest::Wait() {
- if (!spawned())
- return 0;
-
- // Wait until the child either signals that it has acquired the write end
- // of the pipe or it dies.
- const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
- switch (::WaitForMultipleObjects(2,
- wait_handles,
- FALSE, // Waits for any of the handles.
- INFINITE)) {
- case WAIT_OBJECT_0:
- case WAIT_OBJECT_0 + 1:
- break;
- default:
- GTEST_DEATH_TEST_CHECK_(false); // Should not get here.
- }
-
- // The child has acquired the write end of the pipe or exited.
- // We release the handle on our side and continue.
- write_handle_.Reset();
- event_handle_.Reset();
-
- ReadAndInterpretStatusByte();
-
- // Waits for the child process to exit if it haven't already. This
- // returns immediately if the child has already exited, regardless of
- // whether previous calls to WaitForMultipleObjects synchronized on this
- // handle or not.
- GTEST_DEATH_TEST_CHECK_(
- WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
- INFINITE));
- DWORD status_code;
- GTEST_DEATH_TEST_CHECK_(
- ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
- child_handle_.Reset();
- set_status(static_cast<int>(status_code));
- return status();
-}
-
-// The AssumeRole process for a Windows death test. It creates a child
-// process with the same executable as the current process to run the
-// death test. The child process is given the --gtest_filter and
-// --gtest_internal_run_death_test flags such that it knows to run the
-// current death test only.
-DeathTest::TestRole WindowsDeathTest::AssumeRole() {
- const UnitTestImpl* const impl = GetUnitTestImpl();
- const InternalRunDeathTestFlag* const flag =
- impl->internal_run_death_test_flag();
- const TestInfo* const info = impl->current_test_info();
- const int death_test_index = info->result()->death_test_count();
-
- if (flag != NULL) {
- // ParseInternalRunDeathTestFlag() has performed all the necessary
- // processing.
- set_write_fd(flag->write_fd());
- return EXECUTE_TEST;
- }
-
- // WindowsDeathTest uses an anonymous pipe to communicate results of
- // a death test.
- SECURITY_ATTRIBUTES handles_are_inheritable = {
- sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
- HANDLE read_handle, write_handle;
- GTEST_DEATH_TEST_CHECK_(
- ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
- 0) // Default buffer size.
- != FALSE);
- set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
- O_RDONLY));
- write_handle_.Reset(write_handle);
- event_handle_.Reset(::CreateEvent(
- &handles_are_inheritable,
- TRUE, // The event will automatically reset to non-signaled state.
- FALSE, // The initial state is non-signalled.
- NULL)); // The even is unnamed.
- GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
- const String filter_flag = String::Format("--%s%s=%s.%s",
- GTEST_FLAG_PREFIX_, kFilterFlag,
- info->test_case_name(),
- info->name());
- const String internal_flag = String::Format(
- "--%s%s=%s|%d|%d|%u|%Iu|%Iu",
- GTEST_FLAG_PREFIX_,
- kInternalRunDeathTestFlag,
- file_, line_,
- death_test_index,
- static_cast<unsigned int>(::GetCurrentProcessId()),
- // size_t has the same with as pointers on both 32-bit and 64-bit
- // Windows platforms.
- // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
- reinterpret_cast<size_t>(write_handle),
- reinterpret_cast<size_t>(event_handle_.Get()));
-
- char executable_path[_MAX_PATH + 1]; // NOLINT
- GTEST_DEATH_TEST_CHECK_(
- _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
- executable_path,
- _MAX_PATH));
-
- String command_line = String::Format("%s %s \"%s\"",
- ::GetCommandLineA(),
- filter_flag.c_str(),
- internal_flag.c_str());
-
- DeathTest::set_last_death_test_message("");
-
- CaptureStderr();
- // Flush the log buffers since the log streams are shared with the child.
- FlushInfoLog();
-
- // The child process will share the standard handles with the parent.
- STARTUPINFOA startup_info;
- memset(&startup_info, 0, sizeof(STARTUPINFO));
- startup_info.dwFlags = STARTF_USESTDHANDLES;
- startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
- startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
- startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
-
- PROCESS_INFORMATION process_info;
- GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
- executable_path,
- const_cast<char*>(command_line.c_str()),
- NULL, // Retuned process handle is not inheritable.
- NULL, // Retuned thread handle is not inheritable.
- TRUE, // Child inherits all inheritable handles (for write_handle_).
- 0x0, // Default creation flags.
- NULL, // Inherit the parent's environment.
- UnitTest::GetInstance()->original_working_dir(),
- &startup_info,
- &process_info) != FALSE);
- child_handle_.Reset(process_info.hProcess);
- ::CloseHandle(process_info.hThread);
- set_spawned(true);
- return OVERSEE_TEST;
-}
-# else // We are not on Windows.
-
-// ForkingDeathTest provides implementations for most of the abstract
-// methods of the DeathTest interface. Only the AssumeRole method is
-// left undefined.
-class ForkingDeathTest : public DeathTestImpl {
- public:
- ForkingDeathTest(const char* statement, const RE* regex);
-
- // All of these virtual functions are inherited from DeathTest.
- virtual int Wait();
-
- protected:
- void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
-
- private:
- // PID of child process during death test; 0 in the child process itself.
- pid_t child_pid_;
-};
-
-// Constructs a ForkingDeathTest.
-ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
- : DeathTestImpl(a_statement, a_regex),
- child_pid_(-1) {}
-
-// Waits for the child in a death test to exit, returning its exit
-// status, or 0 if no child process exists. As a side effect, sets the
-// outcome data member.
-int ForkingDeathTest::Wait() {
- if (!spawned())
- return 0;
-
- ReadAndInterpretStatusByte();
-
- int status_value;
- GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
- set_status(status_value);
- return status_value;
-}
-
-// A concrete death test class that forks, then immediately runs the test
-// in the child process.
-class NoExecDeathTest : public ForkingDeathTest {
- public:
- NoExecDeathTest(const char* a_statement, const RE* a_regex) :
- ForkingDeathTest(a_statement, a_regex) { }
- virtual TestRole AssumeRole();
-};
-
-// The AssumeRole process for a fork-and-run death test. It implements a
-// straightforward fork, with a simple pipe to transmit the status byte.
-DeathTest::TestRole NoExecDeathTest::AssumeRole() {
- const size_t thread_count = GetThreadCount();
- if (thread_count != 1) {
- GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
- }
-
- int pipe_fd[2];
- GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
-
- DeathTest::set_last_death_test_message("");
- CaptureStderr();
- // When we fork the process below, the log file buffers are copied, but the
- // file descriptors are shared. We flush all log files here so that closing
- // the file descriptors in the child process doesn't throw off the
- // synchronization between descriptors and buffers in the parent process.
- // This is as close to the fork as possible to avoid a race condition in case
- // there are multiple threads running before the death test, and another
- // thread writes to the log file.
- FlushInfoLog();
-
- const pid_t child_pid = fork();
- GTEST_DEATH_TEST_CHECK_(child_pid != -1);
- set_child_pid(child_pid);
- if (child_pid == 0) {
- GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
- set_write_fd(pipe_fd[1]);
- // Redirects all logging to stderr in the child process to prevent
- // concurrent writes to the log files. We capture stderr in the parent
- // process and append the child process' output to a log.
- LogToStderr();
- // Event forwarding to the listeners of event listener API mush be shut
- // down in death test subprocesses.
- GetUnitTestImpl()->listeners()->SuppressEventForwarding();
- return EXECUTE_TEST;
- } else {
- GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
- set_read_fd(pipe_fd[0]);
- set_spawned(true);
- return OVERSEE_TEST;
- }
-}
-
-// A concrete death test class that forks and re-executes the main
-// program from the beginning, with command-line flags set that cause
-// only this specific death test to be run.
-class ExecDeathTest : public ForkingDeathTest {
- public:
- ExecDeathTest(const char* a_statement, const RE* a_regex,
- const char* file, int line) :
- ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
- virtual TestRole AssumeRole();
- private:
- // The name of the file in which the death test is located.
- const char* const file_;
- // The line number on which the death test is located.
- const int line_;
-};
-
-// Utility class for accumulating command-line arguments.
-class Arguments {
- public:
- Arguments() {
- args_.push_back(NULL);
- }
-
- ~Arguments() {
- for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
- ++i) {
- free(*i);
- }
- }
- void AddArgument(const char* argument) {
- args_.insert(args_.end() - 1, posix::StrDup(argument));
- }
-
- template <typename Str>
- void AddArguments(const ::std::vector<Str>& arguments) {
- for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
- i != arguments.end();
- ++i) {
- args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
- }
- }
- char* const* Argv() {
- return &args_[0];
- }
- private:
- std::vector<char*> args_;
-};
-
-// A struct that encompasses the arguments to the child process of a
-// threadsafe-style death test process.
-struct ExecDeathTestArgs {
- char* const* argv; // Command-line arguments for the child's call to exec
- int close_fd; // File descriptor to close; the read end of a pipe
-};
-
-# if GTEST_OS_MAC
-inline char** GetEnviron() {
- // When Google Test is built as a framework on MacOS X, the environ variable
- // is unavailable. Apple's documentation (man environ) recommends using
- // _NSGetEnviron() instead.
- return *_NSGetEnviron();
-}
-# else
-// Some POSIX platforms expect you to declare environ. extern "C" makes
-// it reside in the global namespace.
-extern "C" char** environ;
-inline char** GetEnviron() { return environ; }
-# endif // GTEST_OS_MAC
-
-// The main function for a threadsafe-style death test child process.
-// This function is called in a clone()-ed process and thus must avoid
-// any potentially unsafe operations like malloc or libc functions.
-static int ExecDeathTestChildMain(void* child_arg) {
- ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
- GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
-
- // We need to execute the test program in the same environment where
- // it was originally invoked. Therefore we change to the original
- // working directory first.
- const char* const original_dir =
- UnitTest::GetInstance()->original_working_dir();
- // We can safely call chdir() as it's a direct system call.
- if (chdir(original_dir) != 0) {
- DeathTestAbort(String::Format("chdir(\"%s\") failed: %s",
- original_dir,
- GetLastErrnoDescription().c_str()));
- return EXIT_FAILURE;
- }
-
- // We can safely call execve() as it's a direct system call. We
- // cannot use execvp() as it's a libc function and thus potentially
- // unsafe. Since execve() doesn't search the PATH, the user must
- // invoke the test program via a valid path that contains at least
- // one path separator.
- execve(args->argv[0], args->argv, GetEnviron());
- DeathTestAbort(String::Format("execve(%s, ...) in %s failed: %s",
- args->argv[0],
- original_dir,
- GetLastErrnoDescription().c_str()));
- return EXIT_FAILURE;
-}
-
-// Two utility routines that together determine the direction the stack
-// grows.
-// This could be accomplished more elegantly by a single recursive
-// function, but we want to guard against the unlikely possibility of
-// a smart compiler optimizing the recursion away.
-//
-// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
-// StackLowerThanAddress into StackGrowsDown, which then doesn't give
-// correct answer.
-bool StackLowerThanAddress(const void* ptr) GTEST_NO_INLINE_;
-bool StackLowerThanAddress(const void* ptr) {
- int dummy;
- return &dummy < ptr;
-}
-
-bool StackGrowsDown() {
- int dummy;
- return StackLowerThanAddress(&dummy);
-}
-
-// A threadsafe implementation of fork(2) for threadsafe-style death tests
-// that uses clone(2). It dies with an error message if anything goes
-// wrong.
-static pid_t ExecDeathTestFork(char* const* argv, int close_fd) {
- ExecDeathTestArgs args = { argv, close_fd };
- pid_t child_pid = -1;
-
-# if GTEST_HAS_CLONE
- const bool use_fork = GTEST_FLAG(death_test_use_fork);
-
- if (!use_fork) {
- static const bool stack_grows_down = StackGrowsDown();
- const size_t stack_size = getpagesize();
- // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
- void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
- MAP_ANON | MAP_PRIVATE, -1, 0);
- GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
- void* const stack_top =
- static_cast<char*>(stack) + (stack_grows_down ? stack_size : 0);
-
- child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
-
- GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
- }
-# else
- const bool use_fork = true;
-# endif // GTEST_HAS_CLONE
-
- if (use_fork && (child_pid = fork()) == 0) {
- ExecDeathTestChildMain(&args);
- _exit(0);
- }
-
- GTEST_DEATH_TEST_CHECK_(child_pid != -1);
- return child_pid;
-}
-
-// The AssumeRole process for a fork-and-exec death test. It re-executes the
-// main program from the beginning, setting the --gtest_filter
-// and --gtest_internal_run_death_test flags to cause only the current
-// death test to be re-run.
-DeathTest::TestRole ExecDeathTest::AssumeRole() {
- const UnitTestImpl* const impl = GetUnitTestImpl();
- const InternalRunDeathTestFlag* const flag =
- impl->internal_run_death_test_flag();
- const TestInfo* const info = impl->current_test_info();
- const int death_test_index = info->result()->death_test_count();
-
- if (flag != NULL) {
- set_write_fd(flag->write_fd());
- return EXECUTE_TEST;
- }
-
- int pipe_fd[2];
- GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
- // Clear the close-on-exec flag on the write end of the pipe, lest
- // it be closed when the child process does an exec:
- GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
-
- const String filter_flag =
- String::Format("--%s%s=%s.%s",
- GTEST_FLAG_PREFIX_, kFilterFlag,
- info->test_case_name(), info->name());
- const String internal_flag =
- String::Format("--%s%s=%s|%d|%d|%d",
- GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag,
- file_, line_, death_test_index, pipe_fd[1]);
- Arguments args;
- args.AddArguments(GetArgvs());
- args.AddArgument(filter_flag.c_str());
- args.AddArgument(internal_flag.c_str());
-
- DeathTest::set_last_death_test_message("");
-
- CaptureStderr();
- // See the comment in NoExecDeathTest::AssumeRole for why the next line
- // is necessary.
- FlushInfoLog();
-
- const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]);
- GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
- set_child_pid(child_pid);
- set_read_fd(pipe_fd[0]);
- set_spawned(true);
- return OVERSEE_TEST;
-}
-
-# endif // !GTEST_OS_WINDOWS
-
-// Creates a concrete DeathTest-derived class that depends on the
-// --gtest_death_test_style flag, and sets the pointer pointed to
-// by the "test" argument to its address. If the test should be
-// skipped, sets that pointer to NULL. Returns true, unless the
-// flag is set to an invalid value.
-bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
- const char* file, int line,
- DeathTest** test) {
- UnitTestImpl* const impl = GetUnitTestImpl();
- const InternalRunDeathTestFlag* const flag =
- impl->internal_run_death_test_flag();
- const int death_test_index = impl->current_test_info()
- ->increment_death_test_count();
-
- if (flag != NULL) {
- if (death_test_index > flag->index()) {
- DeathTest::set_last_death_test_message(String::Format(
- "Death test count (%d) somehow exceeded expected maximum (%d)",
- death_test_index, flag->index()));
- return false;
- }
-
- if (!(flag->file() == file && flag->line() == line &&
- flag->index() == death_test_index)) {
- *test = NULL;
- return true;
- }
- }
-
-# if GTEST_OS_WINDOWS
-
- if (GTEST_FLAG(death_test_style) == "threadsafe" ||
- GTEST_FLAG(death_test_style) == "fast") {
- *test = new WindowsDeathTest(statement, regex, file, line);
- }
-
-# else
-
- if (GTEST_FLAG(death_test_style) == "threadsafe") {
- *test = new ExecDeathTest(statement, regex, file, line);
- } else if (GTEST_FLAG(death_test_style) == "fast") {
- *test = new NoExecDeathTest(statement, regex);
- }
-
-# endif // GTEST_OS_WINDOWS
-
- else { // NOLINT - this is more readable than unbalanced brackets inside #if.
- DeathTest::set_last_death_test_message(String::Format(
- "Unknown death test style \"%s\" encountered",
- GTEST_FLAG(death_test_style).c_str()));
- return false;
- }
-
- return true;
-}
-
-// Splits a given string on a given delimiter, populating a given
-// vector with the fields. GTEST_HAS_DEATH_TEST implies that we have
-// ::std::string, so we can use it here.
-static void SplitString(const ::std::string& str, char delimiter,
- ::std::vector< ::std::string>* dest) {
- ::std::vector< ::std::string> parsed;
- ::std::string::size_type pos = 0;
- while (::testing::internal::AlwaysTrue()) {
- const ::std::string::size_type colon = str.find(delimiter, pos);
- if (colon == ::std::string::npos) {
- parsed.push_back(str.substr(pos));
- break;
- } else {
- parsed.push_back(str.substr(pos, colon - pos));
- pos = colon + 1;
- }
- }
- dest->swap(parsed);
-}
-
-# if GTEST_OS_WINDOWS
-// Recreates the pipe and event handles from the provided parameters,
-// signals the event, and returns a file descriptor wrapped around the pipe
-// handle. This function is called in the child process only.
-int GetStatusFileDescriptor(unsigned int parent_process_id,
- size_t write_handle_as_size_t,
- size_t event_handle_as_size_t) {
- AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
- FALSE, // Non-inheritable.
- parent_process_id));
- if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
- DeathTestAbort(String::Format("Unable to open parent process %u",
- parent_process_id));
- }
-
- // TODO(vladl at google.com): Replace the following check with a
- // compile-time assertion when available.
- GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
-
- const HANDLE write_handle =
- reinterpret_cast<HANDLE>(write_handle_as_size_t);
- HANDLE dup_write_handle;
-
- // The newly initialized handle is accessible only in in the parent
- // process. To obtain one accessible within the child, we need to use
- // DuplicateHandle.
- if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
- ::GetCurrentProcess(), &dup_write_handle,
- 0x0, // Requested privileges ignored since
- // DUPLICATE_SAME_ACCESS is used.
- FALSE, // Request non-inheritable handler.
- DUPLICATE_SAME_ACCESS)) {
- DeathTestAbort(String::Format(
- "Unable to duplicate the pipe handle %Iu from the parent process %u",
- write_handle_as_size_t, parent_process_id));
- }
-
- const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
- HANDLE dup_event_handle;
-
- if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
- ::GetCurrentProcess(), &dup_event_handle,
- 0x0,
- FALSE,
- DUPLICATE_SAME_ACCESS)) {
- DeathTestAbort(String::Format(
- "Unable to duplicate the event handle %Iu from the parent process %u",
- event_handle_as_size_t, parent_process_id));
- }
-
- const int write_fd =
- ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
- if (write_fd == -1) {
- DeathTestAbort(String::Format(
- "Unable to convert pipe handle %Iu to a file descriptor",
- write_handle_as_size_t));
- }
-
- // Signals the parent that the write end of the pipe has been acquired
- // so the parent can release its own write end.
- ::SetEvent(dup_event_handle);
-
- return write_fd;
-}
-# endif // GTEST_OS_WINDOWS
-
-// Returns a newly created InternalRunDeathTestFlag object with fields
-// initialized from the GTEST_FLAG(internal_run_death_test) flag if
-// the flag is specified; otherwise returns NULL.
-InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
- if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
-
- // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
- // can use it here.
- int line = -1;
- int index = -1;
- ::std::vector< ::std::string> fields;
- SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
- int write_fd = -1;
-
-# if GTEST_OS_WINDOWS
-
- unsigned int parent_process_id = 0;
- size_t write_handle_as_size_t = 0;
- size_t event_handle_as_size_t = 0;
-
- if (fields.size() != 6
- || !ParseNaturalNumber(fields[1], &line)
- || !ParseNaturalNumber(fields[2], &index)
- || !ParseNaturalNumber(fields[3], &parent_process_id)
- || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
- || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
- DeathTestAbort(String::Format(
- "Bad --gtest_internal_run_death_test flag: %s",
- GTEST_FLAG(internal_run_death_test).c_str()));
- }
- write_fd = GetStatusFileDescriptor(parent_process_id,
- write_handle_as_size_t,
- event_handle_as_size_t);
-# else
-
- if (fields.size() != 4
- || !ParseNaturalNumber(fields[1], &line)
- || !ParseNaturalNumber(fields[2], &index)
- || !ParseNaturalNumber(fields[3], &write_fd)) {
- DeathTestAbort(String::Format(
- "Bad --gtest_internal_run_death_test flag: %s",
- GTEST_FLAG(internal_run_death_test).c_str()));
- }
-
-# endif // GTEST_OS_WINDOWS
-
- return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
-}
-
-} // namespace internal
-
-#endif // GTEST_HAS_DEATH_TEST
-
-} // namespace testing
diff --git a/unit_tests/gtest/src/gtest-filepath.cc b/unit_tests/gtest/src/gtest-filepath.cc
deleted file mode 100644
index 91b2571..0000000
--- a/unit_tests/gtest/src/gtest-filepath.cc
+++ /dev/null
@@ -1,380 +0,0 @@
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: keith.ray at gmail.com (Keith Ray)
-
-#include "gtest/internal/gtest-filepath.h"
-#include "gtest/internal/gtest-port.h"
-
-#include <stdlib.h>
-
-#if GTEST_OS_WINDOWS_MOBILE
-# include <windows.h>
-#elif GTEST_OS_WINDOWS
-# include <direct.h>
-# include <io.h>
-#elif GTEST_OS_SYMBIAN || GTEST_OS_NACL
-// Symbian OpenC and NaCl have PATH_MAX in sys/syslimits.h
-# include <sys/syslimits.h>
-#else
-# include <limits.h>
-# include <climits> // Some Linux distributions define PATH_MAX here.
-#endif // GTEST_OS_WINDOWS_MOBILE
-
-#if GTEST_OS_WINDOWS
-# define GTEST_PATH_MAX_ _MAX_PATH
-#elif defined(PATH_MAX)
-# define GTEST_PATH_MAX_ PATH_MAX
-#elif defined(_XOPEN_PATH_MAX)
-# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
-#else
-# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
-#endif // GTEST_OS_WINDOWS
-
-#include "gtest/internal/gtest-string.h"
-
-namespace testing {
-namespace internal {
-
-#if GTEST_OS_WINDOWS
-// On Windows, '\\' is the standard path separator, but many tools and the
-// Windows API also accept '/' as an alternate path separator. Unless otherwise
-// noted, a file path can contain either kind of path separators, or a mixture
-// of them.
-const char kPathSeparator = '\\';
-const char kAlternatePathSeparator = '/';
-const char kPathSeparatorString[] = "\\";
-const char kAlternatePathSeparatorString[] = "/";
-# if GTEST_OS_WINDOWS_MOBILE
-// Windows CE doesn't have a current directory. You should not use
-// the current directory in tests on Windows CE, but this at least
-// provides a reasonable fallback.
-const char kCurrentDirectoryString[] = "\\";
-// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
-const DWORD kInvalidFileAttributes = 0xffffffff;
-# else
-const char kCurrentDirectoryString[] = ".\\";
-# endif // GTEST_OS_WINDOWS_MOBILE
-#else
-const char kPathSeparator = '/';
-const char kPathSeparatorString[] = "/";
-const char kCurrentDirectoryString[] = "./";
-#endif // GTEST_OS_WINDOWS
-
-// Returns whether the given character is a valid path separator.
-static bool IsPathSeparator(char c) {
-#if GTEST_HAS_ALT_PATH_SEP_
- return (c == kPathSeparator) || (c == kAlternatePathSeparator);
-#else
- return c == kPathSeparator;
-#endif
-}
-
-// Returns the current working directory, or "" if unsuccessful.
-FilePath FilePath::GetCurrentDir() {
-#if GTEST_OS_WINDOWS_MOBILE
- // Windows CE doesn't have a current directory, so we just return
- // something reasonable.
- return FilePath(kCurrentDirectoryString);
-#elif GTEST_OS_WINDOWS
- char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
- return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
-#else
- char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
- return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
-#endif // GTEST_OS_WINDOWS_MOBILE
-}
-
-// Returns a copy of the FilePath with the case-insensitive extension removed.
-// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
-// FilePath("dir/file"). If a case-insensitive extension is not
-// found, returns a copy of the original FilePath.
-FilePath FilePath::RemoveExtension(const char* extension) const {
- String dot_extension(String::Format(".%s", extension));
- if (pathname_.EndsWithCaseInsensitive(dot_extension.c_str())) {
- return FilePath(String(pathname_.c_str(), pathname_.length() - 4));
- }
- return *this;
-}
-
-// Returns a pointer to the last occurence of a valid path separator in
-// the FilePath. On Windows, for example, both '/' and '\' are valid path
-// separators. Returns NULL if no path separator was found.
-const char* FilePath::FindLastPathSeparator() const {
- const char* const last_sep = strrchr(c_str(), kPathSeparator);
-#if GTEST_HAS_ALT_PATH_SEP_
- const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
- // Comparing two pointers of which only one is NULL is undefined.
- if (last_alt_sep != NULL &&
- (last_sep == NULL || last_alt_sep > last_sep)) {
- return last_alt_sep;
- }
-#endif
- return last_sep;
-}
-
-// Returns a copy of the FilePath with the directory part removed.
-// Example: FilePath("path/to/file").RemoveDirectoryName() returns
-// FilePath("file"). If there is no directory part ("just_a_file"), it returns
-// the FilePath unmodified. If there is no file part ("just_a_dir/") it
-// returns an empty FilePath ("").
-// On Windows platform, '\' is the path separator, otherwise it is '/'.
-FilePath FilePath::RemoveDirectoryName() const {
- const char* const last_sep = FindLastPathSeparator();
- return last_sep ? FilePath(String(last_sep + 1)) : *this;
-}
-
-// RemoveFileName returns the directory path with the filename removed.
-// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
-// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
-// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
-// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
-// On Windows platform, '\' is the path separator, otherwise it is '/'.
-FilePath FilePath::RemoveFileName() const {
- const char* const last_sep = FindLastPathSeparator();
- String dir;
- if (last_sep) {
- dir = String(c_str(), last_sep + 1 - c_str());
- } else {
- dir = kCurrentDirectoryString;
- }
- return FilePath(dir);
-}
-
-// Helper functions for naming files in a directory for xml output.
-
-// Given directory = "dir", base_name = "test", number = 0,
-// extension = "xml", returns "dir/test.xml". If number is greater
-// than zero (e.g., 12), returns "dir/test_12.xml".
-// On Windows platform, uses \ as the separator rather than /.
-FilePath FilePath::MakeFileName(const FilePath& directory,
- const FilePath& base_name,
- int number,
- const char* extension) {
- String file;
- if (number == 0) {
- file = String::Format("%s.%s", base_name.c_str(), extension);
- } else {
- file = String::Format("%s_%d.%s", base_name.c_str(), number, extension);
- }
- return ConcatPaths(directory, FilePath(file));
-}
-
-// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
-// On Windows, uses \ as the separator rather than /.
-FilePath FilePath::ConcatPaths(const FilePath& directory,
- const FilePath& relative_path) {
- if (directory.IsEmpty())
- return relative_path;
- const FilePath dir(directory.RemoveTrailingPathSeparator());
- return FilePath(String::Format("%s%c%s", dir.c_str(), kPathSeparator,
- relative_path.c_str()));
-}
-
-// Returns true if pathname describes something findable in the file-system,
-// either a file, directory, or whatever.
-bool FilePath::FileOrDirectoryExists() const {
-#if GTEST_OS_WINDOWS_MOBILE
- LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
- const DWORD attributes = GetFileAttributes(unicode);
- delete [] unicode;
- return attributes != kInvalidFileAttributes;
-#else
- posix::StatStruct file_stat;
- return posix::Stat(pathname_.c_str(), &file_stat) == 0;
-#endif // GTEST_OS_WINDOWS_MOBILE
-}
-
-// Returns true if pathname describes a directory in the file-system
-// that exists.
-bool FilePath::DirectoryExists() const {
- bool result = false;
-#if GTEST_OS_WINDOWS
- // Don't strip off trailing separator if path is a root directory on
- // Windows (like "C:\\").
- const FilePath& path(IsRootDirectory() ? *this :
- RemoveTrailingPathSeparator());
-#else
- const FilePath& path(*this);
-#endif
-
-#if GTEST_OS_WINDOWS_MOBILE
- LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
- const DWORD attributes = GetFileAttributes(unicode);
- delete [] unicode;
- if ((attributes != kInvalidFileAttributes) &&
- (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
- result = true;
- }
-#else
- posix::StatStruct file_stat;
- result = posix::Stat(path.c_str(), &file_stat) == 0 &&
- posix::IsDir(file_stat);
-#endif // GTEST_OS_WINDOWS_MOBILE
-
- return result;
-}
-
-// Returns true if pathname describes a root directory. (Windows has one
-// root directory per disk drive.)
-bool FilePath::IsRootDirectory() const {
-#if GTEST_OS_WINDOWS
- // TODO(wan at google.com): on Windows a network share like
- // \\server\share can be a root directory, although it cannot be the
- // current directory. Handle this properly.
- return pathname_.length() == 3 && IsAbsolutePath();
-#else
- return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
-#endif
-}
-
-// Returns true if pathname describes an absolute path.
-bool FilePath::IsAbsolutePath() const {
- const char* const name = pathname_.c_str();
-#if GTEST_OS_WINDOWS
- return pathname_.length() >= 3 &&
- ((name[0] >= 'a' && name[0] <= 'z') ||
- (name[0] >= 'A' && name[0] <= 'Z')) &&
- name[1] == ':' &&
- IsPathSeparator(name[2]);
-#else
- return IsPathSeparator(name[0]);
-#endif
-}
-
-// Returns a pathname for a file that does not currently exist. The pathname
-// will be directory/base_name.extension or
-// directory/base_name_<number>.extension if directory/base_name.extension
-// already exists. The number will be incremented until a pathname is found
-// that does not already exist.
-// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
-// There could be a race condition if two or more processes are calling this
-// function at the same time -- they could both pick the same filename.
-FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
- const FilePath& base_name,
- const char* extension) {
- FilePath full_pathname;
- int number = 0;
- do {
- full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
- } while (full_pathname.FileOrDirectoryExists());
- return full_pathname;
-}
-
-// Returns true if FilePath ends with a path separator, which indicates that
-// it is intended to represent a directory. Returns false otherwise.
-// This does NOT check that a directory (or file) actually exists.
-bool FilePath::IsDirectory() const {
- return !pathname_.empty() &&
- IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
-}
-
-// Create directories so that path exists. Returns true if successful or if
-// the directories already exist; returns false if unable to create directories
-// for any reason.
-bool FilePath::CreateDirectoriesRecursively() const {
- if (!this->IsDirectory()) {
- return false;
- }
-
- if (pathname_.length() == 0 || this->DirectoryExists()) {
- return true;
- }
-
- const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
- return parent.CreateDirectoriesRecursively() && this->CreateFolder();
-}
-
-// Create the directory so that path exists. Returns true if successful or
-// if the directory already exists; returns false if unable to create the
-// directory for any reason, including if the parent directory does not
-// exist. Not named "CreateDirectory" because that's a macro on Windows.
-bool FilePath::CreateFolder() const {
-#if GTEST_OS_WINDOWS_MOBILE
- FilePath removed_sep(this->RemoveTrailingPathSeparator());
- LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
- int result = CreateDirectory(unicode, NULL) ? 0 : -1;
- delete [] unicode;
-#elif GTEST_OS_WINDOWS
- int result = _mkdir(pathname_.c_str());
-#else
- int result = mkdir(pathname_.c_str(), 0777);
-#endif // GTEST_OS_WINDOWS_MOBILE
-
- if (result == -1) {
- return this->DirectoryExists(); // An error is OK if the directory exists.
- }
- return true; // No error.
-}
-
-// If input name has a trailing separator character, remove it and return the
-// name, otherwise return the name string unmodified.
-// On Windows platform, uses \ as the separator, other platforms use /.
-FilePath FilePath::RemoveTrailingPathSeparator() const {
- return IsDirectory()
- ? FilePath(String(pathname_.c_str(), pathname_.length() - 1))
- : *this;
-}
-
-// Removes any redundant separators that might be in the pathname.
-// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
-// redundancies that might be in a pathname involving "." or "..".
-// TODO(wan at google.com): handle Windows network shares (e.g. \\server\share).
-void FilePath::Normalize() {
- if (pathname_.c_str() == NULL) {
- pathname_ = "";
- return;
- }
- const char* src = pathname_.c_str();
- char* const dest = new char[pathname_.length() + 1];
- char* dest_ptr = dest;
- memset(dest_ptr, 0, pathname_.length() + 1);
-
- while (*src != '\0') {
- *dest_ptr = *src;
- if (!IsPathSeparator(*src)) {
- src++;
- } else {
-#if GTEST_HAS_ALT_PATH_SEP_
- if (*dest_ptr == kAlternatePathSeparator) {
- *dest_ptr = kPathSeparator;
- }
-#endif
- while (IsPathSeparator(*src))
- src++;
- }
- dest_ptr++;
- }
- *dest_ptr = '\0';
- pathname_ = dest;
- delete[] dest;
-}
-
-} // namespace internal
-} // namespace testing
diff --git a/unit_tests/gtest/src/gtest-internal-inl.h b/unit_tests/gtest/src/gtest-internal-inl.h
deleted file mode 100644
index 65a2101..0000000
--- a/unit_tests/gtest/src/gtest-internal-inl.h
+++ /dev/null
@@ -1,1038 +0,0 @@
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Utility functions and classes used by the Google C++ testing framework.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// This file contains purely Google Test's internal implementation. Please
-// DO NOT #INCLUDE IT IN A USER PROGRAM.
-
-#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
-#define GTEST_SRC_GTEST_INTERNAL_INL_H_
-
-// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
-// part of Google Test's implementation; otherwise it's undefined.
-#if !GTEST_IMPLEMENTATION_
-// A user is trying to include this from his code - just say no.
-# error "gtest-internal-inl.h is part of Google Test's internal implementation."
-# error "It must not be included except by Google Test itself."
-#endif // GTEST_IMPLEMENTATION_
-
-#ifndef _WIN32_WCE
-# include <errno.h>
-#endif // !_WIN32_WCE
-#include <stddef.h>
-#include <stdlib.h> // For strtoll/_strtoul64/malloc/free.
-#include <string.h> // For memmove.
-
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include "gtest/internal/gtest-port.h"
-
-#if GTEST_OS_WINDOWS
-# include <windows.h> // NOLINT
-#endif // GTEST_OS_WINDOWS
-
-#include "gtest/gtest.h" // NOLINT
-#include "gtest/gtest-spi.h"
-
-namespace testing {
-
-// Declares the flags.
-//
-// We don't want the users to modify this flag in the code, but want
-// Google Test's own unit tests to be able to access it. Therefore we
-// declare it here as opposed to in gtest.h.
-GTEST_DECLARE_bool_(death_test_use_fork);
-
-namespace internal {
-
-// The value of GetTestTypeId() as seen from within the Google Test
-// library. This is solely for testing GetTestTypeId().
-GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
-
-// Names of the flags (needed for parsing Google Test flags).
-const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
-const char kBreakOnFailureFlag[] = "break_on_failure";
-const char kCatchExceptionsFlag[] = "catch_exceptions";
-const char kColorFlag[] = "color";
-const char kFilterFlag[] = "filter";
-const char kListTestsFlag[] = "list_tests";
-const char kOutputFlag[] = "output";
-const char kPrintTimeFlag[] = "print_time";
-const char kRandomSeedFlag[] = "random_seed";
-const char kRepeatFlag[] = "repeat";
-const char kShuffleFlag[] = "shuffle";
-const char kStackTraceDepthFlag[] = "stack_trace_depth";
-const char kStreamResultToFlag[] = "stream_result_to";
-const char kThrowOnFailureFlag[] = "throw_on_failure";
-
-// A valid random seed must be in [1, kMaxRandomSeed].
-const int kMaxRandomSeed = 99999;
-
-// g_help_flag is true iff the --help flag or an equivalent form is
-// specified on the command line.
-GTEST_API_ extern bool g_help_flag;
-
-// Returns the current time in milliseconds.
-GTEST_API_ TimeInMillis GetTimeInMillis();
-
-// Returns true iff Google Test should use colors in the output.
-GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
-
-// Formats the given time in milliseconds as seconds.
-GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
-
-// Parses a string for an Int32 flag, in the form of "--flag=value".
-//
-// On success, stores the value of the flag in *value, and returns
-// true. On failure, returns false without changing *value.
-GTEST_API_ bool ParseInt32Flag(
- const char* str, const char* flag, Int32* value);
-
-// Returns a random seed in range [1, kMaxRandomSeed] based on the
-// given --gtest_random_seed flag value.
-inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
- const unsigned int raw_seed = (random_seed_flag == 0) ?
- static_cast<unsigned int>(GetTimeInMillis()) :
- static_cast<unsigned int>(random_seed_flag);
-
- // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
- // it's easy to type.
- const int normalized_seed =
- static_cast<int>((raw_seed - 1U) %
- static_cast<unsigned int>(kMaxRandomSeed)) + 1;
- return normalized_seed;
-}
-
-// Returns the first valid random seed after 'seed'. The behavior is
-// undefined if 'seed' is invalid. The seed after kMaxRandomSeed is
-// considered to be 1.
-inline int GetNextRandomSeed(int seed) {
- GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
- << "Invalid random seed " << seed << " - must be in [1, "
- << kMaxRandomSeed << "].";
- const int next_seed = seed + 1;
- return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
-}
-
-// This class saves the values of all Google Test flags in its c'tor, and
-// restores them in its d'tor.
-class GTestFlagSaver {
- public:
- // The c'tor.
- GTestFlagSaver() {
- also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
- break_on_failure_ = GTEST_FLAG(break_on_failure);
- catch_exceptions_ = GTEST_FLAG(catch_exceptions);
- color_ = GTEST_FLAG(color);
- death_test_style_ = GTEST_FLAG(death_test_style);
- death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
- filter_ = GTEST_FLAG(filter);
- internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
- list_tests_ = GTEST_FLAG(list_tests);
- output_ = GTEST_FLAG(output);
- print_time_ = GTEST_FLAG(print_time);
- random_seed_ = GTEST_FLAG(random_seed);
- repeat_ = GTEST_FLAG(repeat);
- shuffle_ = GTEST_FLAG(shuffle);
- stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
- stream_result_to_ = GTEST_FLAG(stream_result_to);
- throw_on_failure_ = GTEST_FLAG(throw_on_failure);
- }
-
- // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS.
- ~GTestFlagSaver() {
- GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
- GTEST_FLAG(break_on_failure) = break_on_failure_;
- GTEST_FLAG(catch_exceptions) = catch_exceptions_;
- GTEST_FLAG(color) = color_;
- GTEST_FLAG(death_test_style) = death_test_style_;
- GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
- GTEST_FLAG(filter) = filter_;
- GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
- GTEST_FLAG(list_tests) = list_tests_;
- GTEST_FLAG(output) = output_;
- GTEST_FLAG(print_time) = print_time_;
- GTEST_FLAG(random_seed) = random_seed_;
- GTEST_FLAG(repeat) = repeat_;
- GTEST_FLAG(shuffle) = shuffle_;
- GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
- GTEST_FLAG(stream_result_to) = stream_result_to_;
- GTEST_FLAG(throw_on_failure) = throw_on_failure_;
- }
- private:
- // Fields for saving the original values of flags.
- bool also_run_disabled_tests_;
- bool break_on_failure_;
- bool catch_exceptions_;
- String color_;
- String death_test_style_;
- bool death_test_use_fork_;
- String filter_;
- String internal_run_death_test_;
- bool list_tests_;
- String output_;
- bool print_time_;
- bool pretty_;
- internal::Int32 random_seed_;
- internal::Int32 repeat_;
- bool shuffle_;
- internal::Int32 stack_trace_depth_;
- String stream_result_to_;
- bool throw_on_failure_;
-} GTEST_ATTRIBUTE_UNUSED_;
-
-// Converts a Unicode code point to a narrow string in UTF-8 encoding.
-// code_point parameter is of type UInt32 because wchar_t may not be
-// wide enough to contain a code point.
-// The output buffer str must containt at least 32 characters.
-// The function returns the address of the output buffer.
-// If the code_point is not a valid Unicode code point
-// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'.
-GTEST_API_ char* CodePointToUtf8(UInt32 code_point, char* str);
-
-// Converts a wide string to a narrow string in UTF-8 encoding.
-// The wide string is assumed to have the following encoding:
-// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
-// UTF-32 if sizeof(wchar_t) == 4 (on Linux)
-// Parameter str points to a null-terminated wide string.
-// Parameter num_chars may additionally limit the number
-// of wchar_t characters processed. -1 is used when the entire string
-// should be processed.
-// If the string contains code points that are not valid Unicode code points
-// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
-// and contains invalid UTF-16 surrogate pairs, values in those pairs
-// will be encoded as individual Unicode characters from Basic Normal Plane.
-GTEST_API_ String WideStringToUtf8(const wchar_t* str, int num_chars);
-
-// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
-// if the variable is present. If a file already exists at this location, this
-// function will write over it. If the variable is present, but the file cannot
-// be created, prints an error and exits.
-void WriteToShardStatusFileIfNeeded();
-
-// Checks whether sharding is enabled by examining the relevant
-// environment variable values. If the variables are present,
-// but inconsistent (e.g., shard_index >= total_shards), prints
-// an error and exits. If in_subprocess_for_death_test, sharding is
-// disabled because it must only be applied to the original test
-// process. Otherwise, we could filter out death tests we intended to execute.
-GTEST_API_ bool ShouldShard(const char* total_shards_str,
- const char* shard_index_str,
- bool in_subprocess_for_death_test);
-
-// Parses the environment variable var as an Int32. If it is unset,
-// returns default_val. If it is not an Int32, prints an error and
-// and aborts.
-GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
-
-// Given the total number of shards, the shard index, and the test id,
-// returns true iff the test should be run on this shard. The test id is
-// some arbitrary but unique non-negative integer assigned to each test
-// method. Assumes that 0 <= shard_index < total_shards.
-GTEST_API_ bool ShouldRunTestOnShard(
- int total_shards, int shard_index, int test_id);
-
-// STL container utilities.
-
-// Returns the number of elements in the given container that satisfy
-// the given predicate.
-template <class Container, typename Predicate>
-inline int CountIf(const Container& c, Predicate predicate) {
- // Implemented as an explicit loop since std::count_if() in libCstd on
- // Solaris has a non-standard signature.
- int count = 0;
- for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
- if (predicate(*it))
- ++count;
- }
- return count;
-}
-
-// Applies a function/functor to each element in the container.
-template <class Container, typename Functor>
-void ForEach(const Container& c, Functor functor) {
- std::for_each(c.begin(), c.end(), functor);
-}
-
-// Returns the i-th element of the vector, or default_value if i is not
-// in range [0, v.size()).
-template <typename E>
-inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
- return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
-}
-
-// Performs an in-place shuffle of a range of the vector's elements.
-// 'begin' and 'end' are element indices as an STL-style range;
-// i.e. [begin, end) are shuffled, where 'end' == size() means to
-// shuffle to the end of the vector.
-template <typename E>
-void ShuffleRange(internal::Random* random, int begin, int end,
- std::vector<E>* v) {
- const int size = static_cast<int>(v->size());
- GTEST_CHECK_(0 <= begin && begin <= size)
- << "Invalid shuffle range start " << begin << ": must be in range [0, "
- << size << "].";
- GTEST_CHECK_(begin <= end && end <= size)
- << "Invalid shuffle range finish " << end << ": must be in range ["
- << begin << ", " << size << "].";
-
- // Fisher-Yates shuffle, from
- // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
- for (int range_width = end - begin; range_width >= 2; range_width--) {
- const int last_in_range = begin + range_width - 1;
- const int selected = begin + random->Generate(range_width);
- std::swap((*v)[selected], (*v)[last_in_range]);
- }
-}
-
-// Performs an in-place shuffle of the vector's elements.
-template <typename E>
-inline void Shuffle(internal::Random* random, std::vector<E>* v) {
- ShuffleRange(random, 0, static_cast<int>(v->size()), v);
-}
-
-// A function for deleting an object. Handy for being used as a
-// functor.
-template <typename T>
-static void Delete(T* x) {
- delete x;
-}
-
-// A predicate that checks the key of a TestProperty against a known key.
-//
-// TestPropertyKeyIs is copyable.
-class TestPropertyKeyIs {
- public:
- // Constructor.
- //
- // TestPropertyKeyIs has NO default constructor.
- explicit TestPropertyKeyIs(const char* key)
- : key_(key) {}
-
- // Returns true iff the test name of test property matches on key_.
- bool operator()(const TestProperty& test_property) const {
- return String(test_property.key()).Compare(key_) == 0;
- }
-
- private:
- String key_;
-};
-
-// Class UnitTestOptions.
-//
-// This class contains functions for processing options the user
-// specifies when running the tests. It has only static members.
-//
-// In most cases, the user can specify an option using either an
-// environment variable or a command line flag. E.g. you can set the
-// test filter using either GTEST_FILTER or --gtest_filter. If both
-// the variable and the flag are present, the latter overrides the
-// former.
-class GTEST_API_ UnitTestOptions {
- public:
- // Functions for processing the gtest_output flag.
-
- // Returns the output format, or "" for normal printed output.
- static String GetOutputFormat();
-
- // Returns the absolute path of the requested output file, or the
- // default (test_detail.xml in the original working directory) if
- // none was explicitly specified.
- static String GetAbsolutePathToOutputFile();
-
- // Functions for processing the gtest_filter flag.
-
- // Returns true iff the wildcard pattern matches the string. The
- // first ':' or '\0' character in pattern marks the end of it.
- //
- // This recursive algorithm isn't very efficient, but is clear and
- // works well enough for matching test names, which are short.
- static bool PatternMatchesString(const char *pattern, const char *str);
-
- // Returns true iff the user-specified filter matches the test case
- // name and the test name.
- static bool FilterMatchesTest(const String &test_case_name,
- const String &test_name);
-
-#if GTEST_OS_WINDOWS
- // Function for supporting the gtest_catch_exception flag.
-
- // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
- // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
- // This function is useful as an __except condition.
- static int GTestShouldProcessSEH(DWORD exception_code);
-#endif // GTEST_OS_WINDOWS
-
- // Returns true if "name" matches the ':' separated list of glob-style
- // filters in "filter".
- static bool MatchesFilter(const String& name, const char* filter);
-};
-
-// Returns the current application's name, removing directory path if that
-// is present. Used by UnitTestOptions::GetOutputFile.
-GTEST_API_ FilePath GetCurrentExecutableName();
-
-// The role interface for getting the OS stack trace as a string.
-class OsStackTraceGetterInterface {
- public:
- OsStackTraceGetterInterface() {}
- virtual ~OsStackTraceGetterInterface() {}
-
- // Returns the current OS stack trace as a String. Parameters:
- //
- // max_depth - the maximum number of stack frames to be included
- // in the trace.
- // skip_count - the number of top frames to be skipped; doesn't count
- // against max_depth.
- virtual String CurrentStackTrace(int max_depth, int skip_count) = 0;
-
- // UponLeavingGTest() should be called immediately before Google Test calls
- // user code. It saves some information about the current stack that
- // CurrentStackTrace() will use to find and hide Google Test stack frames.
- virtual void UponLeavingGTest() = 0;
-
- private:
- GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
-};
-
-// A working implementation of the OsStackTraceGetterInterface interface.
-class OsStackTraceGetter : public OsStackTraceGetterInterface {
- public:
- OsStackTraceGetter() : caller_frame_(NULL) {}
- virtual String CurrentStackTrace(int max_depth, int skip_count);
- virtual void UponLeavingGTest();
-
- // This string is inserted in place of stack frames that are part of
- // Google Test's implementation.
- static const char* const kElidedFramesMarker;
-
- private:
- Mutex mutex_; // protects all internal state
-
- // We save the stack frame below the frame that calls user code.
- // We do this because the address of the frame immediately below
- // the user code changes between the call to UponLeavingGTest()
- // and any calls to CurrentStackTrace() from within the user code.
- void* caller_frame_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
-};
-
-// Information about a Google Test trace point.
-struct TraceInfo {
- const char* file;
- int line;
- String message;
-};
-
-// This is the default global test part result reporter used in UnitTestImpl.
-// This class should only be used by UnitTestImpl.
-class DefaultGlobalTestPartResultReporter
- : public TestPartResultReporterInterface {
- public:
- explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
- // Implements the TestPartResultReporterInterface. Reports the test part
- // result in the current test.
- virtual void ReportTestPartResult(const TestPartResult& result);
-
- private:
- UnitTestImpl* const unit_test_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
-};
-
-// This is the default per thread test part result reporter used in
-// UnitTestImpl. This class should only be used by UnitTestImpl.
-class DefaultPerThreadTestPartResultReporter
- : public TestPartResultReporterInterface {
- public:
- explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
- // Implements the TestPartResultReporterInterface. The implementation just
- // delegates to the current global test part result reporter of *unit_test_.
- virtual void ReportTestPartResult(const TestPartResult& result);
-
- private:
- UnitTestImpl* const unit_test_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
-};
-
-// The private implementation of the UnitTest class. We don't protect
-// the methods under a mutex, as this class is not accessible by a
-// user and the UnitTest class that delegates work to this class does
-// proper locking.
-class GTEST_API_ UnitTestImpl {
- public:
- explicit UnitTestImpl(UnitTest* parent);
- virtual ~UnitTestImpl();
-
- // There are two different ways to register your own TestPartResultReporter.
- // You can register your own repoter to listen either only for test results
- // from the current thread or for results from all threads.
- // By default, each per-thread test result repoter just passes a new
- // TestPartResult to the global test result reporter, which registers the
- // test part result for the currently running test.
-
- // Returns the global test part result reporter.
- TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
-
- // Sets the global test part result reporter.
- void SetGlobalTestPartResultReporter(
- TestPartResultReporterInterface* reporter);
-
- // Returns the test part result reporter for the current thread.
- TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
-
- // Sets the test part result reporter for the current thread.
- void SetTestPartResultReporterForCurrentThread(
- TestPartResultReporterInterface* reporter);
-
- // Gets the number of successful test cases.
- int successful_test_case_count() const;
-
- // Gets the number of failed test cases.
- int failed_test_case_count() const;
-
- // Gets the number of all test cases.
- int total_test_case_count() const;
-
- // Gets the number of all test cases that contain at least one test
- // that should run.
- int test_case_to_run_count() const;
-
- // Gets the number of successful tests.
- int successful_test_count() const;
-
- // Gets the number of failed tests.
- int failed_test_count() const;
-
- // Gets the number of disabled tests.
- int disabled_test_count() const;
-
- // Gets the number of all tests.
- int total_test_count() const;
-
- // Gets the number of tests that should run.
- int test_to_run_count() const;
-
- // Gets the elapsed time, in milliseconds.
- TimeInMillis elapsed_time() const { return elapsed_time_; }
-
- // Returns true iff the unit test passed (i.e. all test cases passed).
- bool Passed() const { return !Failed(); }
-
- // Returns true iff the unit test failed (i.e. some test case failed
- // or something outside of all tests failed).
- bool Failed() const {
- return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
- }
-
- // Gets the i-th test case among all the test cases. i can range from 0 to
- // total_test_case_count() - 1. If i is not in that range, returns NULL.
- const TestCase* GetTestCase(int i) const {
- const int index = GetElementOr(test_case_indices_, i, -1);
- return index < 0 ? NULL : test_cases_[i];
- }
-
- // Gets the i-th test case among all the test cases. i can range from 0 to
- // total_test_case_count() - 1. If i is not in that range, returns NULL.
- TestCase* GetMutableTestCase(int i) {
- const int index = GetElementOr(test_case_indices_, i, -1);
- return index < 0 ? NULL : test_cases_[index];
- }
-
- // Provides access to the event listener list.
- TestEventListeners* listeners() { return &listeners_; }
-
- // Returns the TestResult for the test that's currently running, or
- // the TestResult for the ad hoc test if no test is running.
- TestResult* current_test_result();
-
- // Returns the TestResult for the ad hoc test.
- const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
-
- // Sets the OS stack trace getter.
- //
- // Does nothing if the input and the current OS stack trace getter
- // are the same; otherwise, deletes the old getter and makes the
- // input the current getter.
- void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
-
- // Returns the current OS stack trace getter if it is not NULL;
- // otherwise, creates an OsStackTraceGetter, makes it the current
- // getter, and returns it.
- OsStackTraceGetterInterface* os_stack_trace_getter();
-
- // Returns the current OS stack trace as a String.
- //
- // The maximum number of stack frames to be included is specified by
- // the gtest_stack_trace_depth flag. The skip_count parameter
- // specifies the number of top frames to be skipped, which doesn't
- // count against the number of frames to be included.
- //
- // For example, if Foo() calls Bar(), which in turn calls
- // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
- // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
- String CurrentOsStackTraceExceptTop(int skip_count);
-
- // Finds and returns a TestCase with the given name. If one doesn't
- // exist, creates one and returns it.
- //
- // Arguments:
- //
- // test_case_name: name of the test case
- // type_param: the name of the test's type parameter, or NULL if
- // this is not a typed or a type-parameterized test.
- // set_up_tc: pointer to the function that sets up the test case
- // tear_down_tc: pointer to the function that tears down the test case
- TestCase* GetTestCase(const char* test_case_name,
- const char* type_param,
- Test::SetUpTestCaseFunc set_up_tc,
- Test::TearDownTestCaseFunc tear_down_tc);
-
- // Adds a TestInfo to the unit test.
- //
- // Arguments:
- //
- // set_up_tc: pointer to the function that sets up the test case
- // tear_down_tc: pointer to the function that tears down the test case
- // test_info: the TestInfo object
- void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
- Test::TearDownTestCaseFunc tear_down_tc,
- TestInfo* test_info) {
- // In order to support thread-safe death tests, we need to
- // remember the original working directory when the test program
- // was first invoked. We cannot do this in RUN_ALL_TESTS(), as
- // the user may have changed the current directory before calling
- // RUN_ALL_TESTS(). Therefore we capture the current directory in
- // AddTestInfo(), which is called to register a TEST or TEST_F
- // before main() is reached.
- if (original_working_dir_.IsEmpty()) {
- original_working_dir_.Set(FilePath::GetCurrentDir());
- GTEST_CHECK_(!original_working_dir_.IsEmpty())
- << "Failed to get the current working directory.";
- }
-
- GetTestCase(test_info->test_case_name(),
- test_info->type_param(),
- set_up_tc,
- tear_down_tc)->AddTestInfo(test_info);
- }
-
-#if GTEST_HAS_PARAM_TEST
- // Returns ParameterizedTestCaseRegistry object used to keep track of
- // value-parameterized tests and instantiate and register them.
- internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
- return parameterized_test_registry_;
- }
-#endif // GTEST_HAS_PARAM_TEST
-
- // Sets the TestCase object for the test that's currently running.
- void set_current_test_case(TestCase* a_current_test_case) {
- current_test_case_ = a_current_test_case;
- }
-
- // Sets the TestInfo object for the test that's currently running. If
- // current_test_info is NULL, the assertion results will be stored in
- // ad_hoc_test_result_.
- void set_current_test_info(TestInfo* a_current_test_info) {
- current_test_info_ = a_current_test_info;
- }
-
- // Registers all parameterized tests defined using TEST_P and
- // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
- // combination. This method can be called more then once; it has guards
- // protecting from registering the tests more then once. If
- // value-parameterized tests are disabled, RegisterParameterizedTests is
- // present but does nothing.
- void RegisterParameterizedTests();
-
- // Runs all tests in this UnitTest object, prints the result, and
- // returns true if all tests are successful. If any exception is
- // thrown during a test, this test is considered to be failed, but
- // the rest of the tests will still be run.
- bool RunAllTests();
-
- // Clears the results of all tests, except the ad hoc tests.
- void ClearNonAdHocTestResult() {
- ForEach(test_cases_, TestCase::ClearTestCaseResult);
- }
-
- // Clears the results of ad-hoc test assertions.
- void ClearAdHocTestResult() {
- ad_hoc_test_result_.Clear();
- }
-
- enum ReactionToSharding {
- HONOR_SHARDING_PROTOCOL,
- IGNORE_SHARDING_PROTOCOL
- };
-
- // Matches the full name of each test against the user-specified
- // filter to decide whether the test should run, then records the
- // result in each TestCase and TestInfo object.
- // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
- // based on sharding variables in the environment.
- // Returns the number of tests that should run.
- int FilterTests(ReactionToSharding shard_tests);
-
- // Prints the names of the tests matching the user-specified filter flag.
- void ListTestsMatchingFilter();
-
- const TestCase* current_test_case() const { return current_test_case_; }
- TestInfo* current_test_info() { return current_test_info_; }
- const TestInfo* current_test_info() const { return current_test_info_; }
-
- // Returns the vector of environments that need to be set-up/torn-down
- // before/after the tests are run.
- std::vector<Environment*>& environments() { return environments_; }
-
- // Getters for the per-thread Google Test trace stack.
- std::vector<TraceInfo>& gtest_trace_stack() {
- return *(gtest_trace_stack_.pointer());
- }
- const std::vector<TraceInfo>& gtest_trace_stack() const {
- return gtest_trace_stack_.get();
- }
-
-#if GTEST_HAS_DEATH_TEST
- void InitDeathTestSubprocessControlInfo() {
- internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
- }
- // Returns a pointer to the parsed --gtest_internal_run_death_test
- // flag, or NULL if that flag was not specified.
- // This information is useful only in a death test child process.
- // Must not be called before a call to InitGoogleTest.
- const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
- return internal_run_death_test_flag_.get();
- }
-
- // Returns a pointer to the current death test factory.
- internal::DeathTestFactory* death_test_factory() {
- return death_test_factory_.get();
- }
-
- void SuppressTestEventsIfInSubprocess();
-
- friend class ReplaceDeathTestFactory;
-#endif // GTEST_HAS_DEATH_TEST
-
- // Initializes the event listener performing XML output as specified by
- // UnitTestOptions. Must not be called before InitGoogleTest.
- void ConfigureXmlOutput();
-
-#if GTEST_CAN_STREAM_RESULTS_
- // Initializes the event listener for streaming test results to a socket.
- // Must not be called before InitGoogleTest.
- void ConfigureStreamingOutput();
-#endif
-
- // Performs initialization dependent upon flag values obtained in
- // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to
- // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest
- // this function is also called from RunAllTests. Since this function can be
- // called more than once, it has to be idempotent.
- void PostFlagParsingInit();
-
- // Gets the random seed used at the start of the current test iteration.
- int random_seed() const { return random_seed_; }
-
- // Gets the random number generator.
- internal::Random* random() { return &random_; }
-
- // Shuffles all test cases, and the tests within each test case,
- // making sure that death tests are still run first.
- void ShuffleTests();
-
- // Restores the test cases and tests to their order before the first shuffle.
- void UnshuffleTests();
-
- // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
- // UnitTest::Run() starts.
- bool catch_exceptions() const { return catch_exceptions_; }
-
- private:
- friend class ::testing::UnitTest;
-
- // Used by UnitTest::Run() to capture the state of
- // GTEST_FLAG(catch_exceptions) at the moment it starts.
- void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
-
- // The UnitTest object that owns this implementation object.
- UnitTest* const parent_;
-
- // The working directory when the first TEST() or TEST_F() was
- // executed.
- internal::FilePath original_working_dir_;
-
- // The default test part result reporters.
- DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
- DefaultPerThreadTestPartResultReporter
- default_per_thread_test_part_result_reporter_;
-
- // Points to (but doesn't own) the global test part result reporter.
- TestPartResultReporterInterface* global_test_part_result_repoter_;
-
- // Protects read and write access to global_test_part_result_reporter_.
- internal::Mutex global_test_part_result_reporter_mutex_;
-
- // Points to (but doesn't own) the per-thread test part result reporter.
- internal::ThreadLocal<TestPartResultReporterInterface*>
- per_thread_test_part_result_reporter_;
-
- // The vector of environments that need to be set-up/torn-down
- // before/after the tests are run.
- std::vector<Environment*> environments_;
-
- // The vector of TestCases in their original order. It owns the
- // elements in the vector.
- std::vector<TestCase*> test_cases_;
-
- // Provides a level of indirection for the test case list to allow
- // easy shuffling and restoring the test case order. The i-th
- // element of this vector is the index of the i-th test case in the
- // shuffled order.
- std::vector<int> test_case_indices_;
-
-#if GTEST_HAS_PARAM_TEST
- // ParameterizedTestRegistry object used to register value-parameterized
- // tests.
- internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
-
- // Indicates whether RegisterParameterizedTests() has been called already.
- bool parameterized_tests_registered_;
-#endif // GTEST_HAS_PARAM_TEST
-
- // Index of the last death test case registered. Initially -1.
- int last_death_test_case_;
-
- // This points to the TestCase for the currently running test. It
- // changes as Google Test goes through one test case after another.
- // When no test is running, this is set to NULL and Google Test
- // stores assertion results in ad_hoc_test_result_. Initially NULL.
- TestCase* current_test_case_;
-
- // This points to the TestInfo for the currently running test. It
- // changes as Google Test goes through one test after another. When
- // no test is running, this is set to NULL and Google Test stores
- // assertion results in ad_hoc_test_result_. Initially NULL.
- TestInfo* current_test_info_;
-
- // Normally, a user only writes assertions inside a TEST or TEST_F,
- // or inside a function called by a TEST or TEST_F. Since Google
- // Test keeps track of which test is current running, it can
- // associate such an assertion with the test it belongs to.
- //
- // If an assertion is encountered when no TEST or TEST_F is running,
- // Google Test attributes the assertion result to an imaginary "ad hoc"
- // test, and records the result in ad_hoc_test_result_.
- TestResult ad_hoc_test_result_;
-
- // The list of event listeners that can be used to track events inside
- // Google Test.
- TestEventListeners listeners_;
-
- // The OS stack trace getter. Will be deleted when the UnitTest
- // object is destructed. By default, an OsStackTraceGetter is used,
- // but the user can set this field to use a custom getter if that is
- // desired.
- OsStackTraceGetterInterface* os_stack_trace_getter_;
-
- // True iff PostFlagParsingInit() has been called.
- bool post_flag_parse_init_performed_;
-
- // The random number seed used at the beginning of the test run.
- int random_seed_;
-
- // Our random number generator.
- internal::Random random_;
-
- // How long the test took to run, in milliseconds.
- TimeInMillis elapsed_time_;
-
-#if GTEST_HAS_DEATH_TEST
- // The decomposed components of the gtest_internal_run_death_test flag,
- // parsed when RUN_ALL_TESTS is called.
- internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
- internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
-#endif // GTEST_HAS_DEATH_TEST
-
- // A per-thread stack of traces created by the SCOPED_TRACE() macro.
- internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
-
- // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
- // starts.
- bool catch_exceptions_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
-}; // class UnitTestImpl
-
-// Convenience function for accessing the global UnitTest
-// implementation object.
-inline UnitTestImpl* GetUnitTestImpl() {
- return UnitTest::GetInstance()->impl();
-}
-
-#if GTEST_USES_SIMPLE_RE
-
-// Internal helper functions for implementing the simple regular
-// expression matcher.
-GTEST_API_ bool IsInSet(char ch, const char* str);
-GTEST_API_ bool IsAsciiDigit(char ch);
-GTEST_API_ bool IsAsciiPunct(char ch);
-GTEST_API_ bool IsRepeat(char ch);
-GTEST_API_ bool IsAsciiWhiteSpace(char ch);
-GTEST_API_ bool IsAsciiWordChar(char ch);
-GTEST_API_ bool IsValidEscape(char ch);
-GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
-GTEST_API_ bool ValidateRegex(const char* regex);
-GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
-GTEST_API_ bool MatchRepetitionAndRegexAtHead(
- bool escaped, char ch, char repeat, const char* regex, const char* str);
-GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
-
-#endif // GTEST_USES_SIMPLE_RE
-
-// Parses the command line for Google Test flags, without initializing
-// other parts of Google Test.
-GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
-GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
-
-#if GTEST_HAS_DEATH_TEST
-
-// Returns the message describing the last system error, regardless of the
-// platform.
-GTEST_API_ String GetLastErrnoDescription();
-
-# if GTEST_OS_WINDOWS
-// Provides leak-safe Windows kernel handle ownership.
-class AutoHandle {
- public:
- AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
- explicit AutoHandle(HANDLE handle) : handle_(handle) {}
-
- ~AutoHandle() { Reset(); }
-
- HANDLE Get() const { return handle_; }
- void Reset() { Reset(INVALID_HANDLE_VALUE); }
- void Reset(HANDLE handle) {
- if (handle != handle_) {
- if (handle_ != INVALID_HANDLE_VALUE)
- ::CloseHandle(handle_);
- handle_ = handle;
- }
- }
-
- private:
- HANDLE handle_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
-};
-# endif // GTEST_OS_WINDOWS
-
-// Attempts to parse a string into a positive integer pointed to by the
-// number parameter. Returns true if that is possible.
-// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
-// it here.
-template <typename Integer>
-bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
- // Fail fast if the given string does not begin with a digit;
- // this bypasses strtoXXX's "optional leading whitespace and plus
- // or minus sign" semantics, which are undesirable here.
- if (str.empty() || !IsDigit(str[0])) {
- return false;
- }
- errno = 0;
-
- char* end;
- // BiggestConvertible is the largest integer type that system-provided
- // string-to-number conversion routines can return.
-
-# if GTEST_OS_WINDOWS && !defined(__GNUC__)
-
- // MSVC and C++ Builder define __int64 instead of the standard long long.
- typedef unsigned __int64 BiggestConvertible;
- const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
-
-# else
-
- typedef unsigned long long BiggestConvertible; // NOLINT
- const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
-
-# endif // GTEST_OS_WINDOWS && !defined(__GNUC__)
-
- const bool parse_success = *end == '\0' && errno == 0;
-
- // TODO(vladl at google.com): Convert this to compile time assertion when it is
- // available.
- GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
-
- const Integer result = static_cast<Integer>(parsed);
- if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
- *number = result;
- return true;
- }
- return false;
-}
-#endif // GTEST_HAS_DEATH_TEST
-
-// TestResult contains some private methods that should be hidden from
-// Google Test user but are required for testing. This class allow our tests
-// to access them.
-//
-// This class is supplied only for the purpose of testing Google Test's own
-// constructs. Do not use it in user tests, either directly or indirectly.
-class TestResultAccessor {
- public:
- static void RecordProperty(TestResult* test_result,
- const TestProperty& property) {
- test_result->RecordProperty(property);
- }
-
- static void ClearTestPartResults(TestResult* test_result) {
- test_result->ClearTestPartResults();
- }
-
- static const std::vector<testing::TestPartResult>& test_part_results(
- const TestResult& test_result) {
- return test_result.test_part_results();
- }
-};
-
-} // namespace internal
-} // namespace testing
-
-#endif // GTEST_SRC_GTEST_INTERNAL_INL_H_
diff --git a/unit_tests/gtest/src/gtest-port.cc b/unit_tests/gtest/src/gtest-port.cc
deleted file mode 100644
index 6cb716f..0000000
--- a/unit_tests/gtest/src/gtest-port.cc
+++ /dev/null
@@ -1,752 +0,0 @@
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-#include "gtest/internal/gtest-port.h"
-
-#include <limits.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#if GTEST_OS_WINDOWS_MOBILE
-# include <windows.h> // For TerminateProcess()
-#elif GTEST_OS_WINDOWS
-# include <io.h>
-# include <sys/stat.h>
-#else
-# include <unistd.h>
-#endif // GTEST_OS_WINDOWS_MOBILE
-
-#if GTEST_OS_MAC
-# include <mach/mach_init.h>
-# include <mach/task.h>
-# include <mach/vm_map.h>
-#endif // GTEST_OS_MAC
-
-#include "gtest/gtest-spi.h"
-#include "gtest/gtest-message.h"
-#include "gtest/internal/gtest-internal.h"
-#include "gtest/internal/gtest-string.h"
-
-// Indicates that this translation unit is part of Google Test's
-// implementation. It must come before gtest-internal-inl.h is
-// included, or there will be a compiler error. This trick is to
-// prevent a user from accidentally including gtest-internal-inl.h in
-// his code.
-#define GTEST_IMPLEMENTATION_ 1
-#include "src/gtest-internal-inl.h"
-#undef GTEST_IMPLEMENTATION_
-
-#ifdef __ICC
-// Disable explicit warning on Intel compiler
-#pragma warning disable 2304
-#endif
-
-
-namespace testing {
-namespace internal {
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
-const int kStdOutFileno = 1;
-const int kStdErrFileno = 2;
-#else
-const int kStdOutFileno = STDOUT_FILENO;
-const int kStdErrFileno = STDERR_FILENO;
-#endif // _MSC_VER
-
-#if GTEST_OS_MAC
-
-// Returns the number of threads running in the process, or 0 to indicate that
-// we cannot detect it.
-size_t GetThreadCount() {
- const task_t task = mach_task_self();
- mach_msg_type_number_t thread_count;
- thread_act_array_t thread_list;
- const kern_return_t status = task_threads(task, &thread_list, &thread_count);
- if (status == KERN_SUCCESS) {
- // task_threads allocates resources in thread_list and we need to free them
- // to avoid leaks.
- vm_deallocate(task,
- reinterpret_cast<vm_address_t>(thread_list),
- sizeof(thread_t) * thread_count);
- return static_cast<size_t>(thread_count);
- } else {
- return 0;
- }
-}
-
-#else
-
-size_t GetThreadCount() {
- // There's no portable way to detect the number of threads, so we just
- // return 0 to indicate that we cannot detect it.
- return 0;
-}
-
-#endif // GTEST_OS_MAC
-
-#if GTEST_USES_POSIX_RE
-
-// Implements RE. Currently only needed for death tests.
-
-RE::~RE() {
- if (is_valid_) {
- // regfree'ing an invalid regex might crash because the content
- // of the regex is undefined. Since the regex's are essentially
- // the same, one cannot be valid (or invalid) without the other
- // being so too.
- regfree(&partial_regex_);
- regfree(&full_regex_);
- }
- free(const_cast<char*>(pattern_));
-}
-
-// Returns true iff regular expression re matches the entire str.
-bool RE::FullMatch(const char* str, const RE& re) {
- if (!re.is_valid_) return false;
-
- regmatch_t match;
- return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
-}
-
-// Returns true iff regular expression re matches a substring of str
-// (including str itself).
-bool RE::PartialMatch(const char* str, const RE& re) {
- if (!re.is_valid_) return false;
-
- regmatch_t match;
- return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
-}
-
-// Initializes an RE from its string representation.
-void RE::Init(const char* regex) {
- pattern_ = posix::StrDup(regex);
-
- // Reserves enough bytes to hold the regular expression used for a
- // full match.
- const size_t full_regex_len = strlen(regex) + 10;
- char* const full_pattern = new char[full_regex_len];
-
- snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
- is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
- // We want to call regcomp(&partial_regex_, ...) even if the
- // previous expression returns false. Otherwise partial_regex_ may
- // not be properly initialized can may cause trouble when it's
- // freed.
- //
- // Some implementation of POSIX regex (e.g. on at least some
- // versions of Cygwin) doesn't accept the empty string as a valid
- // regex. We change it to an equivalent form "()" to be safe.
- if (is_valid_) {
- const char* const partial_regex = (*regex == '\0') ? "()" : regex;
- is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
- }
- EXPECT_TRUE(is_valid_)
- << "Regular expression \"" << regex
- << "\" is not a valid POSIX Extended regular expression.";
-
- delete[] full_pattern;
-}
-
-#elif GTEST_USES_SIMPLE_RE
-
-// Returns true iff ch appears anywhere in str (excluding the
-// terminating '\0' character).
-bool IsInSet(char ch, const char* str) {
- return ch != '\0' && strchr(str, ch) != NULL;
-}
-
-// Returns true iff ch belongs to the given classification. Unlike
-// similar functions in <ctype.h>, these aren't affected by the
-// current locale.
-bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
-bool IsAsciiPunct(char ch) {
- return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
-}
-bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
-bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
-bool IsAsciiWordChar(char ch) {
- return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
- ('0' <= ch && ch <= '9') || ch == '_';
-}
-
-// Returns true iff "\\c" is a supported escape sequence.
-bool IsValidEscape(char c) {
- return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
-}
-
-// Returns true iff the given atom (specified by escaped and pattern)
-// matches ch. The result is undefined if the atom is invalid.
-bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
- if (escaped) { // "\\p" where p is pattern_char.
- switch (pattern_char) {
- case 'd': return IsAsciiDigit(ch);
- case 'D': return !IsAsciiDigit(ch);
- case 'f': return ch == '\f';
- case 'n': return ch == '\n';
- case 'r': return ch == '\r';
- case 's': return IsAsciiWhiteSpace(ch);
- case 'S': return !IsAsciiWhiteSpace(ch);
- case 't': return ch == '\t';
- case 'v': return ch == '\v';
- case 'w': return IsAsciiWordChar(ch);
- case 'W': return !IsAsciiWordChar(ch);
- }
- return IsAsciiPunct(pattern_char) && pattern_char == ch;
- }
-
- return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
-}
-
-// Helper function used by ValidateRegex() to format error messages.
-String FormatRegexSyntaxError(const char* regex, int index) {
- return (Message() << "Syntax error at index " << index
- << " in simple regular expression \"" << regex << "\": ").GetString();
-}
-
-// Generates non-fatal failures and returns false if regex is invalid;
-// otherwise returns true.
-bool ValidateRegex(const char* regex) {
- if (regex == NULL) {
- // TODO(wan at google.com): fix the source file location in the
- // assertion failures to match where the regex is used in user
- // code.
- ADD_FAILURE() << "NULL is not a valid simple regular expression.";
- return false;
- }
-
- bool is_valid = true;
-
- // True iff ?, *, or + can follow the previous atom.
- bool prev_repeatable = false;
- for (int i = 0; regex[i]; i++) {
- if (regex[i] == '\\') { // An escape sequence
- i++;
- if (regex[i] == '\0') {
- ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
- << "'\\' cannot appear at the end.";
- return false;
- }
-
- if (!IsValidEscape(regex[i])) {
- ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
- << "invalid escape sequence \"\\" << regex[i] << "\".";
- is_valid = false;
- }
- prev_repeatable = true;
- } else { // Not an escape sequence.
- const char ch = regex[i];
-
- if (ch == '^' && i > 0) {
- ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
- << "'^' can only appear at the beginning.";
- is_valid = false;
- } else if (ch == '$' && regex[i + 1] != '\0') {
- ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
- << "'$' can only appear at the end.";
- is_valid = false;
- } else if (IsInSet(ch, "()[]{}|")) {
- ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
- << "'" << ch << "' is unsupported.";
- is_valid = false;
- } else if (IsRepeat(ch) && !prev_repeatable) {
- ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
- << "'" << ch << "' can only follow a repeatable token.";
- is_valid = false;
- }
-
- prev_repeatable = !IsInSet(ch, "^$?*+");
- }
- }
-
- return is_valid;
-}
-
-// Matches a repeated regex atom followed by a valid simple regular
-// expression. The regex atom is defined as c if escaped is false,
-// or \c otherwise. repeat is the repetition meta character (?, *,
-// or +). The behavior is undefined if str contains too many
-// characters to be indexable by size_t, in which case the test will
-// probably time out anyway. We are fine with this limitation as
-// std::string has it too.
-bool MatchRepetitionAndRegexAtHead(
- bool escaped, char c, char repeat, const char* regex,
- const char* str) {
- const size_t min_count = (repeat == '+') ? 1 : 0;
- const size_t max_count = (repeat == '?') ? 1 :
- static_cast<size_t>(-1) - 1;
- // We cannot call numeric_limits::max() as it conflicts with the
- // max() macro on Windows.
-
- for (size_t i = 0; i <= max_count; ++i) {
- // We know that the atom matches each of the first i characters in str.
- if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
- // We have enough matches at the head, and the tail matches too.
- // Since we only care about *whether* the pattern matches str
- // (as opposed to *how* it matches), there is no need to find a
- // greedy match.
- return true;
- }
- if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
- return false;
- }
- return false;
-}
-
-// Returns true iff regex matches a prefix of str. regex must be a
-// valid simple regular expression and not start with "^", or the
-// result is undefined.
-bool MatchRegexAtHead(const char* regex, const char* str) {
- if (*regex == '\0') // An empty regex matches a prefix of anything.
- return true;
-
- // "$" only matches the end of a string. Note that regex being
- // valid guarantees that there's nothing after "$" in it.
- if (*regex == '$')
- return *str == '\0';
-
- // Is the first thing in regex an escape sequence?
- const bool escaped = *regex == '\\';
- if (escaped)
- ++regex;
- if (IsRepeat(regex[1])) {
- // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
- // here's an indirect recursion. It terminates as the regex gets
- // shorter in each recursion.
- return MatchRepetitionAndRegexAtHead(
- escaped, regex[0], regex[1], regex + 2, str);
- } else {
- // regex isn't empty, isn't "$", and doesn't start with a
- // repetition. We match the first atom of regex with the first
- // character of str and recurse.
- return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
- MatchRegexAtHead(regex + 1, str + 1);
- }
-}
-
-// Returns true iff regex matches any substring of str. regex must be
-// a valid simple regular expression, or the result is undefined.
-//
-// The algorithm is recursive, but the recursion depth doesn't exceed
-// the regex length, so we won't need to worry about running out of
-// stack space normally. In rare cases the time complexity can be
-// exponential with respect to the regex length + the string length,
-// but usually it's must faster (often close to linear).
-bool MatchRegexAnywhere(const char* regex, const char* str) {
- if (regex == NULL || str == NULL)
- return false;
-
- if (*regex == '^')
- return MatchRegexAtHead(regex + 1, str);
-
- // A successful match can be anywhere in str.
- do {
- if (MatchRegexAtHead(regex, str))
- return true;
- } while (*str++ != '\0');
- return false;
-}
-
-// Implements the RE class.
-
-RE::~RE() {
- free(const_cast<char*>(pattern_));
- free(const_cast<char*>(full_pattern_));
-}
-
-// Returns true iff regular expression re matches the entire str.
-bool RE::FullMatch(const char* str, const RE& re) {
- return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
-}
-
-// Returns true iff regular expression re matches a substring of str
-// (including str itself).
-bool RE::PartialMatch(const char* str, const RE& re) {
- return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
-}
-
-// Initializes an RE from its string representation.
-void RE::Init(const char* regex) {
- pattern_ = full_pattern_ = NULL;
- if (regex != NULL) {
- pattern_ = posix::StrDup(regex);
- }
-
- is_valid_ = ValidateRegex(regex);
- if (!is_valid_) {
- // No need to calculate the full pattern when the regex is invalid.
- return;
- }
-
- const size_t len = strlen(regex);
- // Reserves enough bytes to hold the regular expression used for a
- // full match: we need space to prepend a '^', append a '$', and
- // terminate the string with '\0'.
- char* buffer = static_cast<char*>(malloc(len + 3));
- full_pattern_ = buffer;
-
- if (*regex != '^')
- *buffer++ = '^'; // Makes sure full_pattern_ starts with '^'.
-
- // We don't use snprintf or strncpy, as they trigger a warning when
- // compiled with VC++ 8.0.
- memcpy(buffer, regex, len);
- buffer += len;
-
- if (len == 0 || regex[len - 1] != '$')
- *buffer++ = '$'; // Makes sure full_pattern_ ends with '$'.
-
- *buffer = '\0';
-}
-
-#endif // GTEST_USES_POSIX_RE
-
-const char kUnknownFile[] = "unknown file";
-
-// Formats a source file path and a line number as they would appear
-// in an error message from the compiler used to compile this code.
-GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
- const char* const file_name = file == NULL ? kUnknownFile : file;
-
- if (line < 0) {
- return String::Format("%s:", file_name).c_str();
- }
-#ifdef _MSC_VER
- return String::Format("%s(%d):", file_name, line).c_str();
-#else
- return String::Format("%s:%d:", file_name, line).c_str();
-#endif // _MSC_VER
-}
-
-// Formats a file location for compiler-independent XML output.
-// Although this function is not platform dependent, we put it next to
-// FormatFileLocation in order to contrast the two functions.
-// Note that FormatCompilerIndependentFileLocation() does NOT append colon
-// to the file location it produces, unlike FormatFileLocation().
-GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
- const char* file, int line) {
- const char* const file_name = file == NULL ? kUnknownFile : file;
-
- if (line < 0)
- return file_name;
- else
- return String::Format("%s:%d", file_name, line).c_str();
-}
-
-
-GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
- : severity_(severity) {
- const char* const marker =
- severity == GTEST_INFO ? "[ INFO ]" :
- severity == GTEST_WARNING ? "[WARNING]" :
- severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]";
- GetStream() << ::std::endl << marker << " "
- << FormatFileLocation(file, line).c_str() << ": ";
-}
-
-// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
-GTestLog::~GTestLog() {
- GetStream() << ::std::endl;
- if (severity_ == GTEST_FATAL) {
- fflush(stderr);
- posix::Abort();
- }
-}
-// Disable Microsoft deprecation warnings for POSIX functions called from
-// this class (creat, dup, dup2, and close)
-#ifdef _MSC_VER
-# pragma warning(push)
-# pragma warning(disable: 4996)
-#endif // _MSC_VER
-
-#if GTEST_HAS_STREAM_REDIRECTION
-
-// Object that captures an output stream (stdout/stderr).
-class CapturedStream {
- public:
- // The ctor redirects the stream to a temporary file.
- CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
-
-# if GTEST_OS_WINDOWS
- char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT
- char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT
-
- ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
- const UINT success = ::GetTempFileNameA(temp_dir_path,
- "gtest_redir",
- 0, // Generate unique file name.
- temp_file_path);
- GTEST_CHECK_(success != 0)
- << "Unable to create a temporary file in " << temp_dir_path;
- const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
- GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
- << temp_file_path;
- filename_ = temp_file_path;
-# else
- // There's no guarantee that a test has write access to the
- // current directory, so we create the temporary file in the /tmp
- // directory instead.
- char name_template[] = "/tmp/captured_stream.XXXXXX";
- const int captured_fd = mkstemp(name_template);
- filename_ = name_template;
-# endif // GTEST_OS_WINDOWS
- fflush(NULL);
- dup2(captured_fd, fd_);
- close(captured_fd);
- }
-
- ~CapturedStream() {
- remove(filename_.c_str());
- }
-
- String GetCapturedString() {
- if (uncaptured_fd_ != -1) {
- // Restores the original stream.
- fflush(NULL);
- dup2(uncaptured_fd_, fd_);
- close(uncaptured_fd_);
- uncaptured_fd_ = -1;
- }
-
- FILE* const file = posix::FOpen(filename_.c_str(), "r");
- const String content = ReadEntireFile(file);
- posix::FClose(file);
- return content;
- }
-
- private:
- // Reads the entire content of a file as a String.
- static String ReadEntireFile(FILE* file);
-
- // Returns the size (in bytes) of a file.
- static size_t GetFileSize(FILE* file);
-
- const int fd_; // A stream to capture.
- int uncaptured_fd_;
- // Name of the temporary file holding the stderr output.
- ::std::string filename_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
-};
-
-// Returns the size (in bytes) of a file.
-size_t CapturedStream::GetFileSize(FILE* file) {
- fseek(file, 0, SEEK_END);
- return static_cast<size_t>(ftell(file));
-}
-
-// Reads the entire content of a file as a string.
-String CapturedStream::ReadEntireFile(FILE* file) {
- const size_t file_size = GetFileSize(file);
- char* const buffer = new char[file_size];
-
- size_t bytes_last_read = 0; // # of bytes read in the last fread()
- size_t bytes_read = 0; // # of bytes read so far
-
- fseek(file, 0, SEEK_SET);
-
- // Keeps reading the file until we cannot read further or the
- // pre-determined file size is reached.
- do {
- bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
- bytes_read += bytes_last_read;
- } while (bytes_last_read > 0 && bytes_read < file_size);
-
- const String content(buffer, bytes_read);
- delete[] buffer;
-
- return content;
-}
-
-# ifdef _MSC_VER
-# pragma warning(pop)
-# endif // _MSC_VER
-
-static CapturedStream* g_captured_stderr = NULL;
-static CapturedStream* g_captured_stdout = NULL;
-
-// Starts capturing an output stream (stdout/stderr).
-void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
- if (*stream != NULL) {
- GTEST_LOG_(FATAL) << "Only one " << stream_name
- << " capturer can exist at a time.";
- }
- *stream = new CapturedStream(fd);
-}
-
-// Stops capturing the output stream and returns the captured string.
-String GetCapturedStream(CapturedStream** captured_stream) {
- const String content = (*captured_stream)->GetCapturedString();
-
- delete *captured_stream;
- *captured_stream = NULL;
-
- return content;
-}
-
-// Starts capturing stdout.
-void CaptureStdout() {
- CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
-}
-
-// Starts capturing stderr.
-void CaptureStderr() {
- CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
-}
-
-// Stops capturing stdout and returns the captured string.
-String GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); }
-
-// Stops capturing stderr and returns the captured string.
-String GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); }
-
-#endif // GTEST_HAS_STREAM_REDIRECTION
-
-#if GTEST_HAS_DEATH_TEST
-
-// A copy of all command line arguments. Set by InitGoogleTest().
-::std::vector<String> g_argvs;
-
-// Returns the command line as a vector of strings.
-const ::std::vector<String>& GetArgvs() { return g_argvs; }
-
-#endif // GTEST_HAS_DEATH_TEST
-
-#if GTEST_OS_WINDOWS_MOBILE
-namespace posix {
-void Abort() {
- DebugBreak();
- TerminateProcess(GetCurrentProcess(), 1);
-}
-} // namespace posix
-#endif // GTEST_OS_WINDOWS_MOBILE
-
-// Returns the name of the environment variable corresponding to the
-// given flag. For example, FlagToEnvVar("foo") will return
-// "GTEST_FOO" in the open-source version.
-static String FlagToEnvVar(const char* flag) {
- const String full_flag =
- (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
-
- Message env_var;
- for (size_t i = 0; i != full_flag.length(); i++) {
- env_var << ToUpper(full_flag.c_str()[i]);
- }
-
- return env_var.GetString();
-}
-
-// Parses 'str' for a 32-bit signed integer. If successful, writes
-// the result to *value and returns true; otherwise leaves *value
-// unchanged and returns false.
-bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
- // Parses the environment variable as a decimal integer.
- char* end = NULL;
- const long long_value = strtol(str, &end, 10); // NOLINT
-
- // Has strtol() consumed all characters in the string?
- if (*end != '\0') {
- // No - an invalid character was encountered.
- Message msg;
- msg << "WARNING: " << src_text
- << " is expected to be a 32-bit integer, but actually"
- << " has value \"" << str << "\".\n";
- printf("%s", msg.GetString().c_str());
- fflush(stdout);
- return false;
- }
-
- // Is the parsed value in the range of an Int32?
- const Int32 result = static_cast<Int32>(long_value);
- if (long_value == LONG_MAX || long_value == LONG_MIN ||
- // The parsed value overflows as a long. (strtol() returns
- // LONG_MAX or LONG_MIN when the input overflows.)
- result != long_value
- // The parsed value overflows as an Int32.
- ) {
- Message msg;
- msg << "WARNING: " << src_text
- << " is expected to be a 32-bit integer, but actually"
- << " has value " << str << ", which overflows.\n";
- printf("%s", msg.GetString().c_str());
- fflush(stdout);
- return false;
- }
-
- *value = result;
- return true;
-}
-
-// Reads and returns the Boolean environment variable corresponding to
-// the given flag; if it's not set, returns default_value.
-//
-// The value is considered true iff it's not "0".
-bool BoolFromGTestEnv(const char* flag, bool default_value) {
- const String env_var = FlagToEnvVar(flag);
- const char* const string_value = posix::GetEnv(env_var.c_str());
- return string_value == NULL ?
- default_value : strcmp(string_value, "0") != 0;
-}
-
-// Reads and returns a 32-bit integer stored in the environment
-// variable corresponding to the given flag; if it isn't set or
-// doesn't represent a valid 32-bit integer, returns default_value.
-Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
- const String env_var = FlagToEnvVar(flag);
- const char* const string_value = posix::GetEnv(env_var.c_str());
- if (string_value == NULL) {
- // The environment variable is not set.
- return default_value;
- }
-
- Int32 result = default_value;
- if (!ParseInt32(Message() << "Environment variable " << env_var,
- string_value, &result)) {
- printf("The default value %s is used.\n",
- (Message() << default_value).GetString().c_str());
- fflush(stdout);
- return default_value;
- }
-
- return result;
-}
-
-// Reads and returns the string environment variable corresponding to
-// the given flag; if it's not set, returns default_value.
-const char* StringFromGTestEnv(const char* flag, const char* default_value) {
- const String env_var = FlagToEnvVar(flag);
- const char* const value = posix::GetEnv(env_var.c_str());
- return value == NULL ? default_value : value;
-}
-
-} // namespace internal
-} // namespace testing
diff --git a/unit_tests/gtest/src/gtest-printers.cc b/unit_tests/gtest/src/gtest-printers.cc
deleted file mode 100644
index ed63c7b..0000000
--- a/unit_tests/gtest/src/gtest-printers.cc
+++ /dev/null
@@ -1,356 +0,0 @@
-// Copyright 2007, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-// Google Test - The Google C++ Testing Framework
-//
-// This file implements a universal value printer that can print a
-// value of any type T:
-//
-// void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
-//
-// It uses the << operator when possible, and prints the bytes in the
-// object otherwise. A user can override its behavior for a class
-// type Foo by defining either operator<<(::std::ostream&, const Foo&)
-// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
-// defines Foo.
-
-#include "gtest/gtest-printers.h"
-#include <ctype.h>
-#include <stdio.h>
-#include <ostream> // NOLINT
-#include <string>
-#include "gtest/internal/gtest-port.h"
-
-namespace testing {
-
-namespace {
-
-using ::std::ostream;
-
-#if GTEST_OS_WINDOWS_MOBILE // Windows CE does not define _snprintf_s.
-# define snprintf _snprintf
-#elif _MSC_VER >= 1400 // VC 8.0 and later deprecate snprintf and _snprintf.
-# define snprintf _snprintf_s
-#elif _MSC_VER
-# define snprintf _snprintf
-#endif // GTEST_OS_WINDOWS_MOBILE
-
-// Prints a segment of bytes in the given object.
-void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
- size_t count, ostream* os) {
- char text[5] = "";
- for (size_t i = 0; i != count; i++) {
- const size_t j = start + i;
- if (i != 0) {
- // Organizes the bytes into groups of 2 for easy parsing by
- // human.
- if ((j % 2) == 0)
- *os << ' ';
- else
- *os << '-';
- }
- snprintf(text, sizeof(text), "%02X", obj_bytes[j]);
- *os << text;
- }
-}
-
-// Prints the bytes in the given value to the given ostream.
-void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
- ostream* os) {
- // Tells the user how big the object is.
- *os << count << "-byte object <";
-
- const size_t kThreshold = 132;
- const size_t kChunkSize = 64;
- // If the object size is bigger than kThreshold, we'll have to omit
- // some details by printing only the first and the last kChunkSize
- // bytes.
- // TODO(wan): let the user control the threshold using a flag.
- if (count < kThreshold) {
- PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
- } else {
- PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
- *os << " ... ";
- // Rounds up to 2-byte boundary.
- const size_t resume_pos = (count - kChunkSize + 1)/2*2;
- PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
- }
- *os << ">";
-}
-
-} // namespace
-
-namespace internal2 {
-
-// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
-// given object. The delegation simplifies the implementation, which
-// uses the << operator and thus is easier done outside of the
-// ::testing::internal namespace, which contains a << operator that
-// sometimes conflicts with the one in STL.
-void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
- ostream* os) {
- PrintBytesInObjectToImpl(obj_bytes, count, os);
-}
-
-} // namespace internal2
-
-namespace internal {
-
-// Depending on the value of a char (or wchar_t), we print it in one
-// of three formats:
-// - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
-// - as a hexidecimal escape sequence (e.g. '\x7F'), or
-// - as a special escape sequence (e.g. '\r', '\n').
-enum CharFormat {
- kAsIs,
- kHexEscape,
- kSpecialEscape
-};
-
-// Returns true if c is a printable ASCII character. We test the
-// value of c directly instead of calling isprint(), which is buggy on
-// Windows Mobile.
-inline bool IsPrintableAscii(wchar_t c) {
- return 0x20 <= c && c <= 0x7E;
-}
-
-// Prints a wide or narrow char c as a character literal without the
-// quotes, escaping it when necessary; returns how c was formatted.
-// The template argument UnsignedChar is the unsigned version of Char,
-// which is the type of c.
-template <typename UnsignedChar, typename Char>
-static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
- switch (static_cast<wchar_t>(c)) {
- case L'\0':
- *os << "\\0";
- break;
- case L'\'':
- *os << "\\'";
- break;
- case L'\\':
- *os << "\\\\";
- break;
- case L'\a':
- *os << "\\a";
- break;
- case L'\b':
- *os << "\\b";
- break;
- case L'\f':
- *os << "\\f";
- break;
- case L'\n':
- *os << "\\n";
- break;
- case L'\r':
- *os << "\\r";
- break;
- case L'\t':
- *os << "\\t";
- break;
- case L'\v':
- *os << "\\v";
- break;
- default:
- if (IsPrintableAscii(c)) {
- *os << static_cast<char>(c);
- return kAsIs;
- } else {
- *os << String::Format("\\x%X", static_cast<UnsignedChar>(c));
- return kHexEscape;
- }
- }
- return kSpecialEscape;
-}
-
-// Prints a char c as if it's part of a string literal, escaping it when
-// necessary; returns how c was formatted.
-static CharFormat PrintAsWideStringLiteralTo(wchar_t c, ostream* os) {
- switch (c) {
- case L'\'':
- *os << "'";
- return kAsIs;
- case L'"':
- *os << "\\\"";
- return kSpecialEscape;
- default:
- return PrintAsCharLiteralTo<wchar_t>(c, os);
- }
-}
-
-// Prints a char c as if it's part of a string literal, escaping it when
-// necessary; returns how c was formatted.
-static CharFormat PrintAsNarrowStringLiteralTo(char c, ostream* os) {
- return PrintAsWideStringLiteralTo(static_cast<unsigned char>(c), os);
-}
-
-// Prints a wide or narrow character c and its code. '\0' is printed
-// as "'\\0'", other unprintable characters are also properly escaped
-// using the standard C++ escape sequence. The template argument
-// UnsignedChar is the unsigned version of Char, which is the type of c.
-template <typename UnsignedChar, typename Char>
-void PrintCharAndCodeTo(Char c, ostream* os) {
- // First, print c as a literal in the most readable form we can find.
- *os << ((sizeof(c) > 1) ? "L'" : "'");
- const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
- *os << "'";
-
- // To aid user debugging, we also print c's code in decimal, unless
- // it's 0 (in which case c was printed as '\\0', making the code
- // obvious).
- if (c == 0)
- return;
- *os << " (" << String::Format("%d", c).c_str();
-
- // For more convenience, we print c's code again in hexidecimal,
- // unless c was already printed in the form '\x##' or the code is in
- // [1, 9].
- if (format == kHexEscape || (1 <= c && c <= 9)) {
- // Do nothing.
- } else {
- *os << String::Format(", 0x%X",
- static_cast<UnsignedChar>(c)).c_str();
- }
- *os << ")";
-}
-
-void PrintTo(unsigned char c, ::std::ostream* os) {
- PrintCharAndCodeTo<unsigned char>(c, os);
-}
-void PrintTo(signed char c, ::std::ostream* os) {
- PrintCharAndCodeTo<unsigned char>(c, os);
-}
-
-// Prints a wchar_t as a symbol if it is printable or as its internal
-// code otherwise and also as its code. L'\0' is printed as "L'\\0'".
-void PrintTo(wchar_t wc, ostream* os) {
- PrintCharAndCodeTo<wchar_t>(wc, os);
-}
-
-// Prints the given array of characters to the ostream.
-// The array starts at *begin, the length is len, it may include '\0' characters
-// and may not be null-terminated.
-static void PrintCharsAsStringTo(const char* begin, size_t len, ostream* os) {
- *os << "\"";
- bool is_previous_hex = false;
- for (size_t index = 0; index < len; ++index) {
- const char cur = begin[index];
- if (is_previous_hex && IsXDigit(cur)) {
- // Previous character is of '\x..' form and this character can be
- // interpreted as another hexadecimal digit in its number. Break string to
- // disambiguate.
- *os << "\" \"";
- }
- is_previous_hex = PrintAsNarrowStringLiteralTo(cur, os) == kHexEscape;
- }
- *os << "\"";
-}
-
-// Prints a (const) char array of 'len' elements, starting at address 'begin'.
-void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
- PrintCharsAsStringTo(begin, len, os);
-}
-
-// Prints the given array of wide characters to the ostream.
-// The array starts at *begin, the length is len, it may include L'\0'
-// characters and may not be null-terminated.
-static void PrintWideCharsAsStringTo(const wchar_t* begin, size_t len,
- ostream* os) {
- *os << "L\"";
- bool is_previous_hex = false;
- for (size_t index = 0; index < len; ++index) {
- const wchar_t cur = begin[index];
- if (is_previous_hex && isascii(cur) && IsXDigit(static_cast<char>(cur))) {
- // Previous character is of '\x..' form and this character can be
- // interpreted as another hexadecimal digit in its number. Break string to
- // disambiguate.
- *os << "\" L\"";
- }
- is_previous_hex = PrintAsWideStringLiteralTo(cur, os) == kHexEscape;
- }
- *os << "\"";
-}
-
-// Prints the given C string to the ostream.
-void PrintTo(const char* s, ostream* os) {
- if (s == NULL) {
- *os << "NULL";
- } else {
- *os << ImplicitCast_<const void*>(s) << " pointing to ";
- PrintCharsAsStringTo(s, strlen(s), os);
- }
-}
-
-// MSVC compiler can be configured to define whar_t as a typedef
-// of unsigned short. Defining an overload for const wchar_t* in that case
-// would cause pointers to unsigned shorts be printed as wide strings,
-// possibly accessing more memory than intended and causing invalid
-// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
-// wchar_t is implemented as a native type.
-#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
-// Prints the given wide C string to the ostream.
-void PrintTo(const wchar_t* s, ostream* os) {
- if (s == NULL) {
- *os << "NULL";
- } else {
- *os << ImplicitCast_<const void*>(s) << " pointing to ";
- PrintWideCharsAsStringTo(s, wcslen(s), os);
- }
-}
-#endif // wchar_t is native
-
-// Prints a ::string object.
-#if GTEST_HAS_GLOBAL_STRING
-void PrintStringTo(const ::string& s, ostream* os) {
- PrintCharsAsStringTo(s.data(), s.size(), os);
-}
-#endif // GTEST_HAS_GLOBAL_STRING
-
-void PrintStringTo(const ::std::string& s, ostream* os) {
- PrintCharsAsStringTo(s.data(), s.size(), os);
-}
-
-// Prints a ::wstring object.
-#if GTEST_HAS_GLOBAL_WSTRING
-void PrintWideStringTo(const ::wstring& s, ostream* os) {
- PrintWideCharsAsStringTo(s.data(), s.size(), os);
-}
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
-#if GTEST_HAS_STD_WSTRING
-void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
- PrintWideCharsAsStringTo(s.data(), s.size(), os);
-}
-#endif // GTEST_HAS_STD_WSTRING
-
-} // namespace internal
-
-} // namespace testing
diff --git a/unit_tests/gtest/src/gtest-test-part.cc b/unit_tests/gtest/src/gtest-test-part.cc
deleted file mode 100644
index 5ddc67c..0000000
--- a/unit_tests/gtest/src/gtest-test-part.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2008, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: mheule at google.com (Markus Heule)
-//
-// The Google C++ Testing Framework (Google Test)
-
-#include "gtest/gtest-test-part.h"
-
-// Indicates that this translation unit is part of Google Test's
-// implementation. It must come before gtest-internal-inl.h is
-// included, or there will be a compiler error. This trick is to
-// prevent a user from accidentally including gtest-internal-inl.h in
-// his code.
-#define GTEST_IMPLEMENTATION_ 1
-#include "src/gtest-internal-inl.h"
-#undef GTEST_IMPLEMENTATION_
-
-namespace testing {
-
-using internal::GetUnitTestImpl;
-
-// Gets the summary of the failure message by omitting the stack trace
-// in it.
-internal::String TestPartResult::ExtractSummary(const char* message) {
- const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
- return stack_trace == NULL ? internal::String(message) :
- internal::String(message, stack_trace - message);
-}
-
-// Prints a TestPartResult object.
-std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
- return os
- << result.file_name() << ":" << result.line_number() << ": "
- << (result.type() == TestPartResult::kSuccess ? "Success" :
- result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
- "Non-fatal failure") << ":\n"
- << result.message() << std::endl;
-}
-
-// Appends a TestPartResult to the array.
-void TestPartResultArray::Append(const TestPartResult& result) {
- array_.push_back(result);
-}
-
-// Returns the TestPartResult at the given index (0-based).
-const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
- if (index < 0 || index >= size()) {
- printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
- internal::posix::Abort();
- }
-
- return array_[index];
-}
-
-// Returns the number of TestPartResult objects in the array.
-int TestPartResultArray::size() const {
- return static_cast<int>(array_.size());
-}
-
-namespace internal {
-
-HasNewFatalFailureHelper::HasNewFatalFailureHelper()
- : has_new_fatal_failure_(false),
- original_reporter_(GetUnitTestImpl()->
- GetTestPartResultReporterForCurrentThread()) {
- GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
-}
-
-HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
- GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
- original_reporter_);
-}
-
-void HasNewFatalFailureHelper::ReportTestPartResult(
- const TestPartResult& result) {
- if (result.fatally_failed())
- has_new_fatal_failure_ = true;
- original_reporter_->ReportTestPartResult(result);
-}
-
-} // namespace internal
-
-} // namespace testing
diff --git a/unit_tests/gtest/src/gtest-typed-test.cc b/unit_tests/gtest/src/gtest-typed-test.cc
deleted file mode 100644
index a5cc88f..0000000
--- a/unit_tests/gtest/src/gtest-typed-test.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2008 Google Inc.
-// All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-
-#include "gtest/gtest-typed-test.h"
-#include "gtest/gtest.h"
-
-namespace testing {
-namespace internal {
-
-#if GTEST_HAS_TYPED_TEST_P
-
-// Skips to the first non-space char in str. Returns an empty string if str
-// contains only whitespace characters.
-static const char* SkipSpaces(const char* str) {
- while (IsSpace(*str))
- str++;
- return str;
-}
-
-// Verifies that registered_tests match the test names in
-// defined_test_names_; returns registered_tests if successful, or
-// aborts the program otherwise.
-const char* TypedTestCasePState::VerifyRegisteredTestNames(
- const char* file, int line, const char* registered_tests) {
- typedef ::std::set<const char*>::const_iterator DefinedTestIter;
- registered_ = true;
-
- // Skip initial whitespace in registered_tests since some
- // preprocessors prefix stringizied literals with whitespace.
- registered_tests = SkipSpaces(registered_tests);
-
- Message errors;
- ::std::set<String> tests;
- for (const char* names = registered_tests; names != NULL;
- names = SkipComma(names)) {
- const String name = GetPrefixUntilComma(names);
- if (tests.count(name) != 0) {
- errors << "Test " << name << " is listed more than once.\n";
- continue;
- }
-
- bool found = false;
- for (DefinedTestIter it = defined_test_names_.begin();
- it != defined_test_names_.end();
- ++it) {
- if (name == *it) {
- found = true;
- break;
- }
- }
-
- if (found) {
- tests.insert(name);
- } else {
- errors << "No test named " << name
- << " can be found in this test case.\n";
- }
- }
-
- for (DefinedTestIter it = defined_test_names_.begin();
- it != defined_test_names_.end();
- ++it) {
- if (tests.count(*it) == 0) {
- errors << "You forgot to list test " << *it << ".\n";
- }
- }
-
- const String& errors_str = errors.GetString();
- if (errors_str != "") {
- fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
- errors_str.c_str());
- fflush(stderr);
- posix::Abort();
- }
-
- return registered_tests;
-}
-
-#endif // GTEST_HAS_TYPED_TEST_P
-
-} // namespace internal
-} // namespace testing
diff --git a/unit_tests/gtest/src/gtest.cc b/unit_tests/gtest/src/gtest.cc
deleted file mode 100644
index 904d9d7..0000000
--- a/unit_tests/gtest/src/gtest.cc
+++ /dev/null
@@ -1,4898 +0,0 @@
-// Copyright 2005, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Author: wan at google.com (Zhanyong Wan)
-//
-// The Google C++ Testing Framework (Google Test)
-
-#include "gtest/gtest.h"
-#include "gtest/gtest-spi.h"
-
-#include <ctype.h>
-#include <math.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <wctype.h>
-
-#include <algorithm>
-#include <ostream> // NOLINT
-#include <sstream>
-#include <vector>
-
-#if GTEST_OS_LINUX
-
-// TODO(kenton at google.com): Use autoconf to detect availability of
-// gettimeofday().
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-
-# include <fcntl.h> // NOLINT
-# include <limits.h> // NOLINT
-# include <sched.h> // NOLINT
-// Declares vsnprintf(). This header is not available on Windows.
-# include <strings.h> // NOLINT
-# include <sys/mman.h> // NOLINT
-# include <sys/time.h> // NOLINT
-# include <unistd.h> // NOLINT
-# include <string>
-
-#elif GTEST_OS_SYMBIAN
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-# include <sys/time.h> // NOLINT
-
-#elif GTEST_OS_ZOS
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-# include <sys/time.h> // NOLINT
-
-// On z/OS we additionally need strings.h for strcasecmp.
-# include <strings.h> // NOLINT
-
-#elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE.
-
-# include <windows.h> // NOLINT
-
-#elif GTEST_OS_WINDOWS // We are on Windows proper.
-
-# include <io.h> // NOLINT
-# include <sys/timeb.h> // NOLINT
-# include <sys/types.h> // NOLINT
-# include <sys/stat.h> // NOLINT
-
-# if GTEST_OS_WINDOWS_MINGW
-// MinGW has gettimeofday() but not _ftime64().
-// TODO(kenton at google.com): Use autoconf to detect availability of
-// gettimeofday().
-// TODO(kenton at google.com): There are other ways to get the time on
-// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW
-// supports these. consider using them instead.
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-# include <sys/time.h> // NOLINT
-# endif // GTEST_OS_WINDOWS_MINGW
-
-// cpplint thinks that the header is already included, so we want to
-// silence it.
-# include <windows.h> // NOLINT
-
-#else
-
-// Assume other platforms have gettimeofday().
-// TODO(kenton at google.com): Use autoconf to detect availability of
-// gettimeofday().
-# define GTEST_HAS_GETTIMEOFDAY_ 1
-
-// cpplint thinks that the header is already included, so we want to
-// silence it.
-# include <sys/time.h> // NOLINT
-# include <unistd.h> // NOLINT
-
-#endif // GTEST_OS_LINUX
-
-#if GTEST_HAS_EXCEPTIONS
-# include <stdexcept>
-#endif
-
-#if GTEST_CAN_STREAM_RESULTS_
-# include <arpa/inet.h> // NOLINT
-# include <netdb.h> // NOLINT
-#endif
-
-// Indicates that this translation unit is part of Google Test's
-// implementation. It must come before gtest-internal-inl.h is
-// included, or there will be a compiler error. This trick is to
-// prevent a user from accidentally including gtest-internal-inl.h in
-// his code.
-#define GTEST_IMPLEMENTATION_ 1
-#include "src/gtest-internal-inl.h"
-#undef GTEST_IMPLEMENTATION_
-
-#if GTEST_OS_WINDOWS
-# define vsnprintf _vsnprintf
-#endif // GTEST_OS_WINDOWS
-
-namespace testing {
-
-using internal::CountIf;
-using internal::ForEach;
-using internal::GetElementOr;
-using internal::Shuffle;
-
-// Constants.
-
-// A test whose test case name or test name matches this filter is
-// disabled and not run.
-static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
-
-// A test case whose name matches this filter is considered a death
-// test case and will be run before test cases whose name doesn't
-// match this filter.
-static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
-
-// A test filter that matches everything.
-static const char kUniversalFilter[] = "*";
-
-// The default output file for XML output.
-static const char kDefaultOutputFile[] = "test_detail.xml";
-
-// The environment variable name for the test shard index.
-static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
-// The environment variable name for the total number of test shards.
-static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
-// The environment variable name for the test shard status file.
-static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
-
-namespace internal {
-
-// The text used in failure messages to indicate the start of the
-// stack trace.
-const char kStackTraceMarker[] = "\nStack trace:\n";
-
-// g_help_flag is true iff the --help flag or an equivalent form is
-// specified on the command line.
-bool g_help_flag = false;
-
-} // namespace internal
-
-GTEST_DEFINE_bool_(
- also_run_disabled_tests,
- internal::BoolFromGTestEnv("also_run_disabled_tests", false),
- "Run disabled tests too, in addition to the tests normally being run.");
-
-GTEST_DEFINE_bool_(
- break_on_failure,
- internal::BoolFromGTestEnv("break_on_failure", false),
- "True iff a failed assertion should be a debugger break-point.");
-
-GTEST_DEFINE_bool_(
- catch_exceptions,
- internal::BoolFromGTestEnv("catch_exceptions", true),
- "True iff " GTEST_NAME_
- " should catch exceptions and treat them as test failures.");
-
-GTEST_DEFINE_string_(
- color,
- internal::StringFromGTestEnv("color", "auto"),
- "Whether to use colors in the output. Valid values: yes, no, "
- "and auto. 'auto' means to use colors if the output is "
- "being sent to a terminal and the TERM environment variable "
- "is set to xterm, xterm-color, xterm-256color, linux or cygwin.");
-
-GTEST_DEFINE_string_(
- filter,
- internal::StringFromGTestEnv("filter", kUniversalFilter),
- "A colon-separated list of glob (not regex) patterns "
- "for filtering the tests to run, optionally followed by a "
- "'-' and a : separated list of negative patterns (tests to "
- "exclude). A test is run if it matches one of the positive "
- "patterns and does not match any of the negative patterns.");
-
-GTEST_DEFINE_bool_(list_tests, false,
- "List all tests without running them.");
-
-GTEST_DEFINE_string_(
- output,
- internal::StringFromGTestEnv("output", ""),
- "A format (currently must be \"xml\"), optionally followed "
- "by a colon and an output file name or directory. A directory "
- "is indicated by a trailing pathname separator. "
- "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
- "If a directory is specified, output files will be created "
- "within that directory, with file-names based on the test "
- "executable's name and, if necessary, made unique by adding "
- "digits.");
-
-GTEST_DEFINE_bool_(
- print_time,
- internal::BoolFromGTestEnv("print_time", true),
- "True iff " GTEST_NAME_
- " should display elapsed time in text output.");
-
-GTEST_DEFINE_int32_(
- random_seed,
- internal::Int32FromGTestEnv("random_seed", 0),
- "Random number seed to use when shuffling test orders. Must be in range "
- "[1, 99999], or 0 to use a seed based on the current time.");
-
-GTEST_DEFINE_int32_(
- repeat,
- internal::Int32FromGTestEnv("repeat", 1),
- "How many times to repeat each test. Specify a negative number "
- "for repeating forever. Useful for shaking out flaky tests.");
-
-GTEST_DEFINE_bool_(
- show_internal_stack_frames, false,
- "True iff " GTEST_NAME_ " should include internal stack frames when "
- "printing test failure stack traces.");
-
-GTEST_DEFINE_bool_(
- shuffle,
- internal::BoolFromGTestEnv("shuffle", false),
- "True iff " GTEST_NAME_
- " should randomize tests' order on every run.");
-
-GTEST_DEFINE_int32_(
- stack_trace_depth,
- internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
- "The maximum number of stack frames to print when an "
- "assertion fails. The valid range is 0 through 100, inclusive.");
-
-GTEST_DEFINE_string_(
- stream_result_to,
- internal::StringFromGTestEnv("stream_result_to", ""),
- "This flag specifies the host name and the port number on which to stream "
- "test results. Example: \"localhost:555\". The flag is effective only on "
- "Linux.");
-
-GTEST_DEFINE_bool_(
- throw_on_failure,
- internal::BoolFromGTestEnv("throw_on_failure", false),
- "When this flag is specified, a failed assertion will throw an exception "
- "if exceptions are enabled or exit the program with a non-zero code "
- "otherwise.");
-
-namespace internal {
-
-// Generates a random number from [0, range), using a Linear
-// Congruential Generator (LCG). Crashes if 'range' is 0 or greater
-// than kMaxRange.
-UInt32 Random::Generate(UInt32 range) {
- // These constants are the same as are used in glibc's rand(3).
- state_ = (1103515245U*state_ + 12345U) % kMaxRange;
-
- GTEST_CHECK_(range > 0)
- << "Cannot generate a number in the range [0, 0).";
- GTEST_CHECK_(range <= kMaxRange)
- << "Generation of a number in [0, " << range << ") was requested, "
- << "but this can only generate numbers in [0, " << kMaxRange << ").";
-
- // Converting via modulus introduces a bit of downward bias, but
- // it's simple, and a linear congruential generator isn't too good
- // to begin with.
- return state_ % range;
-}
-
-// GTestIsInitialized() returns true iff the user has initialized
-// Google Test. Useful for catching the user mistake of not initializing
-// Google Test before calling RUN_ALL_TESTS().
-//
-// A user must call testing::InitGoogleTest() to initialize Google
-// Test. g_init_gtest_count is set to the number of times
-// InitGoogleTest() has been called. We don't protect this variable
-// under a mutex as it is only accessed in the main thread.
-int g_init_gtest_count = 0;
-static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
-
-// Iterates over a vector of TestCases, keeping a running sum of the
-// results of calling a given int-returning method on each.
-// Returns the sum.
-static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
- int (TestCase::*method)() const) {
- int sum = 0;
- for (size_t i = 0; i < case_list.size(); i++) {
- sum += (case_list[i]->*method)();
- }
- return sum;
-}
-
-// Returns true iff the test case passed.
-static bool TestCasePassed(const TestCase* test_case) {
- return test_case->should_run() && test_case->Passed();
-}
-
-// Returns true iff the test case failed.
-static bool TestCaseFailed(const TestCase* test_case) {
- return test_case->should_run() && test_case->Failed();
-}
-
-// Returns true iff test_case contains at least one test that should
-// run.
-static bool ShouldRunTestCase(const TestCase* test_case) {
- return test_case->should_run();
-}
-
-// AssertHelper constructor.
-AssertHelper::AssertHelper(TestPartResult::Type type,
- const char* file,
- int line,
- const char* message)
- : data_(new AssertHelperData(type, file, line, message)) {
-}
-
-AssertHelper::~AssertHelper() {
- delete data_;
-}
-
-// Message assignment, for assertion streaming support.
-void AssertHelper::operator=(const Message& message) const {
- UnitTest::GetInstance()->
- AddTestPartResult(data_->type, data_->file, data_->line,
- AppendUserMessage(data_->message, message),
- UnitTest::GetInstance()->impl()
- ->CurrentOsStackTraceExceptTop(1)
- // Skips the stack frame for this function itself.
- ); // NOLINT
-}
-
-// Mutex for linked pointers.
-GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
-
-// Application pathname gotten in InitGoogleTest.
-String g_executable_path;
-
-// Returns the current application's name, removing directory path if that
-// is present.
-FilePath GetCurrentExecutableName() {
- FilePath result;
-
-#if GTEST_OS_WINDOWS
- result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
-#else
- result.Set(FilePath(g_executable_path));
-#endif // GTEST_OS_WINDOWS
-
- return result.RemoveDirectoryName();
-}
-
-// Functions for processing the gtest_output flag.
-
-// Returns the output format, or "" for normal printed output.
-String UnitTestOptions::GetOutputFormat() {
- const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
- if (gtest_output_flag == NULL) return String("");
-
- const char* const colon = strchr(gtest_output_flag, ':');
- return (colon == NULL) ?
- String(gtest_output_flag) :
- String(gtest_output_flag, colon - gtest_output_flag);
-}
-
-// Returns the name of the requested output file, or the default if none
-// was explicitly specified.
-String UnitTestOptions::GetAbsolutePathToOutputFile() {
- const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
- if (gtest_output_flag == NULL)
- return String("");
-
- const char* const colon = strchr(gtest_output_flag, ':');
- if (colon == NULL)
- return String(internal::FilePath::ConcatPaths(
- internal::FilePath(
- UnitTest::GetInstance()->original_working_dir()),
- internal::FilePath(kDefaultOutputFile)).ToString() );
-
- internal::FilePath output_name(colon + 1);
- if (!output_name.IsAbsolutePath())
- // TODO(wan at google.com): on Windows \some\path is not an absolute
- // path (as its meaning depends on the current drive), yet the
- // following logic for turning it into an absolute path is wrong.
- // Fix it.
- output_name = internal::FilePath::ConcatPaths(
- internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
- internal::FilePath(colon + 1));
-
- if (!output_name.IsDirectory())
- return output_name.ToString();
-
- internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
- output_name, internal::GetCurrentExecutableName(),
- GetOutputFormat().c_str()));
- return result.ToString();
-}
-
-// Returns true iff the wildcard pattern matches the string. The
-// first ':' or '\0' character in pattern marks the end of it.
-//
-// This recursive algorithm isn't very efficient, but is clear and
-// works well enough for matching test names, which are short.
-bool UnitTestOptions::PatternMatchesString(const char *pattern,
- const char *str) {
- switch (*pattern) {
- case '\0':
- case ':': // Either ':' or '\0' marks the end of the pattern.
- return *str == '\0';
- case '?': // Matches any single character.
- return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
- case '*': // Matches any string (possibly empty) of characters.
- return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
- PatternMatchesString(pattern + 1, str);
- default: // Non-special character. Matches itself.
- return *pattern == *str &&
- PatternMatchesString(pattern + 1, str + 1);
- }
-}
-
-bool UnitTestOptions::MatchesFilter(const String& name, const char* filter) {
- const char *cur_pattern = filter;
- for (;;) {
- if (PatternMatchesString(cur_pattern, name.c_str())) {
- return true;
- }
-
- // Finds the next pattern in the filter.
- cur_pattern = strchr(cur_pattern, ':');
-
- // Returns if no more pattern can be found.
- if (cur_pattern == NULL) {
- return false;
- }
-
- // Skips the pattern separater (the ':' character).
- cur_pattern++;
- }
-}
-
-// TODO(keithray): move String function implementations to gtest-string.cc.
-
-// Returns true iff the user-specified filter matches the test case
-// name and the test name.
-bool UnitTestOptions::FilterMatchesTest(const String &test_case_name,
- const String &test_name) {
- const String& full_name = String::Format("%s.%s",
- test_case_name.c_str(),
- test_name.c_str());
-
- // Split --gtest_filter at '-', if there is one, to separate into
- // positive filter and negative filter portions
- const char* const p = GTEST_FLAG(filter).c_str();
- const char* const dash = strchr(p, '-');
- String positive;
- String negative;
- if (dash == NULL) {
- positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter
- negative = String("");
- } else {
- positive = String(p, dash - p); // Everything up to the dash
- negative = String(dash+1); // Everything after the dash
- if (positive.empty()) {
- // Treat '-test1' as the same as '*-test1'
- positive = kUniversalFilter;
- }
- }
-
- // A filter is a colon-separated list of patterns. It matches a
- // test if any pattern in it matches the test.
- return (MatchesFilter(full_name, positive.c_str()) &&
- !MatchesFilter(full_name, negative.c_str()));
-}
-
-#if GTEST_HAS_SEH
-// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
-// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
-// This function is useful as an __except condition.
-int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
- // Google Test should handle a SEH exception if:
- // 1. the user wants it to, AND
- // 2. this is not a breakpoint exception, AND
- // 3. this is not a C++ exception (VC++ implements them via SEH,
- // apparently).
- //
- // SEH exception code for C++ exceptions.
- // (see http://support.microsoft.com/kb/185294 for more information).
- const DWORD kCxxExceptionCode = 0xe06d7363;
-
- bool should_handle = true;
-
- if (!GTEST_FLAG(catch_exceptions))
- should_handle = false;
- else if (exception_code == EXCEPTION_BREAKPOINT)
- should_handle = false;
- else if (exception_code == kCxxExceptionCode)
- should_handle = false;
-
- return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
-}
-#endif // GTEST_HAS_SEH
-
-} // namespace internal
-
-// The c'tor sets this object as the test part result reporter used by
-// Google Test. The 'result' parameter specifies where to report the
-// results. Intercepts only failures from the current thread.
-ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
- TestPartResultArray* result)
- : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
- result_(result) {
- Init();
-}
-
-// The c'tor sets this object as the test part result reporter used by
-// Google Test. The 'result' parameter specifies where to report the
-// results.
-ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
- InterceptMode intercept_mode, TestPartResultArray* result)
- : intercept_mode_(intercept_mode),
- result_(result) {
- Init();
-}
-
-void ScopedFakeTestPartResultReporter::Init() {
- internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
- if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
- old_reporter_ = impl->GetGlobalTestPartResultReporter();
- impl->SetGlobalTestPartResultReporter(this);
- } else {
- old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
- impl->SetTestPartResultReporterForCurrentThread(this);
- }
-}
-
-// The d'tor restores the test part result reporter used by Google Test
-// before.
-ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
- internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
- if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
- impl->SetGlobalTestPartResultReporter(old_reporter_);
- } else {
- impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
- }
-}
-
-// Increments the test part result count and remembers the result.
-// This method is from the TestPartResultReporterInterface interface.
-void ScopedFakeTestPartResultReporter::ReportTestPartResult(
- const TestPartResult& result) {
- result_->Append(result);
-}
-
-namespace internal {
-
-// Returns the type ID of ::testing::Test. We should always call this
-// instead of GetTypeId< ::testing::Test>() to get the type ID of
-// testing::Test. This is to work around a suspected linker bug when
-// using Google Test as a framework on Mac OS X. The bug causes
-// GetTypeId< ::testing::Test>() to return different values depending
-// on whether the call is from the Google Test framework itself or
-// from user test code. GetTestTypeId() is guaranteed to always
-// return the same value, as it always calls GetTypeId<>() from the
-// gtest.cc, which is within the Google Test framework.
-TypeId GetTestTypeId() {
- return GetTypeId<Test>();
-}
-
-// The value of GetTestTypeId() as seen from within the Google Test
-// library. This is solely for testing GetTestTypeId().
-extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
-
-// This predicate-formatter checks that 'results' contains a test part
-// failure of the given type and that the failure message contains the
-// given substring.
-AssertionResult HasOneFailure(const char* /* results_expr */,
- const char* /* type_expr */,
- const char* /* substr_expr */,
- const TestPartResultArray& results,
- TestPartResult::Type type,
- const string& substr) {
- const String expected(type == TestPartResult::kFatalFailure ?
- "1 fatal failure" :
- "1 non-fatal failure");
- Message msg;
- if (results.size() != 1) {
- msg << "Expected: " << expected << "\n"
- << " Actual: " << results.size() << " failures";
- for (int i = 0; i < results.size(); i++) {
- msg << "\n" << results.GetTestPartResult(i);
- }
- return AssertionFailure() << msg;
- }
-
- const TestPartResult& r = results.GetTestPartResult(0);
- if (r.type() != type) {
- return AssertionFailure() << "Expected: " << expected << "\n"
- << " Actual:\n"
- << r;
- }
-
- if (strstr(r.message(), substr.c_str()) == NULL) {
- return AssertionFailure() << "Expected: " << expected << " containing \""
- << substr << "\"\n"
- << " Actual:\n"
- << r;
- }
-
- return AssertionSuccess();
-}
-
-// The constructor of SingleFailureChecker remembers where to look up
-// test part results, what type of failure we expect, and what
-// substring the failure message should contain.
-SingleFailureChecker:: SingleFailureChecker(
- const TestPartResultArray* results,
- TestPartResult::Type type,
- const string& substr)
- : results_(results),
- type_(type),
- substr_(substr) {}
-
-// The destructor of SingleFailureChecker verifies that the given
-// TestPartResultArray contains exactly one failure that has the given
-// type and contains the given substring. If that's not the case, a
-// non-fatal failure will be generated.
-SingleFailureChecker::~SingleFailureChecker() {
- EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
-}
-
-DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
- UnitTestImpl* unit_test) : unit_test_(unit_test) {}
-
-void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
- const TestPartResult& result) {
- unit_test_->current_test_result()->AddTestPartResult(result);
- unit_test_->listeners()->repeater()->OnTestPartResult(result);
-}
-
-DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
- UnitTestImpl* unit_test) : unit_test_(unit_test) {}
-
-void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
- const TestPartResult& result) {
- unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
-}
-
-// Returns the global test part result reporter.
-TestPartResultReporterInterface*
-UnitTestImpl::GetGlobalTestPartResultReporter() {
- internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
- return global_test_part_result_repoter_;
-}
-
-// Sets the global test part result reporter.
-void UnitTestImpl::SetGlobalTestPartResultReporter(
- TestPartResultReporterInterface* reporter) {
- internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
- global_test_part_result_repoter_ = reporter;
-}
-
-// Returns the test part result reporter for the current thread.
-TestPartResultReporterInterface*
-UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
- return per_thread_test_part_result_reporter_.get();
-}
-
-// Sets the test part result reporter for the current thread.
-void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
- TestPartResultReporterInterface* reporter) {
- per_thread_test_part_result_reporter_.set(reporter);
-}
-
-// Gets the number of successful test cases.
-int UnitTestImpl::successful_test_case_count() const {
- return CountIf(test_cases_, TestCasePassed);
-}
-
-// Gets the number of failed test cases.
-int UnitTestImpl::failed_test_case_count() const {
- return CountIf(test_cases_, TestCaseFailed);
-}
-
-// Gets the number of all test cases.
-int UnitTestImpl::total_test_case_count() const {
- return static_cast<int>(test_cases_.size());
-}
-
-// Gets the number of all test cases that contain at least one test
-// that should run.
-int UnitTestImpl::test_case_to_run_count() const {
- return CountIf(test_cases_, ShouldRunTestCase);
-}
-
-// Gets the number of successful tests.
-int UnitTestImpl::successful_test_count() const {
- return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
-}
-
-// Gets the number of failed tests.
-int UnitTestImpl::failed_test_count() const {
- return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
-}
-
-// Gets the number of disabled tests.
-int UnitTestImpl::disabled_test_count() const {
- return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
-}
-
-// Gets the number of all tests.
-int UnitTestImpl::total_test_count() const {
- return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
-}
-
-// Gets the number of tests that should run.
-int UnitTestImpl::test_to_run_count() const {
- return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
-}
-
-// Returns the current OS stack trace as a String.
-//
-// The maximum number of stack frames to be included is specified by
-// the gtest_stack_trace_depth flag. The skip_count parameter
-// specifies the number of top frames to be skipped, which doesn't
-// count against the number of frames to be included.
-//
-// For example, if Foo() calls Bar(), which in turn calls
-// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
-// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
-String UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
- (void)skip_count;
- return String("");
-}
-
-// Returns the current time in milliseconds.
-TimeInMillis GetTimeInMillis() {
-#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
- // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
- // http://analogous.blogspot.com/2005/04/epoch.html
- const TimeInMillis kJavaEpochToWinFileTimeDelta =
- static_cast<TimeInMillis>(116444736UL) * 100000UL;
- const DWORD kTenthMicrosInMilliSecond = 10000;
-
- SYSTEMTIME now_systime;
- FILETIME now_filetime;
- ULARGE_INTEGER now_int64;
- // TODO(kenton at google.com): Shouldn't this just use
- // GetSystemTimeAsFileTime()?
- GetSystemTime(&now_systime);
- if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
- now_int64.LowPart = now_filetime.dwLowDateTime;
- now_int64.HighPart = now_filetime.dwHighDateTime;
- now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
- kJavaEpochToWinFileTimeDelta;
- return now_int64.QuadPart;
- }
- return 0;
-#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
- __timeb64 now;
-
-# ifdef _MSC_VER
-
- // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
- // (deprecated function) there.
- // TODO(kenton at google.com): Use GetTickCount()? Or use
- // SystemTimeToFileTime()
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4996) // Temporarily disables warning 4996.
- _ftime64(&now);
-# pragma warning(pop) // Restores the warning state.
-# else
-
- _ftime64(&now);
-
-# endif // _MSC_VER
-
- return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
-#elif GTEST_HAS_GETTIMEOFDAY_
- struct timeval now;
- gettimeofday(&now, NULL);
- return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
-#else
-# error "Don't know how to get the current time on your system."
-#endif
-}
-
-// Utilities
-
-// class String
-
-// Returns the input enclosed in double quotes if it's not NULL;
-// otherwise returns "(null)". For example, "\"Hello\"" is returned
-// for input "Hello".
-//
-// This is useful for printing a C string in the syntax of a literal.
-//
-// Known issue: escape sequences are not handled yet.
-String String::ShowCStringQuoted(const char* c_str) {
- return c_str ? String::Format("\"%s\"", c_str) : String("(null)");
-}
-
-// Copies at most length characters from str into a newly-allocated
-// piece of memory of size length+1. The memory is allocated with new[].
-// A terminating null byte is written to the memory, and a pointer to it
-// is returned. If str is NULL, NULL is returned.
-static char* CloneString(const char* str, size_t length) {
- if (str == NULL) {
- return NULL;
- } else {
- char* const clone = new char[length + 1];
- posix::StrNCpy(clone, str, length);
- clone[length] = '\0';
- return clone;
- }
-}
-
-// Clones a 0-terminated C string, allocating memory using new. The
-// caller is responsible for deleting[] the return value. Returns the
-// cloned string, or NULL if the input is NULL.
-const char * String::CloneCString(const char* c_str) {
- return (c_str == NULL) ?
- NULL : CloneString(c_str, strlen(c_str));
-}
-
-#if GTEST_OS_WINDOWS_MOBILE
-// Creates a UTF-16 wide string from the given ANSI string, allocating
-// memory using new. The caller is responsible for deleting the return
-// value using delete[]. Returns the wide string, or NULL if the
-// input is NULL.
-LPCWSTR String::AnsiToUtf16(const char* ansi) {
- if (!ansi) return NULL;
- const int length = strlen(ansi);
- const int unicode_length =
- MultiByteToWideChar(CP_ACP, 0, ansi, length,
- NULL, 0);
- WCHAR* unicode = new WCHAR[unicode_length + 1];
- MultiByteToWideChar(CP_ACP, 0, ansi, length,
- unicode, unicode_length);
- unicode[unicode_length] = 0;
- return unicode;
-}
-
-// Creates an ANSI string from the given wide string, allocating
-// memory using new. The caller is responsible for deleting the return
-// value using delete[]. Returns the ANSI string, or NULL if the
-// input is NULL.
-const char* String::Utf16ToAnsi(LPCWSTR utf16_str) {
- if (!utf16_str) return NULL;
- const int ansi_length =
- WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
- NULL, 0, NULL, NULL);
- char* ansi = new char[ansi_length + 1];
- WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
- ansi, ansi_length, NULL, NULL);
- ansi[ansi_length] = 0;
- return ansi;
-}
-
-#endif // GTEST_OS_WINDOWS_MOBILE
-
-// Compares two C strings. Returns true iff they have the same content.
-//
-// Unlike strcmp(), this function can handle NULL argument(s). A NULL
-// C string is considered different to any non-NULL C string,
-// including the empty string.
-bool String::CStringEquals(const char * lhs, const char * rhs) {
- if ( lhs == NULL ) return rhs == NULL;
-
- if ( rhs == NULL ) return false;
-
- return strcmp(lhs, rhs) == 0;
-}
-
-#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
-
-// Converts an array of wide chars to a narrow string using the UTF-8
-// encoding, and streams the result to the given Message object.
-static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
- Message* msg) {
- // TODO(wan): consider allowing a testing::String object to
- // contain '\0'. This will make it behave more like std::string,
- // and will allow ToUtf8String() to return the correct encoding
- // for '\0' s.t. we can get rid of the conditional here (and in
- // several other places).
- for (size_t i = 0; i != length; ) { // NOLINT
- if (wstr[i] != L'\0') {
- *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
- while (i != length && wstr[i] != L'\0')
- i++;
- } else {
- *msg << '\0';
- i++;
- }
- }
-}
-
-#endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
-
-} // namespace internal
-
-#if GTEST_HAS_STD_WSTRING
-// Converts the given wide string to a narrow string using the UTF-8
-// encoding, and streams the result to this Message object.
-Message& Message::operator <<(const ::std::wstring& wstr) {
- internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
- return *this;
-}
-#endif // GTEST_HAS_STD_WSTRING
-
-#if GTEST_HAS_GLOBAL_WSTRING
-// Converts the given wide string to a narrow string using the UTF-8
-// encoding, and streams the result to this Message object.
-Message& Message::operator <<(const ::wstring& wstr) {
- internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
- return *this;
-}
-#endif // GTEST_HAS_GLOBAL_WSTRING
-
-// AssertionResult constructors.
-// Used in EXPECT_TRUE/FALSE(assertion_result).
-AssertionResult::AssertionResult(const AssertionResult& other)
- : success_(other.success_),
- message_(other.message_.get() != NULL ?
- new ::std::string(*other.message_) :
- static_cast< ::std::string*>(NULL)) {
-}
-
-// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
-AssertionResult AssertionResult::operator!() const {
- AssertionResult negation(!success_);
- if (message_.get() != NULL)
- negation << *message_;
- return negation;
-}
-
-// Makes a successful assertion result.
-AssertionResult AssertionSuccess() {
- return AssertionResult(true);
-}
-
-// Makes a failed assertion result.
-AssertionResult AssertionFailure() {
- return AssertionResult(false);
-}
-
-// Makes a failed assertion result with the given failure message.
-// Deprecated; use AssertionFailure() << message.
-AssertionResult AssertionFailure(const Message& message) {
- return AssertionFailure() << message;
-}
-
-namespace internal {
-
-// Constructs and returns the message for an equality assertion
-// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
-//
-// The first four parameters are the expressions used in the assertion
-// and their values, as strings. For example, for ASSERT_EQ(foo, bar)
-// where foo is 5 and bar is 6, we have:
-//
-// expected_expression: "foo"
-// actual_expression: "bar"
-// expected_value: "5"
-// actual_value: "6"
-//
-// The ignoring_case parameter is true iff the assertion is a
-// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will
-// be inserted into the message.
-AssertionResult EqFailure(const char* expected_expression,
- const char* actual_expression,
- const String& expected_value,
- const String& actual_value,
- bool ignoring_case) {
- Message msg;
- msg << "Value of: " << actual_expression;
- if (actual_value != actual_expression) {
- msg << "\n Actual: " << actual_value;
- }
-
- msg << "\nExpected: " << expected_expression;
- if (ignoring_case) {
- msg << " (ignoring case)";
- }
- if (expected_value != expected_expression) {
- msg << "\nWhich is: " << expected_value;
- }
-
- return AssertionFailure() << msg;
-}
-
-// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
-String GetBoolAssertionFailureMessage(const AssertionResult& assertion_result,
- const char* expression_text,
- const char* actual_predicate_value,
- const char* expected_predicate_value) {
- const char* actual_message = assertion_result.message();
- Message msg;
- msg << "Value of: " << expression_text
- << "\n Actual: " << actual_predicate_value;
- if (actual_message[0] != '\0')
- msg << " (" << actual_message << ")";
- msg << "\nExpected: " << expected_predicate_value;
- return msg.GetString();
-}
-
-// Helper function for implementing ASSERT_NEAR.
-AssertionResult DoubleNearPredFormat(const char* expr1,
- const char* expr2,
- const char* abs_error_expr,
- double val1,
- double val2,
- double abs_error) {
- const double diff = fabs(val1 - val2);
- if (diff <= abs_error) return AssertionSuccess();
-
- // TODO(wan): do not print the value of an expression if it's
- // already a literal.
- return AssertionFailure()
- << "The difference between " << expr1 << " and " << expr2
- << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
- << expr1 << " evaluates to " << val1 << ",\n"
- << expr2 << " evaluates to " << val2 << ", and\n"
- << abs_error_expr << " evaluates to " << abs_error << ".";
-}
-
-
-// Helper template for implementing FloatLE() and DoubleLE().
-template <typename RawType>
-AssertionResult FloatingPointLE(const char* expr1,
- const char* expr2,
- RawType val1,
- RawType val2) {
- // Returns success if val1 is less than val2,
- if (val1 < val2) {
- return AssertionSuccess();
- }
-
- // or if val1 is almost equal to val2.
- const FloatingPoint<RawType> lhs(val1), rhs(val2);
- if (lhs.AlmostEquals(rhs)) {
- return AssertionSuccess();
- }
-
- // Note that the above two checks will both fail if either val1 or
- // val2 is NaN, as the IEEE floating-point standard requires that
- // any predicate involving a NaN must return false.
-
- ::std::stringstream val1_ss;
- val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
- << val1;
-
- ::std::stringstream val2_ss;
- val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
- << val2;
-
- return AssertionFailure()
- << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
- << " Actual: " << StringStreamToString(&val1_ss) << " vs "
- << StringStreamToString(&val2_ss);
-}
-
-} // namespace internal
-
-// Asserts that val1 is less than, or almost equal to, val2. Fails
-// otherwise. In particular, it fails if either val1 or val2 is NaN.
-AssertionResult FloatLE(const char* expr1, const char* expr2,
- float val1, float val2) {
- return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
-}
-
-// Asserts that val1 is less than, or almost equal to, val2. Fails
-// otherwise. In particular, it fails if either val1 or val2 is NaN.
-AssertionResult DoubleLE(const char* expr1, const char* expr2,
- double val1, double val2) {
- return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
-}
-
-namespace internal {
-
-// The helper function for {ASSERT|EXPECT}_EQ with int or enum
-// arguments.
-AssertionResult CmpHelperEQ(const char* expected_expression,
- const char* actual_expression,
- BiggestInt expected,
- BiggestInt actual) {
- if (expected == actual) {
- return AssertionSuccess();
- }
-
- return EqFailure(expected_expression,
- actual_expression,
- FormatForComparisonFailureMessage(expected, actual),
- FormatForComparisonFailureMessage(actual, expected),
- false);
-}
-
-// A macro for implementing the helper functions needed to implement
-// ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here
-// just to avoid copy-and-paste of similar code.
-#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
-AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
- BiggestInt val1, BiggestInt val2) {\
- if (val1 op val2) {\
- return AssertionSuccess();\
- } else {\
- return AssertionFailure() \
- << "Expected: (" << expr1 << ") " #op " (" << expr2\
- << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
- << " vs " << FormatForComparisonFailureMessage(val2, val1);\
- }\
-}
-
-// Implements the helper function for {ASSERT|EXPECT}_NE with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(NE, !=)
-// Implements the helper function for {ASSERT|EXPECT}_LE with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(LE, <=)
-// Implements the helper function for {ASSERT|EXPECT}_LT with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(LT, < )
-// Implements the helper function for {ASSERT|EXPECT}_GE with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(GE, >=)
-// Implements the helper function for {ASSERT|EXPECT}_GT with int or
-// enum arguments.
-GTEST_IMPL_CMP_HELPER_(GT, > )
-
-#undef GTEST_IMPL_CMP_HELPER_
-
-// The helper function for {ASSERT|EXPECT}_STREQ.
-AssertionResult CmpHelperSTREQ(const char* expected_expression,
- const char* actual_expression,
- const char* expected,
- const char* actual) {
- if (String::CStringEquals(expected, actual)) {
- return AssertionSuccess();
- }
-
- return EqFailure(expected_expression,
- actual_expression,
- String::ShowCStringQuoted(expected),
- String::ShowCStringQuoted(actual),
- false);
-}
-
-// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
-AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
- const char* actual_expression,
- const char* expected,
- const char* actual) {
- if (String::CaseInsensitiveCStringEquals(expected, actual)) {
- return AssertionSuccess();
- }
-
- return EqFailure(expected_expression,
- actual_expression,
- String::ShowCStringQuoted(expected),
- String::ShowCStringQuoted(actual),
- true);
-}
-
-// The helper function for {ASSERT|EXPECT}_STRNE.
-AssertionResult CmpHelperSTRNE(const char* s1_expression,
- const char* s2_expression,
- const char* s1,
- const char* s2) {
- if (!String::CStringEquals(s1, s2)) {
- return AssertionSuccess();
- } else {
- return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
- << s2_expression << "), actual: \""
- << s1 << "\" vs \"" << s2 << "\"";
- }
-}
-
-// The helper function for {ASSERT|EXPECT}_STRCASENE.
-AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
- const char* s2_expression,
- const char* s1,
- const char* s2) {
- if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
- return AssertionSuccess();
- } else {
- return AssertionFailure()
- << "Expected: (" << s1_expression << ") != ("
- << s2_expression << ") (ignoring case), actual: \""
- << s1 << "\" vs \"" << s2 << "\"";
- }
-}
-
-} // namespace internal
-
-namespace {
-
-// Helper functions for implementing IsSubString() and IsNotSubstring().
-
-// This group of overloaded functions return true iff needle is a
-// substring of haystack. NULL is considered a substring of itself
-// only.
-
-bool IsSubstringPred(const char* needle, const char* haystack) {
- if (needle == NULL || haystack == NULL)
- return needle == haystack;
-
- return strstr(haystack, needle) != NULL;
-}
-
-bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
- if (needle == NULL || haystack == NULL)
- return needle == haystack;
-
- return wcsstr(haystack, needle) != NULL;
-}
-
-// StringType here can be either ::std::string or ::std::wstring.
-template <typename StringType>
-bool IsSubstringPred(const StringType& needle,
- const StringType& haystack) {
- return haystack.find(needle) != StringType::npos;
-}
-
-// This function implements either IsSubstring() or IsNotSubstring(),
-// depending on the value of the expected_to_be_substring parameter.
-// StringType here can be const char*, const wchar_t*, ::std::string,
-// or ::std::wstring.
-template <typename StringType>
-AssertionResult IsSubstringImpl(
- bool expected_to_be_substring,
- const char* needle_expr, const char* haystack_expr,
- const StringType& needle, const StringType& haystack) {
- if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
- return AssertionSuccess();
-
- const bool is_wide_string = sizeof(needle[0]) > 1;
- const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
- return AssertionFailure()
- << "Value of: " << needle_expr << "\n"
- << " Actual: " << begin_string_quote << needle << "\"\n"
- << "Expected: " << (expected_to_be_substring ? "" : "not ")
- << "a substring of " << haystack_expr << "\n"
- << "Which is: " << begin_string_quote << haystack << "\"";
-}
-
-} // namespace
-
-// IsSubstring() and IsNotSubstring() check whether needle is a
-// substring of haystack (NULL is considered a substring of itself
-// only), and return an appropriate error message when they fail.
-
-AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const char* needle, const char* haystack) {
- return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const wchar_t* needle, const wchar_t* haystack) {
- return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const char* needle, const char* haystack) {
- return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const wchar_t* needle, const wchar_t* haystack) {
- return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::string& needle, const ::std::string& haystack) {
- return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::string& needle, const ::std::string& haystack) {
- return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
-}
-
-#if GTEST_HAS_STD_WSTRING
-AssertionResult IsSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::wstring& needle, const ::std::wstring& haystack) {
- return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
-}
-
-AssertionResult IsNotSubstring(
- const char* needle_expr, const char* haystack_expr,
- const ::std::wstring& needle, const ::std::wstring& haystack) {
- return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
-}
-#endif // GTEST_HAS_STD_WSTRING
-
-namespace internal {
-
-#if GTEST_OS_WINDOWS
-
-namespace {
-
-// Helper function for IsHRESULT{SuccessFailure} predicates
-AssertionResult HRESULTFailureHelper(const char* expr,
- const char* expected,
- long hr) { // NOLINT
-# if GTEST_OS_WINDOWS_MOBILE
-
- // Windows CE doesn't support FormatMessage.
- const char error_text[] = "";
-
-# else
-
- // Looks up the human-readable system message for the HRESULT code
- // and since we're not passing any params to FormatMessage, we don't
- // want inserts expanded.
- const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS;
- const DWORD kBufSize = 4096; // String::Format can't exceed this length.
- // Gets the system's human readable message string for this HRESULT.
- char error_text[kBufSize] = { '\0' };
- DWORD message_length = ::FormatMessageA(kFlags,
- 0, // no source, we're asking system
- hr, // the error
- 0, // no line width restrictions
- error_text, // output buffer
- kBufSize, // buf size
- NULL); // no arguments for inserts
- // Trims tailing white space (FormatMessage leaves a trailing cr-lf)
- for (; message_length && IsSpace(error_text[message_length - 1]);
- --message_length) {
- error_text[message_length - 1] = '\0';
- }
-
-# endif // GTEST_OS_WINDOWS_MOBILE
-
- const String error_hex(String::Format("0x%08X ", hr));
- return ::testing::AssertionFailure()
- << "Expected: " << expr << " " << expected << ".\n"
- << " Actual: " << error_hex << error_text << "\n";
-}
-
-} // namespace
-
-AssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT
- if (SUCCEEDED(hr)) {
- return AssertionSuccess();
- }
- return HRESULTFailureHelper(expr, "succeeds", hr);
-}
-
-AssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT
- if (FAILED(hr)) {
- return AssertionSuccess();
- }
- return HRESULTFailureHelper(expr, "fails", hr);
-}
-
-#endif // GTEST_OS_WINDOWS
-
-// Utility functions for encoding Unicode text (wide strings) in
-// UTF-8.
-
-// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
-// like this:
-//
-// Code-point length Encoding
-// 0 - 7 bits 0xxxxxxx
-// 8 - 11 bits 110xxxxx 10xxxxxx
-// 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx
-// 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
-
-// The maximum code-point a one-byte UTF-8 sequence can represent.
-const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) << 7) - 1;
-
-// The maximum code-point a two-byte UTF-8 sequence can represent.
-const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
-
-// The maximum code-point a three-byte UTF-8 sequence can represent.
-const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
-
-// The maximum code-point a four-byte UTF-8 sequence can represent.
-const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
-
-// Chops off the n lowest bits from a bit pattern. Returns the n
-// lowest bits. As a side effect, the original bit pattern will be
-// shifted to the right by n bits.
-inline UInt32 ChopLowBits(UInt32* bits, int n) {
- const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
- *bits >>= n;
- return low_bits;
-}
-
-// Converts a Unicode code point to a narrow string in UTF-8 encoding.
-// code_point parameter is of type UInt32 because wchar_t may not be
-// wide enough to contain a code point.
-// The output buffer str must containt at least 32 characters.
-// The function returns the address of the output buffer.
-// If the code_point is not a valid Unicode code point
-// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'.
-char* CodePointToUtf8(UInt32 code_point, char* str) {
- if (code_point <= kMaxCodePoint1) {
- str[1] = '\0';
- str[0] = static_cast<char>(code_point); // 0xxxxxxx
- } else if (code_point <= kMaxCodePoint2) {
- str[2] = '\0';
- str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
- str[0] = static_cast<char>(0xC0 | code_point); // 110xxxxx
- } else if (code_point <= kMaxCodePoint3) {
- str[3] = '\0';
- str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
- str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
- str[0] = static_cast<char>(0xE0 | code_point); // 1110xxxx
- } else if (code_point <= kMaxCodePoint4) {
- str[4] = '\0';
- str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
- str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
- str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx
- str[0] = static_cast<char>(0xF0 | code_point); // 11110xxx
- } else {
- // The longest string String::Format can produce when invoked
- // with these parameters is 28 character long (not including
- // the terminating nul character). We are asking for 32 character
- // buffer just in case. This is also enough for strncpy to
- // null-terminate the destination string.
- posix::StrNCpy(
- str, String::Format("(Invalid Unicode 0x%X)", code_point).c_str(), 32);
- str[31] = '\0'; // Makes sure no change in the format to strncpy leaves
- // the result unterminated.
- }
- return str;
-}
-
-// The following two functions only make sense if the the system
-// uses UTF-16 for wide string encoding. All supported systems
-// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
-
-// Determines if the arguments constitute UTF-16 surrogate pair
-// and thus should be combined into a single Unicode code point
-// using CreateCodePointFromUtf16SurrogatePair.
-inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
- return sizeof(wchar_t) == 2 &&
- (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
-}
-
-// Creates a Unicode code point from UTF16 surrogate pair.
-inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
- wchar_t second) {
- const UInt32 mask = (1 << 10) - 1;
- return (sizeof(wchar_t) == 2) ?
- (((first & mask) << 10) | (second & mask)) + 0x10000 :
- // This function should not be called when the condition is
- // false, but we provide a sensible default in case it is.
- static_cast<UInt32>(first);
-}
-
-// Converts a wide string to a narrow string in UTF-8 encoding.
-// The wide string is assumed to have the following encoding:
-// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
-// UTF-32 if sizeof(wchar_t) == 4 (on Linux)
-// Parameter str points to a null-terminated wide string.
-// Parameter num_chars may additionally limit the number
-// of wchar_t characters processed. -1 is used when the entire string
-// should be processed.
-// If the string contains code points that are not valid Unicode code points
-// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
-// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
-// and contains invalid UTF-16 surrogate pairs, values in those pairs
-// will be encoded as individual Unicode characters from Basic Normal Plane.
-String WideStringToUtf8(const wchar_t* str, int num_chars) {
- if (num_chars == -1)
- num_chars = static_cast<int>(wcslen(str));
-
- ::std::stringstream stream;
- for (int i = 0; i < num_chars; ++i) {
- UInt32 unicode_code_point;
-
- if (str[i] == L'\0') {
- break;
- } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
- unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
- str[i + 1]);
- i++;
- } else {
- unicode_code_point = static_cast<UInt32>(str[i]);
- }
-
- char buffer[32]; // CodePointToUtf8 requires a buffer this big.
- stream << CodePointToUtf8(unicode_code_point, buffer);
- }
- return StringStreamToString(&stream);
-}
-
-// Converts a wide C string to a String using the UTF-8 encoding.
-// NULL will be converted to "(null)".
-String String::ShowWideCString(const wchar_t * wide_c_str) {
- if (wide_c_str == NULL) return String("(null)");
-
- return String(internal::WideStringToUtf8(wide_c_str, -1).c_str());
-}
-
-// Similar to ShowWideCString(), except that this function encloses
-// the converted string in double quotes.
-String String::ShowWideCStringQuoted(const wchar_t* wide_c_str) {
- if (wide_c_str == NULL) return String("(null)");
-
- return String::Format("L\"%s\"",
- String::ShowWideCString(wide_c_str).c_str());
-}
-
-// Compares two wide C strings. Returns true iff they have the same
-// content.
-//
-// Unlike wcscmp(), this function can handle NULL argument(s). A NULL
-// C string is considered different to any non-NULL C string,
-// including the empty string.
-bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
- if (lhs == NULL) return rhs == NULL;
-
- if (rhs == NULL) return false;
-
- return wcscmp(lhs, rhs) == 0;
-}
-
-// Helper function for *_STREQ on wide strings.
-AssertionResult CmpHelperSTREQ(const char* expected_expression,
- const char* actual_expression,
- const wchar_t* expected,
- const wchar_t* actual) {
- if (String::WideCStringEquals(expected, actual)) {
- return AssertionSuccess();
- }
-
- return EqFailure(expected_expression,
- actual_expression,
- String::ShowWideCStringQuoted(expected),
- String::ShowWideCStringQuoted(actual),
- false);
-}
-
-// Helper function for *_STRNE on wide strings.
-AssertionResult CmpHelperSTRNE(const char* s1_expression,
- const char* s2_expression,
- const wchar_t* s1,
- const wchar_t* s2) {
- if (!String::WideCStringEquals(s1, s2)) {
- return AssertionSuccess();
- }
-
- return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
- << s2_expression << "), actual: "
- << String::ShowWideCStringQuoted(s1)
- << " vs " << String::ShowWideCStringQuoted(s2);
-}
-
-// Compares two C strings, ignoring case. Returns true iff they have
-// the same content.
-//
-// Unlike strcasecmp(), this function can handle NULL argument(s). A
-// NULL C string is considered different to any non-NULL C string,
-// including the empty string.
-bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
- if (lhs == NULL)
- return rhs == NULL;
- if (rhs == NULL)
- return false;
- return posix::StrCaseCmp(lhs, rhs) == 0;
-}
-
- // Compares two wide C strings, ignoring case. Returns true iff they
- // have the same content.
- //
- // Unlike wcscasecmp(), this function can handle NULL argument(s).
- // A NULL C string is considered different to any non-NULL wide C string,
- // including the empty string.
- // NB: The implementations on different platforms slightly differ.
- // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
- // environment variable. On GNU platform this method uses wcscasecmp
- // which compares according to LC_CTYPE category of the current locale.
- // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
- // current locale.
-bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
- const wchar_t* rhs) {
- if (lhs == NULL) return rhs == NULL;
-
- if (rhs == NULL) return false;
-
-#if GTEST_OS_WINDOWS
- return _wcsicmp(lhs, rhs) == 0;
-#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
- return wcscasecmp(lhs, rhs) == 0;
-#else
- // Android, Mac OS X and Cygwin don't define wcscasecmp.
- // Other unknown OSes may not define it either.
- wint_t left, right;
- do {
- left = towlower(*lhs++);
- right = towlower(*rhs++);
- } while (left && left == right);
- return left == right;
-#endif // OS selector
-}
-
-// Compares this with another String.
-// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0
-// if this is greater than rhs.
-int String::Compare(const String & rhs) const {
- const char* const lhs_c_str = c_str();
- const char* const rhs_c_str = rhs.c_str();
-
- if (lhs_c_str == NULL) {
- return rhs_c_str == NULL ? 0 : -1; // NULL < anything except NULL
- } else if (rhs_c_str == NULL) {
- return 1;
- }
-
- const size_t shorter_str_len =
- length() <= rhs.length() ? length() : rhs.length();
- for (size_t i = 0; i != shorter_str_len; i++) {
- if (lhs_c_str[i] < rhs_c_str[i]) {
- return -1;
- } else if (lhs_c_str[i] > rhs_c_str[i]) {
- return 1;
- }
- }
- return (length() < rhs.length()) ? -1 :
- (length() > rhs.length()) ? 1 : 0;
-}
-
-// Returns true iff this String ends with the given suffix. *Any*
-// String is considered to end with a NULL or empty suffix.
-bool String::EndsWith(const char* suffix) const {
- if (suffix == NULL || CStringEquals(suffix, "")) return true;
-
- if (c_str() == NULL) return false;
-
- const size_t this_len = strlen(c_str());
- const size_t suffix_len = strlen(suffix);
- return (this_len >= suffix_len) &&
- CStringEquals(c_str() + this_len - suffix_len, suffix);
-}
-
-// Returns true iff this String ends with the given suffix, ignoring case.
-// Any String is considered to end with a NULL or empty suffix.
-bool String::EndsWithCaseInsensitive(const char* suffix) const {
- if (suffix == NULL || CStringEquals(suffix, "")) return true;
-
- if (c_str() == NULL) return false;
-
- const size_t this_len = strlen(c_str());
- const size_t suffix_len = strlen(suffix);
- return (this_len >= suffix_len) &&
- CaseInsensitiveCStringEquals(c_str() + this_len - suffix_len, suffix);
-}
-
-// Formats a list of arguments to a String, using the same format
-// spec string as for printf.
-//
-// We do not use the StringPrintf class as it is not universally
-// available.
-//
-// The result is limited to 4096 characters (including the tailing 0).
-// If 4096 characters are not enough to format the input, or if
-// there's an error, "<formatting error or buffer exceeded>" is
-// returned.
-String String::Format(const char * format, ...) {
- va_list args;
- va_start(args, format);
-
- char buffer[4096];
- const int kBufferSize = sizeof(buffer)/sizeof(buffer[0]);
-
- // MSVC 8 deprecates vsnprintf(), so we want to suppress warning
- // 4996 (deprecated function) there.
-#ifdef _MSC_VER // We are using MSVC.
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4996) // Temporarily disables warning 4996.
-
- const int size = vsnprintf(buffer, kBufferSize, format, args);
-
-# pragma warning(pop) // Restores the warning state.
-#else // We are not using MSVC.
- const int size = vsnprintf(buffer, kBufferSize, format, args);
-#endif // _MSC_VER
- va_end(args);
-
- // vsnprintf()'s behavior is not portable. When the buffer is not
- // big enough, it returns a negative value in MSVC, and returns the
- // needed buffer size on Linux. When there is an output error, it
- // always returns a negative value. For simplicity, we lump the two
- // error cases together.
- if (size < 0 || size >= kBufferSize) {
- return String("<formatting error or buffer exceeded>");
- } else {
- return String(buffer, size);
- }
-}
-
-// Converts the buffer in a stringstream to a String, converting NUL
-// bytes to "\\0" along the way.
-String StringStreamToString(::std::stringstream* ss) {
- const ::std::string& str = ss->str();
- const char* const start = str.c_str();
- const char* const end = start + str.length();
-
- // We need to use a helper stringstream to do this transformation
- // because String doesn't support push_back().
- ::std::stringstream helper;
- for (const char* ch = start; ch != end; ++ch) {
- if (*ch == '\0') {
- helper << "\\0"; // Replaces NUL with "\\0";
- } else {
- helper.put(*ch);
- }
- }
-
- return String(helper.str().c_str());
-}
-
-// Appends the user-supplied message to the Google-Test-generated message.
-String AppendUserMessage(const String& gtest_msg,
- const Message& user_msg) {
- // Appends the user message if it's non-empty.
- const String user_msg_string = user_msg.GetString();
- if (user_msg_string.empty()) {
- return gtest_msg;
- }
-
- Message msg;
- msg << gtest_msg << "\n" << user_msg_string;
-
- return msg.GetString();
-}
-
-} // namespace internal
-
-// class TestResult
-
-// Creates an empty TestResult.
-TestResult::TestResult()
- : death_test_count_(0),
- elapsed_time_(0) {
-}
-
-// D'tor.
-TestResult::~TestResult() {
-}
-
-// Returns the i-th test part result among all the results. i can
-// range from 0 to total_part_count() - 1. If i is not in that range,
-// aborts the program.
-const TestPartResult& TestResult::GetTestPartResult(int i) const {
- if (i < 0 || i >= total_part_count())
- internal::posix::Abort();
- return test_part_results_.at(i);
-}
-
-// Returns the i-th test property. i can range from 0 to
-// test_property_count() - 1. If i is not in that range, aborts the
-// program.
-const TestProperty& TestResult::GetTestProperty(int i) const {
- if (i < 0 || i >= test_property_count())
- internal::posix::Abort();
- return test_properties_.at(i);
-}
-
-// Clears the test part results.
-void TestResult::ClearTestPartResults() {
- test_part_results_.clear();
-}
-
-// Adds a test part result to the list.
-void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
- test_part_results_.push_back(test_part_result);
-}
-
-// Adds a test property to the list. If a property with the same key as the
-// supplied property is already represented, the value of this test_property
-// replaces the old value for that key.
-void TestResult::RecordProperty(const TestProperty& test_property) {
- if (!ValidateTestProperty(test_property)) {
- return;
- }
- internal::MutexLock lock(&test_properites_mutex_);
- const std::vector<TestProperty>::iterator property_with_matching_key =
- std::find_if(test_properties_.begin(), test_properties_.end(),
- internal::TestPropertyKeyIs(test_property.key()));
- if (property_with_matching_key == test_properties_.end()) {
- test_properties_.push_back(test_property);
- return;
- }
- property_with_matching_key->SetValue(test_property.value());
-}
-
-// Adds a failure if the key is a reserved attribute of Google Test
-// testcase tags. Returns true if the property is valid.
-bool TestResult::ValidateTestProperty(const TestProperty& test_property) {
- internal::String key(test_property.key());
- if (key == "name" || key == "status" || key == "time" || key == "classname") {
- ADD_FAILURE()
- << "Reserved key used in RecordProperty(): "
- << key
- << " ('name', 'status', 'time', and 'classname' are reserved by "
- << GTEST_NAME_ << ")";
- return false;
- }
- return true;
-}
-
-// Clears the object.
-void TestResult::Clear() {
- test_part_results_.clear();
- test_properties_.clear();
- death_test_count_ = 0;
- elapsed_time_ = 0;
-}
-
-// Returns true iff the test failed.
-bool TestResult::Failed() const {
- for (int i = 0; i < total_part_count(); ++i) {
- if (GetTestPartResult(i).failed())
- return true;
- }
- return false;
-}
-
-// Returns true iff the test part fatally failed.
-static bool TestPartFatallyFailed(const TestPartResult& result) {
- return result.fatally_failed();
-}
-
-// Returns true iff the test fatally failed.
-bool TestResult::HasFatalFailure() const {
- return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
-}
-
-// Returns true iff the test part non-fatally failed.
-static bool TestPartNonfatallyFailed(const TestPartResult& result) {
- return result.nonfatally_failed();
-}
-
-// Returns true iff the test has a non-fatal failure.
-bool TestResult::HasNonfatalFailure() const {
- return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
-}
-
-// Gets the number of all test parts. This is the sum of the number
-// of successful test parts and the number of failed test parts.
-int TestResult::total_part_count() const {
- return static_cast<int>(test_part_results_.size());
-}
-
-// Returns the number of the test properties.
-int TestResult::test_property_count() const {
- return static_cast<int>(test_properties_.size());
-}
-
-// class Test
-
-// Creates a Test object.
-
-// The c'tor saves the values of all Google Test flags.
-Test::Test()
- : gtest_flag_saver_(new internal::GTestFlagSaver) {
-}
-
-// The d'tor restores the values of all Google Test flags.
-Test::~Test() {
- delete gtest_flag_saver_;
-}
-
-// Sets up the test fixture.
-//
-// A sub-class may override this.
-void Test::SetUp() {
-}
-
-// Tears down the test fixture.
-//
-// A sub-class may override this.
-void Test::TearDown() {
-}
-
-// Allows user supplied key value pairs to be recorded for later output.
-void Test::RecordProperty(const char* key, const char* value) {
- UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value);
-}
-
-// Allows user supplied key value pairs to be recorded for later output.
-void Test::RecordProperty(const char* key, int value) {
- Message value_message;
- value_message << value;
- RecordProperty(key, value_message.GetString().c_str());
-}
-
-namespace internal {
-
-void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
- const String& message) {
- // This function is a friend of UnitTest and as such has access to
- // AddTestPartResult.
- UnitTest::GetInstance()->AddTestPartResult(
- result_type,
- NULL, // No info about the source file where the exception occurred.
- -1, // We have no info on which line caused the exception.
- message,
- String()); // No stack trace, either.
-}
-
-} // namespace internal
-
-// Google Test requires all tests in the same test case to use the same test
-// fixture class. This function checks if the current test has the
-// same fixture class as the first test in the current test case. If
-// yes, it returns true; otherwise it generates a Google Test failure and
-// returns false.
-bool Test::HasSameFixtureClass() {
- internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
- const TestCase* const test_case = impl->current_test_case();
-
- // Info about the first test in the current test case.
- const TestInfo* const first_test_info = test_case->test_info_list()[0];
- const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
- const char* const first_test_name = first_test_info->name();
-
- // Info about the current test.
- const TestInfo* const this_test_info = impl->current_test_info();
- const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
- const char* const this_test_name = this_test_info->name();
-
- if (this_fixture_id != first_fixture_id) {
- // Is the first test defined using TEST?
- const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
- // Is this test defined using TEST?
- const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
-
- if (first_is_TEST || this_is_TEST) {
- // The user mixed TEST and TEST_F in this test case - we'll tell
- // him/her how to fix it.
-
- // Gets the name of the TEST and the name of the TEST_F. Note
- // that first_is_TEST and this_is_TEST cannot both be true, as
- // the fixture IDs are different for the two tests.
- const char* const TEST_name =
- first_is_TEST ? first_test_name : this_test_name;
- const char* const TEST_F_name =
- first_is_TEST ? this_test_name : first_test_name;
-
- ADD_FAILURE()
- << "All tests in the same test case must use the same test fixture\n"
- << "class, so mixing TEST_F and TEST in the same test case is\n"
- << "illegal. In test case " << this_test_info->test_case_name()
- << ",\n"
- << "test " << TEST_F_name << " is defined using TEST_F but\n"
- << "test " << TEST_name << " is defined using TEST. You probably\n"
- << "want to change the TEST to TEST_F or move it to another test\n"
- << "case.";
- } else {
- // The user defined two fixture classes with the same name in
- // two namespaces - we'll tell him/her how to fix it.
- ADD_FAILURE()
- << "All tests in the same test case must use the same test fixture\n"
- << "class. However, in test case "
- << this_test_info->test_case_name() << ",\n"
- << "you defined test " << first_test_name
- << " and test " << this_test_name << "\n"
- << "using two different test fixture classes. This can happen if\n"
- << "the two classes are from different namespaces or translation\n"
- << "units and have the same name. You should probably rename one\n"
- << "of the classes to put the tests into different test cases.";
- }
- return false;
- }
-
- return true;
-}
-
-#if GTEST_HAS_SEH
-
-// Adds an "exception thrown" fatal failure to the current test. This
-// function returns its result via an output parameter pointer because VC++
-// prohibits creation of objects with destructors on stack in functions
-// using __try (see error C2712).
-static internal::String* FormatSehExceptionMessage(DWORD exception_code,
- const char* location) {
- Message message;
- message << "SEH exception with code 0x" << std::setbase(16) <<
- exception_code << std::setbase(10) << " thrown in " << location << ".";
-
- return new internal::String(message.GetString());
-}
-
-#endif // GTEST_HAS_SEH
-
-#if GTEST_HAS_EXCEPTIONS
-
-// Adds an "exception thrown" fatal failure to the current test.
-static internal::String FormatCxxExceptionMessage(const char* description,
- const char* location) {
- Message message;
- if (description != NULL) {
- message << "C++ exception with description \"" << description << "\"";
- } else {
- message << "Unknown C++ exception";
- }
- message << " thrown in " << location << ".";
-
- return message.GetString();
-}
-
-static internal::String PrintTestPartResultToString(
- const TestPartResult& test_part_result);
-
-// A failed Google Test assertion will throw an exception of this type when
-// GTEST_FLAG(throw_on_failure) is true (if exceptions are enabled). We
-// derive it from std::runtime_error, which is for errors presumably
-// detectable only at run time. Since std::runtime_error inherits from
-// std::exception, many testing frameworks know how to extract and print the
-// message inside it.
-class GoogleTestFailureException : public ::std::runtime_error {
- public:
- explicit GoogleTestFailureException(const TestPartResult& failure)
- : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
-};
-#endif // GTEST_HAS_EXCEPTIONS
-
-namespace internal {
-// We put these helper functions in the internal namespace as IBM's xlC
-// compiler rejects the code if they were declared static.
-
-// Runs the given method and handles SEH exceptions it throws, when
-// SEH is supported; returns the 0-value for type Result in case of an
-// SEH exception. (Microsoft compilers cannot handle SEH and C++
-// exceptions in the same function. Therefore, we provide a separate
-// wrapper function for handling SEH exceptions.)
-template <class T, typename Result>
-Result HandleSehExceptionsInMethodIfSupported(
- T* object, Result (T::*method)(), const char* location) {
-#if GTEST_HAS_SEH
- __try {
- return (object->*method)();
- } __except (internal::UnitTestOptions::GTestShouldProcessSEH( // NOLINT
- GetExceptionCode())) {
- // We create the exception message on the heap because VC++ prohibits
- // creation of objects with destructors on stack in functions using __try
- // (see error C2712).
- internal::String* exception_message = FormatSehExceptionMessage(
- GetExceptionCode(), location);
- internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
- *exception_message);
- delete exception_message;
- return static_cast<Result>(0);
- }
-#else
- (void)location;
- return (object->*method)();
-#endif // GTEST_HAS_SEH
-}
-
-// Runs the given method and catches and reports C++ and/or SEH-style
-// exceptions, if they are supported; returns the 0-value for type
-// Result in case of an SEH exception.
-template <class T, typename Result>
-Result HandleExceptionsInMethodIfSupported(
- T* object, Result (T::*method)(), const char* location) {
- // NOTE: The user code can affect the way in which Google Test handles
- // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
- // RUN_ALL_TESTS() starts. It is technically possible to check the flag
- // after the exception is caught and either report or re-throw the
- // exception based on the flag's value:
- //
- // try {
- // // Perform the test method.
- // } catch (...) {
- // if (GTEST_FLAG(catch_exceptions))
- // // Report the exception as failure.
- // else
- // throw; // Re-throws the original exception.
- // }
- //
- // However, the purpose of this flag is to allow the program to drop into
- // the debugger when the exception is thrown. On most platforms, once the
- // control enters the catch block, the exception origin information is
- // lost and the debugger will stop the program at the point of the
- // re-throw in this function -- instead of at the point of the original
- // throw statement in the code under test. For this reason, we perform
- // the check early, sacrificing the ability to affect Google Test's
- // exception handling in the method where the exception is thrown.
- if (internal::GetUnitTestImpl()->catch_exceptions()) {
-#if GTEST_HAS_EXCEPTIONS
- try {
- return HandleSehExceptionsInMethodIfSupported(object, method, location);
- } catch (const GoogleTestFailureException&) { // NOLINT
- // This exception doesn't originate in code under test. It makes no
- // sense to report it as a test failure.
- throw;
- } catch (const std::exception& e) { // NOLINT
- internal::ReportFailureInUnknownLocation(
- TestPartResult::kFatalFailure,
- FormatCxxExceptionMessage(e.what(), location));
- } catch (...) { // NOLINT
- internal::ReportFailureInUnknownLocation(
- TestPartResult::kFatalFailure,
- FormatCxxExceptionMessage(NULL, location));
- }
- return static_cast<Result>(0);
-#else
- return HandleSehExceptionsInMethodIfSupported(object, method, location);
-#endif // GTEST_HAS_EXCEPTIONS
- } else {
- return (object->*method)();
- }
-}
-
-} // namespace internal
-
-// Runs the test and updates the test result.
-void Test::Run() {
- if (!HasSameFixtureClass()) return;
-
- internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
- impl->os_stack_trace_getter()->UponLeavingGTest();
- internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
- // We will run the test only if SetUp() was successful.
- if (!HasFatalFailure()) {
- impl->os_stack_trace_getter()->UponLeavingGTest();
- internal::HandleExceptionsInMethodIfSupported(
- this, &Test::TestBody, "the test body");
- }
-
- // However, we want to clean up as much as possible. Hence we will
- // always call TearDown(), even if SetUp() or the test body has
- // failed.
- impl->os_stack_trace_getter()->UponLeavingGTest();
- internal::HandleExceptionsInMethodIfSupported(
- this, &Test::TearDown, "TearDown()");
-}
-
-// Returns true iff the current test has a fatal failure.
-bool Test::HasFatalFailure() {
- return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
-}
-
-// Returns true iff the current test has a non-fatal failure.
-bool Test::HasNonfatalFailure() {
- return internal::GetUnitTestImpl()->current_test_result()->
- HasNonfatalFailure();
-}
-
-// class TestInfo
-
-// Constructs a TestInfo object. It assumes ownership of the test factory
-// object.
-// TODO(vladl at google.com): Make a_test_case_name and a_name const string&'s
-// to signify they cannot be NULLs.
-TestInfo::TestInfo(const char* a_test_case_name,
- const char* a_name,
- const char* a_type_param,
- const char* a_value_param,
- internal::TypeId fixture_class_id,
- internal::TestFactoryBase* factory)
- : test_case_name_(a_test_case_name),
- name_(a_name),
- type_param_(a_type_param ? new std::string(a_type_param) : NULL),
- value_param_(a_value_param ? new std::string(a_value_param) : NULL),
- fixture_class_id_(fixture_class_id),
- should_run_(false),
- is_disabled_(false),
- matches_filter_(false),
- factory_(factory),
- result_() {}
-
-// Destructs a TestInfo object.
-TestInfo::~TestInfo() { delete factory_; }
-
-namespace internal {
-
-// Creates a new TestInfo object and registers it with Google Test;
-// returns the created object.
-//
-// Arguments:
-//
-// test_case_name: name of the test case
-// name: name of the test
-// type_param: the name of the test's type parameter, or NULL if
-// this is not a typed or a type-parameterized test.
-// value_param: text representation of the test's value parameter,
-// or NULL if this is not a value-parameterized test.
-// fixture_class_id: ID of the test fixture class
-// set_up_tc: pointer to the function that sets up the test case
-// tear_down_tc: pointer to the function that tears down the test case
-// factory: pointer to the factory that creates a test object.
-// The newly created TestInfo instance will assume
-// ownership of the factory object.
-TestInfo* MakeAndRegisterTestInfo(
- const char* test_case_name, const char* name,
- const char* type_param,
- const char* value_param,
- TypeId fixture_class_id,
- SetUpTestCaseFunc set_up_tc,
- TearDownTestCaseFunc tear_down_tc,
- TestFactoryBase* factory) {
- TestInfo* const test_info =
- new TestInfo(test_case_name, name, type_param, value_param,
- fixture_class_id, factory);
- GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
- return test_info;
-}
-
-#if GTEST_HAS_PARAM_TEST
-void ReportInvalidTestCaseType(const char* test_case_name,
- const char* file, int line) {
- Message errors;
- errors
- << "Attempted redefinition of test case " << test_case_name << ".\n"
- << "All tests in the same test case must use the same test fixture\n"
- << "class. However, in test case " << test_case_name << ", you tried\n"
- << "to define a test using a fixture class different from the one\n"
- << "used earlier. This can happen if the two fixture classes are\n"
- << "from different namespaces and have the same name. You should\n"
- << "probably rename one of the classes to put the tests into different\n"
- << "test cases.";
-
- fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
- errors.GetString().c_str());
-}
-#endif // GTEST_HAS_PARAM_TEST
-
-} // namespace internal
-
-namespace {
-
-// A predicate that checks the test name of a TestInfo against a known
-// value.
-//
-// This is used for implementation of the TestCase class only. We put
-// it in the anonymous namespace to prevent polluting the outer
-// namespace.
-//
-// TestNameIs is copyable.
-class TestNameIs {
- public:
- // Constructor.
- //
- // TestNameIs has NO default constructor.
- explicit TestNameIs(const char* name)
- : name_(name) {}
-
- // Returns true iff the test name of test_info matches name_.
- bool operator()(const TestInfo * test_info) const {
- return test_info && internal::String(test_info->name()).Compare(name_) == 0;
- }
-
- private:
- internal::String name_;
-};
-
-} // namespace
-
-namespace internal {
-
-// This method expands all parameterized tests registered with macros TEST_P
-// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
-// This will be done just once during the program runtime.
-void UnitTestImpl::RegisterParameterizedTests() {
-#if GTEST_HAS_PARAM_TEST
- if (!parameterized_tests_registered_) {
- parameterized_test_registry_.RegisterTests();
- parameterized_tests_registered_ = true;
- }
-#endif
-}
-
-} // namespace internal
-
-// Creates the test object, runs it, records its result, and then
-// deletes it.
-void TestInfo::Run() {
- if (!should_run_) return;
-
- // Tells UnitTest where to store test result.
- internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
- impl->set_current_test_info(this);
-
- TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
-
- // Notifies the unit test event listeners that a test is about to start.
- repeater->OnTestStart(*this);
-
- const TimeInMillis start = internal::GetTimeInMillis();
-
- impl->os_stack_trace_getter()->UponLeavingGTest();
-
- // Creates the test object.
- Test* const test = internal::HandleExceptionsInMethodIfSupported(
- factory_, &internal::TestFactoryBase::CreateTest,
- "the test fixture's constructor");
-
- // Runs the test only if the test object was created and its
- // constructor didn't generate a fatal failure.
- if ((test != NULL) && !Test::HasFatalFailure()) {
- // This doesn't throw as all user code that can throw are wrapped into
- // exception handling code.
- test->Run();
- }
-
- // Deletes the test object.
- impl->os_stack_trace_getter()->UponLeavingGTest();
- internal::HandleExceptionsInMethodIfSupported(
- test, &Test::DeleteSelf_, "the test fixture's destructor");
-
- result_.set_elapsed_time(internal::GetTimeInMillis() - start);
-
- // Notifies the unit test event listener that a test has just finished.
- repeater->OnTestEnd(*this);
-
- // Tells UnitTest to stop associating assertion results to this
- // test.
- impl->set_current_test_info(NULL);
-}
-
-// class TestCase
-
-// Gets the number of successful tests in this test case.
-int TestCase::successful_test_count() const {
- return CountIf(test_info_list_, TestPassed);
-}
-
-// Gets the number of failed tests in this test case.
-int TestCase::failed_test_count() const {
- return CountIf(test_info_list_, TestFailed);
-}
-
-int TestCase::disabled_test_count() const {
- return CountIf(test_info_list_, TestDisabled);
-}
-
-// Get the number of tests in this test case that should run.
-int TestCase::test_to_run_count() const {
- return CountIf(test_info_list_, ShouldRunTest);
-}
-
-// Gets the number of all tests.
-int TestCase::total_test_count() const {
- return static_cast<int>(test_info_list_.size());
-}
-
-// Creates a TestCase with the given name.
-//
-// Arguments:
-//
-// name: name of the test case
-// a_type_param: the name of the test case's type parameter, or NULL if
-// this is not a typed or a type-parameterized test case.
-// set_up_tc: pointer to the function that sets up the test case
-// tear_down_tc: pointer to the function that tears down the test case
-TestCase::TestCase(const char* a_name, const char* a_type_param,
- Test::SetUpTestCaseFunc set_up_tc,
- Test::TearDownTestCaseFunc tear_down_tc)
- : name_(a_name),
- type_param_(a_type_param ? new std::string(a_type_param) : NULL),
- set_up_tc_(set_up_tc),
- tear_down_tc_(tear_down_tc),
- should_run_(false),
- elapsed_time_(0) {
-}
-
-// Destructor of TestCase.
-TestCase::~TestCase() {
- // Deletes every Test in the collection.
- ForEach(test_info_list_, internal::Delete<TestInfo>);
-}
-
-// Returns the i-th test among all the tests. i can range from 0 to
-// total_test_count() - 1. If i is not in that range, returns NULL.
-const TestInfo* TestCase::GetTestInfo(int i) const {
- const int index = GetElementOr(test_indices_, i, -1);
- return index < 0 ? NULL : test_info_list_[index];
-}
-
-// Returns the i-th test among all the tests. i can range from 0 to
-// total_test_count() - 1. If i is not in that range, returns NULL.
-TestInfo* TestCase::GetMutableTestInfo(int i) {
- const int index = GetElementOr(test_indices_, i, -1);
- return index < 0 ? NULL : test_info_list_[index];
-}
-
-// Adds a test to this test case. Will delete the test upon
-// destruction of the TestCase object.
-void TestCase::AddTestInfo(TestInfo * test_info) {
- test_info_list_.push_back(test_info);
- test_indices_.push_back(static_cast<int>(test_indices_.size()));
-}
-
-// Runs every test in this TestCase.
-void TestCase::Run() {
- if (!should_run_) return;
-
- internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
- impl->set_current_test_case(this);
-
- TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
-
- repeater->OnTestCaseStart(*this);
- impl->os_stack_trace_getter()->UponLeavingGTest();
- internal::HandleExceptionsInMethodIfSupported(
- this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
-
- const internal::TimeInMillis start = internal::GetTimeInMillis();
- for (int i = 0; i < total_test_count(); i++) {
- GetMutableTestInfo(i)->Run();
- }
- elapsed_time_ = internal::GetTimeInMillis() - start;
-
- impl->os_stack_trace_getter()->UponLeavingGTest();
- internal::HandleExceptionsInMethodIfSupported(
- this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
-
- repeater->OnTestCaseEnd(*this);
- impl->set_current_test_case(NULL);
-}
-
-// Clears the results of all tests in this test case.
-void TestCase::ClearResult() {
- ForEach(test_info_list_, TestInfo::ClearTestResult);
-}
-
-// Shuffles the tests in this test case.
-void TestCase::ShuffleTests(internal::Random* random) {
- Shuffle(random, &test_indices_);
-}
-
-// Restores the test order to before the first shuffle.
-void TestCase::UnshuffleTests() {
- for (size_t i = 0; i < test_indices_.size(); i++) {
- test_indices_[i] = static_cast<int>(i);
- }
-}
-
-// Formats a countable noun. Depending on its quantity, either the
-// singular form or the plural form is used. e.g.
-//
-// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
-// FormatCountableNoun(5, "book", "books") returns "5 books".
-static internal::String FormatCountableNoun(int count,
- const char * singular_form,
- const char * plural_form) {
- return internal::String::Format("%d %s", count,
- count == 1 ? singular_form : plural_form);
-}
-
-// Formats the count of tests.
-static internal::String FormatTestCount(int test_count) {
- return FormatCountableNoun(test_count, "test", "tests");
-}
-
-// Formats the count of test cases.
-static internal::String FormatTestCaseCount(int test_case_count) {
- return FormatCountableNoun(test_case_count, "test case", "test cases");
-}
-
-// Converts a TestPartResult::Type enum to human-friendly string
-// representation. Both kNonFatalFailure and kFatalFailure are translated
-// to "Failure", as the user usually doesn't care about the difference
-// between the two when viewing the test result.
-static const char * TestPartResultTypeToString(TestPartResult::Type type) {
- switch (type) {
- case TestPartResult::kSuccess:
- return "Success";
-
- case TestPartResult::kNonFatalFailure:
- case TestPartResult::kFatalFailure:
-#ifdef _MSC_VER
- return "error: ";
-#else
- return "Failure\n";
-#endif
- default:
- return "Unknown result type";
- }
-}
-
-// Prints a TestPartResult to a String.
-static internal::String PrintTestPartResultToString(
- const TestPartResult& test_part_result) {
- return (Message()
- << internal::FormatFileLocation(test_part_result.file_name(),
- test_part_result.line_number())
- << " " << TestPartResultTypeToString(test_part_result.type())
- << test_part_result.message()).GetString();
-}
-
-// Prints a TestPartResult.
-static void PrintTestPartResult(const TestPartResult& test_part_result) {
- const internal::String& result =
- PrintTestPartResultToString(test_part_result);
- printf("%s\n", result.c_str());
- fflush(stdout);
- // If the test program runs in Visual Studio or a debugger, the
- // following statements add the test part result message to the Output
- // window such that the user can double-click on it to jump to the
- // corresponding source code location; otherwise they do nothing.
-#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
- // We don't call OutputDebugString*() on Windows Mobile, as printing
- // to stdout is done by OutputDebugString() there already - we don't
- // want the same message printed twice.
- ::OutputDebugStringA(result.c_str());
- ::OutputDebugStringA("\n");
-#endif
-}
-
-// class PrettyUnitTestResultPrinter
-
-namespace internal {
-
-enum GTestColor {
- COLOR_DEFAULT,
- COLOR_RED,
- COLOR_GREEN,
- COLOR_YELLOW
-};
-
-#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
-
-// Returns the character attribute for the given color.
-WORD GetColorAttribute(GTestColor color) {
- switch (color) {
- case COLOR_RED: return FOREGROUND_RED;
- case COLOR_GREEN: return FOREGROUND_GREEN;
- case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
- default: return 0;
- }
-}
-
-#else
-
-// Returns the ANSI color code for the given color. COLOR_DEFAULT is
-// an invalid input.
-const char* GetAnsiColorCode(GTestColor color) {
- switch (color) {
- case COLOR_RED: return "1";
- case COLOR_GREEN: return "2";
- case COLOR_YELLOW: return "3";
- default: return NULL;
- };
-}
-
-#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
-
-// Returns true iff Google Test should use colors in the output.
-bool ShouldUseColor(bool stdout_is_tty) {
- const char* const gtest_color = GTEST_FLAG(color).c_str();
-
- if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
-#if GTEST_OS_WINDOWS
- // On Windows the TERM variable is usually not set, but the
- // console there does support colors.
- return stdout_is_tty;
-#else
- // On non-Windows platforms, we rely on the TERM variable.
- const char* const term = posix::GetEnv("TERM");
- const bool term_supports_color =
- String::CStringEquals(term, "xterm") ||
- String::CStringEquals(term, "xterm-color") ||
- String::CStringEquals(term, "xterm-256color") ||
- String::CStringEquals(term, "screen") ||
- String::CStringEquals(term, "linux") ||
- String::CStringEquals(term, "cygwin");
- return stdout_is_tty && term_supports_color;
-#endif // GTEST_OS_WINDOWS
- }
-
- return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
- String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
- String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
- String::CStringEquals(gtest_color, "1");
- // We take "yes", "true", "t", and "1" as meaning "yes". If the
- // value is neither one of these nor "auto", we treat it as "no" to
- // be conservative.
-}
-
-// Helpers for printing colored strings to stdout. Note that on Windows, we
-// cannot simply emit special characters and have the terminal change colors.
-// This routine must actually emit the characters rather than return a string
-// that would be colored when printed, as can be done on Linux.
-void ColoredPrintf(GTestColor color, const char* fmt, ...) {
- va_list args;
- va_start(args, fmt);
-
-#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
- const bool use_color = false;
-#else
- static const bool in_color_mode =
- ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
- const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
-#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
- // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
-
- if (!use_color) {
- vprintf(fmt, args);
- va_end(args);
- return;
- }
-
-#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
- const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
-
- // Gets the current text color.
- CONSOLE_SCREEN_BUFFER_INFO buffer_info;
- GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
- const WORD old_color_attrs = buffer_info.wAttributes;
-
- // We need to flush the stream buffers into the console before each
- // SetConsoleTextAttribute call lest it affect the text that is already
- // printed but has not yet reached the console.
- fflush(stdout);
- SetConsoleTextAttribute(stdout_handle,
- GetColorAttribute(color) | FOREGROUND_INTENSITY);
- vprintf(fmt, args);
-
- fflush(stdout);
- // Restores the text color.
- SetConsoleTextAttribute(stdout_handle, old_color_attrs);
-#else
- printf("\033[0;3%sm", GetAnsiColorCode(color));
- vprintf(fmt, args);
- printf("\033[m"); // Resets the terminal to default.
-#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
- va_end(args);
-}
-
-void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
- const char* const type_param = test_info.type_param();
- const char* const value_param = test_info.value_param();
-
- if (type_param != NULL || value_param != NULL) {
- printf(", where ");
- if (type_param != NULL) {
- printf("TypeParam = %s", type_param);
- if (value_param != NULL)
- printf(" and ");
- }
- if (value_param != NULL) {
- printf("GetParam() = %s", value_param);
- }
- }
-}
-
-// This class implements the TestEventListener interface.
-//
-// Class PrettyUnitTestResultPrinter is copyable.
-class PrettyUnitTestResultPrinter : public TestEventListener {
- public:
- PrettyUnitTestResultPrinter() {}
- static void PrintTestName(const char * test_case, const char * test) {
- printf("%s.%s", test_case, test);
- }
-
- // The following methods override what's in the TestEventListener class.
- virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
- virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
- virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
- virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
- virtual void OnTestCaseStart(const TestCase& test_case);
- virtual void OnTestStart(const TestInfo& test_info);
- virtual void OnTestPartResult(const TestPartResult& result);
- virtual void OnTestEnd(const TestInfo& test_info);
- virtual void OnTestCaseEnd(const TestCase& test_case);
- virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
- virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
- virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
- virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
-
- private:
- static void PrintFailedTests(const UnitTest& unit_test);
-
- internal::String test_case_name_;
-};
-
- // Fired before each iteration of tests starts.
-void PrettyUnitTestResultPrinter::OnTestIterationStart(
- const UnitTest& unit_test, int iteration) {
- if (GTEST_FLAG(repeat) != 1)
- printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
-
- const char* const filter = GTEST_FLAG(filter).c_str();
-
- // Prints the filter if it's not *. This reminds the user that some
- // tests may be skipped.
- if (!internal::String::CStringEquals(filter, kUniversalFilter)) {
- ColoredPrintf(COLOR_YELLOW,
- "Note: %s filter = %s\n", GTEST_NAME_, filter);
- }
-
- if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
- const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
- ColoredPrintf(COLOR_YELLOW,
- "Note: This is test shard %d of %s.\n",
- static_cast<int>(shard_index) + 1,
- internal::posix::GetEnv(kTestTotalShards));
- }
-
- if (GTEST_FLAG(shuffle)) {
- ColoredPrintf(COLOR_YELLOW,
- "Note: Randomizing tests' orders with a seed of %d .\n",
- unit_test.random_seed());
- }
-
- ColoredPrintf(COLOR_GREEN, "[==========] ");
- printf("Running %s from %s.\n",
- FormatTestCount(unit_test.test_to_run_count()).c_str(),
- FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
- fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
- const UnitTest& /*unit_test*/) {
- ColoredPrintf(COLOR_GREEN, "[----------] ");
- printf("Global test environment set-up.\n");
- fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
- test_case_name_ = test_case.name();
- const internal::String counts =
- FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
- ColoredPrintf(COLOR_GREEN, "[----------] ");
- printf("%s from %s", counts.c_str(), test_case_name_.c_str());
- if (test_case.type_param() == NULL) {
- printf("\n");
- } else {
- printf(", where TypeParam = %s\n", test_case.type_param());
- }
- fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
- ColoredPrintf(COLOR_GREEN, "[ RUN ] ");
- PrintTestName(test_case_name_.c_str(), test_info.name());
- printf("\n");
- fflush(stdout);
-}
-
-// Called after an assertion failure.
-void PrettyUnitTestResultPrinter::OnTestPartResult(
- const TestPartResult& result) {
- // If the test part succeeded, we don't need to do anything.
- if (result.type() == TestPartResult::kSuccess)
- return;
-
- // Print failure message from the assertion (e.g. expected this and got that).
- PrintTestPartResult(result);
- fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
- if (test_info.result()->Passed()) {
- ColoredPrintf(COLOR_GREEN, "[ OK ] ");
- } else {
- ColoredPrintf(COLOR_RED, "[ FAILED ] ");
- }
- PrintTestName(test_case_name_.c_str(), test_info.name());
- if (test_info.result()->Failed())
- PrintFullTestCommentIfPresent(test_info);
-
- if (GTEST_FLAG(print_time)) {
- printf(" (%s ms)\n", internal::StreamableToString(
- test_info.result()->elapsed_time()).c_str());
- } else {
- printf("\n");
- }
- fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
- if (!GTEST_FLAG(print_time)) return;
-
- test_case_name_ = test_case.name();
- const internal::String counts =
- FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
- ColoredPrintf(COLOR_GREEN, "[----------] ");
- printf("%s from %s (%s ms total)\n\n",
- counts.c_str(), test_case_name_.c_str(),
- internal::StreamableToString(test_case.elapsed_time()).c_str());
- fflush(stdout);
-}
-
-void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
- const UnitTest& /*unit_test*/) {
- ColoredPrintf(COLOR_GREEN, "[----------] ");
- printf("Global test environment tear-down\n");
- fflush(stdout);
-}
-
-// Internal helper for printing the list of failed tests.
-void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
- const int failed_test_count = unit_test.failed_test_count();
- if (failed_test_count == 0) {
- return;
- }
-
- for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
- const TestCase& test_case = *unit_test.GetTestCase(i);
- if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
- continue;
- }
- for (int j = 0; j < test_case.total_test_count(); ++j) {
- const TestInfo& test_info = *test_case.GetTestInfo(j);
- if (!test_info.should_run() || test_info.result()->Passed()) {
- continue;
- }
- ColoredPrintf(COLOR_RED, "[ FAILED ] ");
- printf("%s.%s", test_case.name(), test_info.name());
- PrintFullTestCommentIfPresent(test_info);
- printf("\n");
- }
- }
-}
-
-void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
- int /*iteration*/) {
- ColoredPrintf(COLOR_GREEN, "[==========] ");
- printf("%s from %s ran.",
- FormatTestCount(unit_test.test_to_run_count()).c_str(),
- FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
- if (GTEST_FLAG(print_time)) {
- printf(" (%s ms total)",
- internal::StreamableToString(unit_test.elapsed_time()).c_str());
- }
- printf("\n");
- ColoredPrintf(COLOR_GREEN, "[ PASSED ] ");
- printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
-
- int num_failures = unit_test.failed_test_count();
- if (!unit_test.Passed()) {
- const int failed_test_count = unit_test.failed_test_count();
- ColoredPrintf(COLOR_RED, "[ FAILED ] ");
- printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
- PrintFailedTests(unit_test);
- printf("\n%2d FAILED %s\n", num_failures,
- num_failures == 1 ? "TEST" : "TESTS");
- }
-
- int num_disabled = unit_test.disabled_test_count();
- if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
- if (!num_failures) {
- printf("\n"); // Add a spacer if no FAILURE banner is displayed.
- }
- ColoredPrintf(COLOR_YELLOW,
- " YOU HAVE %d DISABLED %s\n\n",
- num_disabled,
- num_disabled == 1 ? "TEST" : "TESTS");
- }
- // Ensure that Google Test output is printed before, e.g., heapchecker output.
- fflush(stdout);
-}
-
-// End PrettyUnitTestResultPrinter
-
-// class TestEventRepeater
-//
-// This class forwards events to other event listeners.
-class TestEventRepeater : public TestEventListener {
- public:
- TestEventRepeater() : forwarding_enabled_(true) {}
- virtual ~TestEventRepeater();
- void Append(TestEventListener *listener);
- TestEventListener* Release(TestEventListener* listener);
-
- // Controls whether events will be forwarded to listeners_. Set to false
- // in death test child processes.
- bool forwarding_enabled() const { return forwarding_enabled_; }
- void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
-
- virtual void OnTestProgramStart(const UnitTest& unit_test);
- virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
- virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
- virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
- virtual void OnTestCaseStart(const TestCase& test_case);
- virtual void OnTestStart(const TestInfo& test_info);
- virtual void OnTestPartResult(const TestPartResult& result);
- virtual void OnTestEnd(const TestInfo& test_info);
- virtual void OnTestCaseEnd(const TestCase& test_case);
- virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
- virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
- virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
- virtual void OnTestProgramEnd(const UnitTest& unit_test);
-
- private:
- // Controls whether events will be forwarded to listeners_. Set to false
- // in death test child processes.
- bool forwarding_enabled_;
- // The list of listeners that receive events.
- std::vector<TestEventListener*> listeners_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
-};
-
-TestEventRepeater::~TestEventRepeater() {
- ForEach(listeners_, Delete<TestEventListener>);
-}
-
-void TestEventRepeater::Append(TestEventListener *listener) {
- listeners_.push_back(listener);
-}
-
-// TODO(vladl at google.com): Factor the search functionality into Vector::Find.
-TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
- for (size_t i = 0; i < listeners_.size(); ++i) {
- if (listeners_[i] == listener) {
- listeners_.erase(listeners_.begin() + i);
- return listener;
- }
- }
-
- return NULL;
-}
-
-// Since most methods are very similar, use macros to reduce boilerplate.
-// This defines a member that forwards the call to all listeners.
-#define GTEST_REPEATER_METHOD_(Name, Type) \
-void TestEventRepeater::Name(const Type& parameter) { \
- if (forwarding_enabled_) { \
- for (size_t i = 0; i < listeners_.size(); i++) { \
- listeners_[i]->Name(parameter); \
- } \
- } \
-}
-// This defines a member that forwards the call to all listeners in reverse
-// order.
-#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
-void TestEventRepeater::Name(const Type& parameter) { \
- if (forwarding_enabled_) { \
- for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
- listeners_[i]->Name(parameter); \
- } \
- } \
-}
-
-GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
-GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
-GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
-GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
-GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
-GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
-GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
-GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
-GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
-GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
-GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
-
-#undef GTEST_REPEATER_METHOD_
-#undef GTEST_REVERSE_REPEATER_METHOD_
-
-void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
- int iteration) {
- if (forwarding_enabled_) {
- for (size_t i = 0; i < listeners_.size(); i++) {
- listeners_[i]->OnTestIterationStart(unit_test, iteration);
- }
- }
-}
-
-void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
- int iteration) {
- if (forwarding_enabled_) {
- for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
- listeners_[i]->OnTestIterationEnd(unit_test, iteration);
- }
- }
-}
-
-// End TestEventRepeater
-
-// This class generates an XML output file.
-class XmlUnitTestResultPrinter : public EmptyTestEventListener {
- public:
- explicit XmlUnitTestResultPrinter(const char* output_file);
-
- virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
-
- private:
- // Is c a whitespace character that is normalized to a space character
- // when it appears in an XML attribute value?
- static bool IsNormalizableWhitespace(char c) {
- return c == 0x9 || c == 0xA || c == 0xD;
- }
-
- // May c appear in a well-formed XML document?
- static bool IsValidXmlCharacter(char c) {
- return IsNormalizableWhitespace(c) || c >= 0x20;
- }
-
- // Returns an XML-escaped copy of the input string str. If
- // is_attribute is true, the text is meant to appear as an attribute
- // value, and normalizable whitespace is preserved by replacing it
- // with character references.
- static String EscapeXml(const char* str, bool is_attribute);
-
- // Returns the given string with all characters invalid in XML removed.
- static string RemoveInvalidXmlCharacters(const string& str);
-
- // Convenience wrapper around EscapeXml when str is an attribute value.
- static String EscapeXmlAttribute(const char* str) {
- return EscapeXml(str, true);
- }
-
- // Convenience wrapper around EscapeXml when str is not an attribute value.
- static String EscapeXmlText(const char* str) { return EscapeXml(str, false); }
-
- // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
- static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
-
- // Streams an XML representation of a TestInfo object.
- static void OutputXmlTestInfo(::std::ostream* stream,
- const char* test_case_name,
- const TestInfo& test_info);
-
- // Prints an XML representation of a TestCase object
- static void PrintXmlTestCase(FILE* out, const TestCase& test_case);
-
- // Prints an XML summary of unit_test to output stream out.
- static void PrintXmlUnitTest(FILE* out, const UnitTest& unit_test);
-
- // Produces a string representing the test properties in a result as space
- // delimited XML attributes based on the property key="value" pairs.
- // When the String is not empty, it includes a space at the beginning,
- // to delimit this attribute from prior attributes.
- static String TestPropertiesAsXmlAttributes(const TestResult& result);
-
- // The output file.
- const String output_file_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
-};
-
-// Creates a new XmlUnitTestResultPrinter.
-XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
- : output_file_(output_file) {
- if (output_file_.c_str() == NULL || output_file_.empty()) {
- fprintf(stderr, "XML output file may not be null\n");
- fflush(stderr);
- exit(EXIT_FAILURE);
- }
-}
-
-// Called after the unit test ends.
-void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
- int /*iteration*/) {
- FILE* xmlout = NULL;
- FilePath output_file(output_file_);
- FilePath output_dir(output_file.RemoveFileName());
-
- if (output_dir.CreateDirectoriesRecursively()) {
- xmlout = posix::FOpen(output_file_.c_str(), "w");
- }
- if (xmlout == NULL) {
- // TODO(wan): report the reason of the failure.
- //
- // We don't do it for now as:
- //
- // 1. There is no urgent need for it.
- // 2. It's a bit involved to make the errno variable thread-safe on
- // all three operating systems (Linux, Windows, and Mac OS).
- // 3. To interpret the meaning of errno in a thread-safe way,
- // we need the strerror_r() function, which is not available on
- // Windows.
- fprintf(stderr,
- "Unable to open file \"%s\"\n",
- output_file_.c_str());
- fflush(stderr);
- exit(EXIT_FAILURE);
- }
- PrintXmlUnitTest(xmlout, unit_test);
- fclose(xmlout);
-}
-
-// Returns an XML-escaped copy of the input string str. If is_attribute
-// is true, the text is meant to appear as an attribute value, and
-// normalizable whitespace is preserved by replacing it with character
-// references.
-//
-// Invalid XML characters in str, if any, are stripped from the output.
-// It is expected that most, if not all, of the text processed by this
-// module will consist of ordinary English text.
-// If this module is ever modified to produce version 1.1 XML output,
-// most invalid characters can be retained using character references.
-// TODO(wan): It might be nice to have a minimally invasive, human-readable
-// escaping scheme for invalid characters, rather than dropping them.
-String XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) {
- Message m;
-
- if (str != NULL) {
- for (const char* src = str; *src; ++src) {
- switch (*src) {
- case '<':
- m << "<";
- break;
- case '>':
- m << ">";
- break;
- case '&':
- m << "&";
- break;
- case '\'':
- if (is_attribute)
- m << "'";
- else
- m << '\'';
- break;
- case '"':
- if (is_attribute)
- m << """;
- else
- m << '"';
- break;
- default:
- if (IsValidXmlCharacter(*src)) {
- if (is_attribute && IsNormalizableWhitespace(*src))
- m << String::Format("&#x%02X;", unsigned(*src));
- else
- m << *src;
- }
- break;
- }
- }
- }
-
- return m.GetString();
-}
-
-// Returns the given string with all characters invalid in XML removed.
-// Currently invalid characters are dropped from the string. An
-// alternative is to replace them with certain characters such as . or ?.
-string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const string& str) {
- string output;
- output.reserve(str.size());
- for (string::const_iterator it = str.begin(); it != str.end(); ++it)
- if (IsValidXmlCharacter(*it))
- output.push_back(*it);
-
- return output;
-}
-
-// The following routines generate an XML representation of a UnitTest
-// object.
-//
-// This is how Google Test concepts map to the DTD:
-//
-// <testsuites name="AllTests"> <-- corresponds to a UnitTest object
-// <testsuite name="testcase-name"> <-- corresponds to a TestCase object
-// <testcase name="test-name"> <-- corresponds to a TestInfo object
-// <failure message="...">...</failure>
-// <failure message="...">...</failure>
-// <failure message="...">...</failure>
-// <-- individual assertion failures
-// </testcase>
-// </testsuite>
-// </testsuites>
-
-// Formats the given time in milliseconds as seconds.
-std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
- ::std::stringstream ss;
- ss << ms/1000.0;
- return ss.str();
-}
-
-// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
-void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
- const char* data) {
- const char* segment = data;
- *stream << "<![CDATA[";
- for (;;) {
- const char* const next_segment = strstr(segment, "]]>");
- if (next_segment != NULL) {
- stream->write(
- segment, static_cast<std::streamsize>(next_segment - segment));
- *stream << "]]>]]><![CDATA[";
- segment = next_segment + strlen("]]>");
- } else {
- *stream << segment;
- break;
- }
- }
- *stream << "]]>";
-}
-
-// Prints an XML representation of a TestInfo object.
-// TODO(wan): There is also value in printing properties with the plain printer.
-void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
- const char* test_case_name,
- const TestInfo& test_info) {
- const TestResult& result = *test_info.result();
- *stream << " <testcase name=\""
- << EscapeXmlAttribute(test_info.name()).c_str() << "\"";
-
- if (test_info.value_param() != NULL) {
- *stream << " value_param=\"" << EscapeXmlAttribute(test_info.value_param())
- << "\"";
- }
- if (test_info.type_param() != NULL) {
- *stream << " type_param=\"" << EscapeXmlAttribute(test_info.type_param())
- << "\"";
- }
-
- *stream << " status=\""
- << (test_info.should_run() ? "run" : "notrun")
- << "\" time=\""
- << FormatTimeInMillisAsSeconds(result.elapsed_time())
- << "\" classname=\"" << EscapeXmlAttribute(test_case_name).c_str()
- << "\"" << TestPropertiesAsXmlAttributes(result).c_str();
-
- int failures = 0;
- for (int i = 0; i < result.total_part_count(); ++i) {
- const TestPartResult& part = result.GetTestPartResult(i);
- if (part.failed()) {
- if (++failures == 1)
- *stream << ">\n";
- *stream << " <failure message=\""
- << EscapeXmlAttribute(part.summary()).c_str()
- << "\" type=\"\">";
- const string location = internal::FormatCompilerIndependentFileLocation(
- part.file_name(), part.line_number());
- const string message = location + "\n" + part.message();
- OutputXmlCDataSection(stream,
- RemoveInvalidXmlCharacters(message).c_str());
- *stream << "</failure>\n";
- }
- }
-
- if (failures == 0)
- *stream << " />\n";
- else
- *stream << " </testcase>\n";
-}
-
-// Prints an XML representation of a TestCase object
-void XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out,
- const TestCase& test_case) {
- fprintf(out,
- " <testsuite name=\"%s\" tests=\"%d\" failures=\"%d\" "
- "disabled=\"%d\" ",
- EscapeXmlAttribute(test_case.name()).c_str(),
- test_case.total_test_count(),
- test_case.failed_test_count(),
- test_case.disabled_test_count());
- fprintf(out,
- "errors=\"0\" time=\"%s\">\n",
- FormatTimeInMillisAsSeconds(test_case.elapsed_time()).c_str());
- for (int i = 0; i < test_case.total_test_count(); ++i) {
- ::std::stringstream stream;
- OutputXmlTestInfo(&stream, test_case.name(), *test_case.GetTestInfo(i));
- fprintf(out, "%s", StringStreamToString(&stream).c_str());
- }
- fprintf(out, " </testsuite>\n");
-}
-
-// Prints an XML summary of unit_test to output stream out.
-void XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out,
- const UnitTest& unit_test) {
- fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
- fprintf(out,
- "<testsuites tests=\"%d\" failures=\"%d\" disabled=\"%d\" "
- "errors=\"0\" time=\"%s\" ",
- unit_test.total_test_count(),
- unit_test.failed_test_count(),
- unit_test.disabled_test_count(),
- FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str());
- if (GTEST_FLAG(shuffle)) {
- fprintf(out, "random_seed=\"%d\" ", unit_test.random_seed());
- }
- fprintf(out, "name=\"AllTests\">\n");
- for (int i = 0; i < unit_test.total_test_case_count(); ++i)
- PrintXmlTestCase(out, *unit_test.GetTestCase(i));
- fprintf(out, "</testsuites>\n");
-}
-
-// Produces a string representing the test properties in a result as space
-// delimited XML attributes based on the property key="value" pairs.
-String XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
- const TestResult& result) {
- Message attributes;
- for (int i = 0; i < result.test_property_count(); ++i) {
- const TestProperty& property = result.GetTestProperty(i);
- attributes << " " << property.key() << "="
- << "\"" << EscapeXmlAttribute(property.value()) << "\"";
- }
- return attributes.GetString();
-}
-
-// End XmlUnitTestResultPrinter
-
-#if GTEST_CAN_STREAM_RESULTS_
-
-// Streams test results to the given port on the given host machine.
-class StreamingListener : public EmptyTestEventListener {
- public:
- // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
- static string UrlEncode(const char* str);
-
- StreamingListener(const string& host, const string& port)
- : sockfd_(-1), host_name_(host), port_num_(port) {
- MakeConnection();
- Send("gtest_streaming_protocol_version=1.0\n");
- }
-
- virtual ~StreamingListener() {
- if (sockfd_ != -1)
- CloseConnection();
- }
-
- void OnTestProgramStart(const UnitTest& /* unit_test */) {
- Send("event=TestProgramStart\n");
- }
-
- void OnTestProgramEnd(const UnitTest& unit_test) {
- // Note that Google Test current only report elapsed time for each
- // test iteration, not for the entire test program.
- Send(String::Format("event=TestProgramEnd&passed=%d\n",
- unit_test.Passed()));
-
- // Notify the streaming server to stop.
- CloseConnection();
- }
-
- void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
- Send(String::Format("event=TestIterationStart&iteration=%d\n",
- iteration));
- }
-
- void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
- Send(String::Format("event=TestIterationEnd&passed=%d&elapsed_time=%sms\n",
- unit_test.Passed(),
- StreamableToString(unit_test.elapsed_time()).c_str()));
- }
-
- void OnTestCaseStart(const TestCase& test_case) {
- Send(String::Format("event=TestCaseStart&name=%s\n", test_case.name()));
- }
-
- void OnTestCaseEnd(const TestCase& test_case) {
- Send(String::Format("event=TestCaseEnd&passed=%d&elapsed_time=%sms\n",
- test_case.Passed(),
- StreamableToString(test_case.elapsed_time()).c_str()));
- }
-
- void OnTestStart(const TestInfo& test_info) {
- Send(String::Format("event=TestStart&name=%s\n", test_info.name()));
- }
-
- void OnTestEnd(const TestInfo& test_info) {
- Send(String::Format(
- "event=TestEnd&passed=%d&elapsed_time=%sms\n",
- (test_info.result())->Passed(),
- StreamableToString((test_info.result())->elapsed_time()).c_str()));
- }
-
- void OnTestPartResult(const TestPartResult& test_part_result) {
- const char* file_name = test_part_result.file_name();
- if (file_name == NULL)
- file_name = "";
- Send(String::Format("event=TestPartResult&file=%s&line=%d&message=",
- UrlEncode(file_name).c_str(),
- test_part_result.line_number()));
- Send(UrlEncode(test_part_result.message()) + "\n");
- }
-
- private:
- // Creates a client socket and connects to the server.
- void MakeConnection();
-
- // Closes the socket.
- void CloseConnection() {
- GTEST_CHECK_(sockfd_ != -1)
- << "CloseConnection() can be called only when there is a connection.";
-
- close(sockfd_);
- sockfd_ = -1;
- }
-
- // Sends a string to the socket.
- void Send(const string& message) {
- GTEST_CHECK_(sockfd_ != -1)
- << "Send() can be called only when there is a connection.";
-
- const int len = static_cast<int>(message.length());
- if (write(sockfd_, message.c_str(), len) != len) {
- GTEST_LOG_(WARNING)
- << "stream_result_to: failed to stream to "
- << host_name_ << ":" << port_num_;
- }
- }
-
- int sockfd_; // socket file descriptor
- const string host_name_;
- const string port_num_;
-
- GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
-}; // class StreamingListener
-
-// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
-// replaces them by "%xx" where xx is their hexadecimal value. For
-// example, replaces "=" with "%3D". This algorithm is O(strlen(str))
-// in both time and space -- important as the input str may contain an
-// arbitrarily long test failure message and stack trace.
-string StreamingListener::UrlEncode(const char* str) {
- string result;
- result.reserve(strlen(str) + 1);
- for (char ch = *str; ch != '\0'; ch = *++str) {
- switch (ch) {
- case '%':
- case '=':
- case '&':
- case '\n':
- result.append(String::Format("%%%02x", static_cast<unsigned char>(ch)));
- break;
- default:
- result.push_back(ch);
- break;
- }
- }
- return result;
-}
-
-void StreamingListener::MakeConnection() {
- GTEST_CHECK_(sockfd_ == -1)
- << "MakeConnection() can't be called when there is already a connection.";
-
- addrinfo hints;
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_UNSPEC; // To allow both IPv4 and IPv6 addresses.
- hints.ai_socktype = SOCK_STREAM;
- addrinfo* servinfo = NULL;
-
- // Use the getaddrinfo() to get a linked list of IP addresses for
- // the given host name.
- const int error_num = getaddrinfo(
- host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
- if (error_num != 0) {
- GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
- << gai_strerror(error_num);
- }
-
- // Loop through all the results and connect to the first we can.
- for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
- cur_addr = cur_addr->ai_next) {
- sockfd_ = socket(
- cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
- if (sockfd_ != -1) {
- // Connect the client socket to the server socket.
- if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
- close(sockfd_);
- sockfd_ = -1;
- }
- }
- }
-
- freeaddrinfo(servinfo); // all done with this structure
-
- if (sockfd_ == -1) {
- GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
- << host_name_ << ":" << port_num_;
- }
-}
-
-// End of class Streaming Listener
-#endif // GTEST_CAN_STREAM_RESULTS__
-
-// Class ScopedTrace
-
-// Pushes the given source file location and message onto a per-thread
-// trace stack maintained by Google Test.
-// L < UnitTest::mutex_
-ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {
- TraceInfo trace;
- trace.file = file;
- trace.line = line;
- trace.message = message.GetString();
-
- UnitTest::GetInstance()->PushGTestTrace(trace);
-}
-
-// Pops the info pushed by the c'tor.
-// L < UnitTest::mutex_
-ScopedTrace::~ScopedTrace() {
- UnitTest::GetInstance()->PopGTestTrace();
-}
-
-
-// class OsStackTraceGetter
-
-// Returns the current OS stack trace as a String. Parameters:
-//
-// max_depth - the maximum number of stack frames to be included
-// in the trace.
-// skip_count - the number of top frames to be skipped; doesn't count
-// against max_depth.
-//
-// L < mutex_
-// We use "L < mutex_" to denote that the function may acquire mutex_.
-String OsStackTraceGetter::CurrentStackTrace(int, int) {
- return String("");
-}
-
-// L < mutex_
-void OsStackTraceGetter::UponLeavingGTest() {
-}
-
-const char* const
-OsStackTraceGetter::kElidedFramesMarker =
- "... " GTEST_NAME_ " internal frames ...";
-
-} // namespace internal
-
-// class TestEventListeners
-
-TestEventListeners::TestEventListeners()
- : repeater_(new internal::TestEventRepeater()),
- default_result_printer_(NULL),
- default_xml_generator_(NULL) {
-}
-
-TestEventListeners::~TestEventListeners() { delete repeater_; }
-
-// Returns the standard listener responsible for the default console
-// output. Can be removed from the listeners list to shut down default
-// console output. Note that removing this object from the listener list
-// with Release transfers its ownership to the user.
-void TestEventListeners::Append(TestEventListener* listener) {
- repeater_->Append(listener);
-}
-
-// Removes the given event listener from the list and returns it. It then
-// becomes the caller's responsibility to delete the listener. Returns
-// NULL if the listener is not found in the list.
-TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
- if (listener == default_result_printer_)
- default_result_printer_ = NULL;
- else if (listener == default_xml_generator_)
- default_xml_generator_ = NULL;
- return repeater_->Release(listener);
-}
-
-// Returns repeater that broadcasts the TestEventListener events to all
-// subscribers.
-TestEventListener* TestEventListeners::repeater() { return repeater_; }
-
-// Sets the default_result_printer attribute to the provided listener.
-// The listener is also added to the listener list and previous
-// default_result_printer is removed from it and deleted. The listener can
-// also be NULL in which case it will not be added to the list. Does
-// nothing if the previous and the current listener objects are the same.
-void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
- if (default_result_printer_ != listener) {
- // It is an error to pass this method a listener that is already in the
- // list.
- delete Release(default_result_printer_);
- default_result_printer_ = listener;
- if (listener != NULL)
- Append(listener);
- }
-}
-
-// Sets the default_xml_generator attribute to the provided listener. The
-// listener is also added to the listener list and previous
-// default_xml_generator is removed from it and deleted. The listener can
-// also be NULL in which case it will not be added to the list. Does
-// nothing if the previous and the current listener objects are the same.
-void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
- if (default_xml_generator_ != listener) {
- // It is an error to pass this method a listener that is already in the
- // list.
- delete Release(default_xml_generator_);
- default_xml_generator_ = listener;
- if (listener != NULL)
- Append(listener);
- }
-}
-
-// Controls whether events will be forwarded by the repeater to the
-// listeners in the list.
-bool TestEventListeners::EventForwardingEnabled() const {
- return repeater_->forwarding_enabled();
-}
-
-void TestEventListeners::SuppressEventForwarding() {
- repeater_->set_forwarding_enabled(false);
-}
-
-// class UnitTest
-
-// Gets the singleton UnitTest object. The first time this method is
-// called, a UnitTest object is constructed and returned. Consecutive
-// calls will return the same object.
-//
-// We don't protect this under mutex_ as a user is not supposed to
-// call this before main() starts, from which point on the return
-// value will never change.
-UnitTest * UnitTest::GetInstance() {
- // When compiled with MSVC 7.1 in optimized mode, destroying the
- // UnitTest object upon exiting the program messes up the exit code,
- // causing successful tests to appear failed. We have to use a
- // different implementation in this case to bypass the compiler bug.
- // This implementation makes the compiler happy, at the cost of
- // leaking the UnitTest object.
-
- // CodeGear C++Builder insists on a public destructor for the
- // default implementation. Use this implementation to keep good OO
- // design with private destructor.
-
-#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
- static UnitTest* const instance = new UnitTest;
- return instance;
-#else
- static UnitTest instance;
- return &instance;
-#endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
-}
-
-// Gets the number of successful test cases.
-int UnitTest::successful_test_case_count() const {
- return impl()->successful_test_case_count();
-}
-
-// Gets the number of failed test cases.
-int UnitTest::failed_test_case_count() const {
- return impl()->failed_test_case_count();
-}
-
-// Gets the number of all test cases.
-int UnitTest::total_test_case_count() const {
- return impl()->total_test_case_count();
-}
-
-// Gets the number of all test cases that contain at least one test
-// that should run.
-int UnitTest::test_case_to_run_count() const {
- return impl()->test_case_to_run_count();
-}
-
-// Gets the number of successful tests.
-int UnitTest::successful_test_count() const {
- return impl()->successful_test_count();
-}
-
-// Gets the number of failed tests.
-int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
-
-// Gets the number of disabled tests.
-int UnitTest::disabled_test_count() const {
- return impl()->disabled_test_count();
-}
-
-// Gets the number of all tests.
-int UnitTest::total_test_count() const { return impl()->total_test_count(); }
-
-// Gets the number of tests that should run.
-int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
-
-// Gets the elapsed time, in milliseconds.
-internal::TimeInMillis UnitTest::elapsed_time() const {
- return impl()->elapsed_time();
-}
-
-// Returns true iff the unit test passed (i.e. all test cases passed).
-bool UnitTest::Passed() const { return impl()->Passed(); }
-
-// Returns true iff the unit test failed (i.e. some test case failed
-// or something outside of all tests failed).
-bool UnitTest::Failed() const { return impl()->Failed(); }
-
-// Gets the i-th test case among all the test cases. i can range from 0 to
-// total_test_case_count() - 1. If i is not in that range, returns NULL.
-const TestCase* UnitTest::GetTestCase(int i) const {
- return impl()->GetTestCase(i);
-}
-
-// Gets the i-th test case among all the test cases. i can range from 0 to
-// total_test_case_count() - 1. If i is not in that range, returns NULL.
-TestCase* UnitTest::GetMutableTestCase(int i) {
- return impl()->GetMutableTestCase(i);
-}
-
-// Returns the list of event listeners that can be used to track events
-// inside Google Test.
-TestEventListeners& UnitTest::listeners() {
- return *impl()->listeners();
-}
-
-// Registers and returns a global test environment. When a test
-// program is run, all global test environments will be set-up in the
-// order they were registered. After all tests in the program have
-// finished, all global test environments will be torn-down in the
-// *reverse* order they were registered.
-//
-// The UnitTest object takes ownership of the given environment.
-//
-// We don't protect this under mutex_, as we only support calling it
-// from the main thread.
-Environment* UnitTest::AddEnvironment(Environment* env) {
- if (env == NULL) {
- return NULL;
- }
-
- impl_->environments().push_back(env);
- return env;
-}
-
-// Adds a TestPartResult to the current TestResult object. All Google Test
-// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
-// this to report their results. The user code should use the
-// assertion macros instead of calling this directly.
-// L < mutex_
-void UnitTest::AddTestPartResult(TestPartResult::Type result_type,
- const char* file_name,
- int line_number,
- const internal::String& message,
- const internal::String& os_stack_trace) {
- Message msg;
- msg << message;
-
- internal::MutexLock lock(&mutex_);
- if (impl_->gtest_trace_stack().size() > 0) {
- msg << "\n" << GTEST_NAME_ << " trace:";
-
- for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
- i > 0; --i) {
- const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
- msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
- << " " << trace.message;
- }
- }
-
- if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
- msg << internal::kStackTraceMarker << os_stack_trace;
- }
-
- const TestPartResult result =
- TestPartResult(result_type, file_name, line_number,
- msg.GetString().c_str());
- impl_->GetTestPartResultReporterForCurrentThread()->
- ReportTestPartResult(result);
-
- if (result_type != TestPartResult::kSuccess) {
- // gtest_break_on_failure takes precedence over
- // gtest_throw_on_failure. This allows a user to set the latter
- // in the code (perhaps in order to use Google Test assertions
- // with another testing framework) and specify the former on the
- // command line for debugging.
- if (GTEST_FLAG(break_on_failure)) {
-#if GTEST_OS_WINDOWS
- // Using DebugBreak on Windows allows gtest to still break into a debugger
- // when a failure happens and both the --gtest_break_on_failure and
- // the --gtest_catch_exceptions flags are specified.
- DebugBreak();
-#else
- // Dereference NULL through a volatile pointer to prevent the compiler
- // from removing. We use this rather than abort() or __builtin_trap() for
- // portability: Symbian doesn't implement abort() well, and some debuggers
- // don't correctly trap abort().
- *static_cast<volatile int*>(NULL) = 1;
-#endif // GTEST_OS_WINDOWS
- } else if (GTEST_FLAG(throw_on_failure)) {
-#if GTEST_HAS_EXCEPTIONS
- throw GoogleTestFailureException(result);
-#else
- // We cannot call abort() as it generates a pop-up in debug mode
- // that cannot be suppressed in VC 7.1 or below.
- exit(1);
-#endif
- }
- }
-}
-
-// Creates and adds a property to the current TestResult. If a property matching
-// the supplied value already exists, updates its value instead.
-void UnitTest::RecordPropertyForCurrentTest(const char* key,
- const char* value) {
- const TestProperty test_property(key, value);
- impl_->current_test_result()->RecordProperty(test_property);
-}
-
-// Runs all tests in this UnitTest object and prints the result.
-// Returns 0 if successful, or 1 otherwise.
-//
-// We don't protect this under mutex_, as we only support calling it
-// from the main thread.
-int UnitTest::Run() {
- // Captures the value of GTEST_FLAG(catch_exceptions). This value will be
- // used for the duration of the program.
- impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
-
-#if GTEST_HAS_SEH
- const bool in_death_test_child_process =
- internal::GTEST_FLAG(internal_run_death_test).length() > 0;
-
- // Either the user wants Google Test to catch exceptions thrown by the
- // tests or this is executing in the context of death test child
- // process. In either case the user does not want to see pop-up dialogs
- // about crashes - they are expected.
- if (impl()->catch_exceptions() || in_death_test_child_process) {
-
-# if !GTEST_OS_WINDOWS_MOBILE
- // SetErrorMode doesn't exist on CE.
- SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
- SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
-# endif // !GTEST_OS_WINDOWS_MOBILE
-
-# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
- // Death test children can be terminated with _abort(). On Windows,
- // _abort() can show a dialog with a warning message. This forces the
- // abort message to go to stderr instead.
- _set_error_mode(_OUT_TO_STDERR);
-# endif
-
-# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
- // In the debug version, Visual Studio pops up a separate dialog
- // offering a choice to debug the aborted program. We need to suppress
- // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
- // executed. Google Test will notify the user of any unexpected
- // failure via stderr.
- //
- // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
- // Users of prior VC versions shall suffer the agony and pain of
- // clicking through the countless debug dialogs.
- // TODO(vladl at google.com): find a way to suppress the abort dialog() in the
- // debug mode when compiled with VC 7.1 or lower.
- if (!GTEST_FLAG(break_on_failure))
- _set_abort_behavior(
- 0x0, // Clear the following flags:
- _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump.
-# endif
-
- }
-#endif // GTEST_HAS_SEH
-
- return internal::HandleExceptionsInMethodIfSupported(
- impl(),
- &internal::UnitTestImpl::RunAllTests,
- "auxiliary test code (environments or event listeners)") ? 0 : 1;
-}
-
-// Returns the working directory when the first TEST() or TEST_F() was
-// executed.
-const char* UnitTest::original_working_dir() const {
- return impl_->original_working_dir_.c_str();
-}
-
-// Returns the TestCase object for the test that's currently running,
-// or NULL if no test is running.
-// L < mutex_
-const TestCase* UnitTest::current_test_case() const {
- internal::MutexLock lock(&mutex_);
- return impl_->current_test_case();
-}
-
-// Returns the TestInfo object for the test that's currently running,
-// or NULL if no test is running.
-// L < mutex_
-const TestInfo* UnitTest::current_test_info() const {
- internal::MutexLock lock(&mutex_);
- return impl_->current_test_info();
-}
-
-// Returns the random seed used at the start of the current test run.
-int UnitTest::random_seed() const { return impl_->random_seed(); }
-
-#if GTEST_HAS_PARAM_TEST
-// Returns ParameterizedTestCaseRegistry object used to keep track of
-// value-parameterized tests and instantiate and register them.
-// L < mutex_
-internal::ParameterizedTestCaseRegistry&
- UnitTest::parameterized_test_registry() {
- return impl_->parameterized_test_registry();
-}
-#endif // GTEST_HAS_PARAM_TEST
-
-// Creates an empty UnitTest.
-UnitTest::UnitTest() {
- impl_ = new internal::UnitTestImpl(this);
-}
-
-// Destructor of UnitTest.
-UnitTest::~UnitTest() {
- delete impl_;
-}
-
-// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
-// Google Test trace stack.
-// L < mutex_
-void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) {
- internal::MutexLock lock(&mutex_);
- impl_->gtest_trace_stack().push_back(trace);
-}
-
-// Pops a trace from the per-thread Google Test trace stack.
-// L < mutex_
-void UnitTest::PopGTestTrace() {
- internal::MutexLock lock(&mutex_);
- impl_->gtest_trace_stack().pop_back();
-}
-
-namespace internal {
-
-UnitTestImpl::UnitTestImpl(UnitTest* parent)
- : parent_(parent),
-#ifdef _MSC_VER
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4355) // Temporarily disables warning 4355
- // (using this in initializer).
- default_global_test_part_result_reporter_(this),
- default_per_thread_test_part_result_reporter_(this),
-# pragma warning(pop) // Restores the warning state again.
-#else
- default_global_test_part_result_reporter_(this),
- default_per_thread_test_part_result_reporter_(this),
-#endif // _MSC_VER
- global_test_part_result_repoter_(
- &default_global_test_part_result_reporter_),
- per_thread_test_part_result_reporter_(
- &default_per_thread_test_part_result_reporter_),
-#if GTEST_HAS_PARAM_TEST
- parameterized_test_registry_(),
- parameterized_tests_registered_(false),
-#endif // GTEST_HAS_PARAM_TEST
- last_death_test_case_(-1),
- current_test_case_(NULL),
- current_test_info_(NULL),
- ad_hoc_test_result_(),
- os_stack_trace_getter_(NULL),
- post_flag_parse_init_performed_(false),
- random_seed_(0), // Will be overridden by the flag before first use.
- random_(0), // Will be reseeded before first use.
- elapsed_time_(0),
-#if GTEST_HAS_DEATH_TEST
- internal_run_death_test_flag_(NULL),
- death_test_factory_(new DefaultDeathTestFactory),
-#endif
- // Will be overridden by the flag before first use.
- catch_exceptions_(false) {
- listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
-}
-
-UnitTestImpl::~UnitTestImpl() {
- // Deletes every TestCase.
- ForEach(test_cases_, internal::Delete<TestCase>);
-
- // Deletes every Environment.
- ForEach(environments_, internal::Delete<Environment>);
-
- delete os_stack_trace_getter_;
-}
-
-#if GTEST_HAS_DEATH_TEST
-// Disables event forwarding if the control is currently in a death test
-// subprocess. Must not be called before InitGoogleTest.
-void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
- if (internal_run_death_test_flag_.get() != NULL)
- listeners()->SuppressEventForwarding();
-}
-#endif // GTEST_HAS_DEATH_TEST
-
-// Initializes event listeners performing XML output as specified by
-// UnitTestOptions. Must not be called before InitGoogleTest.
-void UnitTestImpl::ConfigureXmlOutput() {
- const String& output_format = UnitTestOptions::GetOutputFormat();
- if (output_format == "xml") {
- listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
- UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
- } else if (output_format != "") {
- printf("WARNING: unrecognized output format \"%s\" ignored.\n",
- output_format.c_str());
- fflush(stdout);
- }
-}
-
-#if GTEST_CAN_STREAM_RESULTS_
-// Initializes event listeners for streaming test results in String form.
-// Must not be called before InitGoogleTest.
-void UnitTestImpl::ConfigureStreamingOutput() {
- const string& target = GTEST_FLAG(stream_result_to);
- if (!target.empty()) {
- const size_t pos = target.find(':');
- if (pos != string::npos) {
- listeners()->Append(new StreamingListener(target.substr(0, pos),
- target.substr(pos+1)));
- } else {
- printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
- target.c_str());
- fflush(stdout);
- }
- }
-}
-#endif // GTEST_CAN_STREAM_RESULTS_
-
-// Performs initialization dependent upon flag values obtained in
-// ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to
-// ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest
-// this function is also called from RunAllTests. Since this function can be
-// called more than once, it has to be idempotent.
-void UnitTestImpl::PostFlagParsingInit() {
- // Ensures that this function does not execute more than once.
- if (!post_flag_parse_init_performed_) {
- post_flag_parse_init_performed_ = true;
-
-#if GTEST_HAS_DEATH_TEST
- InitDeathTestSubprocessControlInfo();
- SuppressTestEventsIfInSubprocess();
-#endif // GTEST_HAS_DEATH_TEST
-
- // Registers parameterized tests. This makes parameterized tests
- // available to the UnitTest reflection API without running
- // RUN_ALL_TESTS.
- RegisterParameterizedTests();
-
- // Configures listeners for XML output. This makes it possible for users
- // to shut down the default XML output before invoking RUN_ALL_TESTS.
- ConfigureXmlOutput();
-
-#if GTEST_CAN_STREAM_RESULTS_
- // Configures listeners for streaming test results to the specified server.
- ConfigureStreamingOutput();
-#endif // GTEST_CAN_STREAM_RESULTS_
- }
-}
-
-// A predicate that checks the name of a TestCase against a known
-// value.
-//
-// This is used for implementation of the UnitTest class only. We put
-// it in the anonymous namespace to prevent polluting the outer
-// namespace.
-//
-// TestCaseNameIs is copyable.
-class TestCaseNameIs {
- public:
- // Constructor.
- explicit TestCaseNameIs(const String& name)
- : name_(name) {}
-
- // Returns true iff the name of test_case matches name_.
- bool operator()(const TestCase* test_case) const {
- return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
- }
-
- private:
- String name_;
-};
-
-// Finds and returns a TestCase with the given name. If one doesn't
-// exist, creates one and returns it. It's the CALLER'S
-// RESPONSIBILITY to ensure that this function is only called WHEN THE
-// TESTS ARE NOT SHUFFLED.
-//
-// Arguments:
-//
-// test_case_name: name of the test case
-// type_param: the name of the test case's type parameter, or NULL if
-// this is not a typed or a type-parameterized test case.
-// set_up_tc: pointer to the function that sets up the test case
-// tear_down_tc: pointer to the function that tears down the test case
-TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
- const char* type_param,
- Test::SetUpTestCaseFunc set_up_tc,
- Test::TearDownTestCaseFunc tear_down_tc) {
- // Can we find a TestCase with the given name?
- const std::vector<TestCase*>::const_iterator test_case =
- std::find_if(test_cases_.begin(), test_cases_.end(),
- TestCaseNameIs(test_case_name));
-
- if (test_case != test_cases_.end())
- return *test_case;
-
- // No. Let's create one.
- TestCase* const new_test_case =
- new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
-
- // Is this a death test case?
- if (internal::UnitTestOptions::MatchesFilter(String(test_case_name),
- kDeathTestCaseFilter)) {
- // Yes. Inserts the test case after the last death test case
- // defined so far. This only works when the test cases haven't
- // been shuffled. Otherwise we may end up running a death test
- // after a non-death test.
- ++last_death_test_case_;
- test_cases_.insert(test_cases_.begin() + last_death_test_case_,
- new_test_case);
- } else {
- // No. Appends to the end of the list.
- test_cases_.push_back(new_test_case);
- }
-
- test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
- return new_test_case;
-}
-
-// Helpers for setting up / tearing down the given environment. They
-// are for use in the ForEach() function.
-static void SetUpEnvironment(Environment* env) { env->SetUp(); }
-static void TearDownEnvironment(Environment* env) { env->TearDown(); }
-
-// Runs all tests in this UnitTest object, prints the result, and
-// returns true if all tests are successful. If any exception is
-// thrown during a test, the test is considered to be failed, but the
-// rest of the tests will still be run.
-//
-// When parameterized tests are enabled, it expands and registers
-// parameterized tests first in RegisterParameterizedTests().
-// All other functions called from RunAllTests() may safely assume that
-// parameterized tests are ready to be counted and run.
-bool UnitTestImpl::RunAllTests() {
- // Makes sure InitGoogleTest() was called.
- if (!GTestIsInitialized()) {
- printf("%s",
- "\nThis test program did NOT call ::testing::InitGoogleTest "
- "before calling RUN_ALL_TESTS(). Please fix it.\n");
- return false;
- }
-
- // Do not run any test if the --help flag was specified.
- if (g_help_flag)
- return true;
-
- // Repeats the call to the post-flag parsing initialization in case the
- // user didn't call InitGoogleTest.
- PostFlagParsingInit();
-
- // Even if sharding is not on, test runners may want to use the
- // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
- // protocol.
- internal::WriteToShardStatusFileIfNeeded();
-
- // True iff we are in a subprocess for running a thread-safe-style
- // death test.
- bool in_subprocess_for_death_test = false;
-
-#if GTEST_HAS_DEATH_TEST
- in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
-#endif // GTEST_HAS_DEATH_TEST
-
- const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
- in_subprocess_for_death_test);
-
- // Compares the full test names with the filter to decide which
- // tests to run.
- const bool has_tests_to_run = FilterTests(should_shard
- ? HONOR_SHARDING_PROTOCOL
- : IGNORE_SHARDING_PROTOCOL) > 0;
-
- // Lists the tests and exits if the --gtest_list_tests flag was specified.
- if (GTEST_FLAG(list_tests)) {
- // This must be called *after* FilterTests() has been called.
- ListTestsMatchingFilter();
- return true;
- }
-
- random_seed_ = GTEST_FLAG(shuffle) ?
- GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
-
- // True iff at least one test has failed.
- bool failed = false;
-
- TestEventListener* repeater = listeners()->repeater();
-
- repeater->OnTestProgramStart(*parent_);
-
- // How many times to repeat the tests? We don't want to repeat them
- // when we are inside the subprocess of a death test.
- const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
- // Repeats forever if the repeat count is negative.
- const bool forever = repeat < 0;
- for (int i = 0; forever || i != repeat; i++) {
- // We want to preserve failures generated by ad-hoc test
- // assertions executed before RUN_ALL_TESTS().
- ClearNonAdHocTestResult();
-
- const TimeInMillis start = GetTimeInMillis();
-
- // Shuffles test cases and tests if requested.
- if (has_tests_to_run && GTEST_FLAG(shuffle)) {
- random()->Reseed(random_seed_);
- // This should be done before calling OnTestIterationStart(),
- // such that a test event listener can see the actual test order
- // in the event.
- ShuffleTests();
- }
-
- // Tells the unit test event listeners that the tests are about to start.
- repeater->OnTestIterationStart(*parent_, i);
-
- // Runs each test case if there is at least one test to run.
- if (has_tests_to_run) {
- // Sets up all environments beforehand.
- repeater->OnEnvironmentsSetUpStart(*parent_);
- ForEach(environments_, SetUpEnvironment);
- repeater->OnEnvironmentsSetUpEnd(*parent_);
-
- // Runs the tests only if there was no fatal failure during global
- // set-up.
- if (!Test::HasFatalFailure()) {
- for (int test_index = 0; test_index < total_test_case_count();
- test_index++) {
- GetMutableTestCase(test_index)->Run();
- }
- }
-
- // Tears down all environments in reverse order afterwards.
- repeater->OnEnvironmentsTearDownStart(*parent_);
- std::for_each(environments_.rbegin(), environments_.rend(),
- TearDownEnvironment);
- repeater->OnEnvironmentsTearDownEnd(*parent_);
- }
-
- elapsed_time_ = GetTimeInMillis() - start;
-
- // Tells the unit test event listener that the tests have just finished.
- repeater->OnTestIterationEnd(*parent_, i);
-
- // Gets the result and clears it.
- if (!Passed()) {
- failed = true;
- }
-
- // Restores the original test order after the iteration. This
- // allows the user to quickly repro a failure that happens in the
- // N-th iteration without repeating the first (N - 1) iterations.
- // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
- // case the user somehow changes the value of the flag somewhere
- // (it's always safe to unshuffle the tests).
- UnshuffleTests();
-
- if (GTEST_FLAG(shuffle)) {
- // Picks a new random seed for each iteration.
- random_seed_ = GetNextRandomSeed(random_seed_);
- }
- }
-
- repeater->OnTestProgramEnd(*parent_);
-
- return !failed;
-}
-
-// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
-// if the variable is present. If a file already exists at this location, this
-// function will write over it. If the variable is present, but the file cannot
-// be created, prints an error and exits.
-void WriteToShardStatusFileIfNeeded() {
- const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
- if (test_shard_file != NULL) {
- FILE* const file = posix::FOpen(test_shard_file, "w");
- if (file == NULL) {
- ColoredPrintf(COLOR_RED,
- "Could not write to the test shard status file \"%s\" "
- "specified by the %s environment variable.\n",
- test_shard_file, kTestShardStatusFile);
- fflush(stdout);
- exit(EXIT_FAILURE);
- }
- fclose(file);
- }
-}
-
-// Checks whether sharding is enabled by examining the relevant
-// environment variable values. If the variables are present,
-// but inconsistent (i.e., shard_index >= total_shards), prints
-// an error and exits. If in_subprocess_for_death_test, sharding is
-// disabled because it must only be applied to the original test
-// process. Otherwise, we could filter out death tests we intended to execute.
-bool ShouldShard(const char* total_shards_env,
- const char* shard_index_env,
- bool in_subprocess_for_death_test) {
- if (in_subprocess_for_death_test) {
- return false;
- }
-
- const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
- const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
-
- if (total_shards == -1 && shard_index == -1) {
- return false;
- } else if (total_shards == -1 && shard_index != -1) {
- const Message msg = Message()
- << "Invalid environment variables: you have "
- << kTestShardIndex << " = " << shard_index
- << ", but have left " << kTestTotalShards << " unset.\n";
- ColoredPrintf(COLOR_RED, msg.GetString().c_str());
- fflush(stdout);
- exit(EXIT_FAILURE);
- } else if (total_shards != -1 && shard_index == -1) {
- const Message msg = Message()
- << "Invalid environment variables: you have "
- << kTestTotalShards << " = " << total_shards
- << ", but have left " << kTestShardIndex << " unset.\n";
- ColoredPrintf(COLOR_RED, msg.GetString().c_str());
- fflush(stdout);
- exit(EXIT_FAILURE);
- } else if (shard_index < 0 || shard_index >= total_shards) {
- const Message msg = Message()
- << "Invalid environment variables: we require 0 <= "
- << kTestShardIndex << " < " << kTestTotalShards
- << ", but you have " << kTestShardIndex << "=" << shard_index
- << ", " << kTestTotalShards << "=" << total_shards << ".\n";
- ColoredPrintf(COLOR_RED, msg.GetString().c_str());
- fflush(stdout);
- exit(EXIT_FAILURE);
- }
-
- return total_shards > 1;
-}
-
-// Parses the environment variable var as an Int32. If it is unset,
-// returns default_val. If it is not an Int32, prints an error
-// and aborts.
-Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
- const char* str_val = posix::GetEnv(var);
- if (str_val == NULL) {
- return default_val;
- }
-
- Int32 result;
- if (!ParseInt32(Message() << "The value of environment variable " << var,
- str_val, &result)) {
- exit(EXIT_FAILURE);
- }
- return result;
-}
-
-// Given the total number of shards, the shard index, and the test id,
-// returns true iff the test should be run on this shard. The test id is
-// some arbitrary but unique non-negative integer assigned to each test
-// method. Assumes that 0 <= shard_index < total_shards.
-bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
- return (test_id % total_shards) == shard_index;
-}
-
-// Compares the name of each test with the user-specified filter to
-// decide whether the test should be run, then records the result in
-// each TestCase and TestInfo object.
-// If shard_tests == true, further filters tests based on sharding
-// variables in the environment - see
-// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
-// Returns the number of tests that should run.
-int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
- const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
- Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
- const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
- Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
-
- // num_runnable_tests are the number of tests that will
- // run across all shards (i.e., match filter and are not disabled).
- // num_selected_tests are the number of tests to be run on
- // this shard.
- int num_runnable_tests = 0;
- int num_selected_tests = 0;
- for (size_t i = 0; i < test_cases_.size(); i++) {
- TestCase* const test_case = test_cases_[i];
- const String &test_case_name = test_case->name();
- test_case->set_should_run(false);
-
- for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
- TestInfo* const test_info = test_case->test_info_list()[j];
- const String test_name(test_info->name());
- // A test is disabled if test case name or test name matches
- // kDisableTestFilter.
- const bool is_disabled =
- internal::UnitTestOptions::MatchesFilter(test_case_name,
- kDisableTestFilter) ||
- internal::UnitTestOptions::MatchesFilter(test_name,
- kDisableTestFilter);
- test_info->is_disabled_ = is_disabled;
-
- const bool matches_filter =
- internal::UnitTestOptions::FilterMatchesTest(test_case_name,
- test_name);
- test_info->matches_filter_ = matches_filter;
-
- const bool is_runnable =
- (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
- matches_filter;
-
- const bool is_selected = is_runnable &&
- (shard_tests == IGNORE_SHARDING_PROTOCOL ||
- ShouldRunTestOnShard(total_shards, shard_index,
- num_runnable_tests));
-
- num_runnable_tests += is_runnable;
- num_selected_tests += is_selected;
-
- test_info->should_run_ = is_selected;
- test_case->set_should_run(test_case->should_run() || is_selected);
- }
- }
- return num_selected_tests;
-}
-
-// Prints the names of the tests matching the user-specified filter flag.
-void UnitTestImpl::ListTestsMatchingFilter() {
- for (size_t i = 0; i < test_cases_.size(); i++) {
- const TestCase* const test_case = test_cases_[i];
- bool printed_test_case_name = false;
-
- for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
- const TestInfo* const test_info =
- test_case->test_info_list()[j];
- if (test_info->matches_filter_) {
- if (!printed_test_case_name) {
- printed_test_case_name = true;
- printf("%s.\n", test_case->name());
- }
- printf(" %s\n", test_info->name());
- }
- }
- }
- fflush(stdout);
-}
-
-// Sets the OS stack trace getter.
-//
-// Does nothing if the input and the current OS stack trace getter are
-// the same; otherwise, deletes the old getter and makes the input the
-// current getter.
-void UnitTestImpl::set_os_stack_trace_getter(
- OsStackTraceGetterInterface* getter) {
- if (os_stack_trace_getter_ != getter) {
- delete os_stack_trace_getter_;
- os_stack_trace_getter_ = getter;
- }
-}
-
-// Returns the current OS stack trace getter if it is not NULL;
-// otherwise, creates an OsStackTraceGetter, makes it the current
-// getter, and returns it.
-OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
- if (os_stack_trace_getter_ == NULL) {
- os_stack_trace_getter_ = new OsStackTraceGetter;
- }
-
- return os_stack_trace_getter_;
-}
-
-// Returns the TestResult for the test that's currently running, or
-// the TestResult for the ad hoc test if no test is running.
-TestResult* UnitTestImpl::current_test_result() {
- return current_test_info_ ?
- &(current_test_info_->result_) : &ad_hoc_test_result_;
-}
-
-// Shuffles all test cases, and the tests within each test case,
-// making sure that death tests are still run first.
-void UnitTestImpl::ShuffleTests() {
- // Shuffles the death test cases.
- ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
-
- // Shuffles the non-death test cases.
- ShuffleRange(random(), last_death_test_case_ + 1,
- static_cast<int>(test_cases_.size()), &test_case_indices_);
-
- // Shuffles the tests inside each test case.
- for (size_t i = 0; i < test_cases_.size(); i++) {
- test_cases_[i]->ShuffleTests(random());
- }
-}
-
-// Restores the test cases and tests to their order before the first shuffle.
-void UnitTestImpl::UnshuffleTests() {
- for (size_t i = 0; i < test_cases_.size(); i++) {
- // Unshuffles the tests in each test case.
- test_cases_[i]->UnshuffleTests();
- // Resets the index of each test case.
- test_case_indices_[i] = static_cast<int>(i);
- }
-}
-
-// Returns the current OS stack trace as a String.
-//
-// The maximum number of stack frames to be included is specified by
-// the gtest_stack_trace_depth flag. The skip_count parameter
-// specifies the number of top frames to be skipped, which doesn't
-// count against the number of frames to be included.
-//
-// For example, if Foo() calls Bar(), which in turn calls
-// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
-// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
-String GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
- int skip_count) {
- // We pass skip_count + 1 to skip this wrapper function in addition
- // to what the user really wants to skip.
- return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
-}
-
-// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
-// suppress unreachable code warnings.
-namespace {
-class ClassUniqueToAlwaysTrue {};
-}
-
-bool IsTrue(bool condition) { return condition; }
-
-bool AlwaysTrue() {
-#if GTEST_HAS_EXCEPTIONS
- // This condition is always false so AlwaysTrue() never actually throws,
- // but it makes the compiler think that it may throw.
- if (IsTrue(false))
- throw ClassUniqueToAlwaysTrue();
-#endif // GTEST_HAS_EXCEPTIONS
- return true;
-}
-
-// If *pstr starts with the given prefix, modifies *pstr to be right
-// past the prefix and returns true; otherwise leaves *pstr unchanged
-// and returns false. None of pstr, *pstr, and prefix can be NULL.
-bool SkipPrefix(const char* prefix, const char** pstr) {
- const size_t prefix_len = strlen(prefix);
- if (strncmp(*pstr, prefix, prefix_len) == 0) {
- *pstr += prefix_len;
- return true;
- }
- return false;
-}
-
-// Parses a string as a command line flag. The string should have
-// the format "--flag=value". When def_optional is true, the "=value"
-// part can be omitted.
-//
-// Returns the value of the flag, or NULL if the parsing failed.
-const char* ParseFlagValue(const char* str,
- const char* flag,
- bool def_optional) {
- // str and flag must not be NULL.
- if (str == NULL || flag == NULL) return NULL;
-
- // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
- const String flag_str = String::Format("--%s%s", GTEST_FLAG_PREFIX_, flag);
- const size_t flag_len = flag_str.length();
- if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
-
- // Skips the flag name.
- const char* flag_end = str + flag_len;
-
- // When def_optional is true, it's OK to not have a "=value" part.
- if (def_optional && (flag_end[0] == '\0')) {
- return flag_end;
- }
-
- // If def_optional is true and there are more characters after the
- // flag name, or if def_optional is false, there must be a '=' after
- // the flag name.
- if (flag_end[0] != '=') return NULL;
-
- // Returns the string after "=".
- return flag_end + 1;
-}
-
-// Parses a string for a bool flag, in the form of either
-// "--flag=value" or "--flag".
-//
-// In the former case, the value is taken as true as long as it does
-// not start with '0', 'f', or 'F'.
-//
-// In the latter case, the value is taken as true.
-//
-// On success, stores the value of the flag in *value, and returns
-// true. On failure, returns false without changing *value.
-bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
- // Gets the value of the flag as a string.
- const char* const value_str = ParseFlagValue(str, flag, true);
-
- // Aborts if the parsing failed.
- if (value_str == NULL) return false;
-
- // Converts the string value to a bool.
- *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
- return true;
-}
-
-// Parses a string for an Int32 flag, in the form of
-// "--flag=value".
-//
-// On success, stores the value of the flag in *value, and returns
-// true. On failure, returns false without changing *value.
-bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
- // Gets the value of the flag as a string.
- const char* const value_str = ParseFlagValue(str, flag, false);
-
- // Aborts if the parsing failed.
- if (value_str == NULL) return false;
-
- // Sets *value to the value of the flag.
- return ParseInt32(Message() << "The value of flag --" << flag,
- value_str, value);
-}
-
-// Parses a string for a string flag, in the form of
-// "--flag=value".
-//
-// On success, stores the value of the flag in *value, and returns
-// true. On failure, returns false without changing *value.
-bool ParseStringFlag(const char* str, const char* flag, String* value) {
- // Gets the value of the flag as a string.
- const char* const value_str = ParseFlagValue(str, flag, false);
-
- // Aborts if the parsing failed.
- if (value_str == NULL) return false;
-
- // Sets *value to the value of the flag.
- *value = value_str;
- return true;
-}
-
-// Determines whether a string has a prefix that Google Test uses for its
-// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
-// If Google Test detects that a command line flag has its prefix but is not
-// recognized, it will print its help message. Flags starting with
-// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
-// internal flags and do not trigger the help message.
-static bool HasGoogleTestFlagPrefix(const char* str) {
- return (SkipPrefix("--", &str) ||
- SkipPrefix("-", &str) ||
- SkipPrefix("/", &str)) &&
- !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
- (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
- SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
-}
-
-// Prints a string containing code-encoded text. The following escape
-// sequences can be used in the string to control the text color:
-//
-// @@ prints a single '@' character.
-// @R changes the color to red.
-// @G changes the color to green.
-// @Y changes the color to yellow.
-// @D changes to the default terminal text color.
-//
-// TODO(wan at google.com): Write tests for this once we add stdout
-// capturing to Google Test.
-static void PrintColorEncoded(const char* str) {
- GTestColor color = COLOR_DEFAULT; // The current color.
-
- // Conceptually, we split the string into segments divided by escape
- // sequences. Then we print one segment at a time. At the end of
- // each iteration, the str pointer advances to the beginning of the
- // next segment.
- for (;;) {
- const char* p = strchr(str, '@');
- if (p == NULL) {
- ColoredPrintf(color, "%s", str);
- return;
- }
-
- ColoredPrintf(color, "%s", String(str, p - str).c_str());
-
- const char ch = p[1];
- str = p + 2;
- if (ch == '@') {
- ColoredPrintf(color, "@");
- } else if (ch == 'D') {
- color = COLOR_DEFAULT;
- } else if (ch == 'R') {
- color = COLOR_RED;
- } else if (ch == 'G') {
- color = COLOR_GREEN;
- } else if (ch == 'Y') {
- color = COLOR_YELLOW;
- } else {
- --str;
- }
- }
-}
-
-static const char kColorEncodedHelpMessage[] =
-"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
-"following command line flags to control its behavior:\n"
-"\n"
-"Test Selection:\n"
-" @G--" GTEST_FLAG_PREFIX_ "list_tests at D\n"
-" List the names of all tests instead of running them. The name of\n"
-" TEST(Foo, Bar) is \"Foo.Bar\".\n"
-" @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
- "[@G- at YNEGATIVE_PATTERNS]@D\n"
-" Run only the tests whose name matches one of the positive patterns but\n"
-" none of the negative patterns. '?' matches any single character; '*'\n"
-" matches any substring; ':' separates two patterns.\n"
-" @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests at D\n"
-" Run all disabled tests too.\n"
-"\n"
-"Test Execution:\n"
-" @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
-" Run the tests repeatedly; use a negative count to repeat forever.\n"
-" @G--" GTEST_FLAG_PREFIX_ "shuffle at D\n"
-" Randomize tests' orders on every iteration.\n"
-" @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
-" Random number seed to use for shuffling test orders (between 1 and\n"
-" 99999, or 0 to use a seed based on the current time).\n"
-"\n"
-"Test Output:\n"
-" @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes at Y|@Gno at Y|@Gauto at Y)@D\n"
-" Enable/disable colored output. The default is @Gauto at D.\n"
-" - at G-" GTEST_FLAG_PREFIX_ "print_time=0 at D\n"
-" Don't print the elapsed time of each test.\n"
-" @G--" GTEST_FLAG_PREFIX_ "output=xml at Y[@G:@YDIRECTORY_PATH at G"
- GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
-" Generate an XML report in the given directory or with the given file\n"
-" name. @YFILE_PATH at D defaults to @Gtest_details.xml at D.\n"
-#if GTEST_CAN_STREAM_RESULTS_
-" @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST at G:@YPORT at D\n"
-" Stream test results to the given server.\n"
-#endif // GTEST_CAN_STREAM_RESULTS_
-"\n"
-"Assertion Behavior:\n"
-#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
-" @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast at Y|@Gthreadsafe at Y)@D\n"
-" Set the default death test style.\n"
-#endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
-" @G--" GTEST_FLAG_PREFIX_ "break_on_failure at D\n"
-" Turn assertion failures into debugger break-points.\n"
-" @G--" GTEST_FLAG_PREFIX_ "throw_on_failure at D\n"
-" Turn assertion failures into C++ exceptions.\n"
-" @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0 at D\n"
-" Do not report exceptions as test failures. Instead, allow them\n"
-" to crash the program or throw a pop-up (on Windows).\n"
-"\n"
-"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests at D, you can alternatively set "
- "the corresponding\n"
-"environment variable of a flag (all letters in upper-case). For example, to\n"
-"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
- "color=no at D or set\n"
-"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR at D environment variable to @Gno at D.\n"
-"\n"
-"For more information, please read the " GTEST_NAME_ " documentation at\n"
-"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
-"(not one in your own code or tests), please report it to\n"
-"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
-
-// Parses the command line for Google Test flags, without initializing
-// other parts of Google Test. The type parameter CharType can be
-// instantiated to either char or wchar_t.
-template <typename CharType>
-void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
- for (int i = 1; i < *argc; i++) {
- const String arg_string = StreamableToString(argv[i]);
- const char* const arg = arg_string.c_str();
-
- using internal::ParseBoolFlag;
- using internal::ParseInt32Flag;
- using internal::ParseStringFlag;
-
- // Do we see a Google Test flag?
- if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
- >EST_FLAG(also_run_disabled_tests)) ||
- ParseBoolFlag(arg, kBreakOnFailureFlag,
- >EST_FLAG(break_on_failure)) ||
- ParseBoolFlag(arg, kCatchExceptionsFlag,
- >EST_FLAG(catch_exceptions)) ||
- ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) ||
- ParseStringFlag(arg, kDeathTestStyleFlag,
- >EST_FLAG(death_test_style)) ||
- ParseBoolFlag(arg, kDeathTestUseFork,
- >EST_FLAG(death_test_use_fork)) ||
- ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) ||
- ParseStringFlag(arg, kInternalRunDeathTestFlag,
- >EST_FLAG(internal_run_death_test)) ||
- ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) ||
- ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) ||
- ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) ||
- ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) ||
- ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) ||
- ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) ||
- ParseInt32Flag(arg, kStackTraceDepthFlag,
- >EST_FLAG(stack_trace_depth)) ||
- ParseStringFlag(arg, kStreamResultToFlag,
- >EST_FLAG(stream_result_to)) ||
- ParseBoolFlag(arg, kThrowOnFailureFlag,
- >EST_FLAG(throw_on_failure))
- ) {
- // Yes. Shift the remainder of the argv list left by one. Note
- // that argv has (*argc + 1) elements, the last one always being
- // NULL. The following loop moves the trailing NULL element as
- // well.
- for (int j = i; j != *argc; j++) {
- argv[j] = argv[j + 1];
- }
-
- // Decrements the argument count.
- (*argc)--;
-
- // We also need to decrement the iterator as we just removed
- // an element.
- i--;
- } else if (arg_string == "--help" || arg_string == "-h" ||
- arg_string == "-?" || arg_string == "/?" ||
- HasGoogleTestFlagPrefix(arg)) {
- // Both help flag and unrecognized Google Test flags (excluding
- // internal ones) trigger help display.
- g_help_flag = true;
- }
- }
-
- if (g_help_flag) {
- // We print the help here instead of in RUN_ALL_TESTS(), as the
- // latter may not be called at all if the user is using Google
- // Test with another testing framework.
- PrintColorEncoded(kColorEncodedHelpMessage);
- }
-}
-
-// Parses the command line for Google Test flags, without initializing
-// other parts of Google Test.
-void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
- ParseGoogleTestFlagsOnlyImpl(argc, argv);
-}
-void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
- ParseGoogleTestFlagsOnlyImpl(argc, argv);
-}
-
-// The internal implementation of InitGoogleTest().
-//
-// The type parameter CharType can be instantiated to either char or
-// wchar_t.
-template <typename CharType>
-void InitGoogleTestImpl(int* argc, CharType** argv) {
- g_init_gtest_count++;
-
- // We don't want to run the initialization code twice.
- if (g_init_gtest_count != 1) return;
-
- if (*argc <= 0) return;
-
- internal::g_executable_path = internal::StreamableToString(argv[0]);
-
-#if GTEST_HAS_DEATH_TEST
-
- g_argvs.clear();
- for (int i = 0; i != *argc; i++) {
- g_argvs.push_back(StreamableToString(argv[i]));
- }
-
-#endif // GTEST_HAS_DEATH_TEST
-
- ParseGoogleTestFlagsOnly(argc, argv);
- GetUnitTestImpl()->PostFlagParsingInit();
-}
-
-} // namespace internal
-
-// Initializes Google Test. This must be called before calling
-// RUN_ALL_TESTS(). In particular, it parses a command line for the
-// flags that Google Test recognizes. Whenever a Google Test flag is
-// seen, it is removed from argv, and *argc is decremented.
-//
-// No value is returned. Instead, the Google Test flag variables are
-// updated.
-//
-// Calling the function for the second time has no user-visible effect.
-void InitGoogleTest(int* argc, char** argv) {
- internal::InitGoogleTestImpl(argc, argv);
-}
-
-// This overloaded version can be used in Windows programs compiled in
-// UNICODE mode.
-void InitGoogleTest(int* argc, wchar_t** argv) {
- internal::InitGoogleTestImpl(argc, argv);
-}
-
-} // namespace testing
diff --git a/unit_tests/gtest/src/gtest_main.cc b/unit_tests/gtest/src/gtest_main.cc
index a09bbe0..f302822 100644
--- a/unit_tests/gtest/src/gtest_main.cc
+++ b/unit_tests/gtest/src/gtest_main.cc
@@ -27,13 +27,12 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <iostream>
+#include <stdio.h>
#include "gtest/gtest.h"
GTEST_API_ int main(int argc, char **argv) {
- std::cout << "Running main() from gtest_main.cc\n";
-
+ printf("Running main() from gtest_main.cc\n");
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
diff --git a/unit_tests/test_allocators_mmap.cc b/unit_tests/test_allocators_mmap.cc
new file mode 100644
index 0000000..09a23fa
--- /dev/null
+++ b/unit_tests/test_allocators_mmap.cc
@@ -0,0 +1,15 @@
+#include <gtest/gtest.h>
+#include <jellyfish/allocators_mmap.hpp>
+
+namespace {
+TEST(AllocMmap, Simple) {
+ static const size_t size = 4096;
+ allocators::mmap mem(size);
+
+ EXPECT_EQ(size, mem.get_size());
+ EXPECT_NE((void*)0, mem.get_ptr());
+ char* ptr = (char*)mem.get_ptr();
+ // char c = ptr[size];
+ // EXPECT_EQ((char)0, c);
+}
+}
diff --git a/unit_tests/test_atomic_bits_array.cc b/unit_tests/test_atomic_bits_array.cc
new file mode 100644
index 0000000..1925a25
--- /dev/null
+++ b/unit_tests/test_atomic_bits_array.cc
@@ -0,0 +1,32 @@
+#include <memory>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/atomic_bits_array.hpp>
+
+namespace {
+TEST(AtomicBitsArray, Fill) {
+ static const size_t size = 2066;
+ static const int bits = 3;
+ jellyfish::atomic_bits_array<unsigned char> ary(bits, size);
+ std::unique_ptr<unsigned char[]> data(new unsigned char[size]);
+
+ for(size_t i = 0; i < size; ++i) {
+ data[i] = random_bits(bits);
+ auto e = ary[i];
+ e.get();
+ EXPECT_TRUE(e.set(data[i]));
+ }
+
+ auto it = ary.begin();
+ auto it_end = ary.end();
+ for(size_t i = 0; i < size; ++i, ++it) {
+ auto e = ary[i];
+ EXPECT_EQ(data[i], e.get());
+ EXPECT_EQ(data[i], (unsigned char)e);
+ ASSERT_NE(it_end, it);
+ EXPECT_EQ(data[i], *it);
+ }
+ EXPECT_EQ(it_end, it);
+}
+}
diff --git a/unit_tests/test_cond.cc b/unit_tests/test_cond.cc
new file mode 100644
index 0000000..787aa1b
--- /dev/null
+++ b/unit_tests/test_cond.cc
@@ -0,0 +1,80 @@
+#include <gtest/gtest.h>
+#include <jellyfish/locks_pthread.hpp>
+
+using testing::Types;
+
+#define NB_THREADS 3
+#define COUNT 1000000
+
+template <class cond>
+class CondTest : public ::testing::Test
+{
+ int volatile count;
+ int count_at_signal;
+ cond count_cond;
+ pthread_t threads[NB_THREADS+1];
+ pthread_attr_t attr;
+
+public:
+ CondTest() : count(0), count_at_signal(0), count_cond() {
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+
+ pthread_create(&threads[0], &attr, master_fun, (void *)this);
+
+ for(int i = 1; i < NB_THREADS+1; i++)
+ pthread_create(&threads[i], &attr, thread_fun, (void *)this);
+
+ for(int i = 0; i <= NB_THREADS; i++)
+ pthread_join(threads[i], NULL);
+ }
+
+ static void *master_fun(void *t) {
+ CondTest<cond> *self = (CondTest<cond> *)t;
+
+ self->master_wait();
+ return NULL;
+ }
+ void master_wait() {
+ count_cond.lock();
+ count_cond.wait();
+ count_at_signal = count;
+ sleep(1);
+ count *= 10;
+ count_cond.unlock();
+ }
+
+ static void *thread_fun(void *t) {
+ CondTest<cond> *self = (CondTest<cond> *)t;
+
+ self->inc();
+ return NULL;
+ }
+
+ void inc() {
+ for(int i = 0; i < COUNT; i++) {
+ count_cond.lock();
+ if(count < 1000000) {
+ count++;
+ if(count > 100000)
+ count_cond.signal();
+ count_cond.unlock();
+ } else {
+ count_cond.unlock();
+ return;
+ }
+ }
+ }
+
+
+ int get_count() { return count; }
+ int get_count_at_signal() { return count_at_signal; }
+};
+
+typedef Types<locks::pthread::cond> Implementations;
+
+TYPED_TEST_CASE(CondTest, Implementations);
+
+TYPED_TEST(CondTest, SuccessfullLocking) {
+ EXPECT_EQ(10 *this->get_count_at_signal(), this->get_count());
+}
diff --git a/unit_tests/test_cooperative_pool2.cc b/unit_tests/test_cooperative_pool2.cc
new file mode 100644
index 0000000..44f4bf3
--- /dev/null
+++ b/unit_tests/test_cooperative_pool2.cc
@@ -0,0 +1,89 @@
+#include <gtest/gtest.h>
+#include <jellyfish/cooperative_pool2.hpp>
+#include <jellyfish/thread_exec.hpp>
+
+namespace {
+// Generate all numbers in [0, producers * max)
+class sequence : public jellyfish::cooperative_pool2<sequence, int> {
+ typedef jellyfish::cooperative_pool2<sequence, int> super;
+
+ const uint32_t max_;
+ std::vector<int> cur_;
+ const uint32_t producers_;
+
+public:
+ std::vector<int> check_;
+ sequence(uint32_t producers, uint32_t threads, uint32_t max) :
+ super(producers, 3 * threads),
+ max_(max),
+ cur_(producers, 0),
+ producers_(producers),
+ check_(max * producers, 0)
+ { }
+
+ bool produce(uint32_t i, int& e) {
+ assert(i < producers_);
+ int& cur = cur_[i];
+ if(cur < max_) {
+ e = i * max_ + cur++;
+ __sync_add_and_fetch(&check_[e], 1);
+ return false;
+ }
+ return true;
+ }
+};
+
+class list_ints : public jellyfish::thread_exec {
+ sequence seq_;
+ std::vector<int> check_;
+public:
+ list_ints(uint32_t producers, uint32_t threads, uint32_t max) : seq_(producers, threads, max), check_(producers * max, 0) { }
+ virtual void start(int i) {
+ while(true) {
+ sequence::job j(seq_);
+ if(j.is_empty())
+ break;
+ ++check_[*j];
+ }
+ }
+
+ bool check() const {
+ for(auto it = check_.cbegin(); it != check_.cend(); ++it)
+ if(*it != 1)
+ return false;
+ return true;
+ }
+
+ bool check_print() const {
+ if(check())
+ return true;
+
+ for(auto it = check_.cbegin(); it != check_.cend(); ++it)
+ printf("%d", *it);
+ printf("\n----------\n");
+ for(auto it = seq_.check_.cbegin(); it != seq_.check_.cend(); ++it)
+ printf("%d", *it);
+ printf("\n");
+ return false;
+ }
+};
+
+class CooperativePoolTest : public ::testing::TestWithParam<uint32_t> {
+public:
+ static const uint32_t nb_threads = 10;
+ CooperativePoolTest() : workers(GetParam(), nb_threads, 1000) { }
+
+protected:
+ list_ints workers;
+};
+
+TEST_P(CooperativePoolTest, Ints) {
+ workers.exec_join(nb_threads);
+ EXPECT_TRUE(workers.check_print());
+}
+
+INSTANTIATE_TEST_CASE_P(CooperativePool,
+ CooperativePoolTest,
+ ::testing::Range((uint32_t)1, CooperativePoolTest::nb_threads + 1));
+
+} // namespace {
diff --git a/unit_tests/test_dumpers.cc b/unit_tests/test_dumpers.cc
new file mode 100644
index 0000000..3fd0623
--- /dev/null
+++ b/unit_tests/test_dumpers.cc
@@ -0,0 +1,144 @@
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/hash_counter.hpp>
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/binary_dumper.hpp>
+#include <jellyfish/text_dumper.hpp>
+#include <jellyfish/mapped_file.hpp>
+
+namespace {
+using jellyfish::mer_dna;
+using jellyfish::file_header;
+typedef jellyfish::cooperative::hash_counter<mer_dna> hash_counter;
+typedef hash_counter::array::eager_iterator iterator;
+
+struct binary {
+ typedef jellyfish::binary_dumper<hash_counter::array> dumper;
+ typedef jellyfish::binary_reader<mer_dna, uint64_t> reader;
+ typedef jellyfish::binary_query_base<mer_dna, uint64_t> query;
+};
+struct text {
+ typedef jellyfish::text_dumper<hash_counter::array> dumper;
+ typedef jellyfish::text_reader<mer_dna, uint64_t> reader;
+};
+
+
+TEST(Dumper, IO) {
+ static const int mer_len = 50;
+ static const int hash_size = 5000;
+ static const int nb = hash_size;
+ static const int hash_val_len = 5;
+ static const int dump_counter_len = 1;
+ static const char* file_binary = "./binary_dumper";
+ static const char* file_text = "./text_dumper";
+
+ file_unlink bf(file_binary);
+ file_unlink tf(file_text);
+
+ mer_dna::k(mer_len);
+ hash_counter hash(hash_size, mer_len * 2, 5 /* val len */, 1 /* nb threads */);
+
+ mer_dna m;
+ for(int i = 0; i < nb; i++) {
+ m.randomize();
+ const uint64_t rval = random_bits(9);
+ hash.add(m, rval);
+ uint64_t val;
+ ASSERT_TRUE(hash.ary()->get_val_for_key(m, &val));
+ EXPECT_EQ(rval, val);
+ }
+
+ // Dump without zeroing to check dumped content against in memory hash
+ {
+ file_header bh;
+ bh.fill_standard();
+ bh.update_from_ary(*hash.ary());
+ binary::dumper bd(dump_counter_len, mer_len * 2, 4, file_binary, &bh);
+ bd.one_file(true);
+ bd.zero_array(false);
+ bd.dump(hash.ary());
+
+ file_header th;
+ th.fill_standard();
+ th.update_from_ary(*hash.ary());
+ text::dumper td(4, file_text, &th);
+ td.one_file(true);
+ td.zero_array(false);
+ td.dump(hash.ary());
+ }
+
+ // Check dumped content
+ {
+ file_header bh;
+ std::ifstream bis(file_binary);
+ bh.read(bis);
+ EXPECT_STREQ(binary::dumper::format, bh.format().c_str());
+ EXPECT_EQ(dump_counter_len, bh.counter_len());
+ binary::reader br(bis, &bh);
+
+ jellyfish::mapped_file binary_map(file_binary);
+ binary::query bq(binary_map.base() + bh.offset(), bh.key_len(), bh.counter_len(), bh.matrix(),
+ bh.size() - 1, binary_map.length() - bh.offset());
+
+ file_header th;
+ std::ifstream tis(file_text);
+ th.read(tis);
+ EXPECT_STREQ(binary::dumper::format, bh.format().c_str());
+ text::reader tr(tis, &th);
+
+ const uint64_t max_val = ((uint64_t)1 << (8 * dump_counter_len)) - 1;
+ int bcount = 0, tcount = 0, qcount = 0;
+ mer_dna tmp_key;
+ while(br.next()) {
+ uint64_t val = 0;
+ size_t id = 0;
+ bool present = hash.ary()->get_val_for_key(br.key(), &val, tmp_key, &id);
+ EXPECT_TRUE(present);
+ if(present) {
+ EXPECT_EQ(std::min(max_val, val), br.val());
+ ++bcount;
+ }
+
+ EXPECT_TRUE(tr.next());
+ present = hash.ary()->get_val_for_key(tr.key(), &val);
+ EXPECT_TRUE(present);
+ if(present) {
+ EXPECT_EQ(val, tr.val());
+ ++tcount;
+ }
+
+ uint64_t query_val;
+ uint64_t query_id;
+ present = bq.val_id(br.key(), &query_val, &query_id);
+ EXPECT_TRUE(present);
+ if(present) {
+ EXPECT_EQ(std::min(max_val, val), query_val);
+ // EXPECT_EQ(id, query_id);
+ ++qcount;
+ }
+ }
+ EXPECT_EQ(nb, bcount);
+ EXPECT_EQ(nb, tcount);
+ EXPECT_EQ(nb, qcount);
+ }
+
+ // Dump with zeroing and check hash is empty
+ {
+ file_header bh;
+ bh.fill_standard();
+ bh.update_from_ary(*hash.ary());
+ binary::dumper bd(dump_counter_len, mer_len * 2, 4, file_binary, &bh);
+ bd.one_file(true);
+ bd.zero_array(true);
+ bd.dump(hash.ary());
+ }
+ {
+ iterator it = hash.ary()->eager_slice(0, 1);
+ uint64_t count = 0;
+ while(it.next()) ++count;
+ EXPECT_EQ((uint64_t)0, count);
+ }
+}
+
+} // namespace {
diff --git a/unit_tests/test_file_header.cc b/unit_tests/test_file_header.cc
new file mode 100644
index 0000000..b635c4a
--- /dev/null
+++ b/unit_tests/test_file_header.cc
@@ -0,0 +1,90 @@
+#include <iostream>
+#include <sstream>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/file_header.hpp>
+#include <jellyfish/storage.hpp>
+
+namespace {
+using jellyfish::file_header;
+using jellyfish::RectangularBinaryMatrix;
+using std::ostringstream;
+using std::istringstream;
+using std::string;
+
+TEST(FileHeader, Standard) {
+ file_header h;
+
+ EXPECT_EQ("", h["hostname"]);
+ EXPECT_EQ("", h["pwd"]);
+ EXPECT_EQ("", h["time"]);
+ EXPECT_EQ("", h["exe_path"]);
+
+ h.fill_standard();
+
+ EXPECT_NE("", h["hostname"]);
+ EXPECT_NE("", h["pwd"]);
+ EXPECT_NE("", h["time"]);
+ EXPECT_NE("", h["exe_path"]);
+}
+
+TEST(FileHeader, WriteRead) {
+ file_header hw;
+ ostringstream os;
+ os.fill('A');
+ os.width(20);
+ os << std::hex;
+ std::ios::fmtflags flags = os.flags();
+ const size_t random_size = random_bits(35);
+ const unsigned int val_len = random_bits(4);
+ const unsigned int max_reprobe = random_bits(7);
+ const double fpr = (double)random_bits(10) / 1024.0;
+ RectangularBinaryMatrix m(random_bits(6) + 1, random_bits(8) + 1);
+ m.randomize(random_bits);
+
+ EXPECT_EQ(8, hw.alignment());
+ hw.fill_standard();
+ hw.size(random_size);
+ hw.matrix(m);
+ hw.key_len(m.r());
+ hw.val_len(val_len);
+ hw.max_reprobe(max_reprobe);
+ hw.set_reprobes(jellyfish::quadratic_reprobes);
+ hw.fpr(fpr);
+ hw.write(os);
+ EXPECT_EQ(0, os.tellp() % 8);
+ EXPECT_EQ('A', os.fill());
+ EXPECT_EQ(20, os.width());
+ EXPECT_EQ(flags, os.flags());
+ os.width(0);
+ const string ah("After header");
+ os << ah;
+
+ // std::cerr << os.str() << "\n";
+ istringstream is(os.str());
+
+ file_header hr;
+ EXPECT_TRUE(hr.read(is));
+ EXPECT_EQ(is.tellg(), hr.offset());
+ EXPECT_EQ(0, is.tellg() % 8);
+ EXPECT_EQ(8, hr.alignment());
+ EXPECT_EQ(random_size, hr.size());
+ EXPECT_EQ(m, hr.matrix());
+ EXPECT_EQ(m.r(), hr.key_len());
+ EXPECT_EQ(val_len, hr.val_len());
+ EXPECT_EQ(fpr, hr.fpr());
+
+ size_t reprobes[max_reprobe + 1];
+ hr.get_reprobes(reprobes);
+ for(unsigned int i = 0; i <= max_reprobe; ++i)
+ EXPECT_EQ(jellyfish::quadratic_reprobes[i], reprobes[i]);
+
+ // Not sure why the following fails. But all the fields come out
+ // equal so ignore for now
+ // EXPECT_EQ(hw, hr);
+ string line;
+ getline(is, line);
+ EXPECT_EQ(ah, line);
+}
+} // namespace {
diff --git a/unit_tests/test_generator_manager.cc b/unit_tests/test_generator_manager.cc
new file mode 100644
index 0000000..f13445b
--- /dev/null
+++ b/unit_tests/test_generator_manager.cc
@@ -0,0 +1,95 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <fstream>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/generator_manager.hpp>
+
+namespace {
+static const int nb_pipes = 5;
+TEST(TmpPipes, CreateDestroy) {
+ std::vector<std::string> pipe_paths;
+
+ {
+ jellyfish::tmp_pipes pipes(nb_pipes);
+ EXPECT_EQ(nb_pipes, pipes.size());
+ for(int i = 0; i < nb_pipes; ++i) {
+ struct stat buf;
+ ASSERT_EQ(0, stat(pipes[i], &buf));
+ EXPECT_TRUE(S_ISFIFO(buf.st_mode));
+ pipe_paths.push_back(pipes[i]);
+ }
+ }
+
+ for(auto it = pipe_paths.begin(); it != pipe_paths.end(); ++it) {
+ struct stat buf;
+ EXPECT_EQ(-1, stat(it->c_str(), &buf));
+ }
+}
+
+TEST(TmpPipes, Discard) {
+ jellyfish::tmp_pipes pipes(nb_pipes);
+ for(int i = 0; i < nb_pipes; ++i) {
+ ASSERT_STRNE("", pipes[i]);
+ std::string path(pipes[i]);
+ int fd = open(path.c_str(), O_RDONLY|O_NONBLOCK);
+ ASSERT_NE(-1, fd);
+ pipes.discard(i);
+
+ EXPECT_STREQ("", pipes[i]);
+ struct stat buf;
+ EXPECT_EQ(-1, stat(path.c_str(), &buf));
+ char rbuf[1];
+ EXPECT_EQ((ssize_t)0, read(fd, rbuf, 1));
+ close(fd);
+ }
+}
+
+TEST(GeneratorManager, OneLiners) {
+ static const char* cmds_file = "./cmds_file";
+ file_unlink unlink_cmds(cmds_file);
+
+ {
+ std::ofstream cmds(cmds_file, std::ios::out|std::ios::trunc);
+ ASSERT_TRUE(cmds.good()) << "Failed to open cmd file '" << cmds_file << "'";
+ cmds << "echo hello\n"
+ << "date\n"
+ << "uptime\n"
+ << "uname\n";
+ ASSERT_TRUE(cmds.good()) << "Failed to write to cmd file";
+ }
+
+ std::ifstream cmds(cmds_file);
+ ASSERT_TRUE(cmds.good()) << "Failed top open cmd file '" << cmds_file << "'";
+ static const int nb_pipes = 2;
+ int active_pipes = nb_pipes;
+ bool active[nb_pipes];
+ jellyfish::generator_manager manager(cmds_file, nb_pipes);
+ manager.start();
+ for(int i = 0; i < nb_pipes; ++i)
+ active[i] = true;
+ std::vector<std::string> lines;
+ while(active_pipes > 0) {
+ for(int i = 0; i < nb_pipes; ++i) {
+ if(!active[i])
+ continue;
+ std::ifstream p(manager.pipes()[i]);
+ if(!p.good()) {
+ active[i] = false;
+ --active_pipes;
+ continue;
+ }
+ std::string line;
+ while(std::getline(p, line))
+ lines.push_back(line);
+ }
+ }
+ EXPECT_TRUE(manager.wait());
+
+ EXPECT_EQ((size_t)4, lines.size());
+}
+}
diff --git a/unit_tests/test_hash_counter.cc b/unit_tests/test_hash_counter.cc
new file mode 100644
index 0000000..08909d4
--- /dev/null
+++ b/unit_tests/test_hash_counter.cc
@@ -0,0 +1,104 @@
+#include <gtest/gtest.h>
+#include <jellyfish/hash_counter.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/mer_dna.hpp>
+#include <map>
+#include <vector>
+#include <limits>
+
+namespace {
+using jellyfish::thread_exec;
+using jellyfish::mer_dna;
+typedef jellyfish::cooperative::hash_counter<mer_dna> hash_counter;
+typedef hash_counter::array::lazy_iterator lazy_iterator;
+
+enum OPERATION { ADD, SET };
+
+class hash_adder : public thread_exec {
+ typedef std::map<mer_dna, uint64_t> map;
+ typedef std::vector<map> maps;
+
+ hash_counter& hash_;
+ int nb_;
+ maps check_;
+ OPERATION op_;
+
+public:
+ hash_adder(hash_counter& hash, int nb, int nb_threads, OPERATION op) :
+ hash_(hash),
+ nb_(nb),
+ check_(nb_threads),
+ op_(op)
+ { }
+ void start(int id) {
+ mer_dna m;
+ map& my_map = check_[id];
+
+ for(int i = 0; i < nb_; ++i) {
+ m.randomize();
+ switch(op_) {
+ case ADD:
+ hash_.add(m, std::numeric_limits<uint64_t>::max());
+ break;
+ case SET:
+ hash_.set(m);
+ break;
+ }
+
+ my_map[m] = std::numeric_limits<uint64_t>::max();
+ }
+
+ hash_.done();
+ }
+
+ uint64_t val(const mer_dna& m) {
+ uint64_t res = 0;
+ for(maps::const_iterator it = check_.begin(); it < check_.end(); ++it) {
+ map::const_iterator vit = (*it).find(m);
+ if(vit != it->end())
+ res += vit->second;
+ }
+ return res;
+ }
+};
+
+TEST(HashCounterCooperative, SizeDouble) {
+ static const int mer_len = 35;
+ static const int nb_threads = 5;
+ static const int nb = 200;
+ static const size_t init_size = 128;
+ mer_dna::k(mer_len);
+
+ {
+ hash_counter hash(init_size, mer_len * 2, 5, nb_threads);
+ EXPECT_TRUE(hash.do_size_doubling());
+ EXPECT_EQ(mer_len * 2, hash.key_len());
+ EXPECT_EQ(5, hash.val_len());
+
+ hash_adder adder(hash, nb, nb_threads, ADD);
+ adder.exec_join(nb_threads);
+
+ lazy_iterator it = hash.ary()->iterator_all<lazy_iterator>();
+ while(it.next())
+ EXPECT_EQ(adder.val(it.key()), it.val());
+ EXPECT_LT((size_t)(nb_threads * nb), hash.size());
+ }
+
+ {
+ hash_counter hash(init_size, mer_len * 2, 0, nb_threads);
+ EXPECT_TRUE(hash.do_size_doubling());
+ EXPECT_EQ(mer_len * 2, hash.key_len());
+ EXPECT_EQ(0, hash.val_len());
+
+ hash_adder adder(hash, nb, nb_threads, SET);
+ adder.exec_join(nb_threads);
+
+ lazy_iterator it = hash.ary()->iterator_all<lazy_iterator>();
+ while(it.next()) {
+ SCOPED_TRACE(::testing::Message() << "mer:" << it.key());
+ EXPECT_EQ(0, it.val());
+ }
+ EXPECT_LT((size_t)(nb_threads * nb), hash.size());
+ }
+}
+} // namespace {
diff --git a/unit_tests/test_int128.cc b/unit_tests/test_int128.cc
new file mode 100644
index 0000000..f0b5c1b
--- /dev/null
+++ b/unit_tests/test_int128.cc
@@ -0,0 +1,34 @@
+#include <gtest/gtest.h>
+#include <config.h>
+
+#ifdef HAVE_INT128
+#include <limits>
+#include <jellyfish/int128.hpp>
+
+namespace {
+TEST(Int128, Specialized) {
+ // This is supposed to be true, whether it is specialized by gcc or
+ // in int128.hpp above.
+ EXPECT_TRUE(std::numeric_limits<__int128>::is_specialized);
+ EXPECT_TRUE(std::numeric_limits<unsigned __int128>::is_specialized);
+}
+
+TEST(Int128, Max) {
+ static const __int128 sone = 1;
+ static const unsigned __int128 uone = 1;
+ __int128 sm = std::numeric_limits<__int128>::max();
+ unsigned __int128 um = std::numeric_limits<unsigned __int128>::max();
+
+ for(int i = 0; i < 127; ++i, sm >>= 1, um >>= 1) {
+ EXPECT_EQ(1, (int)(sm & sone));
+ EXPECT_EQ(1, (int)(um & uone));
+ EXPECT_EQ(1, (int)((std::numeric_limits<__int128>::max() >> i) & sone));
+ EXPECT_EQ(1, (int)((std::numeric_limits<unsigned __int128>::max() >> i) & uone));
+ }
+
+ EXPECT_EQ(0, (int)sm);
+ EXPECT_EQ(1, (int)um);
+}
+} // namespace
+
+#endif // HAVE_INT128
diff --git a/unit_tests/test_large_block.cc b/unit_tests/test_large_block.cc
new file mode 100644
index 0000000..7787445
--- /dev/null
+++ b/unit_tests/test_large_block.cc
@@ -0,0 +1,33 @@
+#include <gtest/gtest.h>
+#include <allocators_malloc.hpp>
+#include <allocators_mmap.hpp>
+#include <allocators_shm.hpp>
+
+using testing::Types;
+
+#define SMALL_SIZE ((size_t)4096)
+template <class large_block>
+class LargeBlockTest : public ::testing::Test
+{
+public:
+ large_block block;
+
+ LargeBlockTest() : block(SMALL_SIZE) {}
+ void *double_size() {
+ return block.realloc(block.get_size() * 2);
+ }
+};
+
+typedef Types<allocators::malloc, allocators::mmap, allocators::shm> Implementations;
+
+TYPED_TEST_CASE(LargeBlockTest, Implementations);
+
+TYPED_TEST(LargeBlockTest, SuccessfulAllocation) {
+ EXPECT_NE((void *)0, this->block.get_ptr());
+ EXPECT_EQ(SMALL_SIZE, this->block.get_size());
+ void *new_ptr = this->double_size();
+ EXPECT_NE((void *)0, new_ptr);
+ EXPECT_NE((void *)0, this->block.get_ptr());
+ EXPECT_EQ(new_ptr, this->block.get_ptr());
+ EXPECT_EQ(SMALL_SIZE * 2, this->block.get_size());
+}
diff --git a/unit_tests/test_large_hash_array.cc b/unit_tests/test_large_hash_array.cc
new file mode 100644
index 0000000..e95e1fe
--- /dev/null
+++ b/unit_tests/test_large_hash_array.cc
@@ -0,0 +1,346 @@
+#include <sys/types.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include <map>
+#include <vector>
+#include <limits>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+
+#include <jellyfish/large_hash_array.hpp>
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/atomic_gcc.hpp>
+#include <jellyfish/allocators_mmap.hpp>
+
+void PrintTo(jellyfish::mer_dna& m, ::std::ostream* os) {
+ *os << m.to_str();
+}
+
+namespace {
+typedef jellyfish::large_hash::array<jellyfish::mer_dna> large_array;
+typedef std::map<jellyfish::mer_dna, uint64_t> mer_map;
+typedef std::set<jellyfish::mer_dna> mer_set;
+
+using jellyfish::RectangularBinaryMatrix;
+using jellyfish::mer_dna;
+using std::numeric_limits;
+
+typedef large_array::iterator stl_iterator;
+typedef large_array::eager_iterator eager_iterator;
+typedef large_array::lazy_iterator lazy_iterator;
+typedef large_array::region_iterator region_iterator;
+
+// Tuple is {key_len, val_len, reprobe_len}.
+class HashArray : public ::testing::TestWithParam< ::std::tr1::tuple<int,int, int> >
+{
+public:
+ static const size_t ary_lsize = 10;
+ static const size_t ary_size = (size_t)1 << ary_lsize;
+ static const size_t ary_size_mask = ary_size - 1;
+ const int key_len, val_len, reprobe_len, reprobe_limit;
+ large_array ary;
+
+ HashArray() :
+ key_len(::std::tr1::get<0>(GetParam())),
+ val_len(::std::tr1::get<1>(GetParam())),
+ reprobe_len(::std::tr1::get<2>(GetParam())),
+ reprobe_limit((1 << reprobe_len) - 2),
+ ary(ary_size, key_len, val_len, reprobe_limit)
+ { }
+
+ void SetUp() {
+ jellyfish::mer_dna::k(key_len / 2);
+ }
+
+ ~HashArray() { }
+};
+
+TEST_P(HashArray, OneElement) {
+ mer_dna m, m2, get_mer;
+
+ SCOPED_TRACE(::testing::Message() << "key_len:" << key_len << " val_len:" << val_len << " reprobe:" << reprobe_limit);
+
+ EXPECT_EQ((unsigned int)ary_lsize, ary.matrix().r());
+ EXPECT_EQ((unsigned int)key_len, ary.matrix().c());
+
+ size_t start_pos = random() % (ary_size - bsizeof(uint64_t));
+ size_t mask = (size_t)key_len >= bsizeof(size_t) ? (size_t)-1 : ((size_t)1 << key_len) - 1;
+ for(uint64_t i = start_pos; i < start_pos + bsizeof(uint64_t); ++i) {
+ SCOPED_TRACE(::testing::Message() << "i:" << i);
+ // Create mer m so that it will hash to position i
+ m.randomize();
+ m2 = m;
+ m2.set_bits(0, ary.matrix().r(), (uint64_t)i);
+ m.set_bits(0, ary.matrix().r(), ary.inverse_matrix().times(m2));
+
+ // Add this one element to the hash
+ ary.clear();
+ bool is_new = false;
+ size_t id = (size_t)-1;
+ unsigned int carry_shift = 0;
+ EXPECT_TRUE(ary.add(m, i, &carry_shift, &is_new, &id));
+ EXPECT_TRUE(is_new);
+ // Only expected to agree on the length of the key. Applies only
+ // if key_len < lsize. The bits above key_len are pseudo-random
+ EXPECT_EQ((size_t)i & mask, id & mask);
+
+ // Every position but i in the hash should be empty
+ uint64_t val;
+ for(ssize_t j = -bsizeof(uint64_t); j <= (ssize_t)bsizeof(uint64_t); ++j) {
+ SCOPED_TRACE(::testing::Message() << "j:" << j);
+ val = (uint64_t)-1;
+ size_t jd = (start_pos + j) & ary_size_mask;
+ ASSERT_EQ(jd == id, ary.get_key_val_at_id(jd, get_mer, val) == large_array::FILLED);
+ if(jd == id) {
+ ASSERT_EQ(m2, get_mer);
+ ASSERT_EQ((uint64_t)jd, val);
+ }
+ }
+ }
+}
+
+TEST_P(HashArray, Collisions) {
+ static const int nb_collisions = 4;
+ std::vector<mer_dna> mers(nb_collisions);
+ std::vector<mer_dna> mers2(nb_collisions);
+ std::map<mer_dna, uint64_t> map;
+ ASSERT_EQ((unsigned int)key_len / 2, mer_dna::k());
+
+ SCOPED_TRACE(::testing::Message() << "key_len:" << key_len << " val_len:" << val_len << " reprobe:" << reprobe_limit);
+
+ mers[0].polyA(); mers2[0].polyA();
+ mers[1].polyC(); mers2[1].polyC();
+ mers[2].polyG(); mers2[2].polyG();
+ mers[3].polyT(); mers2[3].polyT();
+
+ size_t start_pos = random() % (ary_size - bsizeof(uint64_t));
+ for(uint64_t i = start_pos; i < start_pos + bsizeof(uint64_t); ++i) {
+ SCOPED_TRACE(::testing::Message() << "i:" << i);
+ ary.clear();
+ map.clear();
+
+ // Add mers that it will all hash to position i
+ for(int j = 0; j < nb_collisions; ++j) {
+ mers2[j].set_bits(0, ary.matrix().r(), (uint64_t)i);
+ mers[j].set_bits(0, ary.matrix().r(), ary.inverse_matrix().times(mers2[j]));
+ ary.add(mers[j], j);
+ map[mers[j]] += j;
+ }
+
+ lazy_iterator it = ary.iterator_all<lazy_iterator>();
+ size_t count = 0;
+ while(it.next()) {
+ SCOPED_TRACE(::testing::Message() << "it.key():" << it.key());
+ ASSERT_FALSE(map.end() == map.find(it.key()));
+ EXPECT_EQ(map[it.key()], it.val());
+ ++count;
+ }
+ EXPECT_EQ(map.size(), count);
+ }
+}
+
+struct arrays_type {
+ large_array array;
+ mer_map map;
+ arrays_type(size_t size, uint16_t key_len, uint16_t val_len, uint16_t reprobe_limit) :
+ array(size, key_len, val_len, reprobe_limit), map()
+ { }
+};
+
+typedef std::unique_ptr<arrays_type> arrays_ptr;
+arrays_ptr fill_array(size_t nb_elts, size_t size, int key_len, int val_len, int reprobe_limit) {
+ arrays_ptr arrays(new arrays_type(size, key_len, val_len, reprobe_limit));
+ large_array& ary = arrays->array;
+ mer_map& map = arrays->map;
+
+ mer_dna mer;
+ for(int i = 0; i < nb_elts; ++i) {
+ SCOPED_TRACE(::testing::Message() << "i:" << i);
+ mer.randomize();
+ map[mer] += i;
+ // If get false, hash array filled up: double size
+ bool res = ary.add(mer, i);
+ if(!res) {
+ // std::cerr << "Double size (" << size << " -> " << (2 * size) << ") nb_elts:" << nb_elts
+ // << " key_len:" << key_len << " val_len:" << val_len
+ // << " mer:" << mer << std::endl;
+ // return std::make_pair(std::move(ary), std::move(map));
+ return fill_array(nb_elts, 2 * size, key_len, val_len, reprobe_limit);
+ }
+ }
+ return arrays;
+}
+
+TEST_P(HashArray, Iterator) {
+ static const int nb_elts = 1 << (ary_lsize - 1 - (val_len == 1));
+ SCOPED_TRACE(::testing::Message() << "key_len:" << key_len << " val_len:" << val_len << " reprobe:" << reprobe_limit);
+
+ arrays_ptr res = fill_array(nb_elts, ary_size, key_len, val_len, reprobe_limit);
+ large_array& ary = res->array;
+ mer_map & map = res->map;
+
+ eager_iterator it = ary.iterator_all<eager_iterator>();
+ lazy_iterator lit = ary.iterator_all<lazy_iterator>();
+ stl_iterator stl_it = ary.iterator_all<stl_iterator>();
+ int count = 0;
+ for( ; it.next(); ++stl_it) {
+ ASSERT_TRUE(lit.next());
+ ASSERT_NE(ary.end(), stl_it);
+ mer_map::const_iterator mit = map.find(it.key());
+ SCOPED_TRACE(::testing::Message() << "key:" << it.key());
+ ASSERT_NE(map.end(), mit);
+ EXPECT_EQ(mit->first, it.key());
+ EXPECT_EQ(mit->second, it.val());
+ EXPECT_EQ(mit->first, lit.key());
+ EXPECT_EQ(mit->second, lit.val());
+ EXPECT_EQ(mit->first, stl_it->first);
+ EXPECT_EQ(mit->second, stl_it->second);
+ EXPECT_EQ(it.id(), lit.id());
+ EXPECT_EQ(it.id(), stl_it.id());
+ ++count;
+ }
+ EXPECT_FALSE(lit.next());
+ EXPECT_EQ(ary.end(), stl_it);
+ EXPECT_EQ(map.size(), (size_t)count);
+
+ count = 0;
+ const int nb_slices = 1;
+ for(int i = 0; i < nb_slices; ++i) {
+ SCOPED_TRACE(::testing::Message() << "slice:" << i << " nb_slices:" << nb_slices);
+ region_iterator rit = ary.iterator_slice<region_iterator>(i, nb_slices);
+ while(rit.next()) {
+ ASSERT_GE(rit.oid(), rit.start());
+ ASSERT_LT(rit.oid(), rit.end());
+ mer_map::const_iterator mit = map.find(rit.key());
+ ASSERT_NE(map.end(), mit);
+ EXPECT_EQ(mit->first, rit.key());
+ EXPECT_EQ(mit->second, rit.val());
+ ++count;
+ }
+ }
+ EXPECT_EQ(map.size(), (size_t)count);
+
+ int i = 0;
+ for(mer_map::const_iterator it = map.begin(); it != map.end(); ++it, ++i) {
+ SCOPED_TRACE(::testing::Message() << "i:" << i << " key:" << it->first);
+ uint64_t val;
+ size_t id;
+ EXPECT_TRUE(ary.get_key_id(it->first, &id));
+ ASSERT_TRUE(ary.get_val_for_key(it->first, &val));
+ EXPECT_EQ(it->second, val);
+ }
+}
+
+TEST_P(HashArray, LargeValue) {
+ mer_dna mer;
+ mer.randomize();
+ ary.add(mer, numeric_limits<uint64_t>::max());
+
+ uint64_t val = 0;
+ ASSERT_TRUE(ary.get_val_for_key(mer, &val));
+ ASSERT_EQ(numeric_limits<uint64_t>::max(), val);
+}
+
+INSTANTIATE_TEST_CASE_P(HashArrayTest, HashArray, ::testing::Combine(::testing::Range(8, 4 * 64, 2), // Key lengths
+ ::testing::Range(1, 10), // Val lengths
+ ::testing::Range(6, 8) // Reprobe lengths
+ ));
+
+TEST(Hash, Set) {
+ static const int lsize = 16;
+ static const int size = 1 << lsize;
+ static const int nb_elts = 2 * size / 3;
+
+ large_array ary(size, 100, 0, 126);
+ mer_set set;
+ mer_dna::k(50);
+ mer_dna mer;
+
+ for(int i = 0; i < nb_elts; ++i) {
+ mer.randomize();
+ bool is_new;
+ size_t id;
+ ASSERT_TRUE(ary.set(mer, &is_new, &id));
+ ASSERT_EQ(set.insert(mer).second, is_new);
+ }
+
+ mer_dna tmp_mer;
+ for(mer_set::const_iterator it = set.begin(); it != set.end(); ++it) {
+ SCOPED_TRACE(::testing::Message() << "key:" << *it);
+ size_t id;
+ EXPECT_TRUE(ary.get_key_id(*it, &id, tmp_mer));
+ }
+
+ for(int i = 0; i < nb_elts; ++i) {
+ mer.randomize();
+ size_t id;
+ EXPECT_EQ(set.find(mer) != set.end(), ary.get_key_id(mer, &id));
+ }
+}
+
+TEST(Hash, Update) {
+ static const int lsize = 16;
+ static const int size = 1 << lsize;
+ static const int nb_elts = 2 * size / 3;
+
+ large_array ary(size, 100, 4, 126);
+ mer_map in_ary;
+ mer_dna::k(50);
+ mer_dna mer;
+
+ for(int i = 0; i < nb_elts; ++i) {
+ mer.randomize();
+ bool is_new;
+ size_t id;
+ ASSERT_TRUE(ary.set(mer, &is_new, &id));
+ auto res = in_ary.insert(std::make_pair(mer, (uint64_t)0));
+ ASSERT_EQ(res.second, is_new);
+ }
+
+ for(auto it = in_ary.begin(); it != in_ary.end(); ++it) {
+ uint64_t val = random_bits(4);
+ EXPECT_TRUE(ary.update_add(it->first, val));
+ it->second = val;
+ }
+
+ for(int i = 0; i < nb_elts; ++i) {
+ mer.randomize();
+ uint64_t val = random_bits(4);
+ auto it = in_ary.find(mer);
+ if(it == in_ary.end()) {
+ EXPECT_FALSE(ary.update_add(mer, val));
+ } else {
+ it->second += val;
+ EXPECT_TRUE(ary.update_add(mer, val));
+ }
+ }
+
+ lazy_iterator it = ary.iterator_all<lazy_iterator>();
+ size_t count = 0;
+ while(it.next()) {
+ ASSERT_NE(in_ary.end(), in_ary.find(it.key()));
+ EXPECT_EQ(in_ary[it.key()], it.val());
+ ++count;
+ }
+ EXPECT_EQ(in_ary.size(), count);
+}
+
+TEST(Hash, Info) {
+ for(int iteration = 0; iteration < 100; ++iteration) {
+ size_t mem = random_bits(48);
+ uint16_t key_len = random_bits(7) + 1;
+ uint16_t val_len = random_bits(4) + 1;
+ large_array::usage_info info(key_len, val_len, 126);
+
+ SCOPED_TRACE(::testing::Message() << "iteration:" << iteration << " mem:" << mem
+ << " key_len:" << key_len << " val_len:" << val_len);
+ uint16_t size_bits = info.size_bits(mem);
+ uint16_t size2_bits = info.size_bits_linear(mem);
+ ASSERT_EQ(size2_bits, size_bits);
+ ASSERT_LE(info.mem((size_t)1 << size_bits), mem);
+ ASSERT_GT(info.mem((size_t)1 << (size_bits + 1)), mem);
+ }
+}
+}
diff --git a/unit_tests/test_main.cc b/unit_tests/test_main.cc
new file mode 100644
index 0000000..6363cff
--- /dev/null
+++ b/unit_tests/test_main.cc
@@ -0,0 +1,67 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdlib.h>
+#include <iostream>
+#include <fstream>
+#include <gtest/gtest.h>
+#include <unit_tests/test_main_cmdline.hpp>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/backtrace.hpp>
+
+template<long int n>
+struct floorLog2 {
+ static const int val = floorLog2<n / 2>::val + 1;
+};
+template<>
+struct floorLog2<1> {
+ static const int val = 0;
+};
+
+// Return length random bits. 1 <= length <= 64
+uint64_t random_bits(int length) {
+ uint64_t res = 0;
+ for(int i = 0; i < length; i += floorLog2<RAND_MAX>::val)
+ res ^= (uint64_t)random() << i;
+ return res & ((uint64_t)-1 >> (64 - length));
+}
+
+
+int main(int argc, char *argv[]) {
+ ::testing::InitGoogleTest(&argc, argv);
+ cmdline_parse args(argc, argv);
+
+ unsigned int seed;
+ if(args.seed_given) {
+ seed = args.seed_arg;
+ } else {
+ std::ifstream urandom("/dev/urandom");
+ urandom.read((char*)&seed, sizeof(seed));
+ if(!urandom.good()) {
+ std::cerr << "Failed to read random seed" << std::endl;
+ return 1;
+ }
+ }
+ if(args.backtrace_flag) {
+ show_backtrace();
+ setenv("GTEST_CATCH_EXCEPTIONS", "0", 1);
+ }
+
+ std::cout << "Using random seed " << seed << std::endl;
+ srandom(seed);
+
+ return RUN_ALL_TESTS();
+}
diff --git a/unit_tests/test_main.hpp b/unit_tests/test_main.hpp
new file mode 100644
index 0000000..58ecb4d
--- /dev/null
+++ b/unit_tests/test_main.hpp
@@ -0,0 +1,26 @@
+#ifndef __TEST_MAIN_HPP__
+#define __TEST_MAIN_HPP__
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <string>
+
+uint64_t random_bits(int length);
+inline uint64_t random_bits() { return random_bits(64); }
+
+struct file_unlink {
+ std::string path;
+ bool do_unlink;
+ explicit file_unlink(const char* s, bool d = true) : path(s), do_unlink(d) { }
+ explicit file_unlink(const std::string& s, bool d = true) : path(s), do_unlink(d) { }
+
+ ~file_unlink() {
+ if(do_unlink)
+ unlink(path.c_str());
+ }
+};
+
+#endif /* __TEST_MAIN_HPP__ */
+
diff --git a/unit_tests/test_main_cmdline.yaggo b/unit_tests/test_main_cmdline.yaggo
new file mode 100644
index 0000000..81a4038
--- /dev/null
+++ b/unit_tests/test_main_cmdline.yaggo
@@ -0,0 +1,10 @@
+purpose "Unit tests"
+
+name "cmdline_parse"
+
+option("s", "seed") {
+ description "Random seed"
+ uint32 }
+option("b", "backtrace") {
+ description "Do not catch errors and show backtrace"
+ flag }
diff --git a/unit_tests/test_mapped_file.cc b/unit_tests/test_mapped_file.cc
new file mode 100644
index 0000000..8215a1e
--- /dev/null
+++ b/unit_tests/test_mapped_file.cc
@@ -0,0 +1,54 @@
+#include <iostream>
+#include <fstream>
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/mapped_file.hpp>
+
+namespace {
+using jellyfish::mapped_file;
+TEST(MappedFile, CreateMove) {
+ const char* mpt = "mapped_file_test";
+ file_unlink file(mpt);
+ std::string text = "Hello\nThis is a test\n";
+
+ {
+ std::ofstream fd(mpt);
+ fd << text;
+ }
+
+ mapped_file mf(mpt);
+ EXPECT_STREQ(mpt, mf.path().c_str());
+ ASSERT_NE((char*)0, mf.base());
+ ASSERT_EQ(text.size(), mf.length());
+ EXPECT_EQ(text, std::string(mf.base(), mf.length()));
+
+ mapped_file mf2 = std::move(mf);
+ EXPECT_STREQ(mpt, mf2.path().c_str());
+ ASSERT_NE((char*)0, mf2.base());
+ ASSERT_EQ(text.size(), mf2.length());
+ EXPECT_EQ(text, std::string(mf2.base(), mf2.length()));
+ ASSERT_EQ((char*)0, mf.base());
+
+ mapped_file mf3(mpt);
+ mf2 = std::move(mf3);
+ EXPECT_STREQ(mpt, mf2.path().c_str());
+ ASSERT_NE((char*)0, mf2.base());
+ ASSERT_EQ(text.size(), mf2.length());
+ EXPECT_EQ(text, std::string(mf2.base(), mf2.length()));
+ ASSERT_EQ((char*)0, mf.base());
+}
+
+// Gtest and newer compilers seem to have a problem with EXPECT_THROW
+#if !defined(__clang__) && (!defined(GTEST_GCC_VER_) || GTEST_GCC_VER_ < 40800)
+TEST(MappedFile, Fail) {
+ const char* bad_file = "/doesntexistsforsure/thatwouldbecrazy!";
+ EXPECT_THROW(mapped_file mf(bad_file), jellyfish::mapped_file::ErrorMMap);
+
+ mapped_file mf;
+ EXPECT_THROW(mf.map(bad_file), jellyfish::mapped_file::ErrorMMap);
+ EXPECT_EQ((char*)0, mf.base());
+ EXPECT_THROW(mf.map(-1), jellyfish::mapped_file::ErrorMMap);
+ EXPECT_EQ((char*)0, mf.base());
+}
+#endif
+}
diff --git a/unit_tests/test_mer_dna.cc b/unit_tests/test_mer_dna.cc
new file mode 100644
index 0000000..a6f27b8
--- /dev/null
+++ b/unit_tests/test_mer_dna.cc
@@ -0,0 +1,529 @@
+/* SuperRead pipeline
+ * Copyright (C) 2012 Genome group at University of Maryland.
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <stdio.h>
+#include <map>
+#include <iostream>
+#include <sstream>
+#include <gtest/gtest.h>
+#include <jellyfish/mer_dna.hpp>
+#include <unit_tests/test_main.hpp>
+
+namespace {
+using namespace jellyfish;
+
+const std::string short_mer("ACGTTGGCCAA");
+const std::string mid_mer("AAGACTTAGAATCAGCTAAGGTAACTTACGTAGAATATAGA");
+const std::string long_mer("AAGACTTAGAATCAGCTAAGGTAACTTACGTAGAATATAG"
+ "AAGACGGCGCCTATCCCAACCTCCATTTGCTGACGCCCTC"
+ "GTAACCGTGCTGCGAGGTTACTCTATACTGA");
+const std::string huge_mer("CAGGACACAATACGTCGATCCAATCCCCGACGTGAGAGTT"
+ "TAACGCTAATCTTGATCCATTACAAGTATAGATATTTCGG"
+ "GCGCCACGGGGAAACTTGCCCTATGTTCGAGTCCGCCACC"
+ "GCGGCACCAGCCTTTGTGTGACGGCCACAAAGGGTAAAAG"
+ "ATGTTGTCTCGCGCCGGCGTGCGGTCTTTACCAGATCCTT"
+ "GAGCGGCCTAGAAAGTTCGTACCAGTTCGACTGAAACAAG"
+ "ACAACGGATCGCCCACGGTCATCACACGCCCACGCACGGG"
+ "GTCGGGTTGGTATATTCAACCTCGAGTTAAACGT");
+const std::string* test_mers[4] = {
+ &short_mer, &mid_mer, &long_mer, &huge_mer
+};
+
+TEST(MerDNASimple, InitSize64) {
+ struct sinfo {
+ unsigned int k;
+ unsigned int nb_words;
+ unsigned int nb_msb;
+ uint64_t msw;
+ unsigned int lshift;
+ };
+ sinfo ary[5] = {
+ { 5, 1, 10, (uint64_t)0x3ff, 8 }, { 32, 1, 64, (uint64_t)-1, 62 },
+ { 33, 2, 2, (uint64_t)0x3, 0 }, { 64, 2, 64, (uint64_t)-1, 62 },
+ { 65, 3, 2, (uint64_t)0x3, 0 }
+ };
+ typedef mer_dna_ns::mer_base_dynamic<uint64_t> mer64;
+ for(size_t i = 0; i < sizeof(ary) / sizeof(sinfo); ++i) {
+ mer64 m(ary[i].k);
+ EXPECT_EQ(ary[i].k, m.k());
+ EXPECT_EQ(ary[i].nb_words, m.nb_words());
+ EXPECT_EQ(ary[i].nb_msb, m.nb_msb());
+ EXPECT_EQ(ary[i].lshift, m.lshift());
+ }
+}
+
+#ifdef HAVE_INT128
+TEST(MerDNASimple, InitSize128) {
+ struct sinfo {
+ unsigned int k;
+ unsigned int nb_words;
+ unsigned int nb_msb;
+ unsigned __int128 msw;
+ unsigned int lshift;
+ };
+ sinfo ary[5] = {
+ { 5, 1, 10, (unsigned __int128)0x3ff, 8 },
+ { 32, 1, 64, (unsigned __int128)0xffffffffffffffffUL, 62 },
+ { 33, 1, 66, (unsigned __int128)0xffffffffffffffffUL | ((unsigned __int128)0x3 << 64), 64 },
+ { 64, 1, 128, (unsigned __int128)-1, 126 },
+ { 65, 2, 2, (unsigned __int128)0x3, 0 }
+ };
+ typedef mer_dna_ns::mer_base_dynamic<unsigned __int128> mer128;
+ for(size_t i = 0; i < sizeof(ary) / sizeof(sinfo); ++i) {
+ mer128 m(ary[i].k);
+ EXPECT_EQ(ary[i].k, m.k());
+ EXPECT_EQ(ary[i].nb_words, m.nb_words());
+ EXPECT_EQ(ary[i].nb_msb, m.nb_msb());
+ EXPECT_EQ(ary[i].lshift, m.lshift());
+ }
+}
+#endif
+
+TEST(MerDNASimple, Codes) {
+ EXPECT_EQ(mer_dna::CODE_A, mer_dna::code('A'));
+ EXPECT_EQ(mer_dna::CODE_A, mer_dna::code('a'));
+ EXPECT_EQ(mer_dna::CODE_C, mer_dna::code('C'));
+ EXPECT_EQ(mer_dna::CODE_C, mer_dna::code('c'));
+ EXPECT_EQ(mer_dna::CODE_G, mer_dna::code('G'));
+ EXPECT_EQ(mer_dna::CODE_G, mer_dna::code('g'));
+ EXPECT_EQ(mer_dna::CODE_T, mer_dna::code('T'));
+ EXPECT_EQ(mer_dna::CODE_T, mer_dna::code('t'));
+ EXPECT_FALSE(mer_dna::not_dna(mer_dna::CODE_A));
+ EXPECT_FALSE(mer_dna::not_dna(mer_dna::CODE_C));
+ EXPECT_FALSE(mer_dna::not_dna(mer_dna::CODE_G));
+ EXPECT_FALSE(mer_dna::not_dna(mer_dna::CODE_T));
+
+ for(int c = 0; c < 256; ++c) {
+ switch((char)c) {
+ case 'A': case 'a':
+ case 'C': case 'c':
+ case 'G': case 'g':
+ case 'T': case 't':
+ EXPECT_FALSE(mer_dna::not_dna(mer_dna::code(c)));
+ break;
+ default:
+ EXPECT_TRUE(mer_dna::not_dna(mer_dna::code(c)));
+ break;
+ }
+ }
+}
+
+TEST(MerDNASimple, SetBits) {
+ mer_dna::k(100);
+ static const int pattern_len = 10;
+ uint64_t pattern = ::random_bits(pattern_len); // Create a random pattern
+ mer_dna even_pattern, odd_pattern; // And the corresponding mers
+ for(int i = pattern_len - 2; i >= 0; i -= 2) {
+ even_pattern.shift_left((int)((pattern >> i) & 0x3));
+ odd_pattern.shift_left((int)((pattern >> (i + 1)) & 0x3));
+ }
+ odd_pattern.shift_left((int)((pattern << 1) & 0x3));
+
+ mer_dna mer;
+ for(int i = 0; i <= (int)(mer_dna::k() - pattern_len / 2); ++i, even_pattern.shift_left('A'), odd_pattern.shift_left('A')) {
+ // Even
+ mer.polyA();
+ EXPECT_EQ(std::string(mer_dna::k(), 'A'), mer.to_str());
+ mer.set_bits(2 * i, pattern_len, pattern);
+ EXPECT_EQ(pattern, mer.get_bits(2 * i, pattern_len));
+ EXPECT_EQ(even_pattern, mer);
+ EXPECT_EQ(even_pattern.to_str(), mer.to_str());
+ // Odd
+ mer.polyA();
+ mer.set_bits(2 * i + 1, pattern_len, pattern);
+ if(i < (int)(mer_dna::k() - pattern_len / 2))
+ EXPECT_EQ(pattern, mer.get_bits(2 * i + 1, pattern_len));
+ else // On the largest value of i, one bit may have fallen off the end of the mer
+ EXPECT_EQ(pattern & (((uint64_t)1 << (pattern_len - 1)) - 1), mer.get_bits(2 * i + 1, pattern_len));
+ EXPECT_EQ(odd_pattern, mer);
+ EXPECT_EQ(odd_pattern.to_str(), mer.to_str());
+ }
+}
+
+TEST(MerDNASimple, Shifts) {
+ for(int i = 1; i < 100; ++i) {
+ mer_dna::k(i);
+ mer_dna m;
+
+ m.randomize();
+ const int c = ::random_bits(2);
+ mer_dna rm(m);
+ rm.shift_right(c);
+ mer_dna lm(m);
+ lm.shift_left(c);
+
+ EXPECT_EQ(c, rm.base(mer_dna::k() - 1).code());
+ EXPECT_EQ(c, lm.base(0).code());
+ for(unsigned int j = 0; j < mer_dna::k() - 1; ++j) {
+ EXPECT_EQ(m.base(j + 1).code(), rm.base(j).code());
+ EXPECT_EQ(m.base(j).code(), lm.base(j + 1).code());
+ }
+ }
+} // MerDNASimple.Shifts
+
+
+bool simple_homolymer_test(const mer_dna& m) {
+ mer_dna cm(m);
+ cm.shift_right(m.base(0).code());
+ return cm == m;
+}
+
+TEST(MerDNASimple, Homopolymer) {
+ for(int i = 1; i < 256; ++i) {
+ SCOPED_TRACE(::testing::Message() << "i:" << i);
+ mer_dna::k(i);
+ mer_dna m;
+
+ for(int j = 0; j < 10; ++j) {
+ m.randomize();
+ EXPECT_EQ(simple_homolymer_test(m), m.is_homopolymer());
+ }
+
+ m.polyA();
+ EXPECT_TRUE(simple_homolymer_test(m));
+ EXPECT_TRUE(m.is_homopolymer());
+ if(i > 1) { // i == 1 all mers are homopolymers by definition
+ m.base(::random_bits(5) % i) = 'T';
+ if(simple_homolymer_test(m) || m.is_homopolymer())
+ std::cerr << m << "\n";
+ EXPECT_FALSE(simple_homolymer_test(m));
+ EXPECT_FALSE(m.is_homopolymer());
+ }
+
+ m.polyC();
+ EXPECT_TRUE(simple_homolymer_test(m));
+ EXPECT_TRUE(m.is_homopolymer());
+ m.polyG();
+ EXPECT_TRUE(simple_homolymer_test(m));
+ EXPECT_TRUE(m.is_homopolymer());
+ m.polyT();
+ EXPECT_TRUE(simple_homolymer_test(m));
+ EXPECT_TRUE(m.is_homopolymer());
+ }
+} // MerDNASimple.Homopolymer
+
+TEST(MerDNASimple, Comparators) {
+ mer_dna::k(151);
+ mer_dna ma, mc, mg, mt;
+ ma.polyA();
+ mc.polyC();
+ mg.polyG();
+ mt.polyT();
+
+ mer_dna cma(ma), cmc(mc), cmg(mg), cmt(mt);
+
+ ASSERT_TRUE(ma < mc); ASSERT_FALSE(mc < ma);
+ ASSERT_TRUE(ma < mg); ASSERT_FALSE(mg < ma);
+ ASSERT_TRUE(ma < mt); ASSERT_FALSE(mt < ma);
+ ASSERT_TRUE(mc < mg); ASSERT_FALSE(mg < mc);
+ ASSERT_TRUE(mc < mt); ASSERT_FALSE(mt < mc);
+ ASSERT_TRUE(mg < mt); ASSERT_FALSE(mt < mg);
+
+ ASSERT_FALSE(ma < ma);
+ ASSERT_FALSE(mc < mc);
+ ASSERT_FALSE(mg < mg);
+ ASSERT_FALSE(mt < mt);
+
+ std::map<mer_dna, int> map;
+ EXPECT_EQ(1, ++map[ma]);
+ EXPECT_EQ(1, ++map[mc]);
+ EXPECT_EQ(1, ++map[mg]);
+ EXPECT_EQ(1, ++map[mt]);
+ EXPECT_EQ(2, ++map[cma]);
+ EXPECT_EQ(2, ++map[cmc]);
+ EXPECT_EQ(2, ++map[cmg]);
+ EXPECT_EQ(2, ++map[cmt]);
+
+ mer_dna m1, m2;
+ for(int i = 0; i < 1000; ++i) {
+ m1.randomize();
+ m2.randomize();
+ SCOPED_TRACE(::testing::Message() << "m1:" << m1 << " m2:" << m2);
+ ASSERT_FALSE(m1 == m2); // Very small probability to fail (k == 151)
+
+ EXPECT_TRUE(m1 == m1);
+ EXPECT_FALSE(m1 < m1);
+ EXPECT_FALSE(m1 > m1);
+ EXPECT_TRUE(m1 <= m1);
+ EXPECT_TRUE(m1 >= m1);
+
+ EXPECT_TRUE(m2 == m2);
+ EXPECT_FALSE(m2 < m2);
+ EXPECT_FALSE(m2 > m2);
+ EXPECT_TRUE(m2 <= m2);
+ EXPECT_TRUE(m2 >= m2);
+
+ EXPECT_EQ(m1.to_str().compare(m2.to_str()) < 0, m1 < m2); // Comparison is lexicographic
+
+ EXPECT_TRUE(m1 < m2 || m2 < m1);
+ EXPECT_TRUE(m1 <= m2 || m2 <= m1);
+ EXPECT_FALSE(m1 <= m2 && m2 <= m1);
+ EXPECT_TRUE(m1 > m2 || m2 > m1);
+ EXPECT_TRUE(m1 >= m2 || m2 >= m1);
+ EXPECT_FALSE(m1 >= m2 && m2 >= m1);
+
+ EXPECT_NE(m1 < m2, m1 >= m2);
+ EXPECT_NE(m1 < m2, m1 > m2);
+ }
+}
+
+TEST(MerDNASimple, IO) {
+ std::stringstream buffer;
+
+ for(int i = 0; i < 10000; ++i) {
+ buffer.clear();
+ SCOPED_TRACE(::testing::Message() << "i:" << i);
+ mer_dna::k(::random_bits(9) + 1);
+ mer_dna m1, m2;
+ m1.randomize();
+ buffer << m1;
+ buffer >> m2;
+ EXPECT_EQ(m1, m2);
+ }
+}
+
+TEST(MerDNASimple, MultipleSize) {
+ typedef jellyfish::mer_dna_ns::mer_base_static<uint64_t, 1> mer_dna1;
+ typedef jellyfish::mer_dna_ns::mer_base_static<uint64_t, 2> mer_dna2;
+
+ mer_dna::k(10);
+ mer_dna1::k(50);
+ mer_dna2::k(100);
+ EXPECT_EQ(10, mer_dna::k());
+ EXPECT_EQ(0, mer_dna::class_index);
+ EXPECT_EQ(50, mer_dna1::k());
+ EXPECT_EQ(1, mer_dna1::class_index);
+ EXPECT_EQ(100, mer_dna2::k());
+ EXPECT_EQ(2, mer_dna2::class_index);
+}
+
+// Value Type Container class
+template <typename T, int N>
+class VTC {
+public:
+ typedef T Type;
+ static const int test_id = N;
+};
+template <typename T, int N>
+const int VTC<T, N>::test_id;
+
+template<typename VT>
+class MerDNA : public ::testing::Test {
+public:
+ typedef typename VT::Type Type;
+ void SetUp() {
+ Type::k(GetParam().size());
+ }
+ const std::string& GetParam() const {
+ return *test_mers[VT::test_id];
+ }
+};
+typedef ::testing::Types<VTC<mer_dna_ns::mer_base_dynamic<uint64_t>, 0>,
+ VTC<mer_dna_ns::mer_base_dynamic<uint64_t>, 1>,
+ VTC<mer_dna_ns::mer_base_dynamic<uint64_t>, 2>,
+ VTC<mer_dna_ns::mer_base_dynamic<uint64_t>, 3>,
+#ifdef HAVE_INT128
+ VTC<mer_dna_ns::mer_base_dynamic<unsigned __int128>, 0>,
+ VTC<mer_dna_ns::mer_base_dynamic<unsigned __int128>, 1>,
+ VTC<mer_dna_ns::mer_base_dynamic<unsigned __int128>, 2>,
+ VTC<mer_dna_ns::mer_base_dynamic<unsigned __int128>, 3>,
+#endif
+ VTC<mer_dna_ns::mer_base_static<uint32_t>, 3>,
+ VTC<mer_dna_ns::mer_base_static<uint64_t>, 0>,
+ VTC<mer_dna_ns::mer_base_static<uint64_t>, 1>,
+ VTC<mer_dna_ns::mer_base_static<uint64_t>, 2>,
+ VTC<mer_dna_ns::mer_base_static<uint64_t>, 3>,
+#ifdef HAVE_INT128
+ VTC<mer_dna_ns::mer_base_static<unsigned __int128>, 0>,
+ VTC<mer_dna_ns::mer_base_static<unsigned __int128>, 1>,
+ VTC<mer_dna_ns::mer_base_static<unsigned __int128>, 2>,
+ VTC<mer_dna_ns::mer_base_static<unsigned __int128>, 3>,
+#endif
+ VTC<mer_dna_ns::mer_base_static<uint32_t>, 3>
+ > MerDNATypes;
+TYPED_TEST_CASE(MerDNA, MerDNATypes);
+
+TYPED_TEST(MerDNA, InitFromStr) {
+ typename TypeParam::Type m(this->GetParam());
+ EXPECT_EQ(this->GetParam().size(), m.k());
+ EXPECT_EQ(this->GetParam(), m.to_str());
+}
+
+TYPED_TEST(MerDNA, ShiftLeft) {
+ typename TypeParam::Type m(this->GetParam().size());
+ m.polyA();
+ int inserted = 0;
+ for(std::string::const_iterator it = this->GetParam().begin(); it != this->GetParam().end(); ++it, ++inserted) {
+ m.shift_left(*it);
+
+ int check = inserted;
+ for(std::string::const_iterator cit = this->GetParam().begin(); check >= 0; ++cit, --check)
+ EXPECT_EQ(*cit, (char)m.base(check));
+ }
+ EXPECT_EQ(this->GetParam(), m.to_str());
+}
+
+TYPED_TEST(MerDNA, ShiftRight) {
+ typename TypeParam::Type m(this->GetParam().size());
+ m.polyA();
+ int inserted = 0;
+ for(std::string::const_reverse_iterator it = this->GetParam().rbegin(); it != this->GetParam().rend(); ++it, ++inserted) {
+ m.shift_right(*it);
+
+ int check = inserted;
+ for(std::string::const_reverse_iterator cit = this->GetParam().rbegin(); check >= 0; ++cit, --check)
+ EXPECT_EQ(*cit, (char)m.base(m.k() - 1 - check));
+ }
+ EXPECT_EQ(this->GetParam(), m.to_str());
+}
+
+TYPED_TEST(MerDNA, Equality) {
+ typename TypeParam::Type m1(this->GetParam());
+ typename TypeParam::Type m2(this->GetParam().size());
+
+ char str[this->GetParam().size() + 1];
+ str[this->GetParam().size()] = '\0';
+ memset(str, 'A', this->GetParam().size());
+ m2.polyA();
+ EXPECT_STREQ(str, m2.to_str().c_str());
+ memset(str, 'C', this->GetParam().size());
+ m2.polyC();
+ EXPECT_STREQ(str, m2.to_str().c_str());
+ memset(str, 'G', this->GetParam().size());
+ m2.polyG();
+ EXPECT_STREQ(str, m2.to_str().c_str());
+ memset(str, 'T', this->GetParam().size());
+ m2.polyT();
+ EXPECT_STREQ(str, m2.to_str().c_str());
+
+
+ int i = 1;
+ for(std::string::const_iterator it = this->GetParam().begin(); it < this->GetParam().end(); ++it, ++i) {
+ sprintf(str + this->GetParam().size() - i, "%.*s", i, this->GetParam().c_str());
+ typename TypeParam::Type m(str);
+ EXPECT_STREQ(str, m.to_str().c_str());
+ m2.shift_left(*it);
+ EXPECT_EQ(m, m2);
+ }
+ EXPECT_TRUE(m1 == m2);
+ EXPECT_FALSE(m1 != m2);
+ EXPECT_EQ(m1.to_str(), m2.to_str());
+
+ // typename TypeParam::Type m3(this->GetParam());
+ // m3[0] = 0;
+ // EXPECT_FALSE(m1 == m3);
+
+ // typename TypeParam::Type m4(this->GetParam().size() + 1);
+ // EXPECT_FALSE(m1 == m4);
+ // typename TypeParam::Type m5(this->GetParam().size() - 1);
+ // EXPECT_FALSE(m1 == m5);
+
+}
+
+TYPED_TEST(MerDNA, Copy) {
+ typename TypeParam::Type m1(this->GetParam());
+ typename TypeParam::Type m2(m1);
+ typename TypeParam::Type m3(this->GetParam().size());
+ m3 = m1;
+
+ EXPECT_TRUE(m1 == m2);
+ EXPECT_TRUE(m2 == m3);
+ EXPECT_TRUE(m3 == m1);
+ m1.shift_left('A');
+ EXPECT_TRUE(!(m1 == m2));
+ EXPECT_TRUE(!(m1 == m3));
+}
+
+TYPED_TEST(MerDNA, OperatorShift) {
+ typename TypeParam::Type m(this->GetParam());
+ std::ostringstream os;
+ os << m;
+ EXPECT_EQ(this->GetParam(), os.str());
+}
+
+TYPED_TEST(MerDNA, GetBits) {
+ typename TypeParam::Type m(this->GetParam());
+ for(unsigned int i = 0; i < 20; ++i) {
+ long int start = random() % (this->GetParam().size() - 1);
+ long int max_len =
+ std::min(this->GetParam().size() - start, 8 * sizeof(typename TypeParam::Type::base_type));
+ long int len = (random() % (max_len - 1)) + 1;
+
+ // Get bits by right-shifting
+ typename TypeParam::Type cm(m);
+ for(unsigned int j = 1; j < start; j += 2)
+ cm.shift_right(0); // Shift by 2 bits
+ typename TypeParam::Type::base_type y = cm.word(0);
+ if(start & 0x1)
+ y >>= 1;
+ y &= ((typename TypeParam::Type::base_type)1 << len) - 1;
+
+ EXPECT_EQ(y, m.get_bits(start, len));
+ }
+}
+TYPED_TEST(MerDNA, GetBases) {
+ typename TypeParam::Type m(this->GetParam());
+
+ for(std::string::const_reverse_iterator it = this->GetParam().rbegin(); it != this->GetParam().rend(); ++it)
+ EXPECT_EQ(*it, (char)m.base(it - this->GetParam().rbegin()));
+
+ const char bases[4] = { 'A', 'C', 'G', 'T' };
+ for(const char* it = bases; it != bases + 4; ++it) {
+ typename TypeParam::Type n(m);
+ for(size_t j = 0; j < this->GetParam().size(); ++j)
+ n.base(j) = *it;
+ typename TypeParam::Type m_expected(std::string(this->GetParam().size(), *it));
+ EXPECT_EQ(m_expected, n);
+ }
+}
+
+char rc_base(char c) {
+ switch(c) {
+ case 'A': case 'a': return 'T';
+ case 'C': case 'c': return 'G';
+ case 'G': case 'g': return 'C';
+ case 'T': case 't': return 'A';
+ }
+ return 'A'; // Should never be reached
+}
+
+TYPED_TEST(MerDNA, ReverseComplement) {
+ typename TypeParam::Type m(this->GetParam());
+ std::string rc(this->GetParam().size(), 'A');
+ for(size_t i = 0; i < rc.size(); ++i)
+ rc[i] = rc_base(this->GetParam()[this->GetParam().size() - 1 - i]);
+ EXPECT_EQ(this->GetParam().size(), m.k());
+ m.reverse_complement();
+ EXPECT_EQ(rc, m.to_str());
+ typename TypeParam::Type rm(rc);
+ EXPECT_EQ(rm, m);
+ EXPECT_EQ(m, m.get_reverse_complement().get_reverse_complement());
+}
+
+TYPED_TEST(MerDNA, Canonical) {
+ typename TypeParam::Type m(this->GetParam());
+ typename TypeParam::Type canonical = m.get_canonical();
+
+ EXPECT_FALSE(m < canonical);
+ EXPECT_TRUE(canonical <= m);
+ EXPECT_TRUE(canonical == m || canonical == m.get_reverse_complement());
+ m.canonicalize();
+ EXPECT_EQ(canonical, m.get_canonical());
+}
+
+} // namespace {
diff --git a/unit_tests/test_mer_dna_bloom_counter.cc b/unit_tests/test_mer_dna_bloom_counter.cc
new file mode 100644
index 0000000..7e4ba18
--- /dev/null
+++ b/unit_tests/test_mer_dna_bloom_counter.cc
@@ -0,0 +1,150 @@
+/* This file is part of Jellyfish.
+
+ Jellyfish is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Jellyfish is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Jellyfish. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#include <stdlib.h>
+#include <algorithm>
+#include <utility>
+#include <set>
+#include <string>
+#include <fstream>
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/mer_dna_bloom_counter.hpp>
+
+namespace {
+using jellyfish::mer_dna;
+
+static const size_t nb_inserts = 10000;
+static const double error_rate = 0.001;
+
+template<typename T>
+class MerDnaBloomTest : public ::testing::Test { };
+
+struct TestBloomCounter {
+ typedef jellyfish::mer_dna_bloom_counter bloom_type;
+ typedef jellyfish::mer_dna_bloom_counter_file file_type;
+ static const unsigned int threshold_twice = 2; // Bloom counter counts up to 2.
+};
+struct TestBloomFilter {
+ typedef jellyfish::mer_dna_bloom_filter bloom_type;
+ typedef jellyfish::mer_dna_bloom_filter_file file_type;
+ static const unsigned int threshold_twice = 1; // Bloom filter counts up to 1.
+};
+
+typedef ::testing::Types<TestBloomCounter, TestBloomFilter> TestBloomCounterTypes;
+TYPED_TEST_CASE(MerDnaBloomTest, TestBloomCounterTypes);
+
+
+TYPED_TEST(MerDnaBloomTest, FalsePositive) {
+ mer_dna::k(50);
+ std::set<mer_dna> mer_set;
+ typename TypeParam::bloom_type bc(error_rate, nb_inserts);
+
+ size_t collisions2 = 0;
+ size_t collisions3 = 0;
+
+ // Insert once nb_inserts. Insert twice the first half
+ {
+ // First insertion
+ size_t nb_collisions = 0;
+ mer_dna m;
+ for(size_t i = 0; i < nb_inserts; ++i) {
+ m.randomize();
+ mer_set.insert(m);
+ nb_collisions += bc.insert(m) > 0;
+ }
+ EXPECT_GT(error_rate * nb_inserts, nb_collisions);
+ }
+
+ // Second insertion
+ {
+ size_t nb_collisions = 0;
+ size_t nb_errors = 0;
+ auto it = mer_set.cbegin();
+ for(size_t i =0; i < nb_inserts / 2; ++i, ++it) {
+ unsigned int oc = bc.insert(*it);
+ nb_collisions += oc > 1;
+ nb_errors += oc < 1;
+ }
+ EXPECT_GT(2 * error_rate * nb_inserts, nb_collisions);
+ EXPECT_EQ((size_t)0, nb_errors);
+ }
+
+ // Write to file and reload two different ways
+ file_unlink f("bloom_file");
+ {
+ std::ofstream out(f.path.c_str());
+ bc.write_bits(out);
+ EXPECT_TRUE(out.good());
+ EXPECT_EQ(bc.nb_bytes(), out.tellp());
+ }
+ std::ifstream in(f.path.c_str());
+ typename TypeParam::bloom_type bc_read(bc.m(), bc.k(), in, bc.hash_functions());
+ EXPECT_EQ(bc.nb_bytes(), in.tellg());
+ in.close();
+ typename TypeParam::file_type bc_map(bc.m(), bc.k(), f.path.c_str(), bc.hash_functions());
+ EXPECT_EQ(bc.m(), bc_read.m());
+ EXPECT_EQ(bc.k(), bc_read.k());
+ EXPECT_EQ(bc.m(), bc_map.m());
+ EXPECT_EQ(bc.k(), bc_map.k());
+
+ // Check known mers
+ {
+ size_t nb_collisions = 0;
+ size_t nb_errors = 0;
+ auto it = mer_set.cbegin();
+ for(size_t i = 0; i < nb_inserts; ++i, ++it) {
+ unsigned int check = bc.check(*it);
+ EXPECT_EQ(check, bc_read.check(*it));
+ EXPECT_EQ(check, bc_map.check(*it));
+ if(i < nb_inserts / 2) {
+ nb_errors += check < TypeParam::threshold_twice;
+ } else {
+ nb_errors += check < 1;
+ nb_collisions += check > 1;
+ }
+ }
+ EXPECT_EQ((size_t)0, nb_errors);
+ EXPECT_GT(2 * error_rate * nb_inserts, nb_collisions);
+ }
+
+ // Check unknown mers
+ {
+ size_t nb_collisions = 0;
+ mer_dna m;
+ for(size_t i = 0; i < nb_inserts; ++i) {
+ m.randomize();
+ unsigned int check = bc.check(m);
+ EXPECT_EQ(check, bc_read.check(m));
+ EXPECT_EQ(check, bc_map.check(m));
+ nb_collisions += check > 0;
+ }
+ EXPECT_GT(2 * error_rate * nb_inserts, nb_collisions);
+ }
+}
+
+TYPED_TEST(MerDnaBloomTest, Move) {
+ mer_dna::k(100);
+ typename TypeParam::bloom_type bc(error_rate, nb_inserts);
+ const unsigned long k = bc.k();
+ const size_t m = bc.m();
+ typename TypeParam::bloom_type bc2(std::move(bc));
+ EXPECT_EQ(k, bc2.k());
+ EXPECT_EQ(m, bc.m());
+}
+
+}
diff --git a/unit_tests/test_mer_heap.cc b/unit_tests/test_mer_heap.cc
new file mode 100644
index 0000000..44cf91a
--- /dev/null
+++ b/unit_tests/test_mer_heap.cc
@@ -0,0 +1,76 @@
+#include <gtest/gtest.h>
+
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/large_hash_array.hpp>
+#include <jellyfish/mer_heap.hpp>
+
+namespace {
+using jellyfish::mer_dna;
+
+typedef jellyfish::large_hash::array<mer_dna> large_array;
+typedef large_array::region_iterator region_iterator;
+typedef jellyfish::mer_heap::heap<mer_dna, region_iterator> mer_heap;
+
+static const size_t ary_size = 10000;
+static const uint16_t mer_len = 50;
+static const size_t nb_mers = ary_size / 2;
+
+class MerHeapTest : public ::testing::TestWithParam<size_t> {
+protected:
+ static void SetUpTestCase() {
+ mer_dna::k(mer_len);
+ shared_ary = new large_array(ary_size, mer_len * 2, 0, 63);
+ mer_dna m;
+
+ for(size_t i = 0; i < nb_mers; ++i) {
+ m.randomize();
+ bool is_new;
+ size_t id;
+ shared_ary->set(m, &is_new, &id);
+ EXPECT_TRUE(is_new); // Very small probability to fail
+ }
+ }
+
+ static void TearDownTestCase() {
+ delete shared_ary;
+ }
+
+ static large_array* shared_ary;
+};
+large_array* MerHeapTest::shared_ary = 0;
+
+TEST_P(MerHeapTest, Order) {
+ uint64_t hash = 0;
+ int count = 0;
+ const large_array& ary = *shared_ary;
+ mer_dna m;
+ m.polyA();
+
+ for(size_t slice = 0; slice < GetParam(); ++slice) {
+ region_iterator rit = ary.iterator_slice<region_iterator>(slice, GetParam());
+ mer_heap heap(ary.max_reprobe_offset());
+
+ heap.fill(rit);
+
+ while(!heap.is_empty()) {
+ uint64_t nhash = ary.matrix().times(heap.head()->key_);
+ EXPECT_LE(hash, nhash);
+ if(nhash == hash)
+ EXPECT_LT(m, heap.head()->key_);
+ hash = nhash;
+ m = heap.head()->key_;
+
+ heap.pop();
+ ++count;
+
+ if(rit.next())
+ heap.push(rit);
+ }
+ }
+
+ EXPECT_EQ(nb_mers, count);
+}
+
+INSTANTIATE_TEST_CASE_P(MerHeap, MerHeapTest, ::testing::Range((size_t)1, (size_t)11));
+
+} // namespace {
diff --git a/unit_tests/test_mer_iterator.cc b/unit_tests/test_mer_iterator.cc
new file mode 100644
index 0000000..1e1cc52
--- /dev/null
+++ b/unit_tests/test_mer_iterator.cc
@@ -0,0 +1,181 @@
+#include <fstream>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/mer_overlap_sequence_parser.hpp>
+#include <jellyfish/whole_sequence_parser.hpp>
+#include <jellyfish/mer_dna.hpp>
+#include <jellyfish/mer_iterator.hpp>
+#include <jellyfish/mer_qual_iterator.hpp>
+
+namespace {
+using std::string;
+using jellyfish::mer_dna;
+typedef std::vector<string> string_vector;
+template<typename Iterator>
+struct opened_streams {
+ Iterator begin_, end_;
+
+ opened_streams(Iterator begin, Iterator end) : begin_(begin), end_(end) { }
+ std::unique_ptr<std::istream> next() {
+ std::unique_ptr<std::istream> res;
+ if(begin_ != end_) {
+ res.reset(*begin_);
+ ++begin_;
+ }
+ return res;
+ }
+};
+typedef jellyfish::mer_overlap_sequence_parser<opened_streams<std::ifstream**> > parser_type;
+typedef jellyfish::mer_iterator<parser_type, mer_dna> mer_iterator_type;
+
+typedef jellyfish::whole_sequence_parser<opened_streams<std::ifstream**> > parser_qual_type;
+typedef jellyfish::mer_qual_iterator<parser_qual_type, mer_dna> mer_qual_iterator_type;
+
+static string generate_sequence(int len) {
+ static const char bases[4] = { 'A', 'C', 'G', 'T' };
+ string res;
+ res.reserve(len);
+
+ for(int i = 0; i < len; ++i)
+ res += bases[random() & 0x3];
+
+ return res;
+}
+
+static string generate_quals(int len) {
+ string res;
+ res.reserve(len);
+
+ for(int i = 0; i < len; ++i)
+ res += static_cast<char>('!' + (random() % 94));
+
+ return res;
+}
+
+TEST(MerIterator, Sequence) {
+ static const int nb_sequences = 100;
+ const char* file_name = "Sequence.fa";
+ file_unlink fu(file_name);
+ string_vector sequences;
+ mer_dna::k(35);
+
+ {
+ std::ofstream input_fasta(file_name);
+ for(int i = 0; i < nb_sequences; ++i) {
+ sequences.push_back(generate_sequence(20 + random() % 200));
+ input_fasta << ">" << i << "\n" << sequences.back() << "\n";
+ }
+ }
+
+ // Check that every mer of the iterator matches the sequence
+ auto input_fasta = new std::ifstream(file_name);
+ {
+ opened_streams<std::ifstream**> streams(&input_fasta, &input_fasta + 1);
+ parser_type parser(mer_dna::k(), 1, 10, 100, streams);
+ mer_iterator_type mit(parser);
+ for(string_vector::const_iterator it = sequences.begin(); it != sequences.end(); ++it) {
+ if(it->size() >= mer_dna::k()) {
+ for(int i = 0; i < it->size() - (mer_dna::k() - 1); ++i, ++mit) {
+ ASSERT_NE(mer_iterator_type(), mit);
+ EXPECT_EQ(it->substr(i, mer_dna::k()), mit->to_str());
+ }
+ }
+ }
+ EXPECT_EQ(mer_iterator_type(), mit);
+ }
+}
+
+ // Same but with canonical mers
+TEST(MerIterator, SequenceCanonical) {
+ const char* file_name = "SequenceCanonical.fa";
+ file_unlink fu(file_name);
+ string_vector sequences;
+ static const int nb_sequences = 100;
+ mer_dna::k(35);
+
+ {
+ std::ofstream input_fasta(file_name);
+ for(int i = 0; i < nb_sequences; ++i) {
+ sequences.push_back(generate_sequence(20 + random() % 200));
+ input_fasta << ">" << i << "\n" << sequences.back() << "\n";
+ }
+ }
+
+ auto input_fasta = new std::ifstream(file_name);
+ {
+ opened_streams<std::ifstream**> streams(&input_fasta, &input_fasta + 1);
+ parser_type parser(mer_dna::k(), 1, 10, 100, streams);
+ mer_iterator_type mit(parser, true);
+ for(string_vector::const_iterator it = sequences.begin(); it != sequences.end(); ++it) {
+ if(it->size() >= mer_dna::k()) {
+ for(int i = 0; i < it->size() - (mer_dna::k() - 1); ++i, ++mit) {
+ ASSERT_NE(mer_iterator_type(), mit);
+ ASSERT_EQ(*mit, mit->get_canonical());
+ EXPECT_TRUE((it->substr(i, mer_dna::k()) == mit->to_str()) ||
+ (it->substr(i, mer_dna::k()) == mit->get_reverse_complement().to_str()));
+ }
+ }
+ }
+ EXPECT_EQ(mer_iterator_type(), mit);
+ }
+}
+
+TEST(MerQualIterator, Sequence) {
+ const char* file_name = "Sequence.fq";
+ file_unlink fu(file_name);
+ string_vector sequences;
+ string_vector quals;
+ static const int nb_sequences = 100;
+ mer_dna::k(35);
+
+ for(int i = 0; i < nb_sequences; ++i) {
+ const int len = 20 + (random() % 200);
+ sequences.push_back(generate_sequence(len));
+ quals.push_back(generate_quals(len));
+ }
+
+ {
+ std::ofstream input_fasta(file_name);
+ for(size_t i = 0; i < sequences.size(); ++i)
+ input_fasta << "@" << i << "\n"
+ << sequences[i] << "\n"
+ << "+\n"
+ << quals[i] << "\n";
+ }
+
+ auto input1_fastq = new std::ifstream(file_name);
+ auto input2_fastq = new std::ifstream(file_name);
+ {
+ opened_streams<std::ifstream**> streams1(&input1_fastq, &input1_fastq + 1);
+ parser_qual_type parser1(10, 10, 1, streams1);
+ mer_qual_iterator_type mit(parser1, '#', false);
+
+ opened_streams<std::ifstream**> streams2(&input2_fastq, &input2_fastq + 1);
+ parser_qual_type parser2(10, 10, 1, streams2);
+ mer_qual_iterator_type mit_canonical(parser2, '#', true);
+
+ for(string_vector::const_iterator it = sequences.begin(), qit = quals.begin(); it != sequences.end(); ++it, ++qit) {
+ if(it->size() >= mer_dna::k()) {
+ for(int i = 0; i < it->size() - (mer_dna::k() - 1); ++i) {
+ const size_t next_N = qit->find_first_of("!\"", i);
+ SCOPED_TRACE(::testing::Message() << "i:" << i << " next_N:" << next_N);
+ if(next_N != std::string::npos && next_N >= i && next_N < i + mer_dna::k())
+ continue;
+ ASSERT_NE(mer_iterator_type(), mit);
+ EXPECT_EQ(it->substr(i, mer_dna::k()), mit->to_str());
+
+ ASSERT_NE(mer_iterator_type(), mit_canonical);
+ ASSERT_EQ(*mit_canonical, mit_canonical->get_canonical());
+ EXPECT_TRUE((it->substr(i, mer_dna::k()) == mit_canonical->to_str()) ||
+ (it->substr(i, mer_dna::k()) == mit_canonical->get_reverse_complement().to_str()));
+ ++mit;
+ ++mit_canonical;
+ }
+ }
+ }
+ EXPECT_EQ(mer_iterator_type(), mit);
+ }
+
+}
+} // namespace {
diff --git a/unit_tests/test_mer_overlap_sequence_parser.cc b/unit_tests/test_mer_overlap_sequence_parser.cc
new file mode 100644
index 0000000..26cfc32
--- /dev/null
+++ b/unit_tests/test_mer_overlap_sequence_parser.cc
@@ -0,0 +1,177 @@
+#include <string>
+#include <fstream>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/mer_overlap_sequence_parser.hpp>
+
+namespace {
+using std::string;
+using std::istringstream;
+template<typename Iterator>
+struct opened_streams {
+ Iterator begin_, end_;
+
+ opened_streams(Iterator begin, Iterator end) : begin_(begin), end_(end) { }
+ std::unique_ptr<std::istream> next() {
+ std::unique_ptr<std::istream> res;
+ if(begin_ != end_) {
+ res.reset(*begin_);
+ ++begin_;
+ }
+ return res;
+ }
+};
+typedef jellyfish::mer_overlap_sequence_parser<opened_streams<std::ifstream**> > parser_type;
+
+
+TEST(MerOverlapSequenceParser, OneSmallSequence) {
+ static const char* seq = "ATTACCTTGTACCTTCAGAGC";
+ const char* file_name = "OneSmallSequence.fa";
+ file_unlink fu(file_name);
+
+ {
+ std::ofstream sequence(file_name);
+ sequence << ">header\n" << seq;
+ }
+ auto sequence = new std::ifstream(file_name);
+ opened_streams<std::ifstream**> streams(&sequence, &sequence + 1);
+
+ parser_type parser(10, 1, 10, 100, streams);
+
+ parser_type::job j(parser);
+ ASSERT_FALSE(j.is_empty());
+ EXPECT_EQ(strlen(seq), j->end - j->start);
+ EXPECT_STREQ(seq, j->start);
+ j.release();
+
+ parser_type::job j2(parser);
+ EXPECT_TRUE(j2.is_empty());
+}
+
+string generate_sequences(std::ostream& os, int a, int b, int nb, bool fastq = false) {
+ static const char bases[4] = {'A', 'C', 'G', 'T' };
+ string res;
+ for(int i = 0; i < nb; ++i) {
+ int len = a + random() % b;
+ os << (fastq ? "@" : ">") << "r" << i << " " << len << "\n";
+ for(int j = 0; j < len; ++j) {
+ char b = bases[random() & 0x3];
+ os << b;
+ res += b;
+ if(random() % 16 == 0)
+ os << "\n";
+ }
+ if(i != nb - 1)
+ res += 'N';
+ os << "\n";
+ if(fastq) {
+ os << "+\n";
+ for(int j = 0; j < len; ++j) {
+ if(random() % 16 == 0)
+ os << "\n";
+ os << "#";
+ }
+ os << "\n";
+ }
+ }
+ return res;
+}
+
+TEST(MerOverlapSequenceParser, ManySmallSequences) {
+ const char* file_name = "ManySmallSequences.fa";
+ file_unlink fu(file_name);
+ static const int nb_reads = 20;
+ static const int mer_len = 10;
+
+ std::ofstream o_sequence(file_name);
+ string res = generate_sequences(o_sequence, 20, 64, nb_reads);
+ o_sequence.close();
+
+ auto sequence = new std::ifstream(file_name);
+ opened_streams<std::ifstream**> streams(&sequence, &sequence + 1);
+
+ parser_type parser(mer_len, 1, 10, 100, streams);
+ size_t offset = 0;
+ while(true) {
+ parser_type::job j(parser);
+ if(j.is_empty())
+ break;
+ SCOPED_TRACE(::testing::Message() << offset << ": " << res.substr(offset, j->end - j->start));
+ EXPECT_EQ(res.substr(offset, j->end - j->start).c_str(), string(j->start, j->end - j->start));
+ offset += j->end - j->start - (mer_len - 1);
+ }
+ EXPECT_EQ(res.size(), offset + mer_len - 1);
+}
+
+TEST(MerOverlapSequenceParser, BigSequences) {
+ const char* file_name1 = "BigSequences1.fa";
+ const char* file_name2 = "BigSequences2.fa";
+ file_unlink fu1(file_name1);
+ file_unlink fu2(file_name2);
+
+ std::ofstream o_sequence(file_name1);
+ const string res0 = generate_sequences(o_sequence, 200, 100, 3);
+ o_sequence.close();
+ o_sequence.open(file_name2);
+ const string res1 = generate_sequences(o_sequence, 200, 100, 3);
+ o_sequence.close();
+
+ std::ifstream* tmps[2];
+ tmps[0] = new std::ifstream(file_name1);
+ tmps[1] = new std::ifstream(file_name2);
+ opened_streams<std::ifstream**> streams(tmps, tmps + 2);
+
+ static const int mer_len = 10;
+ parser_type parser(mer_len, 1, 10, 100, streams);
+
+ size_t offset = 0;
+ while(offset < res0.size() - mer_len + 1) {
+ parser_type::job j(parser);
+ ASSERT_FALSE(j.is_empty());
+ SCOPED_TRACE(::testing::Message() << offset << ": " << res0.substr(offset, j->end - j->start));
+ EXPECT_EQ(res0.substr(offset, j->end - j->start).c_str(), string(j->start, j->end - j->start));
+ offset += j->end - j->start - (mer_len - 1);
+ }
+ EXPECT_EQ(res0.size(), offset + mer_len - 1);
+
+ offset = 0;
+ while(offset < res1.size() - mer_len + 1) {
+ parser_type::job j(parser);
+ ASSERT_FALSE(j.is_empty());
+ SCOPED_TRACE(::testing::Message() << offset << ": " << res1.substr(offset, j->end - j->start));
+ EXPECT_EQ(res1.substr(offset, j->end - j->start).c_str(), string(j->start, j->end - j->start));
+ offset += j->end - j->start - (mer_len - 1);
+ }
+ EXPECT_EQ(res1.size(), offset + mer_len - 1);
+
+ parser_type::job j2(parser);
+ EXPECT_TRUE(j2.is_empty());
+}
+
+TEST(MerOverlapSequenceParser, Fastq) {
+ const char* file_name = "Fastq.fa";
+ file_unlink fu(file_name);
+ static const int nb_reads = 100;
+ static const int mer_len = 20;
+
+ std::ofstream o_sequence(file_name);
+ string res = generate_sequences(o_sequence, 10, 50, nb_reads, true);
+ o_sequence.close();
+
+ auto sequence = new std::ifstream(file_name);
+ opened_streams<std::ifstream**> streams(&sequence, &sequence + 1);
+ parser_type parser(mer_len, 1, 10, 100, streams);
+
+ size_t offset = 0;
+ while(true) {
+ parser_type::job j(parser);
+ if(j.is_empty())
+ break;
+ // SCOPED_TRACE(::testing::Message() << offset << ": " << res.substr(offset, j->end - j->start));
+ EXPECT_EQ(res.substr(offset, j->end - j->start).c_str(), string(j->start, j->end - j->start));
+ offset += j->end - j->start - (mer_len - 1);
+ }
+ EXPECT_EQ(res.size(), offset + mer_len - 1);
+}
+} // namespace {
diff --git a/unit_tests/test_misc.cc b/unit_tests/test_misc.cc
new file mode 100644
index 0000000..d35b42c
--- /dev/null
+++ b/unit_tests/test_misc.cc
@@ -0,0 +1,110 @@
+#include <stdint.h>
+
+#include <algorithm>
+#include <functional>
+
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/misc.hpp>
+
+namespace {
+using testing::Types;
+
+template <typename T>
+class FloorLog2Test : public ::testing::Test {
+public:
+ T x;
+
+ FloorLog2Test() : x(1) {}
+};
+
+typedef Types<uint32_t, uint64_t> Implementations;
+TYPED_TEST_CASE(FloorLog2Test, Implementations);
+
+TYPED_TEST(FloorLog2Test, FloorLog2) {
+ unsigned int i = 0;
+
+ for(i = 0; i < 8 * sizeof(this->x); i++) {
+ ASSERT_EQ(i, jellyfish::floorLog2(this->x << i));
+ ASSERT_EQ(i, jellyfish::floorLog2((this->x << i) | ((this->x << i) - 1)));
+ }
+}
+
+using jellyfish::bitsize;
+TEST(BitSize, Small) {
+ for(int i = 1; i < 4098; ++i) {
+ SCOPED_TRACE(::testing::Message() << "i:" << i);
+ EXPECT_GE((1 << bitsize(i)) - 1, i);
+ EXPECT_LE(1 << (bitsize(i) - 1), i);
+ }
+}
+
+template<typename T>
+int generic_popcount(T x) {
+ static int counts[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
+ int res = 0;
+ for( ; x; x >>= 4)
+ res += counts[x & 0xf];
+ return res;
+}
+
+TEST(Random, Bits) {
+ uint64_t m = 0;
+ uint64_t m2 = 0;
+ int not_zero = 0;
+ int bits = 0;
+ for(int i = 0; i < 1024; ++i) {
+ m += jellyfish::random_bits(41);
+ m2 += random_bits(41);
+ not_zero += random_bits() > 0;
+ bits += generic_popcount(m);
+ }
+ std::cout << bits << "\n";
+ EXPECT_LT((uint64_t)1 << 49, m); // Should be false with very low probability
+ EXPECT_LT((uint64_t)1 << 49, m2); // Should be false with very low probability
+ EXPECT_LT((int)(20.5 * 1024) / 2, bits);
+ EXPECT_LT(512, not_zero);
+}
+
+TEST(BinarySearchFirst, Int) {
+ static int size = 1024;
+
+ for(int i = 0; i < size; ++i)
+ EXPECT_EQ(i, *jellyfish::binary_search_first_false(jellyfish::pointer_integer<int>(0), jellyfish::pointer_integer<int>(size),
+ std::bind2nd(std::less<int>(), i)));
+}
+
+TEST(Slices, NonOverlapAll) {
+ for(int iteration = 0; iteration < 100; ++iteration) {
+ unsigned int nb_slices = random_bits(4) + 1;
+ unsigned int size = std::max(nb_slices, (unsigned int)random_bits(20));
+ SCOPED_TRACE(::testing::Message() << "iteration:" << iteration
+ << " size:" << size << " nb_slices:" << nb_slices);
+
+ unsigned int total = 0;
+ unsigned int prev = 0;
+ for(unsigned int i = 0; i < nb_slices; ++i) {
+ SCOPED_TRACE(::testing::Message() << "i:" << i);
+ std::pair<unsigned int, unsigned int> b = jellyfish::slice(i, nb_slices, size);
+ ASSERT_EQ(prev, b.first);
+ ASSERT_GT(b.second, b.first);
+ total += b.second - b.first;
+ prev = b.second;
+ }
+ ASSERT_EQ(size, total);
+ }
+}
+
+TEST(QuoteArg, Nothing) {
+ const std::string arg = "hello_world.1234_coucou/voila-bouh";
+ EXPECT_EQ(arg, jellyfish::quote_arg(arg));
+}
+TEST(QuoteArg, Quote) {
+ const std::string arg = "coucou voila";
+ EXPECT_EQ("'" + arg + "'", jellyfish::quote_arg(arg));
+}
+TEST(QuoteArg, QuoteSlash) {
+ const std::string arg = "coucou_'voila";
+ EXPECT_EQ("'coucou_'\\''voila'", jellyfish::quote_arg(arg));
+}
+}
diff --git a/unit_tests/test_mutex.cc b/unit_tests/test_mutex.cc
new file mode 100644
index 0000000..d404950
--- /dev/null
+++ b/unit_tests/test_mutex.cc
@@ -0,0 +1,53 @@
+#include <gtest/gtest.h>
+#include <jellyfish/locks_pthread.hpp>
+
+using testing::Types;
+
+#define NB_THREADS 3
+#define COUNT 1000000
+
+template <class mutex>
+class MutexTest : public ::testing::Test
+{
+ int volatile count;
+ mutex count_mutex;
+ pthread_t threads[NB_THREADS];
+ pthread_attr_t attr;
+
+public:
+ MutexTest() : count(0), count_mutex() {
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+ for(int i = 0; i < NB_THREADS; i++)
+ pthread_create(&threads[i], &attr, thread_fun, (void *)this);
+
+ for(int i = 0; i < NB_THREADS; i++)
+ pthread_join(threads[i], NULL);
+ }
+
+ static void *thread_fun(void *t) {
+ MutexTest<mutex> *self = (MutexTest<mutex> *)t;
+
+ self->inc();
+ return NULL;
+ }
+
+ void inc() {
+ for(int i = 0; i < COUNT; i++) {
+ count_mutex.lock();
+ count++;
+ count_mutex.unlock();
+ }
+ }
+
+
+ int get_count() { return count; }
+};
+
+typedef Types<locks::pthread::mutex> Implementations;
+
+TYPED_TEST_CASE(MutexTest, Implementations);
+
+TYPED_TEST(MutexTest, SuccessfullLocking) {
+ EXPECT_EQ(NB_THREADS * COUNT, this->get_count());
+}
diff --git a/unit_tests/test_offsets_key_value.cc b/unit_tests/test_offsets_key_value.cc
index 38b6d68..15d2918 100644
--- a/unit_tests/test_offsets_key_value.cc
+++ b/unit_tests/test_offsets_key_value.cc
@@ -12,162 +12,151 @@ namespace {
#define UINT64_C(x) ((uint64_t)x)
#endif
- using namespace jellyfish;
-
- typedef struct {
- uint_t key_len, val_len;
- } offset_test_param;
-
- class ComputeOffsetsTest : public ::testing::TestWithParam<offset_test_param>
- {
- public:
- Offsets<uint64_t> offsets;
-
- ComputeOffsetsTest() :
- offsets(GetParam().key_len, GetParam().val_len, 15)
- { }
-
- ~ComputeOffsetsTest() { }
- };
-
- TEST_P(ComputeOffsetsTest, CheckCoherency) {
- const Offsets<uint64_t>::offset_t *it = NULL, *pit = NULL;
- const Offsets<uint64_t>::offset_t *lit = NULL, *lpit = NULL;
- uint_t k_len = GetParam().key_len;
- uint_t v_len = GetParam().val_len;
- uint_t kv_len = k_len + v_len;
- uint_t lk_len = 4;
- uint_t lv_len = kv_len - lk_len;
- uint_t i = 0;
- // uint64_t *w, *pw;
-
- // /* Still missing:
- // * - testing of value masks
- // */
- EXPECT_EQ(lk_len, this->offsets.get_reprobe_len());
- EXPECT_EQ(lv_len, this->offsets.get_lval_len());
-
- for(i = 0; true; i++) {
- this->offsets.get_word_offset(i, &it, &lit, NULL);
- if(i > 0) {
- this->offsets.get_word_offset(i-1, &pit, &lpit, NULL);
-
- uint_t noff = pit->key.boff + kv_len;
- if(noff > 64) {
- EXPECT_EQ(pit->key.woff + 1, it->key.woff) <<
- i << ": Word offset should go up";
- } else {
- EXPECT_EQ(pit->key.woff, it->key.woff) <<
- i << ": Word offset should NOT go up";
- }
-
- if(pit->key.mask2) { // key between two words
- EXPECT_LT((uint_t)64, pit->key.boff + k_len) <<
- i << ": Key not between words, should not have mask2";
- } else {
- EXPECT_GE((uint_t)64, pit->key.boff - 1 + k_len + 1) <<
- i << ": Key between words, should have mask2";
- }
- EXPECT_EQ((pit->key.boff + kv_len + 1 + (pit->key.mask2 ? 2 : 0)) % 64,
- it->key.boff) <<
- i << ": Invalid jump of bit offset";
- EXPECT_EQ((pit->key.boff + kv_len + 1 + (pit->key.mask2 ? 2 : 0)) % 64,
- lit->key.boff) <<
- i << ": Invalid jump of bit offset large field";
- } // if(i > 0)
-
- EXPECT_EQ((it->key.boff + k_len + (it->key.mask2 ? 2 : 0)) % 64, it->val.boff) <<
- i << ": Invalid value offset";
- EXPECT_EQ((lit->key.boff + lk_len + (lit->key.mask2 ? 2 : 0)) % 64, lit->val.boff) <<
- i << ": Invalid value offset large field";
- EXPECT_EQ(UINT64_C(1) << (it->key.boff - 1), it->key.lb_mask) <<
- i << ": Invalid lb_mask";
- EXPECT_EQ(UINT64_C(1) << (lit->key.boff - 1), lit->key.lb_mask) <<
- i << ": Invalid lb_mask";
- if(it->key.mask2) {
- EXPECT_EQ(64 - it->key.boff - 1, it->key.shift) <<
- i << ": invalid key shift";
- EXPECT_EQ(UINT64_C(1) << (64 - it->key.boff + 1), 1 + (it->key.mask1 >> (it->key.boff - 1))) <<
- i << ": invalid key mask";
- EXPECT_EQ(UINT64_C(1) << (it->key.boff + k_len - 64 + 2), 1 + it->key.mask2) <<
- i << ": invalid key mask2";
- EXPECT_EQ(k_len, it->key.shift + it->key.cshift);
- EXPECT_EQ(UINT64_C(1) << 63, it->key.sb_mask1) <<
- i << ": invalid key key sb_mask1";
- EXPECT_EQ(UINT64_C(1) << it->key.cshift, it->key.sb_mask2) <<
- i << ": invalid key sb_mask2";
- } else {
- EXPECT_EQ(0u, it->key.shift) <<
- i << ": key shift should be zero, no mask";
- EXPECT_EQ(UINT64_C(1) << (k_len + 1), 1 + (it->key.mask1 >> (it->key.boff - 1))) <<
- i << ": invalid key mask " << it->key.boff;
- EXPECT_EQ(0u, it->key.cshift);
- EXPECT_EQ(0u, it->key.sb_mask1 | it->key.sb_mask2) <<
- i << ": set bit masks should be 0";
- }
- if(lit->key.mask2) {
- EXPECT_EQ(64 - lit->key.boff - 1, lit->key.shift) <<
- i << ": invalid key shift large field";
- EXPECT_EQ(UINT64_C(1) << (64 - lit->key.boff + 1), 1 + (lit->key.mask1 >> (lit->key.boff - 1))) <<
- i << ": invalid key mask large field";
- EXPECT_EQ(UINT64_C(1) << (lit->key.boff + lk_len - 64 + 2), 1 + lit->key.mask2) <<
- i << ": invalid key mask2 large field";
- EXPECT_EQ(lk_len, lit->key.shift + lit->key.cshift);
- EXPECT_EQ(UINT64_C(1) << 63, lit->key.sb_mask1) <<
- i << ": invalid key key sb_mask1";
- EXPECT_EQ(UINT64_C(1) << lit->key.cshift, lit->key.sb_mask2) <<
- i << ": invalid key sb_mask2";
- } else {
- EXPECT_EQ(0u, lit->key.shift) <<
- i << ": key shift should be zero, no mask, large field";
- EXPECT_EQ(0u, lit->key.cshift);
- EXPECT_EQ(UINT64_C(1) << (lk_len + 1), 1 + (lit->key.mask1 >> (lit->key.boff - 1))) <<
- i << ": invalid key mask large field " << lit->key.boff;
- }
-
- if(it->val.mask2) {
- EXPECT_LT((uint_t)64, it->val.boff + v_len) <<
- i << ": val not between words, should not have mask2";
- EXPECT_EQ(64 - it->val.boff, it->val.shift) <<
- i << ": invalid val shift";
- EXPECT_EQ(UINT64_C(1) << (64 - it->val.boff), 1 + (it->val.mask1 >> it->val.boff)) <<
- i << ": invalid val mask1";
- EXPECT_EQ(UINT64_C(1) << (it->val.boff + v_len - 64), 1 + it->val.mask2) <<
- i << ": invalid val mask2";
- } else {
- EXPECT_GE((uint_t)64, it->val.boff + v_len) <<
- i << ": val between words, should have mask2";
- EXPECT_EQ(v_len, it->val.shift) <<
- i << ": invalid val shift";
- EXPECT_EQ(UINT64_C(1) << v_len, 1 + (it->val.mask1 >> it->val.boff)) <<
- i << ": invalid val mask1";
- }
- EXPECT_EQ(v_len, it->val.shift + it->val.cshift);
- if(lit->val.mask2) {
- EXPECT_LT((uint_t)64, lit->val.boff + lv_len) <<
- i << ": val not between words, should not have mask2 large field";
- EXPECT_EQ(64 - lit->val.boff, lit->val.shift) <<
- i << ": invalid val shift large field";
- EXPECT_EQ(UINT64_C(1) << (64 - lit->val.boff), 1 + (lit->val.mask1 >> lit->val.boff)) <<
- i << ": invalid val mask1 large field";
- EXPECT_EQ(UINT64_C(1) << (lit->val.boff + lv_len - 64), 1 + lit->val.mask2) <<
- i << ": invalid val mask2 large field";
- } else {
- EXPECT_GE((uint_t)64, lit->val.boff + lv_len) <<
- i << ": val between words, should have mask2 large field " << lit->val.boff << " " << lv_len;
- EXPECT_EQ(lv_len, lit->val.shift) <<
- i << ": invalid val shift large field";
- EXPECT_EQ(UINT64_C(1) << lv_len, 1 + (lit->val.mask1 >> lit->val.boff)) <<
- i << ": invalid val mask1 large field";
- }
- EXPECT_EQ(lv_len, lit->val.shift + lit->val.cshift);
-
- uint_t noff = it->key.boff + kv_len;
- if(noff == 62 || noff == 63 || noff == 64)
- break;
+using namespace jellyfish;
+
+// Tuple is {key_len, val_len, reprobe_len}. Actual reprobe value is computed from the reprobe_len.
+class ComputeOffsetsTest : public ::testing::TestWithParam< ::std::tr1::tuple<int,int, int> >
+{
+public:
+ Offsets<uint64_t> offsets;
+
+ ComputeOffsetsTest() :
+ offsets(::std::tr1::get<0>(GetParam()), ::std::tr1::get<1>(GetParam()), (1 << ::std::tr1::get<2>(GetParam())) - 2)
+ { }
+
+ ~ComputeOffsetsTest() { }
+};
+
+void test_key_offsets(const Offsets<uint64_t>::offset_t* it, unsigned int k_len, const char* message) {
+ SCOPED_TRACE(message);
+
+ unsigned int val_boff = (it->key.boff + k_len + 1 + (k_len - (bsizeof(uint64_t) - it->key.boff - 1)) / (bsizeof(uint64_t) - 1)) % bsizeof(uint64_t);
+ if(it->key.sb_mask1) { // key between two words
+ EXPECT_LT(sizeof(uint64_t), it->key.boff + k_len) <<
+ ": Key not between words, should not have mask2";
+ EXPECT_EQ(val_boff + (val_boff > 0), it->val.boff) <<
+ ": Invalid value offset";
+ if(it->val.boff == 0)
+ EXPECT_EQ((uint64_t)0, it->key.sb_mask2);
+ } else {
+ if(bsizeof(uint64_t) >= it->key.boff + k_len) {
+ EXPECT_EQ((it->key.boff + k_len) % bsizeof(uint64_t), it->val.boff) <<
+ ": Invalid value offset";
+ } else {
+ EXPECT_TRUE(val_boff % bsizeof(uint64_t) == 0) <<
+ ": Key between words, should have mask2";
}
}
+ EXPECT_EQ((uint64_t)1 << (it->key.boff - 1), it->key.lb_mask) <<
+ ": Invalid lb_mask";
+ if(it->key.sb_mask1) {
+ EXPECT_EQ(bsizeof(uint64_t) - it->key.boff - 1, it->key.shift) <<
+ ": invalid key shift";
+ EXPECT_EQ(it->key.boff == 1 ? 0 : (uint64_t)1 << (bsizeof(uint64_t) - it->key.boff + 1), 1 + (it->key.mask1 >> (it->key.boff - 1))) <<
+ ": invalid key mask";
+ EXPECT_EQ((uint64_t)1 << it->val.boff, 1 + it->key.mask2) <<
+ ": invalid key mask2";
+ EXPECT_EQ(bsizeof(uint64_t) - it->key.boff - 1, it->key.shift) <<
+ ": invalid key shift";
+ EXPECT_EQ((unsigned int)0, (k_len - (it->key.shift + it->key.cshift)) % (bsizeof(uint64_t) - 1)) <<
+ ": invalid sum of shift and cshift";
+ if(it->key.sb_mask2)
+ EXPECT_EQ(1 + it->key.mask2, (uint64_t)1 << (it->key.cshift + 1)) <<
+ ": invalid key cshift";
+ else
+ EXPECT_EQ((unsigned int)0, it->key.cshift);
+ EXPECT_EQ((uint64_t)1 << 63, it->key.sb_mask1) <<
+ ": invalid key key sb_mask1";
+ EXPECT_EQ(k_len - (bsizeof(uint64_t) - 1 - it->key.boff) >= bsizeof(uint64_t) - 1, it->key.full_words);
+ } else {
+ EXPECT_EQ(0u, it->key.shift) <<
+ ": key shift should be zero, no sb_mask";
+ EXPECT_EQ((uint64_t)1 << (k_len + 1), 1 + (it->key.mask1 >> (it->key.boff - 1))) <<
+ ": invalid key mask, no sb_mask";
+ EXPECT_EQ(0u, it->key.cshift) <<
+ ": key cshift should be zero, no sb_mask";
+ EXPECT_EQ(0u, it->key.sb_mask1 | it->key.sb_mask2) <<
+ ": set bit masks should be 0";
+ }
+}
+
+void test_val_offsets(const Offsets<uint64_t>::offset_t* it, unsigned int v_len, const char* message) {
+ SCOPED_TRACE(message);
+
+ if(it->val.mask2) {
+ EXPECT_TRUE(bsizeof(uint64_t) <= it->val.boff + v_len && (it->val.boff + v_len) % bsizeof(uint64_t) != 0) <<
+ ": val not between words, should not have mask2";
+ EXPECT_EQ(bsizeof(uint64_t) - it->val.boff, it->val.shift) <<
+ ": invalid val shift";
+ EXPECT_EQ((uint64_t)1 << (bsizeof(uint64_t) - it->val.boff), 1 + (it->val.mask1 >> it->val.boff)) <<
+ ": invalid val mask1";
+ EXPECT_EQ((uint64_t)1 << (it->val.boff + v_len - bsizeof(uint64_t)), 1 + it->val.mask2) <<
+ ": invalid val mask2";
+ } else {
+ EXPECT_TRUE(bsizeof(uint64_t) > it->val.boff + v_len ||
+ (bsizeof(uint64_t) <= it->val.boff + v_len && (it->val.boff + v_len) % bsizeof(uint64_t) == 0)) <<
+ ": val between words, should have mask2";
+ EXPECT_EQ(v_len, it->val.shift) <<
+ ": invalid val shift";
+ EXPECT_EQ(v_len == bsizeof(uint64_t) ? (uint64_t)0 : (uint64_t)1 << v_len, 1 + (it->val.mask1 >> it->val.boff)) <<
+ ": invalid val mask1";
+ }
+ EXPECT_EQ(v_len, it->val.shift + it->val.cshift);
+}
+
+TEST_P(ComputeOffsetsTest, CheckCoherency) {
+ const Offsets<uint64_t>::offset_t *it = NULL, *pit = NULL;
+ const Offsets<uint64_t>::offset_t *lit = NULL, *lpit = NULL;
+ unsigned int k_len = ::std::tr1::get<0>(GetParam());
+ unsigned int v_len = ::std::tr1::get<1>(GetParam());
+ unsigned int kv_len = k_len + v_len;
+ unsigned int lk_len = ::std::tr1::get<2>(GetParam());
+ unsigned int lv_len = std::min(kv_len - lk_len, (unsigned int)bsizeof(uint64_t));
+ unsigned int i = 0;
+
+ EXPECT_EQ(lk_len, this->offsets.reprobe_len());
+ EXPECT_EQ((uint64_t)1 << lk_len, this->offsets.reprobe_mask() + 1);
+ EXPECT_EQ(lv_len, this->offsets.lval_len());
+
+
+ for(i = 0; i < bsizeof(uint64_t); i++) {
+ SCOPED_TRACE(::testing::Message() << "key:" << k_len << " val:" << v_len << " i:" << i
+ << " lkey:" << lk_len << " lval:" << lv_len);
+ this->offsets.word_offset(i, &it, &lit, NULL);
+ if(i > 0) {
+ this->offsets.word_offset(i-1, &pit, &lpit, NULL);
+
+ EXPECT_GE(it->key.woff, pit->key.woff) << "Current key offset larger than previous";
+ EXPECT_GE(it->key.woff, pit->val.woff) << "Current key offset larger than previous val offset";
+ EXPECT_TRUE(it->key.woff != pit->key.woff || it->key.boff > pit->key.boff)
+ << "Key bit offset did not increase within a word";
+ EXPECT_EQ((pit->val.boff + v_len) % 64 + 1, it->key.boff) <<
+ ": Invalid jump of bit offset";
+ } // if(i > 0)
+ EXPECT_GE(it->val.woff, it->key.woff) << "Val offset larger than key offset";
+ EXPECT_TRUE(it->key.woff != it->val.woff || it->val.boff > it->key.boff)
+ << "Val bit offset did not increase within a word";
+
+ EXPECT_EQ(it->key.woff, lit->key.woff);
+ EXPECT_EQ(it->key.boff, lit->key.boff);
+ EXPECT_EQ(it->key.lb_mask, lit->key.lb_mask);
+
+ test_key_offsets(it, k_len, "Key offsets");
+ test_key_offsets(lit, lk_len, "Large key offsets");
+
+ test_val_offsets(it, v_len, "Val offsets");
+ test_val_offsets(lit, lv_len, "Large val offsets");
+
+ size_t next_bit = (it->val.boff + v_len) % bsizeof(uint64_t);
+ if(next_bit >= 62 || next_bit == 0)
+ break;
+ }
- offset_test_param params[] = { {10, 10}, { 22, 5 }, {20, 5} };
- INSTANTIATE_TEST_CASE_P(OffsetsTest, ComputeOffsetsTest, ::testing::ValuesIn(params));
+ EXPECT_EQ(i + 1, this->offsets.block_len());
}
+
+INSTANTIATE_TEST_CASE_P(OffsetsTest, ComputeOffsetsTest, ::testing::Combine(::testing::Range(8, 192, 2), // Key lengths
+ ::testing::Range(0, 64), // Val lengths
+ ::testing::Range(4, 9) // Reprobe lengths
+ ));
+} // namespace {
diff --git a/unit_tests/test_packed_key_value_array.cc b/unit_tests/test_packed_key_value_array.cc
new file mode 100644
index 0000000..6205ac3
--- /dev/null
+++ b/unit_tests/test_packed_key_value_array.cc
@@ -0,0 +1,213 @@
+#include <gtest/gtest.h>
+#include <stdlib.h>
+#include <string.h>
+#include <map>
+#include <vector>
+#include <iostream>
+#include <algorithm>
+#include <storage.hpp>
+#include <packed_key_value_array.hpp>
+#include <hash.hpp>
+
+#include <atomic_gcc.hpp>
+#include <allocators_malloc.hpp>
+#include <math.h>
+
+using namespace jellyfish;
+
+typedef struct {
+ size_t size, entries, iterations;
+ uint_t key_len, val_len, reprobe_limit;
+} packed_counting_param;
+
+class PackedCountingTest : public ::testing::TestWithParam<packed_counting_param>
+{
+public:
+ typedef packed_key_value::array<uint64_t,atomic::gcc<uint64_t>,allocators::malloc> pary_t;
+ typedef hash< uint64_t,uint64_t,pary_t,atomic::gcc<uint64_t> > pch_t;
+ typedef std::pair<uint64_t,uint64_t> kv_t;
+ pary_t ary;
+ pch_t pch;
+ kv_t *kv_pairs;
+ std::map<uint64_t,size_t> key_entry_map;
+
+
+ PackedCountingTest() :
+ ary(GetParam().size, GetParam().key_len, GetParam().val_len,
+ GetParam().reprobe_limit, quadratic_reprobes),
+ pch(&ary)
+ { }
+
+ void random_keys_fill() {
+ uint64_t nkey;
+ uint64_t key_mask = (1 << GetParam().key_len) - 1;
+ kv_pairs = new kv_t[GetParam().entries];
+
+ for(size_t i = 0; i < GetParam().entries; i++) {
+ do {
+ nkey = rand() & key_mask;
+ } while(nkey == 0 || key_entry_map.find(nkey) != key_entry_map.end());
+ kv_pairs[i] = kv_t(nkey, 0);
+ key_entry_map[kv_pairs[i].first] = i;
+ }
+
+ for(size_t i = 0; i < GetParam().iterations; i++) {
+ size_t k = exp_rand(0.5, GetParam().entries);
+ if(ary.add_rec(kv_pairs[k].first % GetParam().size,
+ kv_pairs[k].first, (uint64_t)1, false)) {
+ kv_pairs[k].second++;
+ }
+ }
+ }
+
+ void large_fields_fill() {
+ std::vector<uint64_t> keys;
+ uint64_t key_mask = (1 << GetParam().key_len) - 1;
+ uint64_t fval = (((uint64_t)1) << GetParam().val_len) - 1;
+ uint64_t nkey, nval;
+ kv_pairs = new kv_t[GetParam().entries];
+
+ keys.reserve(GetParam().entries);
+
+ for(size_t i = 0; i < GetParam().entries; i++) {
+ do {
+ nkey = rand() & key_mask;
+ } while(nkey == 0 || key_entry_map.find(nkey) != key_entry_map.end());
+ keys.push_back(nkey);
+ key_entry_map[nkey] = i;
+ }
+
+ std::vector<uint64_t> shuff_keys = keys;
+ random_shuffle(shuff_keys.begin(), shuff_keys.end());
+ for(std::vector<uint64_t>::const_iterator it = shuff_keys.begin();
+ it != shuff_keys.end();
+ it++) {
+ ary.add_rec(*it % GetParam().size, *it, fval, false);
+ ASSERT_TRUE(ary.get_val(*it % GetParam().size,
+ *it, nval)) << std::hex <<
+ "Key not set " << (it - shuff_keys.begin()) << " key " << *it;
+ ASSERT_EQ(fval, nval) <<
+ "Val not set properly " << (it - shuff_keys.begin()) << " key " << *it;
+
+ }
+
+ for(std::vector<uint64_t>::const_iterator it = keys.begin();
+ it != keys.end();
+ it++) {
+ uint64_t aval = rand() & 7;
+ bool res = ary.add_rec(*it % GetParam().size, *it, aval, false);
+ kv_pairs[it - keys.begin()] =
+ kv_t(*it, fval + (res ? aval : 0));
+ ASSERT_TRUE(ary.get_val(*it % GetParam().size,
+ *it, nval, true)) << std::hex <<
+ "Key not set " << (it - keys.begin()) << " key " << *it;
+ ASSERT_EQ(fval + (res ? aval : 0), nval) << std::hex <<
+ "Val not set properly " << (it - keys.begin()) << " key " << *it;
+ }
+ }
+
+ ~PackedCountingTest() {}
+
+ // Exponantial distribution with parameter p, truncated into [0, max-1]
+ size_t exp_rand(double p, size_t max) {
+ size_t k;
+ do {
+ k = (size_t)ceil(log(1 - (((double)rand()) / RAND_MAX)) / log(p)) - 1;
+ } while(k >= max);
+ return k;
+ }
+};
+
+TEST_P(PackedCountingTest, RandomIncrementsIterator) {
+ this->random_keys_fill();
+ ASSERT_EQ(GetParam().size, this->ary.get_size());
+ pch_t::iterator it = this->pch.iterator_all();
+ std::map<uint64_t, size_t>::iterator key_id;
+ kv_t kv_pair;
+
+ while(it.next()) {
+ key_id = this->key_entry_map.find(it.key);
+ ASSERT_FALSE(key_entry_map.end() == key_id) <<
+ "Unknown key in hash: " << std::hex << it.key << " id " << it.id;
+ kv_pair = kv_pairs[key_id->second];
+ ASSERT_EQ(kv_pair.first, it.key) <<
+ "Bad initialization";
+ ASSERT_EQ(kv_pairs[key_id->second].second, it.val) <<
+ "Error in count for key: " << it.key;
+ }
+
+// for(size_t i = 0; i < GetParam().entries; i++) {
+// ASSERT_EQ((uint64_t)0, kv_pairs[i].second) <<
+// "Error in count for key: " << i << " " << std::hex << kv_pairs[i].first;
+// }
+}
+
+// Not neede anymore. Only one type of iterator already tested in previous TEST_P
+// TEST_P(PackedCountingTest, RandomIncrementsFullIterator) {
+// this->random_keys_fill();
+// ASSERT_EQ(GetParam().size, this->pch.size());
+// pch_t::full_iterator it = this->pch.full_all();
+// std::map<uint64_t, size_t>::iterator key_id;
+// kv_t kv_pair;
+
+// while(it.next()) {
+// key_id = this->key_entry_map.find(it.key);
+// ASSERT_FALSE(key_entry_map.end() == key_id) <<
+// "Unknown key in hash: " << std::hex << it.key << " id " << it.id;
+// kv_pair = kv_pairs[key_id->second];
+// ASSERT_EQ(kv_pair.first, it.key) <<
+// "Bad initialization";
+// ASSERT_EQ(kv_pairs[key_id->second].second, it.val) <<
+// "Error in count for key: " << std::hex << it.key;
+// }
+// }
+
+TEST_P(PackedCountingTest, FullKeyIncrements) {
+ uint64_t fkey = (((uint64_t)1) << GetParam().key_len) - 1;
+ uint64_t key, val;
+ // uint_t overflows;
+
+ for(size_t i = 0; i < GetParam().size; i++) {
+ this->ary.add_rec(i, fkey, (uint64_t)1, false);
+ ASSERT_TRUE(this->ary.get_key_val(i, key, val));
+ ASSERT_EQ(fkey, key);
+ // ASSERT_EQ(0u, overflows);
+ ASSERT_EQ(1u, val);
+ }
+
+ for(size_t i = 0; i < GetParam().size; i++) {
+ this->ary.add_rec(i, fkey, (uint64_t)1, false);
+ ASSERT_TRUE(this->ary.get_key_val(i, key, val));
+ ASSERT_EQ(fkey, key);
+ // ASSERT_EQ(0u, overflows);
+ ASSERT_EQ(2u, val);
+ }
+}
+
+TEST_P(PackedCountingTest, LargeFields) {
+ this->large_fields_fill();
+ ASSERT_EQ(GetParam().size, this->pch.get_size());
+
+ pch_t::iterator it = this->pch.iterator_all();
+ std::map<uint64_t, size_t>::iterator key_id;
+ kv_t kv_pair;
+
+ while(it.next()) {
+ key_id = this->key_entry_map.find(it.key);
+ ASSERT_FALSE(key_entry_map.end() == key_id) <<
+ "Unknown key in hash: " << std::hex << it.key << " id " << it.id;
+ kv_pair = kv_pairs[key_id->second];
+ ASSERT_EQ(kv_pair.first, it.key) <<
+ "Bad initialization";
+ ASSERT_EQ(kv_pairs[key_id->second].second, it.val) <<
+ "Error in count for key: " << std::hex << it.key;
+ }
+}
+
+packed_counting_param pc_params[] = {
+ { 32, 16, 32, 20, 3, 15}, // size, entries, iterations, key_len, val_len, reprobe-limit
+ { 32, 16, 1024, 20, 3, 15},
+ { 64, 40, 2048, 22, 3, 7}
+};
+INSTANTIATE_TEST_CASE_P(SingleThreadTest, PackedCountingTest,
+ ::testing::ValuesIn(pc_params));
diff --git a/unit_tests/test_rectangular_binary_matrix.cc b/unit_tests/test_rectangular_binary_matrix.cc
new file mode 100644
index 0000000..c0aaad2
--- /dev/null
+++ b/unit_tests/test_rectangular_binary_matrix.cc
@@ -0,0 +1,332 @@
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <stdexcept>
+#include <stdlib.h>
+#include <jellyfish/rectangular_binary_matrix.hpp>
+#include <jellyfish/mer_dna.hpp>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_INT128
+#include <jellyfish/int128.hpp>
+#endif
+
+namespace {
+using jellyfish::RectangularBinaryMatrix;
+using jellyfish::mer_dna;
+
+static bool allocate_matrix(unsigned int r, unsigned c) {
+ RectangularBinaryMatrix m(r, c);
+ return m.is_zero();
+}
+
+TEST(RectangularBinaryMatrix, InitSizes) {
+ RectangularBinaryMatrix m(5, 60);
+
+ EXPECT_EQ(5u, m.r());
+ EXPECT_EQ(60u, m.c());
+ EXPECT_TRUE(m.is_zero());
+
+ EXPECT_THROW(allocate_matrix(100, 100), std::out_of_range);
+ EXPECT_THROW(allocate_matrix(0, 100), std::out_of_range);
+ EXPECT_THROW(allocate_matrix(10, 0), std::out_of_range);
+}
+
+TEST(RectangularBinaryMatrix, Copy) {
+ RectangularBinaryMatrix m1(5, 55);
+ m1.randomize(random_bits);
+
+ RectangularBinaryMatrix m2(m1);
+ RectangularBinaryMatrix m3(6, 66);
+ RectangularBinaryMatrix m4(5, 55);
+
+ EXPECT_TRUE(!m1.is_zero());
+ EXPECT_TRUE(m1 == m2);
+ EXPECT_TRUE(!(m1 == m3));
+ EXPECT_TRUE(!(m1 == m4));
+ m4 = m1;
+ EXPECT_TRUE(m1 == m4);
+}
+
+TEST(RectangularBinaryMatrix, InitRaw) {
+ const unsigned int nb_col = 80;
+ uint64_t raw[nb_col];
+ for(unsigned int i = 0; i < nb_col; ++i)
+ raw[i] = random_bits();
+ const RectangularBinaryMatrix m(raw, 19, nb_col);
+ EXPECT_EQ(19u, m.r());
+ EXPECT_EQ(80u, m.c());
+ const uint64_t mask = ((uint64_t)1 << 19) - 1;
+ for(unsigned int i = 0; i < nb_col; ++i)
+ EXPECT_EQ(raw[i] & mask, m[i]);
+}
+
+TEST(RectangularBinaryMatrix, LowIdentity) {
+ for(int r = 2; r < 64; r += 2) {
+ for(int c = 2; c < 100; c += 2) {
+ SCOPED_TRACE(::testing::Message() << "matrix " << r << "x" << c);
+ RectangularBinaryMatrix m(r, c); // Matrix should be zeroed out
+ mer_dna::k(c);
+ mer_dna v;
+ v.randomize();
+
+ EXPECT_FALSE(m.is_low_identity());
+ m.init_low_identity();
+ EXPECT_TRUE(m.is_low_identity());
+
+ uint64_t res = m.times(v);
+ EXPECT_EQ(v.get_bits(0, std::min(r, c)), res);
+ }
+ }
+}
+
+/******************************
+ * Matrix Vector product
+ ******************************/
+class MatrixVectorProd : public ::testing::TestWithParam< ::std::tr1::tuple<int, int> > {
+public:
+ unsigned int row, col;
+ RectangularBinaryMatrix m;
+ MatrixVectorProd() :
+ row(::std::tr1::get<0>(GetParam())),
+ col(::std::tr1::get<1>(GetParam())),
+ m(row, col)
+ {
+ m.randomize(random_bits);
+ }
+};
+
+TEST_P(MatrixVectorProd, Checks) {
+ EXPECT_EQ(row, m.r());
+ EXPECT_EQ(col, m.c());
+}
+
+TEST_P(MatrixVectorProd, AllOnes) {
+ uint64_t v[2], res = 0;
+ v[0] = v[1] = (uint64_t)-1;
+ for(unsigned int i = 0; i < m.c(); ++i)
+ res ^= m[i];
+ EXPECT_EQ(res, m.times_loop(v));
+#ifdef HAVE_INT128
+ EXPECT_EQ(res, m.times_128(v));
+#endif
+#ifdef HAVE_SSE
+ EXPECT_EQ(res, m.times_sse(v));
+#endif
+}
+
+TEST_P(MatrixVectorProd, EveryOtherOnes) {
+ uint64_t v[2], res = 0;
+ v[0] = 0xaaaaaaaaaaaaaaaaUL;
+ v[1] = 0xaaaaaaaaaaaaaaaaUL;
+ for(unsigned int i = 0; i < m.c(); i += 2)
+ res ^= m[i];
+ EXPECT_EQ(res, m.times_loop(v));
+#ifdef HAVE_INT128
+ EXPECT_EQ(res, m.times_128(v));
+#endif
+#ifdef HAVE_SSE
+ EXPECT_EQ(res, m.times_sse(v));
+#endif
+
+ v[0] >>= 1;
+ v[1] >>= 1;
+ res = 0;
+ for(unsigned int i = 1; i < m.c(); i += 2)
+ res ^= m[i];
+ EXPECT_EQ(res, m.times_loop(v));
+#ifdef HAVE_INT128
+ EXPECT_EQ(res, m.times_128(v));
+#endif
+#ifdef HAVE_SSE
+ EXPECT_EQ(res, m.times_sse(v));
+#endif
+}
+
+#if HAVE_SSE || HAVE_INT128
+TEST_P(MatrixVectorProd, Optimizations) {
+ static const int nb_tests = 100;
+ const unsigned int nb_words = col / 64 + (col % 64 != 0);
+ uint64_t v[nb_words];
+
+ for(int i = 0; i < nb_tests; ++i) {
+ // unsigned int r = 2 * (random() % 31 + 1);
+ // unsigned int c = 2 * (random() % 100) + r;
+
+ // RectangularBinaryMatrix m(r, c);
+ // m.randomize(random_bits);
+
+ for(unsigned int j = 0; j < nb_words; ++j)
+ v[j] = random_bits();
+
+ uint64_t res = m.times_loop((uint64_t*)v);
+#ifdef HAVE_SSE
+ EXPECT_EQ(res, m.times_sse((uint64_t*)v));
+#endif
+#ifdef HAVE_INT128
+ EXPECT_EQ(res, m.times_128((uint64_t*)v));
+#endif
+ }
+}
+#endif // HAVE_SSE || HAVE_INT128
+
+INSTANTIATE_TEST_CASE_P(MatrixVectorProdTest, MatrixVectorProd, ::testing::Combine(::testing::Range(1, 65, 1), // rows
+ ::testing::Range(2, 100, 2))); // cols
+
+/******************************
+ * Matrix product and inverse
+ ******************************/
+TEST(PseudoProduct, Dimensions) {
+ RectangularBinaryMatrix m(30, 100), m1(32, 100), m2(30, 98);
+
+ EXPECT_THROW(m.pseudo_multiplication(m1), std::domain_error);
+ EXPECT_THROW(m.pseudo_multiplication(m2), std::domain_error);
+}
+
+TEST(PseudoProduct, Identity) {
+ RectangularBinaryMatrix m(30, 100), i(30, 100);
+ i.init_low_identity();
+ m.randomize(random_bits);
+
+ EXPECT_TRUE(i.pseudo_multiplication(m) == m);
+}
+
+TEST(PseudoProduct, Parity) {
+ const unsigned int col_sizes[6] = { 50, 70, 126, 130, 64, 128 };
+ const unsigned int nb_rows = 30;
+
+ for(unsigned int k = 0; k < sizeof(col_sizes) / sizeof(unsigned int); ++k) {
+ const unsigned int nb_cols = col_sizes[k];
+ uint64_t *cols = new uint64_t[nb_cols];
+ RectangularBinaryMatrix p(nb_rows, nb_cols);
+
+ for(unsigned int j = 18; j < 19; ++j) {
+ const uint64_t bits = ((uint64_t)1 << j) - 1;
+ unsigned int i;
+ for(i = 0; i < nb_cols; ++i)
+ cols[i] = bits;
+ RectangularBinaryMatrix m(cols, nb_rows, nb_cols);
+
+ p = m.pseudo_multiplication(m);
+ for(i = 0; i < nb_cols - nb_rows; ++i)
+ EXPECT_EQ(__builtin_parity(bits) ? (uint64_t)0 : bits, p[i]);
+ for( ; i < nb_cols; ++i)
+ EXPECT_EQ(__builtin_parity(bits) ? bits : (uint64_t)0, p[i]);
+ }
+ delete [] cols;
+ }
+}
+
+TEST(PseudoProduct, Inverse) {
+ int full_rank = 0, singular = 0;
+ for(unsigned int i = 0; i < 500; ++i) {
+ unsigned int r = random() % 63 + 1;
+ unsigned int c = 2 * ((random() % 100) + 1);
+ SCOPED_TRACE(::testing::Message() << "Dimension " << r << "x" << c);
+ RectangularBinaryMatrix m(r, c);
+ m.randomize(random_bits);
+ RectangularBinaryMatrix s(m);
+ unsigned int rank = m.pseudo_rank();
+ if(rank != c) {
+ ++singular;
+ EXPECT_THROW(m.pseudo_inverse(), std::domain_error);
+ } else {
+ ++full_rank;
+ RectangularBinaryMatrix inv(m);
+ EXPECT_NO_THROW(inv = m.pseudo_inverse());
+ RectangularBinaryMatrix i = inv.pseudo_multiplication(m);
+ EXPECT_TRUE(i.is_low_identity());
+ }
+ EXPECT_TRUE(s == m);
+ }
+ EXPECT_EQ(500, full_rank + singular);
+ EXPECT_NE(0, full_rank);
+}
+
+TEST(PseudoProduct, Rank) {
+ RectangularBinaryMatrix m(50, 100);
+ for(unsigned int i = 0; i < 10; ++i) {
+ m.randomize(random_bits);
+ RectangularBinaryMatrix s(m);
+ unsigned int rank = m.pseudo_rank();
+ EXPECT_TRUE(rank <= m.c());
+ EXPECT_TRUE(s == m);
+ }
+}
+
+TEST(PseudoProduct, InitRandom) {
+ RectangularBinaryMatrix m(50, 100);
+ for(unsigned int i = 0; i < 10; ++i) {
+ RectangularBinaryMatrix im(m.randomize_pseudo_inverse(random_bits));
+ EXPECT_EQ((unsigned int)m.c(), m.pseudo_rank());
+ EXPECT_EQ((unsigned int)m.c(), im.pseudo_rank());
+ EXPECT_TRUE((m.pseudo_multiplication(im)).is_low_identity());
+ }
+}
+
+TEST(PseudoProduct, VectorInverseMultiplication) {
+ RectangularBinaryMatrix m(50, 132);
+ RectangularBinaryMatrix im(m.randomize_pseudo_inverse());
+ RectangularBinaryMatrix cim(im);
+ EXPECT_TRUE(cim.pseudo_multiplication(m).is_low_identity());
+
+ mer_dna::k(66);
+ mer_dna v, iv, iv2;
+ EXPECT_EQ(m.nb_words(), v.nb_words());
+
+ for(int i = 0; i < 100; ++i) {
+ SCOPED_TRACE(::testing::Message() << "i=" << i);
+ v.randomize();
+ uint64_t hash = m.times(v);
+ iv = v; iv.set_bits(0, 50, hash);
+
+ uint64_t lower = im.times(iv);
+ EXPECT_EQ(v.get_bits(0, 50), lower);
+ }
+}
+
+
+static const int speed_loop = 100000000;
+TEST(MatrixProductSpeed, Loop) {
+ RectangularBinaryMatrix m(50, 100);
+ const unsigned int nb_words = m.c() / 64 + (m.c() % 64 != 0);
+ uint64_t v[nb_words];
+ for(unsigned int j = 0; j < nb_words; ++j)
+ v[j] = random_bits();
+
+ volatile uint64_t res = 0;
+ for(int i = 0; i < speed_loop; ++i)
+ res ^= m.times_loop((uint64_t*)v);
+}
+
+#ifdef HAVE_SSE
+TEST(MatrixProductSpeed, SSE) {
+ RectangularBinaryMatrix m(50, 100);
+ const unsigned int nb_words = m.c() / 64 + (m.c() % 64 != 0);
+ uint64_t v[nb_words];
+ for(unsigned int j = 0; j < nb_words; ++j)
+ v[j] = random_bits();
+
+ volatile uint64_t res = 0;
+ for(int i = 0; i < speed_loop; ++i)
+ res ^= m.times_sse((uint64_t*)v);
+}
+#endif
+
+#ifdef HAVE_INT128
+TEST(MatrixProductSpeed, U128) {
+ RectangularBinaryMatrix m(50, 100);
+ const unsigned int nb_words = m.c() / 64 + (m.c() % 64 != 0);
+ uint64_t v[nb_words];
+ for(unsigned int j = 0; j < nb_words; ++j)
+ v[j] = random_bits();
+
+ volatile uint64_t res = 0;
+ for(int i = 0; i < speed_loop; ++i)
+ res ^= m.times_128((uint64_t*)v);
+}
+#endif
+
+}
diff --git a/unit_tests/test_simple_circular_buffer.cc b/unit_tests/test_simple_circular_buffer.cc
index a66e137..50805f6 100644
--- a/unit_tests/test_simple_circular_buffer.cc
+++ b/unit_tests/test_simple_circular_buffer.cc
@@ -2,70 +2,55 @@
#include <jellyfish/simple_circular_buffer.hpp>
namespace {
- // template<typename T>
- // class CircularBufferTest : public ::testing::Test { };
- // typedef ::testing::Types<circular_buffer::fixed<int, 16>,
- // circular_buffer::dyn<int> > CircularBufferTypes;
- // TYPED_TEST_CASE(CircularBufferTest, CircularBufferTypes);
- static const int capa = 16;
-
- class test_simple_circular_buffer :
- public jellyfish::simple_circular_buffer::pre_alloc<int, capa> {
- public:
- typedef jellyfish::simple_circular_buffer::pre_alloc<int, capa> super;
- explicit test_simple_circular_buffer(int* data) : super(data) { }
-
- // int next_index(int i) const { return super::next_index(i); }
- // int prev_index(int i) const { return super::prev_index(i); }
- // int front_ptr() const { return front_; }
- // int back_ptr() const { return back_; }
- };
-
- TEST(SimpleCircularBufferTest, FillEmpty) {
- int ary[capa];
- test_simple_circular_buffer buffer(ary);
- EXPECT_EQ(capa, buffer.capacity());
-
- EXPECT_TRUE(buffer.empty());
- for(int i = 0; i < buffer.capacity(); ++i) {
- SCOPED_TRACE(::testing::Message() << "i=" << i);
- EXPECT_FALSE(buffer.full());
- EXPECT_EQ(i, buffer.size());
- buffer.push_back(i);
- EXPECT_EQ(i, buffer.back());
- EXPECT_FALSE(buffer.empty());
- }
- EXPECT_TRUE(buffer.full());
-
- for(int i = 0; i < buffer.capacity(); ++i) {
- SCOPED_TRACE(::testing::Message() << "i=" << i);
- EXPECT_FALSE(buffer.empty());
- EXPECT_EQ(i, buffer.front());
- EXPECT_EQ(buffer.capacity() - i, buffer.size());
- buffer.pop_front();
- EXPECT_FALSE(buffer.full());
- }
- EXPECT_TRUE(buffer.empty());
- EXPECT_EQ(0, buffer.size());
+static const int capa = 16;
+typedef jellyfish::simple_circular_buffer::pre_alloc<int, capa> test_simple_circular_buffer;
+
+TEST(SimpleCircularBufferTest, FillEmpty) {
+ int ary[capa];
+ test_simple_circular_buffer buffer(ary);
+ EXPECT_EQ(capa, buffer.capacity());
+
+ EXPECT_TRUE(buffer.empty());
+ for(int i = 0; i < buffer.capacity(); ++i) {
+ SCOPED_TRACE(::testing::Message() << "i=" << i);
+ EXPECT_FALSE(buffer.full());
+ EXPECT_EQ(i, buffer.size());
+ buffer.push_back(i);
+ EXPECT_EQ(i, buffer.back());
+ EXPECT_FALSE(buffer.empty());
}
+ EXPECT_TRUE(buffer.full());
+
+ for(int i = 0; i < buffer.capacity(); ++i) {
+ SCOPED_TRACE(::testing::Message() << "i=" << i);
+ EXPECT_FALSE(buffer.empty());
+ EXPECT_EQ(i, buffer.front());
+ EXPECT_EQ(buffer.capacity() - i, buffer.size());
+ buffer.pop_front();
+ EXPECT_FALSE(buffer.full());
+ }
+ EXPECT_TRUE(buffer.empty());
+ EXPECT_EQ(0, buffer.size());
+}
- TEST(SimpleCircularBufferTest, Usefull) {
- int ary[capa];
- test_simple_circular_buffer buffer(ary);
- EXPECT_EQ(capa, buffer.capacity());
+TEST(SimpleCircularBufferTest, Usefull) {
+ int ary[capa];
+ test_simple_circular_buffer buffer(ary);
+ EXPECT_EQ(capa, buffer.capacity());
- int i = 0;
- for( ; i < buffer.capacity(); ++i) {
- EXPECT_TRUE(buffer.push_back());
- buffer.back() = i;
- }
+ int i = 0;
+ for( ; i < buffer.capacity(); ++i) {
+ EXPECT_TRUE(buffer.push_back());
+ buffer.back() = i;
+ }
- for( ; i < 10 * buffer.capacity(); ++i) {
- EXPECT_EQ(i - capa, buffer.front());
- buffer.pop_front();
- EXPECT_TRUE(buffer.push_back());
- buffer.back() = i;
- }
+ for( ; i < 10 * buffer.capacity(); ++i) {
+ EXPECT_EQ(i - capa, buffer.front());
+ buffer.pop_front();
+ EXPECT_TRUE(buffer.push_back());
+ buffer.back() = i;
}
}
+
+} // namespace {
diff --git a/unit_tests/test_square_binary_matrix.cc b/unit_tests/test_square_binary_matrix.cc
index 58008ad..7022ab7 100644
--- a/unit_tests/test_square_binary_matrix.cc
+++ b/unit_tests/test_square_binary_matrix.cc
@@ -1,5 +1,6 @@
#include <fstream>
#include <gtest/gtest.h>
+#include <unit_test/test_main.hpp>
#include <jellyfish/square_binary_matrix.hpp>
#include <jellyfish/time.hpp>
@@ -16,15 +17,6 @@ class RandomEnvironment : public ::testing::Environment {
};
//::testing::Environment* const foo_env = ::testing::AddGlobalTestEnvironment(new RandomEnvironment);
-uint64_t random_vector(int length) {
- uint64_t _mask = (((uint64_t)1) << length) - 1;
- uint64_t res = 0;
- int lrm = floorLog2((unsigned long)RAND_MAX);
- int i;
- for(i = 0; i < length; i += lrm)
- res ^= (uint64_t)random() << i;
- return res & _mask;
-}
#define VECLEN 44
diff --git a/unit_tests/test_stdio_filebuf.cc b/unit_tests/test_stdio_filebuf.cc
new file mode 100644
index 0000000..078003a
--- /dev/null
+++ b/unit_tests/test_stdio_filebuf.cc
@@ -0,0 +1,55 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <cstdio>
+#include <fstream>
+#include <istream>
+#include <memory>
+
+#include <gtest/gtest.h>
+
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/stdio_filebuf.hpp>
+
+namespace {
+typedef jellyfish::stdio_filebuf<char> stdio_filebuf;
+TEST(StdioFileBuf, Read) {
+ const char* file_name = "test_stdio_file_buf_read";
+ file_unlink fu(file_name);
+ std::vector<char> buffer(8192);
+ for(size_t i = 0; i < buffer.size(); ++i)
+ buffer[i] = '@' + (i % 64);
+ {
+ std::ofstream out(file_name);
+ out.write(buffer.data(), buffer.size());
+ }
+
+ int fd = open(file_name, O_RDONLY);
+ EXPECT_GT(fd, -1);
+ FILE* file = fopen(file_name, "r");
+ EXPECT_NE((FILE*)0, file);
+
+ std::unique_ptr<stdio_filebuf> fd_buf(new stdio_filebuf(fd, std::ios::in));
+ std::istream fd_stream(fd_buf.get());
+ std::unique_ptr<stdio_filebuf> file_buf(new stdio_filebuf(file, std::ios::in));
+ std::istream file_stream(file_buf.get());
+
+ size_t have_read = 0;
+ char read_buffer[256];
+ while(have_read < buffer.size()) {
+ const size_t to_read = random_bits(8);
+ const size_t expect_read = std::min(buffer.size() - have_read, to_read);
+
+ fd_stream.read(read_buffer, to_read);
+ EXPECT_EQ(expect_read, fd_stream.gcount());
+ EXPECT_EQ(0, std::strncmp(&buffer[have_read], read_buffer, expect_read));
+
+ file_stream.read(read_buffer, to_read);
+ EXPECT_EQ(expect_read, fd_stream.gcount());
+ EXPECT_EQ(0, std::strncmp(&buffer[have_read], read_buffer, expect_read));
+
+ have_read += expect_read;
+ }
+ EXPECT_TRUE(fd_stream.eof());
+}
+}
diff --git a/unit_tests/test_stream_iterator.cc b/unit_tests/test_stream_iterator.cc
new file mode 100644
index 0000000..cc6f2bf
--- /dev/null
+++ b/unit_tests/test_stream_iterator.cc
@@ -0,0 +1,94 @@
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <gtest/gtest.h>
+
+#include <vector>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <stdexcept>
+
+#include <jellyfish/err.hpp>
+#include <jellyfish/misc.hpp>
+#include <jellyfish/stream_iterator.hpp>
+
+namespace {
+namespace err = jellyfish::err;
+
+typedef std::vector<const char*> path_vector;
+typedef path_vector::const_iterator path_iterator;
+typedef jellyfish::stream_iterator<path_iterator> stream_iterator;
+
+class StreamIterator : public ::testing::Test {
+protected:
+ static path_vector paths;
+ static int total_lines;
+ static char* tmpdir;
+
+ static void SetUpTestCase() {
+ tmpdir = strdup("/tmp/stream_iterator_XXXXXX");
+ if(!mkdtemp(tmpdir))
+ throw std::runtime_error(err::msg() << "Failed to create tmp directory: " << err::no);
+
+ int nb_files = jellyfish::random_bits(5);
+ for(int i = 0; i < nb_files; ++i) {
+ std::ostringstream path;
+ path << tmpdir << "/" << i;
+ paths.push_back(strdup(path.str().c_str()));
+ std::ofstream tmp_file(path.str().c_str());
+ if(tmp_file.fail())
+ throw std::runtime_error(err::msg() << "Failed to open file '" << path.str() << "' for writing");
+ int nb_lines = jellyfish::random_bits(6);
+ total_lines += nb_lines;
+ for(int j = 0; j < nb_lines; ++j)
+ tmp_file << "line " << j << "\n";
+ }
+ }
+
+ static void TearDownTestCase() {
+ for(path_iterator it = paths.begin(); it != paths.end(); ++it) {
+ if(unlink(*it) == -1)
+ throw std::runtime_error(err::msg() << "Failed to unlink file '" << *it << ": " << err::no);
+ free((void*)*it);
+ }
+ if(rmdir(tmpdir) == -1)
+ throw std::runtime_error(err::msg() << "Failed to rmdir '" << tmpdir << ": " << err::no);
+ free(tmpdir);
+ }
+};
+path_vector StreamIterator::paths;
+int StreamIterator::total_lines = 0;
+char* StreamIterator::tmpdir;
+
+TEST_F(StreamIterator, Empty) {
+ stream_iterator sit(paths.begin(), paths.begin());
+ stream_iterator send;
+
+ int nb_files = 0;
+ int nb_lines = 0;
+ for( ; sit != send; ++sit, ++nb_files)
+ for(std::string line; std::getline(*sit, line); ++nb_lines) ;
+
+ EXPECT_EQ(0, nb_files);
+ EXPECT_EQ(0, nb_lines);
+}
+
+
+TEST_F(StreamIterator, RandomFiles) {
+ SCOPED_TRACE(::testing::Message() << "nb_files:" << paths.size() << " nb_lines:" << total_lines);
+
+ stream_iterator sit(paths.begin(), paths.end());
+ stream_iterator send;
+
+ int nb_files = 0;
+ int nb_lines = 0;
+ for( ; sit != send; ++sit, ++nb_files) {
+ for(std::string line; std::getline(*sit, line); ++nb_lines) ;
+ EXPECT_TRUE(sit->eof());
+ }
+
+ EXPECT_EQ(paths.size(), (size_t)nb_files);
+ EXPECT_EQ(total_lines, nb_lines);
+}
+}
diff --git a/unit_tests/test_text_dumper.cc b/unit_tests/test_text_dumper.cc
new file mode 100644
index 0000000..47f819b
--- /dev/null
+++ b/unit_tests/test_text_dumper.cc
@@ -0,0 +1,115 @@
+#include <map>
+#include <gtest/gtest.h>
+#include <unit_tests/test_main.hpp>
+#include <jellyfish/text_dumper.hpp>
+#include <jellyfish/hash_counter.hpp>
+#include <jellyfish/thread_exec.hpp>
+#include <jellyfish/mer_dna.hpp>
+
+namespace {
+using jellyfish::mer_dna;
+typedef jellyfish::cooperative::hash_counter<mer_dna> hash_counter;
+typedef hash_counter::array::lazy_iterator lazy_iterator;
+typedef hash_counter::array::eager_iterator eager_iterator;
+typedef hash_counter::array::region_iterator region_iterator;
+typedef jellyfish::text_dumper<hash_counter::array> dumper;
+
+class hash_adder : public jellyfish::thread_exec {
+ typedef std::map<mer_dna, uint64_t> map;
+ typedef std::vector<map> maps;
+
+ hash_counter& hash_;
+ int nb_;
+ maps check_;
+
+public:
+ hash_adder(hash_counter& hash, int nb, int nb_threads) :
+ hash_(hash),
+ nb_(nb),
+ check_(nb_threads)
+ { }
+ void start(int id) {
+ mer_dna m;
+ map& my_map = check_[id];
+
+ for(int i = 0; i < nb_; ++i) {
+ m.randomize();
+ hash_.add(m, 1);
+ ++my_map[m];
+ }
+
+ hash_.done();
+ }
+
+ void maps_consolidate() {
+ maps::iterator first = check_.begin();
+ maps::const_iterator it = first;
+ for(++it; it < check_.end(); ++it)
+ for(map::const_iterator vit = it->begin(); vit != it->end(); ++vit)
+ (*first)[vit->first] += vit->second;
+ }
+
+ void hash_check() {
+ map& m = check_.front();
+ size_t id;
+ for(map::const_iterator vit = m.begin(); vit != m.end(); ++vit)
+ EXPECT_TRUE(hash_.ary()->get_key_id(vit->first, &id));
+ }
+
+ uint64_t operator[](const mer_dna& m) const {
+ map::const_iterator it = check_.front().find(m);
+ if(it == check_.front().end())
+ return 0;
+ else
+ return it->second;
+ }
+
+ size_t size() const { return check_.front().size(); }
+ };
+
+template<typename T>
+struct inc_on_destructor {
+ T* const x;
+ inc_on_destructor(T* nb) : x(nb) { }
+ ~inc_on_destructor() { ++*x; }
+ operator T() const { return *x; }
+};
+
+TEST(TextDumper, Random) {
+ static int iteration_count_ = 0;
+ ++iteration_count_;
+
+ static const int mer_len = 35;
+ static const int nb_threads = 5;
+ static const int nb = 5000;
+ static const size_t init_size = 5000;
+ static const char* file = "./text_dumper";
+ file_unlink f(file);
+
+ mer_dna::k(mer_len);
+ hash_counter hash(init_size, mer_len * 2, 5, nb_threads, 15);
+ hash_adder adder(hash, nb, nb_threads);
+ adder.exec_join(nb_threads);
+ adder.maps_consolidate();
+ adder.hash_check();
+
+ {
+ dumper d(nb_threads, file);
+ d.one_file(true);
+ d.dump(hash.ary());
+ }
+
+ std::ifstream fd(file);
+ std::string line;
+ mer_dna m;
+ uint64_t count = 0;
+ while(std::getline(fd, line)) {
+ m = line.substr(0, mer_dna::k());
+ EXPECT_EQ(adder[m], (uint64_t)atol(line.substr(mer_dna::k() + 1).c_str()));
+ ++count;
+ }
+ EXPECT_EQ(adder.size(), count);
+
+ // unlink(file);
+}
+} // namespace {
diff --git a/unit_tests/test_token_ring.cc b/unit_tests/test_token_ring.cc
new file mode 100644
index 0000000..d77b4ea
--- /dev/null
+++ b/unit_tests/test_token_ring.cc
@@ -0,0 +1,44 @@
+#include <iostream>
+#include <sstream>
+#include <gtest/gtest.h>
+#include <jellyfish/token_ring.hpp>
+#include <jellyfish/thread_exec.hpp>
+
+namespace {
+using jellyfish::thread_exec;
+struct write_number : public thread_exec {
+ typedef jellyfish::token_ring<jellyfish::locks::pthread::cond> token_ring;
+
+ std::ostream *os_;
+ int nb_threads_;
+ token_ring ring;
+
+public:
+ write_number(std::ostream* os, int nb_threads) :
+ os_(os), nb_threads_(nb_threads), ring(nb_threads)
+ { }
+
+ virtual void start(int i) {
+ token_ring::token& token = ring[i];
+ for(int j = 0; j < 10; ++j) {
+ token.wait();
+ *os_ << (nb_threads_ * j + i) << "\n";
+ token.pass();
+ }
+ }
+};
+
+TEST(TokenRing, Count) {
+ static const int nb_threads = 5;
+ std::ostringstream out;
+
+ write_number write(&out, nb_threads);
+ write.exec_join(nb_threads);
+
+ std::ostringstream res;
+ for(int i = 0; i < nb_threads * 10; ++i)
+ res << i << "\n";
+
+ EXPECT_EQ(res.str(), out.str());
+}
+} // namespace {
diff --git a/unit_tests/test_whole_sequence_parser.cc b/unit_tests/test_whole_sequence_parser.cc
new file mode 100644
index 0000000..587f422
--- /dev/null
+++ b/unit_tests/test_whole_sequence_parser.cc
@@ -0,0 +1,161 @@
+#include <fstream>
+
+#include <gtest/gtest.h>
+#include <jellyfish/whole_sequence_parser.hpp>
+#include <unit_tests/test_main.hpp>
+
+namespace {
+using std::string;
+using std::istringstream;
+template<typename Iterator>
+struct opened_streams {
+ Iterator begin_, end_;
+
+ opened_streams(Iterator begin, Iterator end) : begin_(begin), end_(end) { }
+ std::unique_ptr<std::istream> next() {
+ std::unique_ptr<std::istream> res;
+ if(begin_ != end_) {
+ res.reset(*begin_);
+ ++begin_;
+ }
+ return res;
+ }
+};
+typedef jellyfish::whole_sequence_parser<opened_streams<std::ifstream**> > parser_type;
+
+TEST(SequenceParser, Fasta) {
+ static const char* seq1 = "ATTACCTTGTACCTTCAGAGC";
+ static const char* seq2 = "TTCGATCCCTTGATAATTAGTCACGTTAGCT";
+ const char* file_name = "Fasta.fa";
+ file_unlink fu(file_name);
+
+ {
+ std::ofstream sequence(file_name);
+ sequence << ">header1\n"
+ << seq1 << "\n\n"
+ << ">header2\n"
+ << seq2 << "\n\n\n"
+ << seq1;
+ }
+
+ auto sequence = new std::ifstream(file_name);
+ opened_streams<std::ifstream**> streams(&sequence, &sequence + 1);
+ parser_type parser(10, 1, 1, streams);
+
+ {
+ parser_type::job j(parser);
+ ASSERT_FALSE(j.is_empty());
+ ASSERT_EQ((size_t)1, j->nb_filled);
+ EXPECT_STREQ("header1", j->data[0].header.c_str());
+ EXPECT_STREQ(seq1, j->data[0].seq.c_str());
+ }
+
+ {
+ parser_type::job j(parser);
+ ASSERT_FALSE(j.is_empty());
+ ASSERT_EQ((size_t)1, j->nb_filled);
+ EXPECT_STREQ("header2", j->data[0].header.c_str());
+ EXPECT_EQ(strlen(seq2) + strlen(seq1), j->data[0].seq.size());
+ EXPECT_STREQ(seq2, j->data[0].seq.substr(0, strlen(seq2)).c_str());
+ EXPECT_STREQ(seq1, j->data[0].seq.substr(strlen(seq2)).c_str());
+ }
+
+ {
+ parser_type::job j(parser);
+ EXPECT_TRUE(j.is_empty());
+ }
+}
+
+TEST(SequenceParser, Fastq) {
+ static const char* seq1 = "ATTACCTTGTACCTTCAGAGC";
+ static const char* seq2 = "TTCGATCCCTTGATAATTAGTCACGTTAGCT";
+ const char* file_name = "Fasta.fq";
+ file_unlink fu(file_name);
+
+ {
+ std::ofstream sequence(file_name);
+ sequence << "@header1\n"
+ << seq1 << "\n\n"
+ << "+and some stuff\n"
+ << seq1 << "\n"
+ << "@header2\n"
+ << seq2 << "\n\n\n"
+ << seq1 << "\n"
+ << "+\n"
+ << seq1 << "\n"
+ << seq2 << "\n";
+ }
+
+ auto sequence = new std::ifstream(file_name);
+ opened_streams<std::ifstream**> streams(&sequence, &sequence + 1);
+ parser_type parser(10, 1, 1, streams);
+
+ {
+ parser_type::job j(parser);
+ ASSERT_FALSE(j.is_empty());
+ ASSERT_EQ((size_t)1, j->nb_filled);
+ EXPECT_STREQ("header1", j->data[0].header.c_str());
+ EXPECT_STREQ(seq1, j->data[0].seq.c_str());
+ EXPECT_STREQ(seq1, j->data[0].qual.c_str());
+ }
+
+ {
+ parser_type::job j(parser);
+ ASSERT_FALSE(j.is_empty());
+ ASSERT_EQ((size_t)1, j->nb_filled);
+ EXPECT_STREQ("header2", j->data[0].header.c_str());
+ EXPECT_EQ(strlen(seq2) + strlen(seq1), j->data[0].seq.size());
+ EXPECT_EQ(strlen(seq2) + strlen(seq1), j->data[0].qual.size());
+ EXPECT_STREQ(seq2, j->data[0].seq.substr(0, strlen(seq2)).c_str());
+ EXPECT_STREQ(seq1, j->data[0].seq.substr(strlen(seq2)).c_str());
+ EXPECT_STREQ(seq1, j->data[0].qual.substr(0, strlen(seq1)).c_str());
+ EXPECT_STREQ(seq2, j->data[0].qual.substr(strlen(seq1)).c_str());
+ }
+
+ {
+ parser_type::job j(parser);
+ EXPECT_TRUE(j.is_empty());
+ }
+}
+
+TEST(SequenceParser, FastaMany) {
+ const char* file_name = "FastaMany.fa";
+ file_unlink fu(file_name);
+ static const int nb_sequences = 1000;
+
+ {
+ std::ofstream sequence(file_name);
+ ASSERT_TRUE(sequence.good());
+ for(int i = 0; i < nb_sequences; ++i) {
+ const int seq_len = random_bits(8) + 10;
+ sequence << ">" << i << " " << seq_len << "\n";
+ for(int j = 0; j < seq_len; ++j) {
+ sequence << (char)('A' + j % 26);
+ if(random_bits(6) == 0)
+ sequence << '\n';
+ }
+ sequence << '\n';
+ }
+ }
+
+ auto sequence = new std::ifstream(file_name);
+ opened_streams<std::ifstream**> streams(&sequence, &sequence + 1);
+ parser_type parser(10, 13, 1, streams);
+ int got_sequences = 0;
+ while(true) {
+ parser_type::job job(parser);
+ if(job.is_empty())
+ break;
+ for(size_t i = 0; i < job->nb_filled; ++i) {
+ ++got_sequences;
+ const size_t len_pos = job->data[i].header.find_first_of(" ");
+ const int seq_len = atoi(job->data[i].header.c_str() + len_pos + 1);
+ ASSERT_LE(10, seq_len);
+ for(int j = 0; j < seq_len; ++j)
+ EXPECT_EQ('A' + (j % 26), job->data[i].seq[j]);
+ }
+ }
+ EXPECT_EQ(nb_sequences, got_sequences);
+}
+
+}
diff --git a/unit_tests/unit_tests.sh b/unit_tests/unit_tests.sh
index e173586..57e457b 100644
--- a/unit_tests/unit_tests.sh
+++ b/unit_tests/unit_tests.sh
@@ -3,4 +3,8 @@
cd tests
. ./compat.sh
-${DIR}/test_all
+if [ -n "$VALGRIND" ]; then
+ exec valgrind ${DIR}/test_all
+else
+ exec ${DIR}/test_all
+fi
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/jellyfish.git
More information about the debian-med-commit
mailing list